1、第6章 Verilog HDL设计应用实例 6.1 8位加法器的设计 6.2 8位乘法器的设计 6.3 8位除法器的设计 6.4 可调信号发生器的设计 6.5 PWM信号发生器的设计 6.6 数字频率计的设计 6.7 数字秒表的设计 6.8 交通灯信号控制器的设计 6.9 高速PID控制器的设计 6.10 FIR滤波器的设计 6.11 CORDIC算法的应用设计 6.12 闹钟系统的设计 第第6章章 Verilog HDL设计应用实例设计应用实例 第6章 Verilog HDL设计应用实例 1系统设计思路系统设计思路加法器是数字系统中的基本逻辑器件,减法器和硬件乘法器都可由加法器来构成。多位加
2、法器的构成有两种方式:并行进位和串行进位。并行进位方式设有进位产生逻辑,运算速度较快;串行进位方式是将全加器级联构成多位加法器。6.1 8位加法器的设计位加法器的设计第6章 Verilog HDL设计应用实例 并行进位加法器通常比串行级联加法器占用更多的资源。随着位数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大。因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。实践证明,4位二进制并行加法器和串行级联加法器占用几乎相同的资源。这样,多位加法器由4位二进制并行加法器级联构成是较好的折中选择。本设计中的8位二进制并行加法器即是由两个4位二进制并行加法器级联而成的,其电路
3、原理图如图6.1所示。第6章 Verilog HDL设计应用实例 图6.1 8位加法器电路原理图第6章 Verilog HDL设计应用实例 2Verilog HDL源程序源程序1)4位二进制并行加法器的源程序adder4b.v/4位二进制并行加法器adder4b.vmodule adder4b(a4,b4,c4,s4,co4);input 3:0 a4,b4;input c4;output 3:0 s4;output co4;assign co4,s4=a4+b4+c4;endmodule第6章 Verilog HDL设计应用实例 2)8位二进制加法器的源程序adder8b.v/8位二进制并行
4、加法器adder8b.vmodule adder8b(a8,b8,c8,s8,co8);input 7:0 a8,b8;input c8;output 7:0 s8;output co8;wire sc;adder4b u1(.a4(a83:0),.b4(b83:0),.c4(c8),.s4(s83:0),.co4(sc);adder4b u2(.a4(a87:4),.b4(b87:4),.c4(sc),.s4(s87:4),.co4(co8);endmodule第6章 Verilog HDL设计应用实例 3仿真结果验证仿真结果验证 在程序调试和仿真时,要使用自底向上的方法进行,也就是对于含有
5、多个模块的设计,要先从底层模块进行调试和仿真,再进行更高层次模块的调试和仿真,最后进行顶层模块的调试与仿真。图6.2和图6.3分别是使用Quartus 8.0对adder4b和adder8b进行时序仿真的结果。从仿真结果可以看出,从输入到输出有一个时延,时间大概为几个纳秒。同时要经过一个大概几个纳秒的不稳定状态或过渡过程,系统才达到一个稳定而正确的结果。经过对各组输入与输出数据的分析,确认仿真结果是正确的。第6章 Verilog HDL设计应用实例 图6.2 adder4b的时序仿真结果第6章 Verilog HDL设计应用实例 图6.3 adder8b的时序仿真结果第6章 Verilog H
6、DL设计应用实例 4逻辑综合分析逻辑综合分析图6.4是使用Quartus 8.0进行逻辑综合后adder8b的RTL视图,图6.5是对adder8b的RTL视图中的adder4b进行展开后的视图。图6.6是使用Quartus 8.0对adder8b进行逻辑综合后的资源使用情况。第6章 Verilog HDL设计应用实例 图6.4 adder8b综合后的RTL视图第6章 Verilog HDL设计应用实例 图6.5 adder8b的RTL视图中的adder4b展开后的视图第6章 Verilog HDL设计应用实例 图6.6 adder8b逻辑综合后的资源使用情况第6章 Verilog HDL设计
7、应用实例 5硬件逻辑验证硬件逻辑验证若使用GW48-CK EDA实验开发系统进行硬件逻辑验证,可选择实验电路结构图NO.1,由5.2节的实验电路结构图NO.1和图6.1确定引脚的锁定。如可取实验电路结构图的PIO3PIO0接a83:0、PIO7PIO4接a87:4、PIO11PIO8接b83:0、PIO15PIO12接b87:4、PIO49接c8。此加法器的被加数a8和加数b8分别由键2与键1、键4与键3输入,加法器的最低位进位c8由键8输入,计算结果将分别通过PIO23PIO20、PIO19PIO16输出,并显示于数码管6(高4位)和数码管5(低4位),溢出进位由PIO39输出,当有进位时,
8、结果显示于发光管D8。第6章 Verilog HDL设计应用实例 1系统设计思路系统设计思路一般乘法器采用各种不同的设计技巧,综合后的电路亦有不同的执行效能。本节将介绍移位乘法器、定点乘法器及布斯(booth)乘法器的设计。6.2 8位乘法器的设计位乘法器的设计第6章 Verilog HDL设计应用实例 1)8位移位乘法器不带符号的8位乘法器若采用连加方式,则最差情况需要28-1次方能完成计算;而采用移位式则最多仅需要8次即可完成乘法计算。移位式8位乘法器计算流程如下:(1)输入8位被乘数a及乘数b时,程序会先判断输入值:若乘数及被乘数有一个为0,则输出乘积为0;若被乘数与乘数中有一个为1,则
9、输出乘积为被乘数或乘数;若被乘数或乘数皆非0或1,则利用算法求得乘积。第6章 Verilog HDL设计应用实例 先预设乘积p为0,位n=0,0位n8。算法求乘积的方法是:利用判断乘数中的第n位是否为1的方法进行计算。若为1,则乘积缓存器等于被乘数左移n位,积数等于乘积缓存器加积数;若为0,则位n=位n+1。如此判断8次即可获得乘积。(2)当乘数和被乘数均为8位时,以for循环执行8次即可完成乘法计算。第6章 Verilog HDL设计应用实例 2)8位定点乘法器一般作乘法运算时,均以乘数的每一位数乘以被乘数后,所得部分乘积再与乘数每一位数的位置对齐后相加。经过对二进制乘法运算规律的总结,定点
10、乘法运算中进行相加的运算规则为:(1)当乘数的位数字为1时,可将被乘数的值放置适当的位置作为部分乘积。第6章 Verilog HDL设计应用实例(2)当乘数的位数字为0时,可将0放置适当的位置作为部分乘积。(3)在硬件中可利用and门做判断,如10101,乘数1和每一个被乘数的位都作and运算,其结果为1010,只需用and门就可得到部分乘积。(4)当部分乘积都求得后,再用加法器将上述部分乘积相加完成乘积运算。第6章 Verilog HDL设计应用实例 3)8位布斯乘法器布斯(booth)乘法算法,是先将被乘数的最低位加设一虚拟位,开始时虚拟位设为0,并存放于被乘数中。根据最低位与虚拟位构成的
11、布斯编码的不同,分别执行如下四种运算:(1)00:不执行运算,乘积缓存器直接右移1位。(2)01:将乘积加上被乘数后右移1位。(3)10:将乘积减去被乘数后右移1位。(4)11:不执行运算,乘积缓存器直接右移1位。第6章 Verilog HDL设计应用实例 2.Verilog HDL源程序源程序1)8位移位乘法器/8位移位乘法器mult8s.vmodule mult8s(p,a,b);input 7:0 a,b;/a为被乘数,b为乘数 output 15:0 p;/16位乘积 reg 15:0 rp,temp;reg 7:0 ra,rb;reg 3:0 rbn;always(a or b)第6
12、章 Verilog HDL设计应用实例 beginra=a;rb=b;if(a=0|b=0)/当a=0或b=0时,rp=0 rp=16b0;else if(a=1)/当a=1时,rp=rb rp=rb;else if(b=1)/当b=1时,rp=ra rp=ra;else begin rp=15b0;for(rbn=0;rbn8;rbn=rbn+1)if (rbrbn=1b1)第6章 Verilog HDL设计应用实例 begin temp=ra rbn;/左移rbn位 rp=rp+temp;endend end assign p=rp;endmodule第6章 Verilog HDL设计应用
13、实例 2)8位定点乘法器/8位定点乘法器mult8_fp.vmodule mult8_fp(p,a,b);parameter width=8;/设定数据宽度为8位 input width-1:0 a;/被乘数 input width-1:0 b;/乘数 output width+width-1:0 p;/乘积 reg width-1:0 pp;/设定乘积的暂存器 reg width-1:0 ps;/设定和的暂存器 reg width-1:0 pc;/设定进位的暂存器第6章 Verilog HDL设计应用实例 reg width-1:0 ps1,pc1;reg width-1:0 ppram w
14、idth-1:0;/设定乘积的暂存器 reg width-1:0 psram width:0;/设定和的暂存器 reg width-1:0 pcram width:0;/设定进位的暂存器 reg width+width-1:0 temp;/设定乘积的暂存器 integer j,k;always(a or b)/读取乘数与被乘数begin for(j=0;jwidth;j=j+1)第6章 Verilog HDL设计应用实例 begin for(k=0;kwidth;k=k+1)ppk=ak&bj;/利用and完成部分乘积ppramj=ppwidth-1:0;/存入乘积缓存器中pcj=0;/将进位
15、pc设定为0 end pcram0=pcwidth-1:0;psram0=ppram0;/将ppram的列设定给pp pp=ppram0;temp0=pp0;for(j=1;jwidth;j=j+1)第6章 Verilog HDL设计应用实例 begin pp=ppramj;/将ppram的列设定给ppps=psramj-1;pc=pcramj-1;for(k=0;kwidth-1;k=k+1)begin ps1k=ppk pck psk+1;/全加器之和与进位运算 pc1k=ppk&pck|ppk&psk+1|pck&psk+1;/endps1width-1=ppwidth-1;/将pp乘积
16、指定给ps1第6章 Verilog HDL设计应用实例 pc1width-1=0;/设定每列的最后一个进位都为0tempj=ps10;/将每个ps1(0)设定给乘积psramj=ps1width-1:0;/将ps1存到psram数组中pcramj=pc1width-1:0;end ps=psramwidth-1;pc=pcramwidth-1;pc10=0;ps10=0;for(k=1;kwidth;k=k+1)begin第6章 Verilog HDL设计应用实例 ps1k=pc1k-1pck-1psk;/全加器之和与进位运算pc1k=pc1k-1&pck-1|pc1k-1&psk|pck-1
17、&psk;end tempwidth+width-1=pc1width-1;/将ps1的值设定给乘积结果 tempwidth+width-2:width=ps1width-1:1;endassign p=tempwidth+width-1:0;/乘积结果的输出endmodule第6章 Verilog HDL设计应用实例 3)8位布斯乘法器/8位布斯乘法器 booth.vmodule booth(a,b,p);parameter width=8;/设定为8位 input width-1:0 a,b;/a为被乘数,b为乘数 output width+width-1:0 p;/乘积结果 reg wi
18、dth+width-1:0 p;integer cnt;/右移次数 reg width+width:0 pa,right;/暂存乘数 always (a or b)第6章 Verilog HDL设计应用实例 beginpawidth+width:0=16b0,a,1b0;/p,a,1b0for(cnt=0;cnt width;cnt=cnt+1)begin case(pa1:0)/pa最后两位pa1:0用于case选择函数2b10:begin /pa=pa-b pawidth+width:width+1=pawidth+width:width+1-bwidth-1:0;rshift(pa,ri
19、ght);/执行算术右移task子程序 end第6章 Verilog HDL设计应用实例 2b01:begin /pa=pa+b pawidth+width:width+1=pawidth+width:width+1+bwidth-1:0;rshift(pa,right);/执行算术右移task子程序 enddefault:rshift(pa,right);/直接执行算术右移task子程序 endcase pa=right;end第6章 Verilog HDL设计应用实例 pwidth+width-1:0=pawidth+width:1;/将乘积指定给输出端 end /右移task子程序 ta
20、sk rshift;input width+width:0 pa;/输入为paoutput width+width:0 right;/输出为rightcase(pawidth+width)/最高位为0的算术右移 1b0:rightwidth+width:0=1b0,pawidth+width:1;/最高位为1的算术右移 1b1:rightwidth+width:0=1b1,pawidth+width:1;endcase endtaskendmodule第6章 Verilog HDL设计应用实例 3仿真结果验证仿真结果验证图6.7是使用Quartus 8.0对移位乘法器mult8s进行时序仿真的
21、结果。当输入a=36、b=12时,乘积输出p应为3612=432,实际仿真输出为432,因此仿真结果是正确的。同理可验证其余的仿真结果也是正确的。定点乘法器mult8_fp和布斯乘法器booth的时序仿真和结果分析,请读者自己完成。第6章 Verilog HDL设计应用实例 图6.7 移位乘法器mult8s的时序仿真结果第6章 Verilog HDL设计应用实例 4逻辑综合分析逻辑综合分析根据第6.1节所述的方法,请读者自己进行逻辑综合,查看并分析有关综合结果。第6章 Verilog HDL设计应用实例 5硬件逻辑验证硬件逻辑验证若使用GW48-CK EDA实验开发系统进行硬件逻辑验证,可选择
22、实验电路结构图NO.1,由5.2节的实验电路结构图NO.1和对应程序的输入输出端口定义确定引脚的锁定。被乘数a7:0接PIO15PIO8(由键4、键3输入8位二进制数),乘数b7:0接PIO7PIO0(由键2、键1输入8位二进制数),乘积输出p15:0接PIO31PIO16。进行硬件验证的方法为:键4和键3分别输入被乘数的高4位和低4位(输入值显示于数码4和数码3),键2和键1分别输入乘数的高4位和低4位(输入值显示于数码2和数码1);乘积显示于数码管8数码管5,高位在左。第6章 Verilog HDL设计应用实例 1系统设计思路系统设计思路1)8位移位除法器(1)输入被除数a及除数b时,程序
23、会先判断输入值:若除数及被除数均为0,则此表达式无意义,商数输出记为0,余数输出记为0,因为溢位输出为1,所以商数无意义;若除数为0且被除数大于0,则此表达式溢位输出,商数输出为0,余数输出为0,溢位输出为1;6.3 8位除法器的设计位除法器的设计第6章 Verilog HDL设计应用实例 若被除数及除数相等,则输出商数为1,余数输出为0,溢位输出为0;若被除数小于除数,则输出商数为0,余位输出为被除数,溢位输出为0;若除数为1,则输出商数为被除数,余数输出为0,溢位输出为0;若被除数大于除数,则利用下列算法求出商数。预设商数q为0,余数r为0,位cn=8(为8位除法器)。第6章 Verilo
24、g HDL设计应用实例 此算法先判断位cn是否大于0,若大于0,则余数左移一位,余数则等于余数加上被除数第cn1位的值,商数左移一位。再判断余数是否大于或等于除数,若大于或等于除数,商数则等于商数加1,余数等于余数减除数;若小于除数,则cn=cn1。再判断cn是否大于0,如此来回判断8次,即可获得商数、余数。(2)此算法的优点是n位除法器仅需判断n次即可获得商数、余数,无需进行庞大的运算。第6章 Verilog HDL设计应用实例 2)8位重存除法器已知被除数a、除数b,则商数q及余数r与a、b的关系定义为:a=q*b+r。在进行除法运算时,商数q中的每一位均可通过执行一连串的减法2rib确定
25、。对于重存除法,在每一步骤中均执行ri+1=2rib。当相减结果为负时,必须执行重存加法算法,即ri+1=2ri+b。换言之,若对应商数qi为0,则部分的余数将由修正值重新存回。其执行步骤为:(1)将被除数存入缓存器a(亦为商数)中,除数放在缓存器b中,接着将余数缓存器r清除为0,然后开始作n次除法步骤(n是商数的位长度)。第6章 Verilog HDL设计应用实例(2)将r,a所组成的缓存器向左移一位。(3)余数缓存器r减掉除数缓存器b,并把差值再存回余数缓存器r。(4)如果差值是负的,则被除数缓存器a最低位设为0,否则为1。(5)差值是负值确定之后,把r加回b以恢复旧的r值。第6章 Ver
26、ilog HDL设计应用实例 3)8位非重存除法器已知被除数a、除数b,则商数q及余数r与a、b的关系定义为:a=q*b+r。在进行除法运算时,商数q中的每一位均可通过执行一连串的减法2rib确定。非重存除法算法,是由重存除法算法演变而来的。对于非重存除法,在每一步骤中均执行ri+1=2rib。当相减结果为负时(对应商数qi为0),不做重存操作,而是继续左移一位,如此可节省重存除法中的加法器。非重存除法的执行步骤为:(1)将被除数存入缓存器a(亦为商数)中,除数放在缓存器b中,接着将余数缓存器r清除为0,然后开始作n次除法步骤(n是商数的位长度)。第6章 Verilog HDL设计应用实例(2
27、)将r,a所组成的缓存器向左移一位。(3)检查余数缓存器r,若为负数,则将除数缓存器b加入余数缓存器r;若为正值,则由余数缓存器r减去除数缓存器b。(4)如果余数缓存器r为负值,则设a的最低位为0,反之设为1。(5)若最后一次的余数为负,则须将除数b重新加回余数r。第6章 Verilog HDL设计应用实例 2Verilog HDL源程序源程序1)8位移位除法器/8位移位式除法器div8s.vmodule div8s(q,r,o,a,b);parameter bitl=8;/数据位长 input bitl-1:0 a,b;/a为被除数,b为除数 output bitl-1:0 q,r;/q为商
28、,r为余数 output o;/溢出标志 reg bitl-1:0 rq,rr;reg over;第6章 Verilog HDL设计应用实例 reg bitl-1:0 ra,rb;reg bitl-1:0 cnt;/位计数器 always(a or b)beginover=0;ra=a;rb=b;if(rb=0)/当rb=0时,使rq=0,rr=0 begin rq=0;rr=0;if(ra=0)/当ra=0时,使over=1 over=1;第6章 Verilog HDL设计应用实例 elsebeginrq=-1;rr=-1;over=1;end endelse if(ra=rb)/当ra=r
29、b时,使rq=1,rr=0 begin rq=1;rr=0;endelse if(ra rb)/当rab时,使rq=0,rr=0 begin rq=0;rr=0;/初始化rq和rr for(cnt=bitl-1;cnt 0;cnt=cnt-1)beginrr=rrbitl-2:0,racnt-1;rq=rq=rb)/当rrrb时,使rq=rq+1,rr=rr-rb begin rq=rq+1;rr=rr-rb;endend end end assign q=rq;assign r=rr;assign o=over;endmodule第6章 Verilog HDL设计应用实例 2)8位重存除法器
30、/8位重存除法器divrd8.vmodule divrd8(q,r,o,a,b);parameter width=8;/设定8位 output width-1:0 q;/商 output width-1:0 r;/余数 output o;/溢出标志 input width-1:0 a;/被除数 input width-1:0 b;/除数 reg width:0 p;reg width-1:0 q,div,r;第6章 Verilog HDL设计应用实例 integer i;always(a or b)begin q=a;div=b;p=8h00,1b0;for(i=0;iwidth;i=i+1)
31、begin p=pwidth-1:0,qwidth-1;q=qwidth-2:0,1b0;p=p+1b0,div+1b1;case(pwidth)第6章 Verilog HDL设计应用实例 1b0:q0=1b1;/正的余数 1b1:begin /负的余数 p=p+div;/恢复加法 q0=1b0;end endcase end r=pwidth-1:0;end assign o=(b=8h00)?1b1:1b0;/溢出检测endmodule第6章 Verilog HDL设计应用实例 3)8位非重存除法器/8位非重存除法器divnrd8.vmodule divnrd8(a,b,q,r,o);pa
32、rameter width=8;/设定8位 input width-1:0 a,b;/a为被除数,b为除数 output width-1:0 q,r;/q为商,r为余数 output o;/溢出标志 reg width:0 p;reg width-1:0 q,div,r;reg sign;/余数符号位 integer i;第6章 Verilog HDL设计应用实例 always(a or b)begin sign=1b0;q=a;div=b;p=8h00,1b0;for(i=0;i=127)addr=0;else beginif(i=0|i=1)addr=addr+1;else begin k
33、=127/i;m=i*k;addr=m)addr=0;第6章 Verilog HDL设计应用实例 end end end 1:begin /产生锯齿波 if(addr=255)addr=128;else beginif(i=0|i=1)addr=addr+1;else begin第6章 Verilog HDL设计应用实例 k=127/i;m=1*k;addr=(m+128)addr=128;end end end 2:begin/产生方波 if(addr=383)addr=256;elsebeginif(i=0|i=1)addr=addr+1;第6章 Verilog HDL设计应用实例 els
34、e begin k=127/i;m=i*k;addr=(m+256)addr=256;end end end 3:begin /产生三角波 if(addr=383)addr=256;else begin if(i=0|i=1)第6章 Verilog HDL设计应用实例 addr=addr+1;else begin k=127/i;m=i*k;addr=(m+384)addr=384;end end end endcase end endmodule第6章 Verilog HDL设计应用实例 2)底层datarom模块的设计(1)建立ROM初始化文件。ROM的初始化文件用来完成对数据的初始化,即
35、将所有将要显示的波形数据存放到ROM里。下面是常用的两种初始化设计方法:第6章 Verilog HDL设计应用实例 建立.mf格式文件。首先选择ROM数据文件编辑窗口,即在【File】菜单中选择【New】,并在【New】对话框中选择【Other files】标签,选择【Memory Initization file】,单击【OK】按钮后产生ROM数据文件大小选择对话框。这里采用512点8位数据的情况,可选ROM的数据数(Numer)为512,数据宽(Word size)为8位。单击【OK】按钮,将出现空的mif数据表格,表格中的数据为十进制表达方式,任一数据对应的地址为左列与顶行数之和。将波形
36、数据填入表中,完成后在【file】菜单中单击【Save as】,保存此数据。第6章 Verilog HDL设计应用实例 建立hex格式文件。建立.hex格式文件的方法有两种:第一种方法与建立.mif格式文件的方法相同,只是在【New】对话框中选择【Other files】标签,然后选择H,最后生成hex格式文件;第二种方法是用C语言或者使用MATLAB等工具生成.hex格式的波形数据。第6章 Verilog HDL设计应用实例 datarom的数据如下:128 134 140 146 152 159 165 171 176 182 188 193 199 204 209 213218 222
37、226 230 234 237 240 243 246 248 250 252 253 254 255 255255 255 255 254 253 252 250 248 246 243 240 237 234 230 226 222218 213 209 204 199 193 188 182 176 171 165 159 152 146 140 134128 122 116 110 104 97 91 85 80 74 68 63 57 52 47 43 38 34 3026 22 19 16 13 10 10 8 6 4 3 2 1 1 1 1 1 2 3 4 6 8 10 13 1
38、6 19 22 26 30 34 38 43 47 52 57 63 68 74 80 85 91 97 104 110第6章 Verilog HDL设计应用实例 116 122 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 3940 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 5960 61 62 63 64 65 66 67 68 69 70 71 72 73 7
39、4 75 76 77 78 7980 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115116 117 118 119 120 121 122 123 124 125 126 127 255 255 255 255255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255255 255 255 255 255 255 255 255 255
40、255 255 255 255 255 255 255第6章 Verilog HDL设计应用实例 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 2 4 6 8 10 12
41、 14 16 18 20 22 24 26 28 30 32 34 3638 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 7678 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112114 116 118 120 122 124 126 126 124 122 120 118 116 114 112 110108 106 104 102 100 98 96 94 92 90 88 86 84 82 80 78 76 74 7270 68 66 64 62 60 58
42、56 54 52 50 48 46 44 42 40 38 36 34 3230 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0第6章 Verilog HDL设计应用实例(2)利用MegaWizard Plug-In Manager定制正弦信号数据datarom。在【Tools】菜单中选择【MegaWizard Plug-In Manager】,弹出对话框。选择【Create a new custom megafunction variation】,即定制一个新的模块。单击该对话框的【Next】按钮后,新出现的操作对话框如图6.9所示,选择【Memory Com
43、piler】项下的【ROM:1-PORT】,再选目标器件为Cyclone 器件和Verilog HDL语言方式,最后键入ROM文件存放的路径和文件名。第6章 Verilog HDL设计应用实例 图6.9 定制模块选择及输出文件的选择与设置选择第6章 Verilog HDL设计应用实例 根据依次弹出的操作设置对话框,依次选择设置ROM控制线、地址、数据线,选择设置输出端口,选择设置ROM初始文件,声明元器件库,直至完成datarom的定制。其中,dataromde1初始文件设置如图6.10所示。第6章 Verilog HDL设计应用实例 图6.10 选择设置ROM初始文件datarom.mf第6
44、章 Verilog HDL设计应用实例 3仿真结果验证仿真结果验证这里使用SignalTap 嵌入式逻辑分析仪进行实时测试。SignalTap 嵌入式逻辑分析仪集成在Quartus 设计软件中,能够捕获和显示可编程片上系统(SOPC)设计中实时信号的状态,还可以实时测试FPGA中的信号波形。目前,SignalTap 嵌入式逻辑分析仪支持的器件系列包括APEXTAPEX20KEAPEX20KCAPEX20KCYCLONEEXCALIBURMERCURYSTRATIX GXSTRATIX等。第6章 Verilog HDL设计应用实例 使用SignalTap 的一般流程是:设计人员在完成设计并编译工
45、程后,建立SignalTap(.stp)文件并加入工程配置STP文件编译并下载设计到FPGA在Quartus 中显示被测信号的波形测试完毕后将该逻辑分析仪从项目中删除。本设计中使用SignalTap 进行波形实时测试的步骤如下:(1)选择【File】菜单中的【New】,在【New】对话框中选择【Other Files】标签中的【SignalTap Logic Analyzer File】,单击【OK】按钮,即出现如图6.11所示的SignalTap 编辑器。第6章 Verilog HDL设计应用实例 图6.11 signaltap编辑器第6章 Verilog HDL设计应用实例(2)调入待测信
46、号及保存文件。首先单击上排的【Instance】栏内的【auto-signaltap_0】,根据自己的意愿将其改名,这是其中一组待测信号。为了调入待测信号,在下栏的空白处双击,即弹出【Node Finder】对话框,单击【List】即在左栏出现与此工程相关的所有信号,包括内部信号。此例中要将control、i、q_out信号调入,如图6.12所示。第6章 Verilog HDL设计应用实例 图6.12 调入待测信号第6章 Verilog HDL设计应用实例 不能将工程的主频时钟信号调入信号观察窗。如果有总线信号,只需调入总线信号即可,而慢速信号可不调入。调入信号的数量应根据实际需要来决定,不可
47、随意调入过多的没有实际意义的信号,这会导致SignalTap 无谓地占用芯片内过多的资源。最后,保存SignalTap 文件。第6章 Verilog HDL设计应用实例 选择【File】菜单中的【Save As】命令,键入此SignalTap 文件的文件名,扩展名是默认的“stp”。单击保存按钮后将出现一个提示:“Do you want to enable SignalTap”,应该单击【Yes】按钮,表示同意再次编译时将此SignalTap 文件(核)与工程(sindt)捆绑在一起综合/适配,以便一同被下载进FPGA芯片中去。如果单击【No】按钮,则必须自己去设置,方法是,选择菜单【Assi
48、gnments】中的【Settings】命令,在【Category】栏中选择【SignalTap Logic Analyzer】。第6章 Verilog HDL设计应用实例 在【SignalTap File】栏选择已保存的SignalTap 文件名,并选择【Enable SignalTap Logic Analyzer】,单击【OK】按钮即可。但应该特别注意,当利用SignalTap 将芯片中的信号全部测试结束后,如在构成产品前,不要忘了将SignalTap 从芯片中除去。方法是在此窗口中关闭【Enable SignalTap Logic Analyzer】,再编译一次即可。第6章 Veril
49、og HDL设计应用实例(3)SignalTap 的参数设置。单击最大化按钮和窗口左下角的【Setup】,即出现如图6.13所示的全屏编辑窗口。首先选择输入逻辑分析仪的工作时钟信号Clock,单击Clock栏左侧的“”按钮,选择工程的主频时钟信号。接着在【Data】框的【Sample】栏选择此组信号的采样深度(sample depth)为1kbit。注意,这个深度一旦确定,信号组的每一位信号就将获得同样的采样深度。然后设置观察信号的要求,在【Buffer acquisition mode】框的【Circulate】栏设置既定的采样深度中起始触发的位置,比如选择中点触发(Center trigg
50、er position)。第6章 Verilog HDL设计应用实例 最后设置触发信号和触发方式,这可以根据具体需求来选置。在【Trigger】框的【Trigger level】栏选择1;选择【Trigger In】复选框,并在【Source】栏选择触发信号。在这里选择sin工程的内部计数器最高位输出信号address6作为触发信号,在【Pattern】栏选择上升沿触发方式(Rising Edges),即当address6为上升沿时,Signal Tap 在CLK的驱动下对信号组的信号进行连续或单次采样(根据设置决定)。设置完毕后保存。第6章 Verilog HDL设计应用实例 图6.13 S