FPGA学习流程
FPGA 内部资源介绍
FPGA芯片主要由6部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块。
CLB(configurable logic block)
Artix 7系列CLB提供高级、高性能FPGA逻辑:查找表,分布式存储器和移位寄存器逻辑,高速进位逻辑,多路复用器。
CLB是实现时序电路和组合电路的主要逻辑资源。每个CLB元素都连接到一个开关矩阵,以访问通用布线矩阵(如图1-1所示)。每个CLB包含两个SLICEL或一个SLICEL和一个SLICEM。
每一个SLICE都包含:四个逻辑函数发生器(或查找表LUT),八个存储元件,宽功能多路复用器,进位逻辑。所有SLICE都使用这些元件来提供逻辑、算术和ROM功能。在里面
此外,SLICEM还支持两个附加功能: Distributed RAM和32位移位寄存器。
SLICE
每个Slice由四个6输入LUT、八个触发器、多路复用器、算术进位逻辑和异或门组成,两个Slice组成一个CLB。每个Slice的其中四个触发器(每个LUT一个)可以选择配置为锁存器。在这种情况下,该Slice中剩余的四个触发器必须保持未使用状态。
FPGA的Slice资源中,大约三分之二的Slice是 SLICEL(logic slices),其余三分之一是 SLICEM。 SLICEL可用于产生逻辑,算术,ROM。 SLICEM除以上作用外还可配置成分布式64-bit RAM或32bit的移位寄存器。每个CLB可包含两个SLICEL或者一个SLICEL与一个SLICEM。
•CLB触发器具有置位或复位功能。设计者不能同时使用set和reset。触发器非常丰富,应该考虑使用流水线来提高性能。
•控制输入通过Slice或CLB共享。设计所需的唯一控制输入的数量应最小化。控制输入包括clock, clock enable,set/reset, and write enable
•6输入LUT可用作32位移位寄存器,以便高效实现。
•6输入LUT可用作64*1memory,以满足小型存储需求。
•专用进位逻辑有效实现算术功能。
在FPGA芯片中,CLB是均匀分布的,不过在列的方向上,它们的排列一般更加紧密些,可能是为了减少加法进位链的延迟和实现高性能的寄存器链。
SliceM
LUT
每个查找表(LUT)可以配置为具有一个输出6输入的LUT,也可以配置为具有单独输出但具有公共地址或逻辑输入的两个5输入LUT。每个5输入LUT输出可以选择在触发器寄存输出。
Artix系列的LUT包含6个输入 A1 -A6 , 两个输出 O5 , O6 .可配置成6输入查找表,O6此时作为输出。或者两个5输入的查找表,A1-A5作为输入 A6拉高,O5,O6作为输出。
一个LUT包含6个输入,逻辑容量为2^6bit,为实现7输入逻辑需要2^7容量,对于更多输入也一样。每个Slice有4个LUT,256bit容量能够实现最多8bit输入的逻辑。为了实现此功能,每个Slice还包括3个MUX(多路选择器)
F7AMUX 用于产生7输入的逻辑功能,用于连接A,B两个LUT
F7BMUX 用于产生7输入的逻辑功能, 用于连接C,D两个LUT
F8MUX 用于产生8输入的逻辑功能, 用于连接4个LUT
对于大于8输入的逻辑需要使用多个SLICES, 会增加逻辑实现的延时。
一个SLICES中的4个寄存器可以连接LUT或者MUX的输出,或者被直接旁路不连接任何逻辑资源。寄存器的置位/复位端为高电平有效。只有CLK端能被设置为两个极性,其他输入若要改变电平需要插入逻辑资源。例如低电平复位需要额外的逻辑资源将rst端输入取反。但设为上升/下降沿触发寄存器不会带来额外消耗。
SliceL
Artix 系列存储元件
每个Slice有八个存储元件(可以配置为8个触发器或者4个锁存器(因为配置为锁存器时,前面的触发器不能使用))。四个可以配置为边沿触发D型触发器或电平敏感锁存器。D输入可以通过AFFMUX、BFFMUX、CFFMUX或DFFMUX由LUT输出直接驱动,或者通过AX、BX、CX或DX输入由将LUT(函数生成器)旁路时的输入直接驱动。配置为锁存器时,CLK低时锁存器是透明的。
另外还有四个存储元件只能配置为边沿触发D型触发器。D输入可由LUT的O5输出或通过AX、BX、CX或DX对Slice旁路输入驱动。当原来的四个存储元件配置为锁存时,这四个附加存储元件不能使用。
一个Slice中有两种配置:仅4个寄存器和4个寄存器/锁存器
控制信号
控制信号时钟 (CLK)、时钟使能 (CE) 和置位/复位 (SR) 对一个Slice中的所有存储元件是通用的。当Slice中的一个触发器启用了SR或CE 时,Slice 中使用的其他触发器也会通过公共信号启用 SR 或 CE。只有 CLK 信号具有独立的极性。任何放置在时钟信号上的反相器都会被自动吸收。CE和SR信号为高电平有效。
这些初始化选项可用于存储元件:
• SRLOW:当 CLB SR 信号有效时同步或异步复位
• SRHIGH:当 CLB SR 信号有效时同步或异步置位
• INIT0:上电时异步复位或全局置位/复位
• INIT1:上电时异步置位或全局置位/复位
S信号强制存储元件进入由 SRHIGH 或 SRLOW 属性指定的状态。当SR被置位时,SRHIGH 在存储元件输出端强制逻辑高,而 SRLOW 在存储元件输出端强制逻辑低。
Distributed RAM(仅在SLICEM中可用)
Xilinx的FPGA中有分布式RAM 和 Block RAM 两种存储器。用分布式RAM 时其实要用到其所在的SliceM,所以要占用其中的逻辑资源;SLICEM可以配置成分布式RAM,SLICEM 中的函数发生器 (LUT) 可以实现为称为分布式 RAM 元件的同步 RAM 资源。SLICEM 中的多个 LUT 可以通过多种方式组合以存储更大量的数据。
移位寄存器(仅在 SLICEM 中可用)
SLICEM 的函数发生器也可以配置为 32 位移位寄存器,而无需使用Slice中可用的触发器。 以这种方式使用,每个 LUT 可以将串行数据延迟1到 32个时钟周期。移入 D(DI1 LUT 引脚)和移出 Q31(MC31 LUT 引脚)线级联 LUT 以形成更大的移位寄存器。因此,SLICEM 中的四个 LUT 级联以产生高达 128 个时钟周期的延迟。 还可以在多个 SLICEM 上组合移位寄存器。 Slice之间没有直接连接以形成更长的移位寄存器,LUT B/C/D 处的 MC31 输出也不可用。 由此产生的可编程延迟可用于平衡数据流水线的时序。
而Block RAM 是单纯的存储资源,但是要一块一块的用,不像分布式RAM 想要多少bit都可以。用户申请存储资源,FPGA先提供Block RAM ,当Block RAM 数量不够时再用分布式RAM补充。
SLICEM 和 SLICEL 中的每个函数发生器(LUT)都可以实现 64 x1位 ROM。
1个CLB = 2个SLICE = 8个6输入LUT+16个Flip-Flops =4个6输入LUT(SLICEL)+ 256bits Distributed RAM(SLICEM 的4个6输入LUT=4*2^6=256bit)+16个Flip-Flops =4个6输入LUT(SLICEL)+ 128bits Shift Registers(一个LUT可以配置成一个32bit Shift Registers,4个LUT最大可配置成128bits Shift Registers)+16个Flip-Flops
LUT
LUT即查找表,是FPGA芯片与其他可编程逻辑芯片之间最大的区别。LUT可以有多个输入引脚,但只能有一个输出引脚。我们可以用ROM的概念来理解LUT,即,一般来说,一个N输入的查找表,它的行为相当于一个地址总线为N位,单位存储量为1bit,总存储量为2Nbit的单口ROM。例如,对于一个2输入的查找表,如果按照“逻辑与”的真值表去配置其内部ROM的存储内容,那么它的行为就相当于一个与门;如果按照“逻辑或”的真值表去配置其内部ROM的存储内容,那么它的行为就相当于一个或门;如果固定住一个输入引脚,也可以很方便地模拟非门的行为;如果恰当地组合两个2输入的LUT,也可以很方便地实现任意3输入逻辑;以此类推。因此,只要通过恰当的连接,我们可以用该LUT实现任意的组合逻辑功能。LUT中的每一个存储单位都对应于逻辑表达式中的一个最小项,因此,LUT可以方便地描述任何组合逻辑。
加法器
加法是所有二进制运算的基础,因为它在FPGA中的地位非常重要。而二进制加法中最重要的功能元素就是异或操作,因此,为了实现高性能的加法,Xilinx采用了专门的异或门,虽然LUT也可以模拟异或门的功能,但是它的延迟相比于专门有的异或门来说还是太大,尤其是两个多维数据的相加时,由于级联效应,会导致处理变慢。因此,目前在FPGA的逻辑资源块中,都是留有专门的异或门外加专门的进位链布线资源,再配合相关资源实现全加器。不过LUT可以配合异或门实现超前进位加法器,进一步提高加法器的性能。
寄存器
FPGA中有丰富的寄存器资源,寄存器是时序逻辑的基础,由于它对电路状态的保持和记忆特性,才使得数字电路具有千变万化的功能。FPGA中的寄存器一般可以被配置为D类型的触发器或者锁存器。配置为D类型的触发器时,根据生产厂商以及型号的不同,可能会有一些其他的功能管脚,例如异步复位、同步复位、时钟使能、同步置位等。FPGA中寄存器的输出一般都会连到附近一个寄存器的输入MUX中,通过配置该MUX,可以将多个寄存器串联起来形成寄存器链,实现移位寄存器电路。
MUX
MUX就是复用器,也叫多路选择器。FPGA的逻辑资源块中,有很多MUX,根据用法可以分为两类:一类是配置MUX,它的选通是在配置FPGA的时候确定的,因此它决定了所处逻辑资源块的功能;另一类是逻辑MUX,它的选通是由此时的内部逻辑决定的,因此它是内部逻辑的一部分。由此可见,配置MUX在FPGA中的作用更大一些,通过改变配置MUX的选通情况,可以让逻辑资源块实现多种多样的功能。例如:通过改变配置MUX的选通情况,我们可以只使用逻辑资源块中的组合逻辑部分,也可以只使用其中的寄存器,甚至可以同时使用这两部分,但它们却分别隶属于不同的功能模块。
嵌入式块RAM(BRAM)
大多数FPGA都具有内嵌的块RAM,Block RAM这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器 (CAM)以及FIFO等常用存储结构。RAM、FIFO是比较普及的概念,在此就不冗述。CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入 CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块RAM,还可以将 FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。
例如:单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于18k比特;其次,位宽最大不能超过36比特。当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而不再受上面两条原则约束。
时钟网络资源
时钟信号是时序逻辑的灵魂,也是整个FPGA设计的核心。在某些情况下,他几乎要作用于整个FPGA芯片上的所有寄存器和相关存储单元,而FPGA内部布线资源的时间不可确定性,会使得时钟信号到达各个寄存器的延迟时间有很大出入,因此极易造成时序问题,从而导致系统行为不符合预期。为了实现大规模、高性能、高速度的FPGA设计, FPGA芯片中引入了专门的时钟网络资源用于时钟信号的载体。按照应用的区域范围不同,时钟网络资源一般被分为三大类。
全局时钟网络资源
全局时钟网络资源作用的范围覆盖整个FPGA芯片,它能保证其上所承载的时钟信号到达FPGA芯片上任意两个地方的延迟时间偏差最小。从而保证大型的FPGA设计能够被高速的时钟信号正确驱动。一般来说,全局时钟网络资源是比较珍贵的,一些小型的FPGA中可能仅有几个全局时钟网络,因此在使用的时候一定要节省。
区域时钟网络资源
随着FPGA芯片的集成度越来越高,规模大一点的FPGA又被划分为多个区域(一般来说,一个FPGA区域只包含一个IO bank)。与全局时钟网络不通,每一个FPGA区域都有若干个属于自己的区域时钟网络,它所能覆盖的范围是整个区域甚至还包括与本区域相邻的区域。区域时钟网络能保证其上所承载的时钟信号到达FPGA芯片上该时钟网络作用域中任意两个地方的时间偏差最小。这种区域时钟网络资源对于源同步的接口逻辑十分有效。
IO时钟网络资源
前面所述的两种时钟网络资源针对的主要都是FPGA内部的一些资源,例如逻辑资源块,BLOCK RAM、DSP等,而对于接口资源,则有专门的IO时钟网络资源来完成时钟信号承载工作。这主要有三点原因:首先,接口资源中的寄存器数量较少,不需要大型的树状时钟网络来减少时钟到达各个目的地之间的延迟时间差。其次,内部的时钟网络资源由于作用的范围广,所以网络较庞大,一般上面都不能承载频率太高的时钟信号,而一些通信接口的时钟速率很高,远远超出了全局或区域时钟网络的承受范围,因此需要使用专有的IO时钟网络资源。第三,高速的接口逻辑一般都使用专有的接口资源,它的布局布线已经固定,能够力保外部信号到达寄存器的延迟最短,为了配合达到高速度的信号传输,也必须要求我们的时钟信号所走的路径最短,但全局或区域时钟网络的特点是保证时钟到达各个地方的延迟差最小,而不是延迟最短,因此并不适用高速接口的数据情况,那么这种情况下只有使用专有的IO时钟网络资源。
时钟处理单元
时钟是时序逻辑的灵魂,因此时钟信号非常重要。而在实际使用中,经常会碰到外部送给我们的时钟信号在频率或者相位上并不满足直接使用的要求,而内部时序逻辑又只能对时钟信号进行整数倍分频,并且不能保证产生新时钟信号的相位稳定性,所以这个时候就需要用到时钟处理单元。
时钟处理单元可以对时钟信号进行高精度的倍频、分频和相位调整,因此对时序逻辑的设计非常重要。FPGA中的时钟处理单元共有两种:PLL和DCM,分别介绍如下。
PLL
PLL,英文全称Phase Locked Loop,即锁相环。因为PLL调整输入时钟信号频率和相位的原理中利用了模拟电路的知识。因此一般来说,FPGA并不是一个纯粹的数字电路,因为它其中一般会包含PLL,当然,它还会包含一个内部晶振电路用于产生上电自加载时的时钟信号。
PLL的原理结构框图如图所示。
它的原理是这样的:压控振荡器VCO输出的信号为整个锁相环最终的输出信号,该信号会经过一个整数分频器分频后反馈给鉴相器PD(其实也是鉴频器),PD比较该反馈信号与输入的本振信号,如果他们之间有差别,那么PD会输出差别信号,该差别信号经过低通滤波器LF滤波后,形成控制VCO频率变化的控制电压。在该控制电压的作用下,VCO输出信号的频率或相位将改变,如果新的输出信号经过反馈回路后与本振信号相等,那么PLL进入锁定状态,否则PLL仍在失锁状态,上述调整将会继续进行。
DCM
DCM,英文全称Digital Clock Manager,翻译成中文即数字时钟管理。与PLL不同,DCM并没有利用模拟电路的原理,而是采用了全数字的处理方式实现时钟信号的管理。DCM中的一个核心结构为DLL,英文全称为delay-clocked loop,翻译成中文是延迟锁相环, Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
其中Varaible Delay Line是一个可变的延迟线,内部应该是由若干个小的延迟单元或者缓冲门组成,而Control模块通过比较CLKIN和CLKFB的相位关系,对可变延迟线的延迟时间进行调整,直到CLKIN和CLKFB的相位相差达到360°(其实就是一度不差)后完成锁定。
丰富的布线资源
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长 度、宽度和分布位置的不同而划分为4类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时 钟、复位等控制信号线。
在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。
内嵌专用硬核
内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。例如:为了提高FPGA的乘法速度,主流的FPGA 中都集成了专用乘法器;为了适用通信总线与接口标准,很多高端的FPGA内部都集成了串并收发器(SERDES),可以达到数十Gbps的收发速度。Xilinx公司的高端产品不仅集成了Power PC系列CPU,还内嵌了DSP Core模块,其相应的系统级设计工具是EDK和Platform Studio,并依此提出了片上系统(System on Chip)的概念。通过PowerPC、Miroblaze、Picoblaze等平台,能够开发标准的DSP处理器及其相关应用,达到SOC的开发目的。
FPGA资源利用率
FPGA资源利用率中的Total LUT是指设计中消耗的所有LUT,包括用做逻辑函数发生器的LUT(SLICEL中的LUT,备注:logic LUT),也包括用做存储单元的LUT(SLICEM中的LUT,备注:LUTRAM)
FPGA资源利用率报告中的LUTRAM是指设计中消耗的SLICEM中的LUT(用做分布式RAM/ROM或移位寄存器)
FPGA资源利用率报告中的 SRLs指设计中消耗的SLICEM中的移位寄存器。
软核
软核在EDA设计领域指的是综合之前的寄存器传输级(RTL)模型;具体在FPGA设计中指的是对电路的硬件语言描述,包括逻辑描述、网表和帮助文档等。 软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发 生错误的可能性,有一定的设计风险。软核是IP核应用最广泛的形式。
固核
固核在EDA设计领域指的是带有平面规划信息的网表;具体在FPGA设计中可以看做带有布局规划的软核,通常以RTL代码和对应具体工艺网表的混合形式提供。将RTL描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。和软核相比,固核的设计灵活性稍差,但在可靠性上有较大提高。目前,固核也是IP核的主流形式之一。
硬核
硬核在EDA设计领域指经过验证的设计版图;具体在FPGA设计中指布局和工艺固定、经过前端和后端验证的设计,设计人员不能对其修改。不能修改的原因有 两个:首先是系统设计对各个模块的时序要求很严格,不允许打乱已有的物理版图;其次是保护知识产权的要求,不允许设计人员对其有任何改动。IP硬核的不许修改特点使其复用有一定的困难,因此只能用于某些特定应用,使用范围较窄。
FPGA buffer
BUFG
全局时钟Buffer:该设计元件是一个高扇出缓冲器,它将信号连接到全局布线资源,以实现信号的低skew分布。 BUFG通常用于时钟网。
可以使用实例化(Instantiation),Verilog HDL的实例化模板如下:
// BUFG: Global Clock Buffer (source by an internal signal) // All FPGAs // Xilinx HDL Libraries Guide, BUFG BUFG_inst ( .O(O), // Clock buffer output .I(I) // Clock buffer input ); // End of BUFG_inst instantiation
BUFGCE
带有时钟使能的全局时钟Buffer
此设计元件是具有单门控输入的全局时钟缓冲器。 当时钟使能(CE)为低(无效)时,其O输出为“0”。当时钟使能(CE)为高电平时,I输入被传送到O输出。
Verilog Instantiation Template // BUFGCE: Global Clock Buffer with Clock Enable (active high) BUFGCE BUFGCE_inst ( .O(O), // Clock buffer output .CE(CE), // Clock enable input .I(I) // Clock buffer input );
BUFGCE_1
与BUFGCE的区别在于时钟使能(CE)为0时,输出状态为1。
该设计元件是具有单门控输入的多路复用全局时钟缓冲器。 当时钟使能(CE)为低(无效)时,其O输出为高(1)。 当时钟使能(CE)为高电平时,I输入被传送到O输出。
BUFGCE_1 BUFGCE_1_inst ( .O(O), // Clock buffer output .CE(CE), // Clock enable input .I(I) // Clock buffer input ); // End of BUFGCE_1_inst instantiation
BUFGMUX和BUFGMUX_1
BUFGMUX是一个多路复用的全局时钟缓冲器,可以在两个输入时钟之间进行选择:I0和I1。 当选择输入(S)为低时,选择I0上的信号作为输出(O)。 当选择输入(S)为高电平时,选择I1上的信号进行输出。
BUFGMUX和BUFGMUX_1的区别在于当输出在时钟之间切换以响应其选择输入的变化时输出的状态。 BUGFMUX假定输出状态为0,BUFGMUX_1为输出状态1。
注意:BUFGMUX保证当S切换时,输出状态保持无效状态,直到出现下一个有效时钟沿(I0或I1)。
FPGA仿真
XDC 编写的语法
普通 IO 口只需约束引脚号和电压,管脚约束如下:
set_property PACKAGE_PIN "引脚编号" [get_ports “端口名称” ]
电平信号的约束如下:
set_property IOSTANDARD "电压" [get_ports “端口名称” ]
这里需要注意文字的大小写,端口名称是数组的话用{ }括起来, 端口名称必须和源代码中的
名字一致,且端口名字不能和关键字一样。
时钟端口还可以定义时钟周期约束, 比如我们在 XDC 里面定义了输入的差分时钟的时钟周期
为 20ns。 时钟周期的约束方法如下:
create_clock -period "周期" [get_ports “端口名称” ]
Vivado 使用的约束文件格式为 xdc 文件。 xdc 文件里主要是完成管脚的约束,时钟的约束,以及组的约束。这里我们需要对 led.v 程序中的输入输出端口分配到 FPGA 的真实管脚上。
管脚约束
1) 点击“Open Elaborated Design”, 在弹出的窗口中点击“OK”按钮;
2) 在菜单中选择“Window -> I/O Ports”, 在弹出的 I/O Ports 中可以看到管脚分配情况,给复位信号 rst_n LED 和时钟分配管脚、电平标准,完成后点击保存图标,弹出窗口,要求保存约束文件,文件类型默认“XDC”。
添加时序约束
一个 FPGA 设计除了管脚分配以外,还有一个重要的约束,那就是时序约束,这里通过向导方式进行一个时序约束。
1) 点击“Run Synthesis”开始综合
2) 弹出对话框点击“OK,综合完成以后点击“Cancel”,不要run implementation
3) 点击“Constraints Wizard”
4) 在弹出的窗口中点击“Next”
5) 时序约束向导分析出设计中的时钟,设置时钟的频率。
仿真流程
- 点击 Run Simulation 按钮,再选择 Run Behavioral Simulation。做行为级的仿真;
- 点击 Run Synthesis,即可开始综合并生成网表文件;
- Run Implementation 来开始布局布线;
- 布线完成后会GenerateBitstream 即可生成 bit 文件。
- Bit 文件生成完成后,我们可以打开 Project Summary 页面的 Table 来查看板子上实际资源的使用情况。
- 经过前面的编译和仿真,我们可以把 bit 文件下载到 FPGA 芯片中,看一下 LED 实际运行的效果。
- 下载和调试之前先连接硬件,把 JTAG 下载器和开发板连接(如下图是 AX7A200 开发板 JTAG 连接作为参考) ,然后开发板上电。
- 下载之前还需进行设置:右击 PROGRAM AND DEBUG ,将bin_file 后面打对号,然后ok。设置完成后单击 Generate Bitstream 产生中 bit 和 bin 文件。
- 点击 Open target 按钮->Auto Connect, 在 hardware 界面下会显示开发板的图标,
问题与解决方案
1.若ILA时钟与观察的数据的时序违例:
解决方法:可以采用PLL分频生成两个时钟,然后一个为系统时钟clk_osc,另一个为ILA时钟ila_clk:
但是在约束中, 重新利用create_clock根据想要的ila_clk的时钟和上升沿与下降沿设置生成ila_clk的管脚,同时在约束中将ila_clk设置为异步时钟
2.[Synth 8-5788] Register Packet_header_reg in module RXDDSP is has both Set and reset with same priority. This may cause simulation mismatches.
解决方法:在复位时将寄存器Packet_header_reg的初值设置为0;
3.Vivado在处理外部时钟信号的时候会自动添加BUFG模块来去除时钟的抖动,但是其他的信号就不会这样做。在always语句的敏感信号列表中使用没有去抖动的外部信号就有可能导致系统不稳定,所以会出现错误。
当将外部输入的一个时钟分配到一个普通的IO口上面作为输入时,FPGA实现的时候会报错,如果分配到一个专用的时钟管脚,就不会报错。
因为普通IO管脚周围没有全局时钟 BUFG,所以在约束内添加:set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pad_clk]屏蔽 Xilinx 的检测,从而通过编译。pad_clk为输入时钟管脚
原文链接:https://blog.csdn.net/woshiyuzhoushizhe/article/details/103391028
[Timing 38-316] Clock period '10.000' specified during out-of-context synthesis of instance 'ila_Top_inst' at clock pin 'clk' is different from the actual clock period '5.000', this can lead to different synthesis results.
FPGA时序分析
创建时序约束
在此步骤中,您将打开synthesized design并使用 Vivado®时序约束向导。 Timing Constraints 向导分析门级网表并找到缺失的约束。使用 Timing Constraints 向导为此设计生成约束。
- 1.在Flow Navigator 中,单击Open Synthesized Design。
- 2. 打开综合设计后,单击 Synthesized Design 部分下的 Constraints Wizard。出现 Timing Constraints 向导的介绍页面。本页介绍向导创建的约束类型:时钟、输入和输出端口以及时钟域交叉。
- 3.阅读页面后,点击下一步继续。 Timing Constraints 向导的 Primary Clocks 页面显示所有缺少时钟定义的时钟源。wizard检测到对逻辑路径进行时序分析所需的丢失的时钟约束,以及仅在验证脉冲宽度和最小或最大周期要求时需要的丢失的时钟约束。
Vivado中Debug的操作方式
:空心绿色图标表示设置了 MARK_DEBUG 属性的网络,但未连接到任何 ILA 核。
:实心绿色图标表示设置了 MARK_DEBUG 属性并连接到 ILA 核的网络。
:黄色图标表示网络上没有MARK_DEBUG,但它连接到一个ILA核。
Debug窗口中的Debug Cores选项卡:
•显示连接到Debug Hub (dbg_hub) core的debug cores列表。
•在窗口底部保留未分配的调试信号列表。您可以从弹出菜单或窗口顶部的工具栏按钮操作调试内核和端口。
Debug窗口中的Debug Cores选项卡对 ILA 内核和调试内核集线器插入提供了比Set up Debug向导中提供的更精细的控制。此窗口中可用的控件允许创建内核、删除内核、调试信号连接和更改内核参数。
可以通过上图的 图标创建Debug Cores。
代码中例化ILA IP核
第一种,直接例化ILA IP核:
需要探测多少个信号,每次探测的信号长度(数据深度),以及设置Capture control(捕获控制功能:C_EN_STRG_QUAL)和Advanced trigger(高级触发功能:C_ADV_TRIGGER),这样可以选择在后面的调试中是否使用高级的捕获功能,也可以不选择这两个选项。
【Enable Trigger Output Port】:使能ILA 触发输出端口。在HDL 代码设计中,将该触发端口输出至FPGA 引脚,可以用于触发外部测试设备。该触发输出端口也可以和设计的其他逻辑相连,作为触发、中断或者控制信号。其波形(电平或者脉冲)和极性(高有效或者低有效)可以在运行中通过分析工具随时控制。ILA 触发输出相对于触发输入延时10 个时钟周期。
然后设置probe_ports 页面,选择探测信号宽度以及触发方式,不同的信号可以设置不同的位宽,
在 Vivado Hardware Manager中自定义探针以用作Data或trigger,或两者兼而有之。参与触发或捕获比较值的探针被配置为仅“trigger”探针。这优化了 ILA 内核对 BRAM 的使用。通常,需要捕获其数据的探测器被配置为仅“Data”探测器。参与两个触发比较值的探针以及需要捕获其数据的探针应配置为“trigger和Data”。
当在运行时使用包含仅配置为“Data”的探针的设计对设备进行编程时,将无法使用这些探针来配置触发或捕获设置条件。相反,也无法使用仅在波形窗口中配置为“trigger”的探头。
5.2 RTL代码中加入标记
1. 首先rtl代码中加入mark_debug 标记。Verilog 语法示例:
(* mark_debug = "true" *) wire [7:0] char_fifo_dout;
2. 然后通过单击 Vivado设计界面中的 Run Synthesis 或运行以下 Tcl 命令来综合包含调试内核的设计:
launch_runs synth_1
wait_on_run synth_1
3. 在综合设计中标记网络以进行调试:通过单击 Flow Navigator 中的 Open Synthesized Design 打开综合设计,然后选择 Debug 窗口布局以查看 Debug 窗口。任何与标记为调试的 HDL 信号相对应的网络都显示在 Debug 窗口的 Unassigned Debug Nets 文件夹中。
在任何设计视图(例如 Netlist 或 Schematic 窗口)中选择一个net,然后右键单击选择 Mark Debug 选项。
如上图所示,右键选择data0,然后选择mark_debug选项,该net就会被放到Unassigned Debug Nets文件夹中。
注意:有些信号能够Mark Debug,有些则不能,例如模块直接的输入信号不能,它经过一个Buf之后就可以。
最后的输出也不能(不太确定):
或者在综合后的原理图中Mark Debug,这和网表debug是一致的:
然后在Set up Debug向导中选择net,并设置Debug参数即可,包括选择需要Debug的信号,设置时钟域、探针类型、触发方式、选择采样深度等。
通过上图的clock domain选项,右键单击选择待调试信号的时钟域,以更改用于对信号进行采样的时钟,Set up Debug向导尝试通过搜索同步元件的路径来为调试信号自动选择适当的时钟域。使用 Select Clock Domain 对话框窗口根据需要修改此选择,然后vivado根据不同的时钟域生成多个ILA内核,每个时钟域都会产生单独的 ILA 内核。
如果要启用高级触发模式或基本捕获模式advanced trigger mode or basic capture mode,请使用相应的复选框来执行此操作。单击下一步移动到最后一个面板。
然后data0就变成了实心的绿色图标,所有设置了 MARK_DEBUG 属性并连接到 ILA 核的信号都有绿色实心图标。
之后,实现生成bit流文件即可完成debug,准备上板子吧。
在project模式下将约束保存到目标约束文件可能会导致综合和实现步骤过时。 但是,不需要重新综合设计,因为debug XDC 约束仅在实现期间使用。 您可以通过选择 Design Runs 窗口、右键单击综合运行(synthesis run)(例如 synth_1)并选择 Force up-to-date 来强制更新综合步骤。
实现设计
在插入、连接和自定义调试内核之后,现在就可以实现设计了。实现包含调试内核的设计 Vivado 软件最初将调试内核集线器创建为一个黑盒。 该内核必须在运行布局器和布线器之前实现。
通过单击 Vivado Design Suite 中的 Run Implementation 或运行以下 Tcl 命令来实现包含debug core的设计:
launch_runs impl_1
wait_on_run impl_1
还可以使用实现命令 opt_design、place_design 和 route_design 来实现设计。
5.3 Debug Cores的时钟指南
Vivado Hardware Manager使用JTAG接口与Vivado Debug Hub core进行通信。
该接口在FPGA器件的JTAG边界扫描(BSCAN)接口和Vivado Debug cores之间提供了一个接口。
5.3.1 JTAG时钟
这个时钟使JTAG边界扫描(BSCAN)的内部状态机操作同步。
边界扫描(BSCAN)接口的内部状态机操作。在连接到目标设备时,您通常会在Vivado Hardware Manager中选择JTAG时钟的频率。如果你的设计包含debug cores,确保JTAG时钟比debug cores时钟慢2.5倍。
你可以通过使用Open New Hardware Target向导或以下Tcl命令来修改JTAG频率:
set_property PARAM.FREQUENCY 250000 [get_hw_targets */xilinx_tcf/Digilent/210203327962A]
Debug Hub Clock - Vivado Debug Hub内核,它在FPGA器件的JTAG边界扫描(BSCAN)接口和Vivado Debug core之间提供一个接口。如果Vivado IDE在设计实现步骤中检测到debug cores,则会自动插入Debug Hub core。Vivado IDE在设计实现步骤中选择驱动Debug Hub core的时钟。
确保为ILA核选择的时钟是自由运行的时钟。如果不这样做,可能会导致在设计被加载到设备上时,无法与debug core进行通信。可以使用connect_debug_port Tcl命令来将debug hub的clk引脚连接到一个自由运行的时钟上。
在添加debug cores之前,关闭设计上的timing。赛灵思不建议使用debug cores来调试与时序有关的问题。
如果你仍然注意到由于添加了ILAdebug cores而导致的时序下降,并且关键路径在dbg_hub中请执行以下步骤:
a. 打开synthesized design。
b. 在网表中找到dbg_hub cell 。
c. 转到dbg_hub的属性,右键选择cell properties。
d. 找到属性C_CLK_INPUT_FREQ_HZ。
e. 把它设置为连接到dbg_hub的时钟的频率(单位:Hz)。
f. 找到属性C_ENABLE_CLK_DIVIDER并启用它。
g. 重新实现设计。
确保ILA核心的输入时钟与被探测的信号是同步的。如果不这样做,当设计被编入调试核心时,会导致时序问题和与调试核心的通信失败。
设计被编程到设备中时,就会导致时序问题和与调试核心的通信失败。在硬件上运行设计之前,要确保设计符合时序。如果不这样做,导致不可靠的结果。
赛灵思建议Debug Hub的时钟频率在100MHz左右或更低,因为 JTAG的时钟速度不需要特别高的频率。
你可以使用下面的TCL命令改变Debug Hub的时钟。
connect_debug_port dbg_hub/clk [get_nets [list clk ]]
注意:你需要在设计被综合后,但在实现(implementation)前运行这个命令。
你也可以使用下面的TCL命令将implementation的时钟频率降低到100MHz。命令。
set_property C_CLK_INPUT_FREQ_HZ 200000000 [get_debug_cores dbg_hub)
set_property C_ENABLE_CLK_DIVIDER true [get_debug_cores dbg_hub] 。
注意:你需要在设计被综合后,但在实现前运行这个命令。对于有非常高速度的时钟的设计,建议这样做。这条命令使得在Debug Hub core 中加入一个基于MMCM的时钟分频器,以达到100MHz的时钟频率。
5.3.2 Debug Core时钟
Vivado IP目录中的所有调Debug Core都需要一个时钟,以确保与被监测的输入探头或被Debug Core驱动的任何输出信号同步。。在内核发现和调试测量阶段,希望时钟是自由运行和稳定的。也希望时钟能与被监测或驱动的信号同步。如果不这样做,可能会导致周期不准确的数据。
Debug Hub IP在主机(通过支持串行接口的BSCAN基元)和芯片上的debug cores(通过支持并行接口的XSDB接口)之间建立桥梁。BSCAN基元的时钟将数据以串行方式进出芯片并传送给Debug Hub IP,Debug Hub IP收集数据并使用Debug Hub的时钟将其发送到并行接口上的所有Debug Core。如果任何一个debug core的时钟不能自由运行或不稳定,我们最终会得到损坏的数据,导致 "未检测到debug core "的消息。为了避免任何数据的损坏,在debug core检测过程中,确保JTAG时钟和debug core时钟稳定和自由运行是很重要的。
- 调试中心的时钟必须是自由运行和稳定的。赛灵思建议时钟由时钟驱动器驱动,该驱动器有适当的约束,其时序符合要求。
- 如果时钟由MMCM/PLL驱动,在进行任何debug core测量之前,确保MMCM/PLL的LOCKED信号为高电平。如果时钟被连接到调试中心 如果时钟被连接到Debug Hub或任何一个debug cores,并且MMCM/PLL LOCKED信号在调试操作的过程中转变为0,那么时钟就会在调试操作的过程中转变为0。则时钟可能有明显的抖动,可能会导致调试逻辑的不可预知的行为。
- 为了检测debug cores,使用这些核心进行测量并捕获数据。需要让所有相关的时钟自由运行和稳定。
- Free running clock是指,上电以后无条件运行的时钟,比如晶振,上电以后就开始起震,不需要额外的附加条件限制,vivado锁相环pll输出的时钟,这个时候除了要满足上电以外,还需要pll没有被复位,而且输入时钟倍频后的vco在一定范围内,等诸多限制条件的满足,clk才能正常输出,所以PLL输出时钟就不是Free running clock,但经过实际测试,vivado的锁相环pll输出的时钟是可以作为逻辑分析仪ila的采样时钟的,如下图所示。同时也需要确保ila的时钟频率不能太小下述工程中的ila采样时钟为20MHz。
5.3.3 Vivado Hardware Manager 时钟相关错误消息
如果 JTAG 时钟处于非活动状态或不可用,您将无法连接到硬件目标。
如果Debug Hub时钟不活动或不可用,Vivado Hardware Manager会发出以下错误消息:
INFO: [Labtools 27-1434] Device xxx (JTAG device index = 0) is programmed with a design that has no supported debug core(s) in it.
WARNING: [Labtools 27-3123] The debug hub core was not detected at User Scan Chain 1 or 3.
解决方法:
1. 确保连接到调试集线器 (dbg_hub) 内核的时钟是自由运行时钟并且处于活动状态。
2. 使用 -e "set xsdb-user-bscan <C_USER_SCAN_CHAIN scan_chain_number>"; 手动启动 hw_server 以检测debug hub位于 2 或 4 的用户扫描链。要确定用户扫描链设置,请打开已实现的设计并使用:get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub]。
如果任何Debug Core时钟不活动或不可用,Vivado Hardware Manager会发出以下错误消息:
INFO: [Labtools 27-2302] Device xxx (JTAG device index = 1) is programmed with a design that has 1 ILA core(s).
CRITICAL WARNING: [Labtools 27-1433] Device xxx (JTAG device index = 1) is programmed with a design that has an unrecognizable debug core (slave type = 17) at user chain = 1, index = 0.
解决方案:
1) 确保连接到debug core和/或debug hub的时钟信号干净且自由运行。
2) 确保连接到debug core和/或debug hub的时钟满足所有时序约束。
3) 确保连接到debug core和/或debug hub的时钟比 JTAG 时钟频率快。
Debug Core 时钟举例
该调试网络的时钟拓扑如下。将设计编程到器件中后,Vivado Hardware Manager会尝试发现设计中是否存在 Debug Hub core。Debug Hub依次尝试发现并解释与其连接的所有Debug Hub core.。在此设计中,Debug core是 ILA“A”和 ILA“B”。请注意,CLKA 驱动 ILA“A”和Debug Hub core.。 CLKB 驱动 ILA“B” Debug core.。
当您连接到目标并对器件进行编程时,我们期望有一个活动的 JTAG clk。在Debug core发现阶段,我们期望一个自由运行且稳定的时钟驱动Debug Hub core,在本例中为 CLKA。在调试内核测量阶段(即任何涉及在Debug core上获取/设置属性的任何事情),我们期望有一个活动的 JTAG、调试集线器和调试内核时钟。如果我们期望在 ILA“B”上触发和捕获数据,我们期望自由运行和稳定的 JTAG、Debug Hub (CLKA) 和Debug Core (CLKB) 时钟。
5.4 在硬件中调试逻辑设计
在设计中拥有debug cores后,您可以使用运行时逻辑分析仪功能在硬件中调试设计。使用 Vivado 逻辑分析仪调试设计。要访问 Vivado 逻辑分析仪功能,请单击 Flow Navigator 的 Program and Debug 部分中的 Open Hardware Manager 按钮。下面给出使用 ILA 调试内核在硬件中调试设计的步骤。
5.4.1 FPGA器件编程
连接到hardware target并使用.bit 文件对 FPGA 器件进行编程:连接到硬件目标和对 FPGA 器件进行编程,在调试之前对 FPGA 器件进行编程与对 FPGA 器件进行编程中描述的步骤完全相同。
使用包含新 ILA、VIO 和 JTAG-to-AXI 主调试内核的 .bit 文件对器件进行编程后,硬件窗口现在会显示在扫描器件时检测到的debug core。
5.4.2 Default Dashboards
在刷新硬件设备时检测到debug core时,会自动打开每个调试内核的Default Dashboards。
每个Default Dashboards都包含为其创建仪表板的debug core相关的窗口。
为 ILA 调试核心创建的默认仪表板包含五个窗口:
•Settings window •Status window •Trigger Setup window •Capture Setup window
•Waveform window
5.4.3 设置 ILA 调试内核触发和捕获控制
5.4.4 使用基本触发模式
使用基本触发模式来描述触发条件,它是参与调试探针比较器的全局布尔方程。当触发模式设置为 BASIC_ONLY 或 BASIC_OR_TRIG_IN 时,将启用基本触发模式。 使用 Basic Trigger Setup 窗口创建此触发条件并调试探头比较值。
Basic Trigger Setup 窗口
您还可以使用 set_property Tcl 命令更改 ILA 内核的触发模式。
例如,要将 ILA 内核 hw_ila_1 的触发模式更改为 BASIC_ONLY,请使用以下命令:
set_property CONTROL.TRIGGER_MODE BASIC_ONLY [get_hw_ilas hw_ila_1]
- 布防 ILA 调试内核触发器。
将探针添加到基本触发设置窗口:使用基本触发模式的第一步是确定要参与触发条件的 ILA 调试探针。通过从 Debug Probes 窗口中选择所需的 ILA 调试探针并右键单击选择 Add Probes to Basic Trigger Setup或将探头拖放到基本触发设置窗口中来执行此操作。
注意:您可以将第一个探头拖放到 Basic Trigger Setup 窗口中的任何位置,但您必须将第二个和后续探头放在第一个探头的顶部。新探针始终添加在表中先前添加的探针之上。您也可以通过使用拖放操作这种方式在表格中重新排列探针。
您可以通过选择探头并按 Delete 键或右键单击选择“删除”选项,从“基本触发设置”窗口中删除探头。
重要提示:只有 Basic Trigger Setup 窗口中的探头才会参与触发条件。 不在窗口中的任何探测器都设置为“无关”值,并且不用作触发条件的一部分。
设置基本触发比较值
使用 ILA 调试探针触发比较器检测 ILA 内核的探针输入上的特定相等或不相等条件。 触发条件是对每个 ILA 探针触发比较器结果进行布尔“AND”、“OR”、“NAND”或“NOR”计算的结果。 要指定给定 ILA 探针的比较值,请在 Basic Trigger Setup 窗口中选择给定 ILA 调试探针的 Value 单元格以打开。
设置基本触发条件 您可以使用基本触发设置窗口左侧的工具栏按钮设置触发条件,该按钮上有一个逻辑门形状的图标。
还可以使用 set_property Tcl 命令更改 ILA 内核的触发条件:
set_property CONTROL.TRIGGER_CONDITION AND [get_hw_ilas hw_ila_1]
重要提示:如果 ILA 内核有两个或更多调试探针连接在一起以共享 ILA 内核的单个物理探针端口,则仅支持“全局与”(AND) 和“全局 NAND”(NAND) 触发条件设置 . 由于探头端口比较器逻辑的限制,不支持“全局或”(OR)和“全局或”(NOR)功能。 如果要使用“全局或”(OR)或“全局或”(NOR)触发条件设置,请确保将每个唯一网络或总线网络分配给 ILA 内核的单独探针端口。
5.4.5 使用高级触发模式
ILA 内核可在内核生成或插入时配置为具有高级触发功能,包括以下特性:
• 触发状态机最多包含 16 个状态。
• 每个状态可以由单向、二向或三向条件分支组成。
• 在触发状态机程序中最多可以使用四个计数器来跟踪多个事件。
• 在触发状态机程序中最多可以使用四个标志来指示何时采用某些分支。
• 状态机可以执行“goto”、“trigger”以及各种与计数器和标志相关的动作。
如果在硬件设备中运行的设计中的 ILA 内核具有高级触发功能,则可以通过将 ILA Dashboard 的 ILA 属性窗口中的触发模式控件设置为:
ADVANCED_ONLY 或 ADVANCED_OR_TRIG_IN 来启用高级触发模式功能。
指定触发状态机程序文件
当您将触发模式设置为 ADVANCED_ONLY 或 ADVANCED_OR_TRIG_IN 时,ILA 仪表板中会发生两个变化:
1. ILA 属性窗口中出现一个称为触发状态机的新控件
2. 基本触发设置窗口被替换 通过触发状态机代码编辑器窗口。
如果您是第一次指定 ILA 触发状态机程序,触发状态机代码编辑器窗口将如下图所示。
要创建新的触发器状态机,请单击 Create new trigger state machine 链接,否则单击 Open existing trigger state machine 链接以打开触发器状态机程序文件(.tsm 扩展名)。 您还可以使用 ILA 仪表板的 ILA 属性窗口中的触发状态机文本字段和/或浏览按钮打开现有的触发状态机程序文件。
- 在波形窗口中查看从 ILA 调试内核捕获的数据。
5.4.6 运行触发
您可以在两种不同的模式下运行或启用 ILA 内核触发器:
• 运行触发Run Trigger::选择要启用的 ILA 内核,然后单击 ILA 仪表板或硬件窗口工具栏上的运行触发器按钮来启用 ILA 内核 检测由 ILA 核心基本或高级触发设置定义的触发事件。
• Run Trigger Immediate:选择要准备的 ILA 核心,然后单击 ILA 仪表板或硬件窗口工具栏上的 Run Trigger Immediate 按钮,无论 ILA 核心触发设置如何,都可以立即触发 ILA 核心。此命令可用于通过捕获 ILA 内核的探针输入处的任何活动来检测设计的“活跃性”。您还可以通过选择并右键单击 ILA 内核并从弹出菜单中选择 Run Trigger 或 Run Trigger Immediate 来武装触发(见下图)。
Stop Trigger:可以通过选择适当的 ILA 内核,然后单击 ILA 仪表板或硬件窗口工具栏上的停止触发按钮来停止 ILA 内核触发。 您还可以通过选择并右键单击适当的 ILA 内核并从弹出菜单中选择停止触发来停止触发(参见图 11-30)。
使用 Auto Re-Trigger:在ILA核心上选择启用自动重新触发(Enable Auto Re-Trigger)的右键菜单选项(或ILA仪表板工具栏上的相应按钮),以使Vivado IDE能够在成功 触发+上传+显示操作完成后,自动重新设置ILA核的触发。
每次成功触发事件时,都会覆盖显示在与 ILA 内核对应的波形查看器中的捕获数据。Auto Re-Trigger 选项可与 Run Trigger 和 Run Trigger Immediate 操作一起使用。单击停止触发可停止当前正在进行的触发。
提示:可以通过选择所需的 ILA 内核,然后使用硬件窗口工具栏中的运行触发器、立即运行触发器或停止触发器按钮来运行或停止多个 ILA 内核的触发器。
还可以通过在硬件窗口中选择设备并单击硬件窗口工具栏中的相应按钮来运行或停止给定设备中所有 ILA 内核的触发。
在波形查看器中查看来自ILA核心的捕获的数据:
一旦ILA核捕获的数据被上传到Vivado IDE,它就会显示在波形浏览器中。在波形查看器中查看ILA探针数据,了解使用波形查看器查看ILA核心捕获数据的详情。
使用波形ILA触发和导出功能
您可以使用波形窗口中的图标来武装ILA并运行触发器,停止触发。和导出ILA数据,如下图所示。
Enable Auto Re-Trigger:选择 Waveform 窗口工具栏上的 Enable Auto Re-Trigger 按钮,使 Vivado IDE 在成功触发 + 上传 + 显示操作完成后自动设置与 Waveform 窗口触发关联的 ILA 内核。每次成功触发事件时,都会覆盖显示在与 ILA 内核对应的波形窗口中的捕获数据。 Auto Re-Trigger 选项可与 Run Trigger 和 Run Trigger Immediate 操作一起使用。单击停止触发按钮以停止当前正在进行的触发。
Run Trigger运行触发:启动与波形窗口关联的 ILA 内核,以检测由 ILA 内核基本或高级触发设置定义的触发事件。
Run Trigger Immediate立即运行触发:使与波形窗口关联的 ILA 核心立即触发,而不管 ILA 核心触发设置如何。 此命令可用于通过捕获 ILA 内核的探针输入处的任何活动来检测设计的“活跃性”。
Stop Trigger停止触发:停止与波形窗口关联的 ILA 的 ILA 核心触发。
5.4.7 导出 ILA 数据
从 ILA 核心捕获数据并将其保存到文件中。 可以以本机、.csv 或 .vcd 格式捕获数据。 单击波形窗口工具栏上的此图标时,将出现以下对话框。
ILA 核心是要为其导出数据的 ILA 调试核心的名称。 格式是从 Native、CSV 和 VCD 格式中选择的一种格式。
• 原生格式配置write_hw_ila_data 命令以原生ILA 格式导出ILA 数据。可以将该 ILA 文件导入回 Vivado IDE,以便您查看之前捕获的 ILA 数据。read_hw_ila_data TCL 命令可用于将 ILA 数据重新导入 Vivado IDE,如下例所示:
read_hw_ila_data {./iladata.ila}
display_hw_ila_data
CSV 格式配置 write_hw_ila_data 命令以 .csv 文件的形式导出 ILA 数据,该文件可用于将数据导入电子表格或第三方应用程序。
VCD 文件格式配置 write_hw_ila_data 命令以 .vcd 文件的形式导出 ILA 数据,该文件可用于导入第三方应用程序或查看器。
重要提示:虽然 ILA 数据可以 CSV、VCD 和原生 ILA 格式导出,但只能将原生 ILA 格式导入 Vivado。 此外,导入 Vivado 的原生 ILA 数据仅支持离线查看以前捕获的数据。 探测信号不能用于触发等其他用途。
5.4.8 从 ILA 内核保存和恢复捕获的数据
除了显示直接从 ILA 内核上传的捕获数据之外,您还可以将捕获的数据写入文件,然后从文件中读取数据并在波形查看器中显示。
将捕获的 ILA 数据保存到文件:目前,从 ILA 内核上传捕获的数据并将其保存到文件的唯一方法是使用以下 Tcl 命令: write_hw_ila_data my_hw_ila_data_file.ila [upload_hw_ila_data hw_ila_1]
此 Tcl 命令序列上传捕获的数据 来自 ILA 核心并将其写入名为 my_hw_ila_data_file.ila 的存档文件。
存档文件包含波形数据库文件、波形配置文件、波形逗号分隔值文件和调试探针文件。
提示:使用 -csv_file 选项生成逗号分隔值 (CSV) 文件。 这将 write_hw_ila_data 命令配置为以 CSV 文件的形式导出 ILA 数据,该文件可用于导入电子表格或第三方应用程序,而不是默认的二进制 ILA 文件格式。
提示:使用 -vcd_file 选项生成值更改转储 (VCD) 文件。 这将 write_hw_ila_data 命令配置为以可用于导入第三方应用程序或查看器的 VCD 文件的形式导出 ILA 数据,而不是默认的二进制 ILA 文件格式。
探针数据基数
每个探针都有一个与之关联的 DISPLAY_RADIX 属性。默认情况下,对于多位探针,此属性设置为 HEX,对于一位探针,此属性设置为 BINARY。.csv 文件中导出的探针数据使用探针基数。
5.5 ILA失败情景
5.5.1 没有波形窗口
WARNING: [Labtools 27-3123] The debug hub core was not detected at User Scan Chain 1 or 3.
Resolution:
1. Make sure the clock connected to the debug hub (dbg_hub) core is a free running clock and is active OR解决方法:查看 ILA 的时钟,如果不是自由时钟会出现这种问题,
2. Manually launch hw_server with -e "set xsdb-user-bscan " to detect the debug hub at User Scan Chain of 2 or 4. To determine the user scan chain setting, open the implemented design and use: get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub].
WARNING: [Labtools 27-1974] Mismatch between the design programmed into the device xc7z010_1 and the probes file
6. FPGA实现
opt design place design route design
6.1 生成比特流
在生成比特流数据文件之前,检查比特流设置以确保适合设计需求。Vivado中有两种类型的比特流设置: 1. 比特流文件格式设置。 2器件配置设置。
在 Vivado Flow Navigator中选择 Settings > Bitstream 或 Flow > Settings > Bitstream Settings... 菜单选择以打开Settings弹出窗口中的 Bitstream 部分。比特流设置正确后,可以使用write_bistream Tcl命令或使用Vivado流程导航器中的Generate Bitstream按钮生成比特流数据文件。z
6.1.1 更改比特流文件格式设置
默认情况下,write_bitstream Tcl 命令仅生成二进制比特流 (.bit)文件。您可以选择使用以下命令选项更改write_bitstream Tcl 命令写出的文件格式:
•-raw_bitfile:(可选)此开关导致write_bitstream生成原始位文件 (.rbt),该文件包含与二进制比特流文件相同的信息,但为ASCII 格式。输出文件名为 filename.rbt。
• -mask_file:(可选)编写掩码文件(.msk),其中包含掩码数据,其中配置数据位于比特流文件中。该文件确定应将比特流中的哪些位与回读数据进行比较以进行验证。如果掩码位为 0,则应根据比特流数据验证该位。如果掩码位为 1,则不应验证该位。输出文件名为file.msk。
• -no_binary_bitfile:(可选)不要写入二进制比特流文件(.bit)。当您想要生成ASCII比特流或掩码文件,或者要生成比特流报告而不生成二进制比特流文件时,请使用此命令。
• -logic_location_file:(可选)创建一个ASCII 逻辑位置文件(.ll),显示锁存器、触发器、LUT、块RAM 和I/O 块输入和输出的比特流位置。位由位置文件中的帧和位号引用,以帮助您观察 FPGA 寄存器的内容。 • -bin_file:(可选)创建一个仅包含器件编程数据的二进制文件(.bin),没有标准比特流文件(.bit) 中的标头信息。
• -reference_bitfile <arg>:(可选)读取参考比特流文件,并输出仅包含与指定参考文件差异的增量比特流文件。此部分比特流文件可用于对具有更新设计的现有设备进行增量编程。
6.1.2 更改器件配置比特流设置
您可以更改的最常见的配置设置属于设备配置设置类别。这些设置是器件模型上的属性,您可以使用 Edit Device Properties 对话框为选定的综合或实现的设计网表更改它们。以下步骤描述了如何使用此方法设置各种比特流属性:
1. Select Tools > Edit Device Properties
2. 在 Edit Device Properties 对话框中,选择左侧栏中的类别之一(参见下图)
3. 将属性设置为所需的值,然后单击“确定”。
4. 选择 File > Save Constraints 将更新的属性保存到目标 XDC 文件。
您还可以使用 XDC 文件中的 set_property 命令设置比特流属性。 例如,以下是有关如何更改启动 DONE 周期属性的示例:
set_property BITSTREAM.STARTUP.DONE_CYCLE 4 [current_design]
Vivado 模板中提供了其他示例和模板。 附录 A,设备配置比特流设置描述了所有设备配置设置。
重要提示:仅编辑与正在使用的配置模式相关的设备配置比特流设置。 将其他设置保留为默认值
6.1.3 BITSTREAM配置
在xdc文件中配置
BITSTREAM.CONFIG.SPI_BUSWIDTH :默认值为NONE, 可配置值为1, 2, 4
将 SPI 总线设置为双 (x2) 或四 (x4) 模式,以便从第三方 SPI 闪存设备进行主 SPI 配置。
BITSTREAM.CONFIG.CONFIGRATE:默认值为3,可配置值为3, 6, 9, 12, 16, 22, 26, 33, 40, 50, 66。
在主模式下配置时,使用内部振荡器生成配置时钟 Cclk。 使用此选项选择 Cclk 的速率
6.1.4 对FPGA器件进行编程
生成比特流数据编程文件后的下一步是将其下载到目标FPGA器件中。Vivado Design Suite允许连接到包含一个或多个FPGA器件的硬件以对这些FPGA器件进行编程和交互的功能。可以从Vivado Design Suite 图形用户界面或使用 Tcl 命令连接到硬件。在任何一种情况下,连接硬件和对目标 FPGA 器件进行编程的步骤都是相同的:
1. 打开硬件管理器。
2. 打开一个由运行在主机上(host computer)的hardware server管理的hardware target。
3. 将比特流数据编程文件与适当的 FPGA 器件相关联。
4. 编程或下载编程文件到硬件设备中。
6.1.5 打开硬件管理器(Hardware Manager)
打开硬件管理器是在硬件中编程和/或调试设计的第一步。要打开硬件管理器,请执行以下操作之一:
•如果您打开了一个项目,请单击Vivado flow navigator的Program and Debug部分中的Open Hardware Manager按钮。
•选择Flow > Open Hardware Manager。
•在Tcl Console窗口中,运行 open_hw 命令
6.1.6 打开硬件目标连接(Hardware Target Connections)
打开硬件目标(hardware target)(例如,包含一个或多个 FPGA 设备的JTAG链的硬件板)的下一步是连接到硬件服务器hardware server, 硬件服务器主要用于管理与硬件目标(hardware target)连接的部分。您可以通过以下三种方式之一执行此操作:
•使用 Vivado Flow Navigator 的 Program and Debug 部分的 Hardware Manager 下的 Open Target 选项打开新的或最近的硬件目标。
•使用Hardware Manager 窗口顶部绿色用户帮助横幅上的 Open Target ->Recent targets 或 Open Target -> Open New Target 选项分别打开最近或新的硬件目标。
使用 Tcl 命令打开到硬件目标的连接。
6.1.7 使用hw_server 连接到硬件目标
当连接到本地计算机上的目标时,hw_server由Vivado 自动启动。但是,您也可以在本地或远程计算机上手动启动hw_server。例如,在 Windows平台上的完整 Vivado安装中,在cmd提示符下运行以下命令:
C:\Xilinx\Vivado\<Vivado_version>\bin\hw_server.bat 如果您在Windows 平台上,在cmd提示符处运行以下命令: c:\Xilinx\HWSRVR\<Vivado_version>\bin\hw_server.bat 按照下一节中的步骤使用此代理打开与新硬件目标的连接。
重要信息:如果Vivado Hardware Manager连接到hw_server,并且hw_server已停止,Hardware Manager会自动检测到这种情况并断开与服务器的连接
6.1.7.1 打开新硬件目标
打开新硬件目标向导为您提供了一种交互方式来连接到硬件服务器和目标。向导过程有以下步骤
- 选择本地或远程服务器,具体取决于您的硬件目标连接到的机器:
• 本地服务器:如果您的硬件目标连接到运行Vivado IDE ( 请参见图 4Vivado 软件会自动在本地计算机上启动 Vivado 硬件服务器 (hw_server) 应用程序。
•远程服务器:如果您的硬件目标连接到另一台运行Vivado IDE 的计算机,则使用此设置。 指定远程机器的主机名或 IP 地址以及在该机器上运行的硬件服务器 (hw_server) 应用程序的端口号(参见图 4-4)。 有关远程调试的更多详细信息,请参阅第 228 页的连接到在实验室机器上运行的远程 hw_server