《FPGA杂记之基础篇(FPGA设计重要知识点).docx》由会员分享,可在线阅读,更多相关《FPGA杂记之基础篇(FPGA设计重要知识点).docx(18页珍藏版)》请在课桌文档上搜索。
1、Verilog基础语法组合逻辑1.1 可综合模块以module为单元,具体实现如下:11*声明模块:module模块名(输入输出);endmodule-*/1.1.1时序逻辑以异步触发的D触发器为例,时序逻辑在always块里实现。moduleex_seodule(IWUtwiresys-cllc,声明模块时.输入变量一定是类型InPUtWirrt-nrinputwire(:.Jd,OQtPntreg:二q输出变量可以是wra,也可以是工ag,rg变量只能在lxay3块中赋迫1.);always(POSedgCays-clkfnogedgeNSJn)敏S?列表既可以是边沿帆发,也可以是电平核发
2、if(rst_n=1bC)qib;elseq三d;沿烛发的逻辑里.一定采用的是非阻塞电冽endnodle主要注意点:1 .声明模块时,输入变量一定是Wire类型。2 .声明模块时,输出变量可以是Wire,也可以是reg,reg变量只能在always块中赋值。3 .敏感列表既可以是边沿触发,也可以是电平触发。4 .沿触发的逻辑里,一定采用的是非阻塞触发=。1.1.2组合逻辑以数据选择器为例,组合逻辑通常使用assign语句赋值。modulesei(inputwiresei,inputwirea,inputwirebroutputwirec);assignc=(SeI=1,b)?a:b;endmo
3、dule主要注意点:1.Sel=O时,c=a;SeI=I时,c=b,即二选一数据选择器。四选一则有两个选择端,四个输入端,八选一则是三个选择端,八个输入端。2 .wire变量一定要用连续赋值语句赋值,而且必须用阻塞赋值。3 .2仿真模块仿真模块和可综合模块的区别:可综合模块最终生成的bit文件会烧录进芯片运行,而仿真模块编译过后是在仿真软件(例如modelsim)上运行的。仿真模块是基于可综合模块进行例化,并通过仿真软件的模拟,可以初步验证我们写的可综合模块的实现现象。以计数器为例,可综合模块如下:mmoduleex_cnt(inputwiresys_clk,inputwirerst_nrou
4、tputwire9:0ent);reg?:cnt_r;由于要在always里面操作赋值,因此要定义一个reg变量always(posedgesys_clk,negedgerst_n)if(rst_n三三1,bC)cnt_r=10,b;elseIcnt_r=cnt_r+_bl;endmodle基于以上可综合模块的仿真模块如下:zincscle/时葬卫位是ns褶堂是IOoP3,BP100.1是有效效僚,为100.1ns,而】0。.】先是遍别为100.1-octaletb_ex_cns仿M的矮块声明不需委输入列表regtb-ays-clk;regZtTrstja:wire9:3zbjcnz:init
5、ial上电初始化,只在上电时执行一次!可以认为整个程序中只会执行一次begintb_sys_clk三0;/块只能对【寄存器】量进行赋值cbrscn0;2001*/200.1之后8_“jn-1:endalways一tb_ays_clk-tb_3y3_clk;宸55循环周期为20113.sys-clk(tbsys-clk),X9ZJJarcnc(tbent);例化模境时,如果朦始模块时输出交量则括号内必须是【wire变量】endmoduld1 .仿真的模块声明不需要输入列表。2 .initial块只能对【寄存器】量进行赋值。3 .例化模块时,如果原始模块是输出变量,则括号内必须【wire变量工HD
6、L常见例子2.1 译码器2.1.1 可综合模块(CaSe语句)此模块用case实现了一个数据选择的功能,先产生了一个8位计数器,通过判断计数器的值来输出不同的取值,当计数器计数到1时,o_data和。_dv分别输出5和1,当计数器为2时,输出7和1,其余均输出0。(Note:CaSe语句常常运用于状态机中状态的判断)*译码器11moduleex_case(inputwireSClk,inptwirersc_n,outputrego_dv,outputreg7:0o_data,);reg2:0ent;always6(posedgesclk,negedgerst_n)if(rst_n=L,b)11
7、beginent=3,b;endelseent=ent+-bl212223 B242526-27fi 8 9 0 2 2 3313233-34 A353637-38394041-42-43-always (posedge sclk, negedge rst_n) if(rst_n = .,b)begino_dv = .,b;o_data = 3 ,b;endelsebegincase(ent)3,dl:begino_data n 3,d5;o_dv = 1,bl; end3,d2:begino_data 3,d7;。二dv = l,bl; enddefault:begino_data = S,
8、d;o_dv 1,b; endendcaseendendmoduleCase语句注意点:必须有default语句,否则会形成锁存器。2.1.2仿真模块timescalelns100psmoduletb_ex_case;regtb_scllc;regtb_rst_n;wiretb_o_dv;wire:.tb_o_daca;|91011 1213141516-initialbegintb_sclk=1b;tb_rst_n=1,b;#200tb_rst_n=1bl;end1718192021222324252627always #10 tb SCIk 0.5outputregchange,outpu
9、tregcola);reg3:3scare;二进制编码e.g.IDLE-000:HALF-001;ONE-010;ONEHALr三011;TWO=100t占用的寄存器效量少,但是组合逻辑资源多.独热码编码如例程中使用的.占用的寄存器数量多,但是组合逻辑资源少.关于组合逻辑贡源占用,例如,使用语句,即比较器1(Stace-4b0001)经过优化会变成if(staee(0-lbl)即实际上,用到的是1比特的比较器,只用判断对应位是否为0:而二迸制编码,用到的是3比特比较器,三个位置都要判断是否为0,使用的速辑资源就明39404142434445464748495051525354555657585
10、96061626364656667686970717273747576-n787980818283848586878889909192939495969798parameter Parameter Parameter parcuneter ParameterIDLE=4,b0000;HALF=4,b0001;ONE=三4,b0010;ONEHALF=4,b0100;TWO=4,blOOC;always(posedgeSClk,negedgerst_n)if(!rst_n)state=IDLE;elsebegincase(state)IDLE:if(money=0)state=HALF;else
11、state=ONE;HALF:|if(money=0)state=ONE;elsestate=ONEHALF;ONE:if(money=0)state=ONEHALF;elsestate=TWO;ONEHALF:if(money=0)state=TWO;elsestate三IDLE;TWO:state三IDLE;default:state=IDLE;endcaseend-endalways(posedgesclk,negedgerst-n)beginif(!rsjn)change0;elseif(state=TWO&money=ltbl)change三-bl;elsechange=0;1.en
12、dalwaysQ(posedgesclktnegedgerst_n)Rbeginif(!rsjn)cola=0;elseif(state三三TWO)(state三三ONEHALF&money三三1,t-)cola=1,bl;elsecoladorun.tcl仿真结果:2.2.5 上板测试上板测试对原来的条件做了一定改动更方便观测结果,输入和输出分别使用的按键和LED灯,测试版使用的是Anlogic的EF3L40CG332B.DEV,实现的功能如下:在开发板上完成自动售货机的实验,投币的动作通过按键实现,当按一次按键(按下到抬起算一次),算作投币一次。按键有两个,按下分别代表5毛和1元,可乐售价
13、2.5元。当投入总金额为5毛时,led灯亮一个,投入总金额为1元时,Ied灯亮两个,投入总金额为1.5元时,Ied灯亮三个,投入总金额为2元时,Ied亮四个,用单向流水灯效果充当出可乐并且不找零的情况,用双向流水灯效果充当既出可乐又找零的情况。流水灯持续十秒后熄灭,状态回到初始状态。重新设计状态图如下:LtvllllLlOOOwleDIS-NGLEOMEDlD OUBLElo代码详见工程fsm_key,笔记不再赘述,此次笔记主要记录关于顶层模块和例化的相关知识点:工程目录如下所示:三Hierarchy,2)fsm(././src/fsm.v)0led_water_single_inst-IeC
14、LWateJSingIe(././s回led_water_doublejnst-led_water_double(./.3key_debounce_inst05-key_debounce(././sr0key_debounce_instlO-key_debounce(././s/Constraintskeydebounce.adc各模块之间的关系是:顶层文件是fsm.v,在fsm.v中调用了模块led_water_single,led_Water_double和key_debounce,这三个模块的功能分别是单向流水灯,双向流水灯和按镜消抖。想在顶层文件中调用对应的模块需要在顶层文件中对相应的
15、模块进行例化,以单向流水灯为例。单向流水灯的声明如下:input wire sclk, input wire rst_nz output wire 7:0 led );2Jnoduleled_water_single(3456-,72930endmodule那么在fsm.v中例化方法如下:led_water_singleled_water_single_inst(.sclk(sclk)t.rst_n(rst_n)r.le(d(led_single);括号外的信号是对应的声明信号;括号内的信号是从fsm模块中传入的信号,该信号名称可以自定义。整个工程的框架如下:(由于本实验没有另外写一个总的TO
16、P文件,而是将例化和状态机信号处理都放在了fsm模块中,因此top层和状态机模块都标注的是fsm)其中keyO5,keyl,就是从外界接入的信号,led7:0即输出信号。接入信号我们要引到对应的按键,可以参考EF3L40CG332B_DEV的原理图:ff3L40CG332BSW2和SW3对应的FPGA的管脚分别是R19和R20,同理可查,八个Ied的对应脚,并写出相座见邕脚约事文件:1set_pin_assignmentkey05LOCATION=R19;2set_pin_asSignmentkeylLOCATION=R20;34set_pin_assignmentled0LOCATION=J
17、19;5set_pin_assignmentled1LOCATION=J20;6set_pin_assignmentled2LOCATION=M20;7set_pin_assignmentled3LOCATION=M19;8set_pin_assignmentled4LOCATION=N20;9set_pin_assignmentled5LOCATION=N19;10set_pin_assignmentled6LOCATION=P20;11set_pin_assignmentled7LOCATION=P19;1213set_pin_assignmentsclkLOCATION=G2r14set
18、_pinassignmentrstnLOCATION=T20;15IUS2BANKlQ TE1P 1,GPLL1F FDBIOTE1N-1.GPLL1IN-FDBK)TE2P10_TE2N_1Io-TE3P 二 1.GPLL1IP_REFK)-TE3N 1.GPLL11N* REFK) TE4P 1K)TE4N1KrTEePr0_TE5N_1KTE6P-1K) TE6N 1IO-TE7P1Q二TE7N 二 1K) TE8P.1K)*TE8N1IO TE9P 1K)TE9N1IO*TE10P_1K) TEION 1K)-TEllP-IK)TE11N- 1IOTE12P-1tZTE12NllK)T
19、E13P1K) TE13N 1K)*TE14P1K)*TE14N*1K) TE15P 1IOeTE15N- 1K)二TE16P 二 1K)-TE16N-lIo-TEl7P二 1.GCLKI0T O 1K)ZTE17NZl .GCLKIOTe ClK) TE18P 1K) TE18N 11 .GCLKIOT 2 11 .GCLKIOT 3 1 ItCSONtDbUTIO TE20N.1IO TE21P.1.DIOTE21N1.D7 会N 1IO_TE23N_1,D5-Q TE24P 1IO TE24N 7.USRCLK-10 JE25P 1.CSN-IO l25HJIO TE2P_1.SCLK
20、一IO f26N 1IO TE27P 1.D2 IO-TE27N*1,D3 IO-TE28P二 1.D0虫 LEDl型 LED2ji西 LED3嘤电7THB GNSeJU野 LEDS 2 LgPeTnF GPte) 3_9W) GHlJ二yigM16-FrrGPI03J1PigaLPt863_12PW-TEWLbPi/ IO TE29P 1I。二TE30N 二 1IOTE31P1IO TE31N 1 K TE32P-1 IO-TE32N-IK).TE35P.1 IO-TE35N-IIO TE34P1 l-TES43_2UT19KEV3 .T20 KEY4管脚约束文件写完后,在可综合模块顶层文件
21、中的输入输出信号就会对应到相应的物理输入输出,也可以使用图形页面设置。完成后编译下载到板子上观测现象。在本次实验的过程中也发生了一个编程错误问题,刚编写完上板测试时发现结果和预想的有差异,具体错处在输入3元进入双向流水灯的状态时,双向流水灯正向流水正常,当反向流水时,在倒数第二个灯会卡住,然后反复亮灭倒数一二个灯,没法完成反向流水。由于第一次正向流水是正常的,因此推测是在反向流水时有条件判断错误使得反向流水无法正常运行,进入到Ie(LWateJdoUble模块关于反向流水灯的操作模块,经查验发现是设置翻转标志的时候判断条件写错了。always(posedgesclk,negedgerst_n)
22、3beginif(rst_n=l,b)trans_flag=1,b;elseif(led=8rnsJTlagClockHoldTimeClock-to-OutputDelay等众多时序特征量密切相关。面积和速度这两个指标贯穿FPGA/CPLD设计的时钟,是设计质量的评价的终极标准一一面积和速度是一对对立统一的矛盾体。要求一个同时具备设计面积最小、运行频率最高是不现实的。更科学的设计目标应该是在满足设计时序要求(包括对设计频率的要求)的前提下,占用最小的芯片面积。或者在所规定的面积下,是设计的时序余量更大、频率跑的更高。这两种目标充分体现了面积和速度的平衡的思想。作为矛盾的两个组成部分,面积和速
23、度的地位是不一样的。相比之下,满足时序、工作频率的要求更重要一些,当两者冲突时,采用速度优先的准则。从理论上讲,如果一个设计时序余量较大,所能跑的速度远远高于设计要求,那么就通过功能模块的复用来减少整个设计消耗的芯片面积,这就是用速度的优势换取面积的节约。反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取乒乓操作和串并转换的思想运行。2 .硬件原则硬件原则主要针对HDL代码编写而言:Verilog是采用了C语言形式的硬件的抽象,它的本质作用在于描述硬件,它的最终实现结果是芯片内部的实际电路。所以评判一段HDL代码的优
24、劣的最终标准是:其描述并实现的硬件电路的性能,包括面积和速度两个方面。评价一个设计的代码水平较高,仅仅是说这个设计是由硬件想HDL代码这种表现形式的转换更加流畅、合理。而一个设计最终性能,在更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。(HDL代码仅仅是硬件设计的表达形式之一)初学者片面追求代码的整洁、简短,是错误的,是与HDL的标准背道而驰的。正确的编码方法,首先要做到对所需实现的硬件电路胸有成竹,对该部分的硬件的结构和连接十分清晰,然后再用适当的HDL语句表达出来即可。另外,VerilOg作为一种HDL语言,是分层次的。系统级一算法级寄存器传输级-逻辑级-门级-开关级。构
25、建优先级树会消耗大量的组合逻辑,所以如果能够使用case的地方,尽量使用case代替if.else3 .系统原则系统原则包含两个层次的含义:更高层面上看,是一个硬件系统,一块单板如何进行模块花费和任务分配,什么样的算法和功能适合放在FPGA里面实现,什么样的算法和功能适合放在DSP/CPU里面实现,以及FPGA的规模估算数据接口设计等。具体到FPGA设计就要对设计的全局有个宏观上的合理安排,比如时钟域、模块复用、约束、面积、速度等问题,在系统上模块的优化最为重要。一般来说实时性要求高,频率快的功能模块适合FPGA实现。而FPGA和CPLD相比,更适合实现规模较大、频率较高、寄存器较多的设计。使
26、用FPGA/CPLD设计时,应该对芯片内部的各种底层硬件资源,和可用的设计资源有一个较深刻的认识。比如FPGA一般触发器资源丰富,CPLD的组合逻辑资源更加丰富。FPGA/CPLD一般是由底层可编程硬件单元、BRAM、布线资源、可配置IO单元、时钟资源等构成。底层可编程硬件单元一般由触发器和查找表组成。Xilinx的底层可编程硬件资源较SLICE,由两个FF和2个LUT构成。Altera的底层硬件资源叫LE,由1个FF和1个LUT构成。使用片内RAN可以实现单口RAM、双口RAM、同步/异步FlF0、ROM、CAM等常用单元模块。一般的FPGA系统规划的简化流程4 .同步设计原则异步电路的逻辑
27、核心是用组合逻辑电路实现,比如异步的FIFO/RAM读写信号,地址译码等电路。电路的主要信号、输出信号等并不依赖于任何一个时钟性信号,不是由时钟信号驱动FF产生的。异步时序电路的最大缺点是容易产生毛刺,在布局布线后仿真和用逻辑分析仪观测实际信号时,这种毛刺尤其明显。同步时序电路的核心逻辑用各种各样的触发器实现,电路的主要信号、输出信号都是由某个时钟沿驱动触发器产生出来的。同步时序电路可以很好的避免毛刺,布局布线后仿真,和用逻辑分析仪采样实际工作信号都没有毛刺。是否时序电路一定比异步电路使用更多的资源呢?从单纯的ASCl设计来看,大约需要7个门来实现一个D触发器,而一个门即可实现一个2输入与非1
28、1,所以一般来说,同步时序电路比异步电路占用更大的面积。(FPGA/CPLD中不同,主要是因为单元块的计算方式)如何实现同步时序电路的延时?异步电路产生延时的一般方法是插入一个Buffer,两级与非门等,这种延时调整手段是不适用同步时序设计思想的。首先要明确一点HDL语法中的延时控制语法,是行为级的代码描述,常用于仿真测试激励,但是在电路综合是会被忽略,并不能启动延时作用。同步时序电路的延时一般是通过时序控制完成的,换句话说,同步时序电路的延时被当做一个电路逻辑来设计。对于比较大的和特殊定时要求的延时,一般用高速时钟产生一个计数器,通过计数器的计数控制延迟;对于比较小的延时,可以用D触发器打一
29、下,这种做法不仅仅使信号延时了一个时钟周期,而且完成了信号与时钟的初次同步,在输入信号采样和增加时序约束余量中使用。同步时序电路的时钟如何产生?时钟的质量和稳定性直接决定着同步时序电路的性能。输入信号的同步时序电路要求对输入信号进行同步化,如果输入数据的节拍和本级芯片的处理时钟同频,并且建立保持时间匹配,可以直接用本级芯片的主时钟对输入数据寄存器采样,完成输入数据的同步化。如果输入数据和本级芯片的处理时钟是异步的,特别是频率不匹配的时候,则要用处理时钟对输入数据做两次寄存器采样,才能完成输入数据的同步化。是不是定义为Reg型,就一定综合成寄存器,并且是同步时序电路呢?答案的否定的。VeriIO
30、g中最常用的两种数据类型Wire和Reg,一般来说,Wire型指定书数据和网线通过组合逻辑实现,而reg型指定的数据不一定就是用寄存器实现。5 .乒乓操作“乒操作”是一个常常应用于数据流控制的处理技巧,乒乓操作的处理流程为:输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM(DPRAM)单口RAM(SPRAM)、FIFO等。在第一个缓冲周期,将输入的数据流缓存到“数据缓冲模块1”;在第2个缓冲周期,通过“输入数据选择单元”的切换,将输入的数据流缓存到“数据缓冲模块2”,同时将“数据缓冲模块1”缓存的第1个周期数据通
31、过“输入数据选择单元”的选择,送到“数据流运算处理模块”进行运算处理;在第3个缓冲周期通过“输入数据选择单元”的再次切换,将输入的数据流缓存到“数据缓冲模块1”,同时将“数据缓冲模块2”缓存的第2个周期的数据通过“输入数据选择单元”切换,送到“数据流运算处理模块”进行运算处理。如此循环。典型的乒乓操作方法乒乓操作的最大特点是,通过输入数据选择单元和输出数据选择单元、进行运算和处理。把乒乓操作模块当成一个整体,站在两端看数据,输入数据和输出数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理。所以乒乓操作常常应用于流水线式算法,完成数据的无缝缓冲和处理。乒乓操作的第二个优点是
32、可以节约缓冲区空间。比如在WCDMA基带应用中,1帧是由15个时隙组成的,有时需要将1整帧的数据延时一个时隙后处理,比较直接的方法就是将这帧数据缓存起来,然后延时一个时隙,进行处理。这时缓冲区的长度为1帧的数据长,假设数据速率是3.84Mbs,1帧IOms,此时需要缓冲区的长度是38400bit,如果采用乒乓操作,只需定义两个缓冲1时隙的数据RAM,当向一个RAM写数据时,从另一块RAM读数据,然后送到处理单元处理,此时每块RAM的容量仅需2560bit,2块加起来512Obit的容量。输入数据流选择单元MUX2选1i数据爆冲模块DPRAM1数据救处理模块11幡出数据流选择单元MUX2选1数据
33、流运算处理模块数据媛冲模块DPRAM2二数据懵处理模块2乒乓操作用低速模块处理高速数据流另外,巧妙运用乒乓操作还可以达到用低速模块处理高速数据流的效果。如图2所示,数据缓冲模块采用了双口RAM,并在DPRAM后引入了一级数据预处理模块,这个数据预处理可以根据需要的各种数据运算,比如在WCDMA设计中,对输入数据流的解扩、解扰、去旋转等。假设端口A的输入数据流的速率为100Mbps,乒乓操作的缓冲周期是IOmso6 .串并转换设计技巧串并转换是FPGA设计的一个重要技巧,它是数据流处理的常用手段,也是面积与速度互换思想的直接体现。串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用寄
34、存器、RAM等实现。前面在乒乓操作的图例中,就是通过DPRAM实现了数据流的串并转换,而且由于使用了DPRAM,数据的缓冲区可以开得很大,对于数量比较小的设计可以采用寄存器完成串并转换。如无特殊需求,应该用同步时序设计完成串并之间的转换。比如数据从串行到并行,数据排列顺序是高位在前,可以用下面的编码实现:PrLtemPV=prl_temp,srl_in。其中,prUemp息并行输值缓存寄存器,srLin是串行数据输入。对于排列顺序有规定的串并转换,可以用case语句判断实现。对于复杂的串并转换,还可以用状态机实现。串并转换的方法比较简单,在此不必赘述。7 .流水线操作设计思想首先需要声明的是,
35、这里所讲述的流水线是指一种处理流程和顺序操作的设计思想,并非FPGA、ASlC设计中优化时序所用的“Pipelining”。流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。-步算1:步骤2/.;步骤n寸流水线设计的结构流水线设计的结构示意图如图所示。其基本结构为:将适当划分的n个操作步骤单流向串联起来。流水线操作的最大特点和要求是,数据流在各个步骤的处理从时间上看是连续的,如果将每个操作步骤简化假设为通过一个D触发器(就是用
36、寄存器打一个节拍),那么流水线操作就类似一个移位寄存器组,数据流依次流经D触发器,完成每个步骤的操作。流水线设计时序流水线设计的一个关键在于整个设计时序的合理安排,要求每个操作步骤的划分合理。如果前级操作时间恰好等于后级的操作时间,设计最为简单,前级的输出直接汇入后级的输入即可;如果前级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存才能汇入到后级输入端;如果前级操作时间恰好小于后级的操作时间,则必须通过复制逻辑,将数据流分流,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出。在WCDMA设计中经常使用到流水线处理的方法,如RAKE接收机、搜索器、前导捕获等。流水线处理方
37、式之所以频率较高,是因为复制了处理模块,它是面积换取速度思想的又一种具体体现。8.数据接口的同步方法数据接口的同步是FPGA/CPLD设计的一个常见问题,也是一个重点和难点,很多设计不稳定都是源于数据接口的同步有问题。在电路图设计阶段,一些工程师手工加入BUFT或者非门调整数据延迟,从而保证本级模块的时钟对上级模块数据的建立、保持时间要求。还有一些工程师为了有稳定的采样,生成了很多相差90度的时钟信号,时而用正沿打一下数据,时而用负沿打一下数据,用以调整数据的采样位置。这两种做法都十分不可取,因为一旦芯片更新换代或者移植到其它芯片组的芯片上,采样实现必须重新设计。而且,这两种做法造成电路实现的
38、余量不够,一旦外界条件变换(比如温度升高),采样时序就有可能完全紊乱,造成电路瘫痪。输入、输出的延时(芯片间、PCB布线、一些驱动接口元件的延时等)不可测,或者有可能变动的条件下,如何完成数据同步?对于数据的延迟不可测或变动,就需要建立同步机制,可以用一个同步使能或同步指示信号。另外,使数据通过RAM或者FIFo的存取,也可以达到数据同步目的。设计数据接口同步是否需要添加约束?建议最好添加适当的约束,特别是对于高速设计,一定要对周期、建立、保持时间等添加相应的约束。这里附加约束的作用有两点:提高设计的工作频率,满足接口数据同步要求;获得正确的时序分析报告。1quit-sin23.maincle
39、ar4vlibwork/创建工作目录WOrk(通常默认也是WOrk)|67vlog.cbfsm.v8vlog./.desgnfsm.v,淀译文件至工作目录9,0vain-vopcargs=+accwork.tbefsm*启动仿真(对应图形操作页面右键,启动对应文件仿真1-2Rvirtualtype(3T(4l23456789bOOOOIDLE)4(ib0001HALF)54ib0010ONE164tb0100ONEHALF)7(4blOOOTWO)8)abc;*标识转换9Ovirtualfunction(abc)tb-f3mf3mln3c3catenew-scateaddwave/1b_frafsm_msr/*34run1U3仿真脚本编写好后,只需要进入仿真软件(本例使用的是modelsim),改变当前路径到脚本保存的路径,然后在modelsim命令行输入do脚本文件名即