1、一口吃不成一个胖子FPGA 学习之目录1杂记 31.1 FPGA 中未赋初值寄存器的值 31.2 关于 initial 在仿真中的应用 31.3 仿真程序控制的变量 .31.4 错误汇总 .31.5 Inout 口的编写办法 31.6 Component 相当于 assign 不能用在什么 always 模块中 .71.7 If-else 不完全配套时 71.8 X 实际上是 0.71.9 关于 BRAM(BLOCK RAM) .71.10 一个 FPGA 设计最大能工作的频率 71.11 DCM 不能直接接管脚?输出一般要先过一个 buf 再输出? 81.12 FPGA 中不同 BANK 区
2、别?DSP 概念?BUFG? 81.13 全局时钟只能跑一半?DCM 输出时钟一般能跑 1/4 整芯片? .81.14 把 F68013_PC_FPGA 程序最大工作频率提高,方法: 81.15 单词翻译 .91.16 时序报告解读及解决 91.17 关于 FPGA Editor 101.18 未用管脚电平设置 112关于 Chip Scop112.1 简介 112.2 关于常用核 122.3 重要操作 .132.4 缺点 .132.5 使用说明 .133 Modesim 与 ISE 联合仿真 .13一口吃不成一个胖子3.1 安装方法,照下面操作即可实现联合仿真 .133.1.1 安装注意事项
3、 143.2 主要的优点 .143.2.1 关于波形比较 143.2.2 数据流窗口调试 153.2.3 代码覆盖率,这功能不错 154. BUFG,IBUFG,BUFGP,IBUFGDS 等含义以及使用 164.1 全局时钟资源的使用方法(五种) .174.2 全局时钟资源的例化方法 .184.3 详解 IBUFG/IBUFGDS+BUFG 用法 185 I2C 网上程序精读(尽快抽空) .185.1 关于上复位 .18一口吃不成一个胖子FPGA 设计1杂记1.1 FPGA 中未赋初值寄存器的值在硬件平台中,当系统上电后,信号电平不是 1 就是 0,不会存在 X,因此,设计中用到的寄存器如果
4、在没有初始化的情况下,在不同的平台上,其初始状态是不一定的,存在两种可能全 0 或者全 1,而在 XILINx 公司的 FPGA/CPLD 上,默认为 0。1.2 关于 initial 在仿真中的应用在实验中发现,硬件输出分频器已经获得了成功,但是仿真的结果却始终不对,老是输出 X。原因如下:在不同的平台中,未赋于初值的寄存器的初始值不一样。一般情况下有人加一个复位信号,这个信号用来对未赋值的信号进行下初始等初始操作,但是,有时不用。这时,我们就必须要加个 initial 语句,虽然它是不可综合的,但是,在仿真操作时会对未赋值变量赋于一个初值。这时仿真才可以正确的运行。1.3 仿真程序控制的变
5、量还要注意一点在仿真程序中,只能控制的是输入变量,而原程序中的中间变量和输出变量都不是受人工控制的。1.4 错误汇总Cannot mix blocking and non blocking assignments on signal i这种错误一般是因为程序中变量 i 阻塞和非阻塞一起使用了,解决的办法不要只看报错的那一行,而是要把这个变量的上下文全找一下,是否有混合使用的地方。 Always 程序块能够直接在符号后面放置字符*,在这种情况下,模拟器创建一个隐含的灵敏度列表,它包含了所有可能会影响到过程语句产生结果的那些信号。而同时,一个不完全灵敏度列表的“组合逻辑”其行为将具有时序特性。就是
6、把所有的输入的变量全列进去。1.5 Inout 口的编写办法一口吃不成一个胖子下面是在网上找的一篇资料,是一个关于 IO 口的程序及测试程序的书写的完整例子。不错先谈下自己的体会:首先,IO 口要做为输出口时,此时一定要用 assign 语句让 IO 口输出高阻态。在做测试程序时,也要用到 assign 但是,assign 里面的判断语句的符号要反过来。其中 inner_port 与芯片内部其他逻辑相连,outer_port 为芯片外部管脚, out_en 用于控制双向端口的方向,out_en 为 1 时,端口为输出方向,out_en 为 0 时,端口为输入方向。assign a = ( (s
7、2:0!=4)? ibus : 8bz;如上原程序中 s 为 4 时输出高阻,同时 IO 口为输入,不为 4 时,为输出。则对应测试程序为:assign a = ( (s2:0=4)? a_t : 8bz;可以发现 s 为 4 时,a 口数据为 a_t,也就是假定的外界的输入,此时 a 口为输入口。S 不为 4 时,为高阻态,与原程序中比较不难发现其实相当于 Zinput out_en;inout7:0 inner_port;inout7:0 outer_port;assign outer_port=(out_en=1)?inner_port:8hzz;assign inner_port=(o
8、ut_en=0)?outer_port:8hzz;endmodule用 VHDL 语言描述双向端口如下:library ieee;use IEEE.STD_LOGIC_1164.ALL;entity bidirection_io isport ( inner_port : inout std_logic_vector(7 downto 0);out_en : in std_logic;outer_port : inout std_logic_vector(7 downto 0) );end bidirection_io; architecture behavioral of bidirecti
9、on_io isbegin一口吃不成一个胖子outer_portZ);inner_portZ);end behavioral;仿真时需要验证双向端口能正确输出数据,以及正确读入数据,因此需要驱动 out_en 端口,当 out_en 端口为 1 时,testbench 驱动 inner_port 端口,然后检查 outer_port 端口输出的数据是否正确;当 out_en端口为 0 时,testbench 驱动 outer_port 端口,然后检查 inner_port 端口读入的数据是否正确。由于 inner_port 和 outer_port 端口都是双向端口(在 VHDL 和 Veri
10、log 语言中都用 inout 定义) ,因此驱动方法与单向端口有所不同。这是一个 self-checking testbench,可以自动检查仿真结果是否正确,并在 Modelsim 控制台上打印出提示信息。图中 Monitor 完成信号采样、结果自动比较的功能。testbench 的工作过程为1)out_en=1 时,双向端口处于输出状态,testbench 给 inner_port_tb_reg 信号赋值,然后读取 outer_port_tb_wire 的值,如果两者一致,双向端口工作正常。2)out_en=0 时,双向端口处于输如状态,testbench 给 outer_port_tb
11、_reg 信号赋值,然后读取 inner_port_tb_wire 的值,如果两者一致,双向端口工作正常。用 Verilog 代码编写的 testbench 如下,其中使用了自动结果比较,随机化激励产生等技术。timescale 1ns/10psmodule tb();reg7:0 inner_port_tb_reg;wire7:0 inner_port_tb_wire;reg7:0 outer_port_tb_reg;wire7:0 outer_port_tb_wire;reg out_en_tb;integer i;initialbeginout_en_tb=0;inner_port_tb
12、_reg=0;outer_port_tb_reg=0;i=0;repeat(20)begin #50i=$random;out_en_tb=i0; /randomize out_en_tbinner_port_tb_reg=$random; /randomize dataouter_port_tb_reg=$random;end end/* drive the ports connecting to bidirction_io一口吃不成一个胖子assign inner_port_tb_wire=(out_en_tb=1)?inner_port_tb_reg:8hzz;assign outer_
13、port_tb_wire=(out_en_tb=0)?outer_port_tb_reg:8hzz;/instatiate the bidirction_io modulebidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),.out_en(out_en_tb),.outer_port(outer_port_tb_wire);/* monitor *always(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)begin#1;if(outer_port_tb_wire
14、=inner_port_tb_wire) begin$display(“n * time=%t *“,$time);$display(“OK! out_en=%d“,out_en_tb);$display(“OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d“,outer_port_tb_wire,inner_port_tb_wire);endelsebegin$display(“n * time=%t *“,$time);$display(“ERROR! out_en=%d“,out_en_tb);$display(“ERROR! outer_po
15、rt_tb_wire != inner_port_tb_wire“ );$display(“ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d“,outer_port_tb_wire,inner_port_tb_wire);endendendmoduleYihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!1.6 Component 相当于 assign 不能用在什么 always 模块中1.7 If-else 不完全配套时有时会生成一个锁存器,以便 在 always 模块的
16、所有逻辑路径都没有给出赋值的情况下,用来保存前一个级联输出。由于这种情况不会发生,所以你可能认为没有什么损坏,但是扮演出锁存器会增加最后综合出来的电路规模和延迟,尽管你不需要这个锁存器。1.8 X 实际上是 0对某种情况的输出不关心时,就把把对应的输出设置为 x,而实际上 Xilinx HDL,编译器似乎把 X 输出当成 0,所以也不会提高设计电路的性能。1.9 关于 BRAM(BLOCK RAM)大多数 FPGA 都具有内嵌的块 RAM,这大大的拓展了 FPGA 的应用范围和灵活性,块 RAM 可被配置为单端口 RAM,双端口 RAM,内容地址存储器(CAM)以及FIFO 等常用存储结构。单
17、片块 RAM 的容量为 18Kbit,即位宽为 18bit,深度为 1024.可以根据需要改变其位宽和深度,但是要记住两个原则:首先,修改后的容量(位宽*深度)不能大于18Kbit;其次,位宽最大不能超过 36bit,当然可以将多片 RAM 级联起来形成更大的RAM,此时只受限于芯片内块 RAM 的数量,而不受上面的两条原则的约束。1.10 一个 FPGA 设计最大能工作的频率当添加时序约束后,用 constraints editor, 给时钟添加约束。然后布局布线,然后在报告文件中的 Timing constraint 中就可以直接看到你的设计是否能达到你的要求,以及最高能跑到多大的频率。而
18、同时,报告中还会给出不满足条件的线路中的延时情况。它主要是由最大延时路径来控制,而在 PlaneAhead 中可以直接看到最大延时路径的网络是哪些,也可以由条状图输出大部分网络的延时信息,从而你可以通过 Pblock 限定其布局布线的位置来进行约束后再布线,可能最后最大工作频率会有所提高。Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!1.11 DCM 不能直接接管脚?输出一般要先过一个 buf 再输出?1.12 FPGA 中不同 BANK 区别?DSP 概念?BUFG?1.13 全局时钟只能跑一半?DCM 输出时钟一般
19、能跑 1/4 整芯片?1.14 把 F68013_PC_FPGA 程序最大工作频率提高,方法:1. 给时钟添加约束,这样它跑的时候会对时钟相关线路特别对待,这样有利于提高最大工作时钟频率。实现完成后,在 design summary/reportstatic timing 中会给出不满足时钟约束要求的线路是哪些,同时会给出该设计支持的最大工作频率。2. 在此基础上还有可能提高设计最大工作频率:打开 Plane ahead-file-new project-specify synthesized(edif or ngc) netlist 导入 ISE 中设计的经过综合后的网表文件,并新建一个工程
20、。3. 进入 Plane ahead 后,可以 tools -creat multip runs 然后在根据提示一步步的创建该项目文件的多种实现方式。然后 implement4. 完成上面操作后,就可以对上面设定的多种实现的结果的每一种的实现情况进行查询了,从其报告文件中也可以发现其最大延时路径情况,同时还有它的最大能工作的频率。但是,如果上面的各种方案都不能满足你的要求的话。5. 找到最大延时路径:可以通过 slack histogram,打开延时条状图条状图中最高的那一条也就是本设计中的延时最长的关键路径了。选中对应路径。也可以通过 Timing result 直接看到未满足条件的结果。也
21、是选中未满足条件的路径。你可以选中该路径或者网络,右击选择 schematic,就会在打开这条去路的原理图,从而可以方便分析造成延时过大的原因。然后就可以在 Device 中看到你选中的那些路径了,这时,你可以通过画一个pblock 把对应这些关键路径的布局布线位置合理的分配,然后就再实现一次看看是否有所提高。针对这里我说下我的感受,TMD 试了 N 次,最后结果各不一样,时好时坏的,反正,这个 Pblock 的位置不好搞的很哪。这里要说明的是,好的设计是设计出来的,比如我本次程序的设计中就设计的很Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,
22、独立。工作:要努力,自信!差劲,在分频产生 19200 的时钟售的时候,用到了一个 integer 型的,计数达 6000 多的计数器,而计数器在实现的时候我感觉它是通过一个串行加法器来实现的,而这样做直接的结果就是经过了一大串的组合逻辑,最后才输出,而这样带来的组合逻辑延时,以及布线延时就很大了。要从根本上提高设计的工作频率应该从设计上下手。比如上个设计中我使用200M 的主时钟,经 DCM 后,时序报告中没有时序的警告或者不满足的地方,也即,让系统达到了 200M 的工作频率。1.15 单词翻译Slack :裕量Skew:偏移,时钟偏移时常用到这个词LVDS:Low-votage Diff
23、erential Signaling1.16 时序报告解读及解决时序原因一般三类:布局较差,逻辑级数过多,信号扇出过多。解决方法:布局较差:1 高速布线工具的努力程序2 利用布局布线工具的特别努力程序3 利用区域约束4 自用 FPGA EDITOR 优化布线,尽可能小地降低走线延迟逻辑级数过多:修改代码1 流水线技术,在组合逻辑中插入寄存器,简化原有的逻辑结构2 好的编码习惯,不要嵌套使用 IF 或者 IF case,尽量使用 CASE。信号扇出:1 通过逻辑复制的方法来降低信号的高扇出,可以 HDL 代码中手动复制或者通过在综合工具中设置来达到目的2 利用区域约束,把相关逻辑放在一起,当然本
24、方法限于高级用户结论:时序约束只是一个提高设计时序的辅助手段,有一定效果,但最终仍需设计人员通过Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!时序分析器的反馈结果来反复优化代码才能实现预期的目标。实验中我加入了一个 DCM 然后呢,每一级输入为 200M,DIV16 输出第一级 DCM,然后 DIV8 以及 FX11.54 输出。得到的静态报告如下:从上面可以看出:输入为 200M,且第一次 16 分步,时序要求都要求了条件。可以从上图看出,第一级 DCM 分步后最大频率能达到 50M,其中下面这边支路满足时钟条件,而
25、且时钟裕量非常大。77.87可以看出,该线路的扇出并不大,才 1,总延时为 1.417,其中逻辑延时较大,布线延时较小,如果有问题,应该集中搞搞逻辑延时,其逻辑级数应该比较深1.17 关于 FPGA EditorISE 中的实现工具提供了功能强大的自动布线功能,但在一些高级设计中,仍然需要对某些关键路径采用手动布线才能达到设计要求,FPGA editor 就是手动的底层布线功能工具,可以设计人员提供丰富的 FPGA 底层编辑器。现在用的上的,就是:1. 可以用来修改 CHIP scope 的 ILA 核的连线,而不用经过重新的编译以及布局布线,只需要在 FPGA editor 中重新配置即可。
26、Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!ToolsILA进行修改2. 可以用来添加探针:使设计人员快速鉴别和发送内部信号给未被占用的 IO 引脚。一旦信号发送给了引脚,通过外部测试设备就可以观察该内部信号的实时活动情况。Toolsprobsadd1.18 未用管脚电平设置在 ISE 中选中工程顶层文件后,在 genrate programming file 上点击鼠标右键,然后点击 properties 打开属性配置窗口,在窗口的左侧选择 configurate opinions,里面有一项 unused IOB
27、 pins 通过它右侧的下拉选项就可以选择对未使用的管脚进行处理了。2关于 Chip Scop2.1 简介http:/ ,教材在这里它可以将逻辑分析仪,总线分析器和虚拟 IO 等逻辑直接插入设计中,可查看任何内部信号,包括嵌入式软或硬件以及高速串行 IO 模块.PC 和芯片之间的 JTAG 通信电缆有一定的要求,目前支持:1. Platform Cable Usb2. Parallel Cable IV3. MultiPRO(JTAG Mode only)Chipscope 是 XILINX 推出的一款在线调试软件,价格便宜,通过它完全可以脱离传统逻辑分析仪(太贵)来调时序,观察 FPGA 内
28、部的任何信号,触发条件、数据宽度和深度等的设置也非常方便,但是肯定也存在不足,比如速度和数据量方面。Chipscope 本身是一个逻辑分析仪,主要用于在上板测试过程中采集并观察芯片内部信号,以便于调试。 它的原理是,在你综合完的网表里插入用于采集数据的 core(包括 ILA 和 ICON) ,插入的方式可以用 core inserter,也可以用 core generator,只不过后者需要在源代码中实例化。用 core inserter 更为快捷,基本上就是选择你要观察的信号以及触发源、时钟等,然后运行Yihua-computer-hound-liwang-68013-pc-FPGA做事:
29、要踏实,独立。工作:要努力,自信!之后会自动生成一个新的网表文件,再用这个网表在 ISE 里面进行布局布线,生成下载文件,通过 JTAG 方式下载到芯片里运行。在芯片运行的过程中,如果你选择的触发源发生跳变,或满足触发条件时,芯片里的 core 会将你要观察的信号采集并存储在芯片内的RAM(也可以是 FF)中,然后通过 JTAG 口将采集到的信号上载到 PC,最后在 PC 的chipscope analyzer 的界面中以波形的方式显示出来,因此你就能看到芯片里的信号波形。 我们平时都是使用 Chipscope 的 core inserter 方式来往我们的工程里面植入 Chipscope核。
30、凡事都是利弊相生的,XILINX 的 Chipscope core inserter 工具帮你便捷地把 core 植入到你的工程里面,那么存在一定的弊端,那就是编译时间被延长得很长,而且每次编译过程中,都会根据你的 cdc 工程文件重新生成一次 ICON、ILA 内核网表,再重新编译整个工程,那么编译时间就不可避免地被延长了。 所以,如果要采集到你所要的信号波形,首先是你的触发条件被满足。chipscope 不会去改变你的原始设计中的信号,只对他们作采集。 总结来说,chipscope 是利用植入 FPGA 的两个 core: ILA 和 ICON,利用 JTAG 数据线传回数据的方式来观察、
31、调试设计的。2.2 关于常用核CHIPSCOPEPRO 提供了 7 类不同的核资源,其中 ICON 核,ILA 核,VIO 核及 ATC2核获得了广泛应用。ICON 核(Integrated controller)所有的核都需要通过 JTAG 电缆完成计算机和芯片的通信,在 CHIPSCOP PRO 中,只有 ICON 核具备和 JTAG 边界扫描端口通信的能力,因此它是必不可少的核。ILA 核(Integrated logic analyzer)ILA 核提供触发和跟踪功能,根据用户设置的触发条件捕获数据,然后在 ICON 控制下,通过边界扫描口将数据传输到 PC 机上,最后在 ANALYZ
32、ER 中显示波形。VIO 核(Vitual input/output )虚拟输入、输出核用于实时监控和驱动 FPGA 内部的信号,可以观测 FPGA 设计中任意信号的输出结果,以及添加虚拟输入,如 DIP 开关,按键等。且不战胜块 RAM。ATC2 核(Angilent Trace )它由 xilinx 公司和 Aglient 合作开发,适配于 Agilent 最新一代的逻辑分析器,联合完成调试捕获,允许逻辑分析仪访问 FPGA 内部设计中任何一点人网表,提供更深的捕获深Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!度
33、。更复杂的捕获设置。它可以为每个信号提供 2MB 的捕获深度,是 ILA 深度的 60 倍,此外最多允许在 FPGA 内部添加 64 个观测信号组,和逻辑分析仪链接数据最多达 128 管脚。大的捕获深度以及多的观测信号对于查找设计故障原因是非常有用的。2.3 重要操作 综合工程后在 ISE 工程中右键 Add New Souce 选择 chipscope definition connection file Chipscope pro 只能分析 FPGA 设计的内部信号,因此不能直接连接输入信号的网表,所以输入信号网表全部以灰色表示。如果要采样输入信号,则可通过连接其输入缓冲信号来实现。时钟信
34、号选择相应的 BUFGP,普通信号选择相应的 IBUF.2.4 缺点经过使用后我觉得,其深度太浅,只能记录那么点数据(16384) ,还好,触发条件是可以自己控制的。2.5 使用说明Add new sourceChipScope definition and connection File输入文件名在工程中添加Chipscope双击打开该文件 配置 chipscope配置完后编译,布局布线打开Chipscope device config双击 trigger setup 运行就 OK 了3 Modesim 与 ISE 联合仿真3.1 安装方法,照下面操作即可实现联合仿真在生成 modesim.
35、ini 文件之前最好先把 EDITER-PREFERENCE-INTEGRATED TOOL 里面的综合工具的路径先修改了。1、 直接找到 E:Xilinx11.1ISEbinntcompxlib.exe(根据自己的安装路径来找) ,打开 compxlib.exe,一路默认确定即可.,这个很漫长,一开始一直是 0%,我还以为没有运行,后来等了好久,突然之间变成 9%,确信这个没有问题了,好像大概运行了半个多小时吧,才完事。没看无线通信 FPGA 设计这本书的时候我还以为这样就好了呢,调用Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:
36、要努力,自信!了一下发现还是找不到库。接下来是那本书上说的第二步2、 在 Xilinx 本地库编译成功之后,在相应的目录下会自动生成 modelsim.ini 文件,用任何一个文本编辑器将该文件中Library目录下(除 others 以外)的内容添加到硬盘上相应的另外的 Modelsim 安装目录下同名 modelsim.ini 文件中的相应 Library位置。我找了一下,发现 modelsim.ini 中没有 others,就直接把刚才生成的 modelsim.ini 直接复制到Modelsim 安装目录下了,将原来的 modelsim.ini 覆盖掉了, (为了安全起见,你可以先把Mo
37、delsim 安装目录下的 modelsim.ini 复制到另外的位置, )然后再 ISE 中调用了一下Modelsim,就好使了。注意;网上的那些新建库,然后编译库的那些方法,我都试了,可就是不好使,不知道为什么,有兴趣的话你可以试一下,说不定就好使了。反正我没有整好使。之后 的话就简单了,像在 ISE 中进行仿真一样。编好测试文件后,进入 simulatin 面板,你会惊喜的发现,突然低下不是 ISE 自己的仿真器了,而是 MODOLESIM,另外右边还多了几个仿真的选项前仿真,后仿真,或者其它。3.1.1 安装注意事项不知道为什么,我把 ISE12.1 中生成的 MODESIM.INI
38、直接覆盖或者修改到MODESIM 安装目录下时,12.1 总是不能正确的仿真。而 11.4 可以。更奇怪的是,我用 11.4生成的 MODESIM.INI 修改 MODESIM 安装目录下的该文件后,12.1 也可以用了。3.2 主要的优点晕了,ISE 自带的仿真工具和 MODSIM 中的仿真工具在仿真的速度上根本就不是一个等级,快了 N 倍,反正就是快多了。在较小的设计中或许 ISE 还能满足要求,如果设计复杂的话,MODESIM 的优点就太明显了。MODESIM 可能对仿真的处理更准确些,在针对 FPGA_68013 这个项目的仿真中,ISE的仿真中 START_T 信号是一串固定的,快速
39、变化的信号,但是呢,在 MODESIM 中它就是一根红线,表示不确定。而实际用示波器进行测试时其实也是不确定的,它的值可能多种变化 。上面的结论都是从一个项目中得出的,不一定准确。3.2.1 关于波形比较Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!按照 1 中把波形产生后,首先,对综合后波形进行存储为 WLF 文件,方法如下:FILE-DATASET-选中当前仿真文件 SIM(Vsim.wlf)-点击 save as-命名并保存之后布局,布线,之后再打开 MODESIM,进行比较,方法如下:Tools-wave co
40、mpare-compare wizard-设置完成后,TOOLS-Wave form compare-start comparison就可以看到其结果了,在结果中,相比较的两个波形不同的地方会用红色表示。3.2.2 数据流窗口调试其实我觉得没什么用,因为,看其数据图也看不出到底是哪的代码出了问题:先记录如下:以后再来深究数据流窗口的最大用途是用来进行信号跟踪,方便查找错误的根源所在,这在布局布线后仿真作用中非常明显。方法如下:1 通过 ISE 进入 MODESIM 仿真2 IEW-dataflow,打开数据流窗口后,3 还是要全速进行仿真,发现你感兴趣的信号后,双击,会在 dataflow 窗
41、口中出现一堆逻辑符号,之后你就可以 trace /chase x 一直查找到导制你的信号变成 X 的根源为止。3.2.3 代码覆盖率,这功能不错所谓的代码覆盖率,指的是 Modesim 能得到 statement(语句),branch(分支),condition(条件 ),expression(表达式) ,toggle(信号翻转),fsm( 有限状态机) 等多种条件下的覆盖率。1 通过 ISE 进入 MODESIM 仿真2 编译目标代码,在命令行输入以下命令Vlog cover bcsxf file1.v file2.v file3.v test.v其中“-cover bcsxf” 代表 mo
42、desim 执行 branck,condition,toggle,fsm 的覆盖统计操作。3 加载该程序,在命令行输入以下命令Vsim voptargs = ”+acc” coverage file1/file2/testYihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!之后运行代码就可以看到哪些代码运行了,哪些代码没有运行,而运行了的代码运行了多少次。4 view-object 查看翻转统计4. BUFG,IBUFG,BUFGP ,IBUFGDS 等含义以及使用目前,大型设计一般推荐使用同步时序电路。同步时序电路基于时钟
43、触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高的要求。为了满足同步时序设计的要求,一般在 FPGA 设计中采用全局时钟资源驱动设计的主时钟,以达到最低的时钟抖动和延迟。 FPGA 全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、I/O 单元 (IOB)和选择性块 RAM(Block Select RAM)的时延和抖动都为最小。为了适应复杂设计的需要,Xilinx 的 FPGA 中集成的专用时钟资源与数字延迟锁相环(DLL) 的数目不断增加,最新的 Virtex II 器件最多可以提供 16 个全局时钟输入端口和
44、8 个数字时钟管理模块(DCM) 。与全局时钟资源相关的原语常用的与全局时钟资源相关的 Xilinx 器件原语包括:BUFG、 IBUFGDS、BUFG、 BUFGP、BUFGCE、BUFGMUX、BUFGDLL 和 DCM 等1. IBUFG 即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过 IBUF 元,否则在布局布线时会报错。 IBUFG 支持AGP、CTT、GTL 、GTLP、HSTL、LVCMOS、LVDCI、 LVDS、LVPECL 、LVTTL 、PCI、PCIX 和 SSTL 等多种格式的 IO 标准。2. IBUFGDS 是
45、IBUFG 的差分形式,当信号从一对差分全局时钟管脚输入时,必须使用 IBUFGDS 作为全局时钟输入缓冲。IBUFG 支持BLVDS、LDT、LVDSEXT 、 LVDS、LVPECL 和 ULVDS 等多种格式的 IO 标准。3. BUFG 是全局缓冲,它的输入是 IBUFG 的输出,BUFG 的输出到达 FPGA 内部的IOB、CLB 、选择性块 RAM 的时钟延迟和抖动最小。4. BUFGCE 是带有时钟使能端的全局缓冲。它有一个输入 I、一个使能端 CE 和一个输出端 O。只有当 BUFGCE 的使能端 CE 有效( 高电平)时, BUFGCE 才有输出。 5. BUFGMUX 是全
46、局时钟选择缓冲,它有 I0 和 I1 两个输入,一个控制端 S,一个输Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!出端 O。当 S 为低电平时输出时钟为 I0,反之为 I1。需要指出的是 BUFGMUX 的应用十分灵活,I0 和 I1 两个输入时钟甚至可以为异步关系。6. BUFGP 相当于 IBUG 加上 BUFG。7. BUFGDLL 是全局缓冲延迟锁相环,相当于 BUFG 与 DLL 的结合。BUFGDLL 在早期设计中经常使用,用以完成全局时钟的同步和驱动等功能。随着数字时钟管理单元(DCM)的日益完善,目前
47、 BUFGDLL 的应用已经逐渐被 DCM 所取代。8. DCM 即数字时钟管理单元,主要完成时钟的同步、移相、分频、倍频和去抖动等。DCM 与全局时钟有着密不可分的联系,为了达到最小的延迟和抖动,几乎所有的 DCM 应用都要使用全局缓冲资源。DCM 可以用 Xilinx ISE 软件中的 Architecture Wizard 直接生成。4.1 全局时钟资源的使用方法(五种)1:IBUFG + BUFG 的使用方法:IBUFG 后面连接 BUFG 的方法是最基本的全局时钟资源使用方法,由于 IBUFG 组合BUFG 相当于 BUFGP,所以在这种使用方法也称为 BUFGP 方法。2. IBU
48、FGDS + BUFG 的使用方法:当输入时钟信号为差分信号时,需要使用 IBUFGDS 代替 IBUFG。3. IBUFG + DCM + BUFG 的使用方法:这种使用方法最灵活,对全局时钟的控制更加有效。通过 DCM 模块不仅仅能对时钟进行同步、移相、分频和倍频等变换,而且可以使全局时钟的输出达到无抖动延迟。4. Logic BUFG 的使用方法:BUFG 不但可以驱动 IBUFG 的输出,还可以驱动其它普通信号的输出。当某个信号(时钟、使能、快速路径)的扇出非常大,并且要求抖动延迟最小时,可以使用 BUFG 驱动该信号,使该信号利用全局时钟资源。但需要注意的是,普通 IO 的输入或普通
49、片内信号进入全局时钟布线层需要一个固有的延时,一般在 10ns 左右,即普通 IO 和普通片内信号Yihua-computer-hound-liwang-68013-pc-FPGA做事:要踏实,独立。工作:要努力,自信!从输入到 BUFG 输出有一个约 10ns 左右的固有延时,但是 BUFG 的输出到片内所有单元(IOB、 CLB、选择性块 RAM)的延时可以忽略不计为“0”ns。5 Logic + DCM + BUFG 的使用方法:DCM 同样也可以控制并变换普通时钟信号,即 DCM 的输入也可以是普通片内信号。使用全局时钟资源的注意事项全局时钟资源必须满足的重要原则是:使用 IBUFG 或IBUFGDS 的充分必要条件是信号从专用全局时钟管脚输入。换言之,当某个信号从全局时钟管脚输入,不论它是否为时钟信号,都必须使用 IBUFG 或 IBUFGDS;如果对某个信号使用了 IBUFG 或 IBUFGDS 硬件原语,则这个信号必定是从