第4讲-Verilog-HDL高级编程技术课件

上传人:无*** 文档编号:241612948 上传时间:2024-07-09 格式:PPTX 页数:60 大小:909.39KB
返回 下载 相关 举报
第4讲-Verilog-HDL高级编程技术课件_第1页
第1页 / 共60页
第4讲-Verilog-HDL高级编程技术课件_第2页
第2页 / 共60页
第4讲-Verilog-HDL高级编程技术课件_第3页
第3页 / 共60页
点击查看更多>>
资源描述
第四讲第四讲 Verilog HDL高级编程技术高级编程技术参见课本的第参见课本的第4,9,10章章v加法器设计加法器设计v乘法器设计乘法器设计v除法器的设计除法器的设计v奇数分频与小数分频奇数分频与小数分频v有限状态机设计有限状态机设计v基于宏功能模块的设计基于宏功能模块的设计v设计的可综合性设计的可综合性加法器设计加法器设计v加法、乘法作为基本的运算,大量应用在数字信加法、乘法作为基本的运算,大量应用在数字信号处理和数字通信的各种算法中。由于加法器、号处理和数字通信的各种算法中。由于加法器、乘法器使用频繁,所以其速度往往影响着整个系乘法器使用频繁,所以其速度往往影响着整个系统的运行速度。如果可实现快速加法器和快速乘统的运行速度。如果可实现快速加法器和快速乘法器的设计,则可以提高整个系统的速度。法器的设计,则可以提高整个系统的速度。v加法运算是最基本的运算,在多少情况下,无论加法运算是最基本的运算,在多少情况下,无论是乘法、除法、加法还是是乘法、除法、加法还是FFT等运算,最终都可等运算,最终都可以分解为加法运算来实现。以分解为加法运算来实现。v加法运算有:级连加法器、并行加法器、超前进加法运算有:级连加法器、并行加法器、超前进位加法器、流水线加法器等位加法器、流水线加法器等v1.级连加法器的设计见课本级连加法器的设计见课本P184-P185。级连加法器是由级连加法器是由1位全加器级连构成的,本级的进位输出作为位全加器级连构成的,本级的进位输出作为下一级的进位输入。下一级的进位输入。级连加法器结构简单,但级连加法器结构简单,但N位级连加法运算的延时是位级连加法运算的延时是1位全加位全加器的器的N倍,延时主要是进位信号级连造成倍,延时主要是进位信号级连造成的。在需要高性能的的。在需要高性能的设计中,这种加法结构不宜采用。设计中,这种加法结构不宜采用。例程如下:例程如下:module full_add1(a,b,cin,sum,cout);input a,b,cin;output sum,cout;wire s1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(s1,a,b),(sum,s1,cin);or (cout,m1,m2,m3);endmodulemodule add8(sum,cout,a,b,cin);input7:0 a,b;input cin;output7:0 sum;output cout;full_add1 f0(a0,b0,cin,sum0,cin1);full_add1 f1(a1,b1,cin1,sum1,cin2);full_add1 f2(a2,b2,cin2,sum2,cin3);full_add1 f3(a3,b3,cin3,sum3,cin4);full_add1 f4(a4,b4,cin4,sum4,cin5);full_add1 f5(a5,b5,cin5,sum5,cin6);full_add1 f6(a6,b6,cin6,sum6,cin7);full_add1 f7(a7,b7,cin7,sum7,cout);endmodule v2.并行加法器:并行加法器可采用并行加法器:并行加法器可采用Verilog HDL的的加法运算符直接描述加法运算符直接描述,借助于,借助于EDA综合软件和综合软件和HDL描述语言,实现起来很容易,描述语言,实现起来很容易,其运算速度快,但耗用其运算速度快,但耗用资源多,尤其是当加法运算的位数较宽时资源多,尤其是当加法运算的位数较宽时,其耗用的,其耗用的资源将会较大。资源将会较大。module add_bx(cout,sum,a,b,cin);input7:0 a,b;input cin;output7:0 sum;output cout;assign cout,sum=a+b+cin;endmodulev3.流水线加法器:流水线加法器:为保证数据吞吐率,电路设计中的一个主要问题就为保证数据吞吐率,电路设计中的一个主要问题就是要维持系统时钟的速度处于或高于某一频率。例如,是要维持系统时钟的速度处于或高于某一频率。例如,如果整个系统是一个全同步时钟,同时又必须运行在如果整个系统是一个全同步时钟,同时又必须运行在25MHz的频率上,那么,从任何寄存器的输出到它的频率上,那么,从任何寄存器的输出到它馈给信号的寄存器输入路径间的最大时延必须小于馈给信号的寄存器输入路径间的最大时延必须小于40ns。如果通过某些复杂逻辑的延时路径比较长,。如果通过某些复杂逻辑的延时路径比较长,系统时钟的速度就很难维持。这时,就必须在组合逻系统时钟的速度就很难维持。这时,就必须在组合逻辑间插入触发器,使复杂的组合逻辑形成流水线。虽辑间插入触发器,使复杂的组合逻辑形成流水线。虽然流水线会增加器件资源的使用,但它降低了寄存器然流水线会增加器件资源的使用,但它降低了寄存器间的传播延时,保证系统维持高的系统时钟速度。间的传播延时,保证系统维持高的系统时钟速度。v流水线设计的基本思想是在逻辑电路中加入若干寄存器来暂存流水线设计的基本思想是在逻辑电路中加入若干寄存器来暂存中间结果,虽然多用了一些寄存器资源,但减少了每一级组合中间结果,虽然多用了一些寄存器资源,但减少了每一级组合电路的时延,因此可提高整个电路的运行效率。电路的时延,因此可提高整个电路的运行效率。v流水线设计可有效提高系统的工作频率,尤其是对于流水线设计可有效提高系统的工作频率,尤其是对于FPGA器器件。件。FPGA的逻辑单元中有大量的逻辑单元中有大量4到到5变量的查找表变量的查找表(LUT)以以及大量的触发器,因此在及大量的触发器,因此在FPGA设计中采用流水线技术可以有设计中采用流水线技术可以有效提高系统的速度。效提高系统的速度。v实际中的乘法器大多是有时钟引脚的,以连续不断地进行乘法实际中的乘法器大多是有时钟引脚的,以连续不断地进行乘法运算。在有时钟信号的乘法器中,可以采用流水线设计技术,运算。在有时钟信号的乘法器中,可以采用流水线设计技术,以提高系统的运行频率。同样加法器也可以采用流水线设计。以提高系统的运行频率。同样加法器也可以采用流水线设计。v下面的例子就是一个两个流水下面的例子就是一个两个流水8位加法,由两个位加法,由两个4位加法器构成,位加法器构成,输出存储在寄存器中。输出存储在寄存器中。module add8(cout,sum,a,b,cin,en);input7:0 a,b;input cin,en;output7:0 sum;output cout;reg7:0 sum;reg cout;reg3:0 tempa,tempb,firsts;reg firstc;always(posedge en)begin firstc,firsts=a3:0+b3:0+cin;tempa=a7:4;tempb=b7:4;endalways(posedge en)begin cout,sum7:4=tempa+tempb+firstc;sum3:0=firsts;endendmodule乘法器设计乘法器设计v乘法器也频繁使用在数字信号处理和数字通信的各种乘法器也频繁使用在数字信号处理和数字通信的各种算法中,并且往往影响着整个系统的运行速度,所以算法中,并且往往影响着整个系统的运行速度,所以如果能实现快速乘法器的设计,可提高整个系统的处如果能实现快速乘法器的设计,可提高整个系统的处理速度。乘法器的设计方法主要有:并行运算理速度。乘法器的设计方法主要有:并行运算(纯组合纯组合逻辑逻辑)、移位相加、查找表、加法树等。、移位相加、查找表、加法树等。v1.并行乘法器:并行乘法器是纯组合逻辑的乘法器,并行乘法器:并行乘法器是纯组合逻辑的乘法器,完全由逻辑门实现。对于完全由逻辑门实现。对于11乘法,只需乘法,只需1个与门即个与门即可实现,可实现,P=AB。对于。对于22乘法,根据课本乘法,根据课本P189的的真值表可以得出结果表达式:真值表可以得出结果表达式:因此我们可以用与门、或门来实现。因此我们可以用与门、或门来实现。v并行乘法器示例:并行乘法器示例:module mult(outcome,a,b);parameter size=8;inputsize:1 a,b;output2*size:1 coutcome;assign outcom=a*b;endmodule并行乘法器随着操作数位数加宽,耗用的资源迅速变多,如果将并行乘法器随着操作数位数加宽,耗用的资源迅速变多,如果将上面的上面的8位并行乘法器适配到位并行乘法器适配到Cyclone系列的系列的EP1C3器件实器件实现的话,需耗用现的话,需耗用106个个LE单元。单元。而如果所用的而如果所用的FPGA器件中有嵌入式乘法器的话,则可采用嵌入器件中有嵌入式乘法器的话,则可采用嵌入式乘法器来实现乘法,比如将上例适配到式乘法器来实现乘法,比如将上例适配到Cyclone II系列的系列的EP2C5器件的话,只耗用器件的话,只耗用1个个LE单元和单元和1个个9位位*9位的嵌入式位的嵌入式乘法器单元。乘法器单元。因此,如果所用的因此,如果所用的FPGA器件中有硬件乘法器,建议用硬件乘器件中有硬件乘法器,建议用硬件乘法器来实现乘法操作,具有速度快,资源利用合理等优点。法器来实现乘法操作,具有速度快,资源利用合理等优点。v2.移位相加乘法器移位相加乘法器 移位相加乘法器将乘法变为加法实现,其设计思路是:乘法移位相加乘法器将乘法变为加法实现,其设计思路是:乘法通过逐次移位相加实现,每次判断乘数的最低位,若为通过逐次移位相加实现,每次判断乘数的最低位,若为1则将被则将被乘数移位相加。乘数移位相加。被乘数被乘数A 1101乘数乘数B 1011部分积部分积0 1101A左移左移 11010 部分积部分积1 100111A左移左移 000000部分积部分积2 100111A左移左移 1101000积积 v对于乘数中的第对于乘数中的第i位,若为位,若为1,则,则将被乘数左移将被乘数左移i位,并加到上次的位,并加到上次的部分积结果上。部分积结果上。(若为若为0可以看作可以看作只移位不相加。只移位不相加。)v也可以依次判断乘数也可以依次判断乘数B的最低有的最低有效位是否为效位是否为1,若为,若为1则则P=P+A(部分积(部分积P在刚开始时在刚开始时要清要清0),然后将被乘数),然后将被乘数A左移左移1位,乘数位,乘数B右移右移1位位(并用并用0填补填补高位高位);当被乘数全部变为当被乘数全部变为0后,后,乘法运算完成。乘法运算完成。注:如果注:如果B的最低有效位为的最低有效位为0时,只需接着移位,不要相加时,只需接着移位,不要相加v移位相加乘法器是一种相对节省资源的设计方法,为移位相加乘法器是一种相对节省资源的设计方法,为了实现了实现nn乘法,需要一个乘法,需要一个2n位的左移寄存器(存位的左移寄存器(存放部分积),一个放部分积),一个n位的右移寄存器(可用除数寄存位的右移寄存器(可用除数寄存器代替),一个器代替),一个2n位加法器(被加数为部分积和被位加法器(被加数为部分积和被乘数,所以还需要一个被乘数寄存器),再加少量乘数,所以还需要一个被乘数寄存器),再加少量的控制逻辑即可实现。尤其是当操作数位宽增加时,的控制逻辑即可实现。尤其是当操作数位宽增加时,移位相加乘法器耗用的逻辑资源不会像并行乘法器移位相加乘法器耗用的逻辑资源不会像并行乘法器那样急剧增加。那样急剧增加。v注:是先移位后相加注:是先移位后相加v移位相加乘法示例(移位相加乘法示例(0 x18600 *CNT16D3:0)Result20:17=4b0000;/部分积的高位先清零部分积的高位先清零mult16:0=17h186a0;/1000*100=0 x186a0Result16:0=CNT16D0?mult16:0:0;for(i=1;i=3;i=i+1)begin if(CNT16Di=1)Result20:0=Result20:0+(mult16:0i);end注意:注意:for循环计算是在一个时钟周期内完成的。循环计算是在一个时钟周期内完成的。v或者程序改为或者程序改为(不能被综合不能被综合):Result20:0=21b0;/部分积先清零部分积先清零mult16:0=17h186a0;/被乘数被乘数while(CNT16D3:0!=4b0)/注意注意while循环不能被综合循环不能被综合begin if(CNT16D0=1)begin Result20:0=Result20:01;Result20:0=Result20:0+mult16:0;end else begin Result20:0=Result20:01;endv为何不能将为何不能将while(CNT16D3:0!=4b0)改成改成for循环然后判断循环然后判断CNT16D3:0=4b0时用时用break语语句跳出?句跳出?v答答:因为因为Verilog中没有中没有break语句。语句。Verilog的的for循循环综合后是硬件的重复,而环综合后是硬件的重复,而C语言的语言的for是过程的重复。是过程的重复。所以说在所以说在Verilog中没有中没有break。v3.查找表乘法器查找表乘法器 查找表乘法器将乘积直接放在存储器中,将操作查找表乘法器将乘积直接放在存储器中,将操作数数(乘数和被乘数乘数和被乘数)作为地址访问存储器,得到的输作为地址访问存储器,得到的输出数据就是乘法运算的结果。查找表方式的乘法器出数据就是乘法运算的结果。查找表方式的乘法器速度只局限于所使用存储器的存取速度。速度只局限于所使用存储器的存取速度。但由于查找表的规模随着操作数位数的增加而迅但由于查找表的规模随着操作数位数的增加而迅速增大,因此如果用于实现位数宽的乘法操作,需速增大,因此如果用于实现位数宽的乘法操作,需要要FPGA器件具有较大的片内存储器模块。比如,器件具有较大的片内存储器模块。比如,要实现要实现8*8乘法器的地址位宽为乘法器的地址位宽为16位,字长为位,字长为16位(可能性为:位(可能性为:28*28=256*256),即存储器大),即存储器大小为小为1048576(1M)比特,用这么大的存储器来实比特,用这么大的存储器来实现现8*8乘法运算,显然是不经济的。乘法运算,显然是不经济的。v3.除法器设计:多数工具对除法(除法器设计:多数工具对除法(/)和求模)和求模(%)有有限制。如对除法操作,只有当除数是常数,且是限制。如对除法操作,只有当除数是常数,且是2的的指数时才支持。指数时才支持。v两个无符号数相除的时序算法是要从被除数中重复地两个无符号数相除的时序算法是要从被除数中重复地减去除法,直到已检测到余数小于除数。可以通过累减去除法,直到已检测到余数小于除数。可以通过累计减法运算的次数而得到商;余数的最终值是减法运计减法运算的次数而得到商;余数的最终值是减法运算序列结束时被除数中的剩余值。算序列结束时被除数中的剩余值。v两个有符号数相除的最简单方法是先将两数相除,然两个有符号数相除的最简单方法是先将两数相除,然后调整结果的符号。其他方法则都比较复杂。后调整结果的符号。其他方法则都比较复杂。v除法器的设计方法:除法器的设计方法:1.一种是直接采用一种是直接采用Verilog的除法指令,如:的除法指令,如:k=127/i;(注意此种方法有综合工具的限制)(注意此种方法有综合工具的限制)2.另一种是采用移位减法来实现除法运算(先移位另一种是采用移位减法来实现除法运算(先移位后减);后减);3.再一种是采用基于除法器宏功能模块的设计。再一种是采用基于除法器宏功能模块的设计。4.还有一种是将整数除法转换为小数乘法的方法实还有一种是将整数除法转换为小数乘法的方法实现。(此时除数应为常数)现。(此时除数应为常数)v移位减法式除法器设计:移位减法式除法器设计:v除数应大于被除数的高部分除数应大于被除数的高部分(否则不能保证商位为否则不能保证商位为1);在通用程序的编写中,可以通过在被除数前面补在通用程序的编写中,可以通过在被除数前面补0来来实现。实现。v运算时先将运算时先将 被除数(被除数(商商+余数)一起左移余数)一起左移1位,然后位,然后用被除数的高部分减去除数;用被除数的高部分减去除数;v判断前面的减法是否够减:够减,则商加判断前面的减法是否够减:够减,则商加1,减法结果,减法结果保存为新的余数;保存为新的余数;不够减,则商不加不够减,则商不加1,减法结果也不要保存;,减法结果也不要保存;v循环次数的确定:根据被除数位宽循环次数的确定:根据被除数位宽-除数位宽确定,因为移位减法到最除数位宽确定,因为移位减法到最后被除数由余数后被除数由余数+商给代替,而余商给代替,而余数总是和除数的位宽相同,剩下的数总是和除数的位宽相同,剩下的就是商的宽度(也就是需要循环的就是商的宽度(也就是需要循环的次数)。次数)。v如果保证程序的通用性的话(即被如果保证程序的通用性的话(即被除数的高位部分小于或等于除数),除数的高位部分小于或等于除数),一般在被除数前面一般在被除数前面+(除数位宽)(除数位宽)个个0,构成新的被除数,这时的循,构成新的被除数,这时的循环次数也就等于(原来被除数的位环次数也就等于(原来被除数的位宽数)。宽数)。100|00010100010100-100 0101000-100 1010000-100 0010001-101 0100010移位相减移位相减移位相减移位相减商要加商要加10100010移位相减移位相减移位相减移位相减余数余数+商商00101000101000v移位减法实现除法示例移位减法实现除法示例(被除数(被除数21+11=32位,除数位,除数11位)位)C =0;F0=0;Result31:21=11d0;for(i=0;i 21;i=i+1)/确定循环次数确定循环次数 begin C =Result31;/保存移出的最高位保存移出的最高位 Result31:0=Result31:0=CNT11bD10:0)begin F0=1;Result31:21=Result31:21-CNT11bD10:0;end else F0=0;if(C|F0)Result0=1;/商加商加1 end 思考:如果要把此除法变为流水线方式应该如何设计程序?思考:如果要把此除法变为流水线方式应该如何设计程序?整数除法整数除法-小数乘法小数乘法v整数除法也可以转化为小数乘法,可以通过整数除法也可以转化为小数乘法,可以通过SD编码方式转化为移位加减编码方式转化为移位加减法实现。如:法实现。如:x/278=x*0.0036vSD编码(编码(Signed Digit Numbers)是将十进制数用数相加减)是将十进制数用数相加减 的形式表示出来,该编码与传统的二进制编码不同,它使用的形式表示出来,该编码与传统的二进制编码不同,它使用3个值来表个值来表 示数字,即示数字,即0,1,-1,其中,其中-1常写为常写为 。v如为整数:如为整数:271032104101101000002100212 (下标表示进制)(下标表示进制)v如为小数(将小数先乘以如为小数(将小数先乘以128):):t1=128*0.8500=108.800=128-16-4+0.5+0.25+0.0625 =t2=128*0.0036=0.46080.50.03125 vt1=v vt2=v得到:得到:x1*t1-x2*t2=(x17)(x1 2)2)v(x12)+x17,x17:1+x17,x7,x17:2v+x17,x7,x17,x7,x17:4 x27,x27:1 vx27,x27,x27,x27,x27,x27,x27:5v得到结果后,再将结果右移得到结果后,再将结果右移7位位(因为刚开始的小数乘以了因为刚开始的小数乘以了128)。v注:乘以注:乘以128的目的是把的目的是把SD码的小数部分转化为小于码的小数部分转化为小于8位(最位(最大大7位)的二进制小数,这样计算结果的右移位数就可以控制在位)的二进制小数,这样计算结果的右移位数就可以控制在7位之内(最多右移位之内(最多右移7位),因为当一个字节右移位),因为当一个字节右移8位后就什么位后就什么都没有,只剩下都没有,只剩下0了。了。奇数分频与小数分频奇数分频与小数分频v1.奇数分频奇数分频 在实际应用中,我们经常会遇到这样的问题,需要在实际应用中,我们经常会遇到这样的问题,需要进行奇数次分频,同时又要得到占空比是进行奇数次分频,同时又要得到占空比是50%的方的方波波形。如果是偶数次分频的话,得到占空比是波波形。如果是偶数次分频的话,得到占空比是50%的方波并不困难,比如进行的方波并不困难,比如进行2N次分频,只需在次分频,只需在计数到计数到N-1(从从0开始开始)时,波形翻转即可;或者在最时,波形翻转即可;或者在最后一级加一个后一级加一个2分频器也可实现。如果是奇数次分频分频器也可实现。如果是奇数次分频的话,可采用如下方法:用两个计数器,一个由输入的话,可采用如下方法:用两个计数器,一个由输入时钟上升沿触发,一个由输入时钟下降沿触发,最后时钟上升沿触发,一个由输入时钟下降沿触发,最后将两个计数器的输出相或,即可得到占空比为将两个计数器的输出相或,即可得到占空比为50%的方波波形。的方波波形。下面的示例就实现了对输入时钟下面的示例就实现了对输入时钟CLK的的7分频,同分频,同时得到了占空比为时得到了占空比为50%的方波。的方波。module count7(rst,clk,cout);input clk,rst;output cout;reg2:0 m,n;wire cout;reg cnt1,cnt2;assign cout=cnt1|cnt2;/两个计数器的输出相或两个计数器的输出相或always(posedge clk)begin if(!rst)begin cnt1=0;m=0;end else if(rst)begin if(m=6)begin m=0;end else m=m+1;if(m=2)cnt1=cnt1;else if(m=5)cnt1=cnt1;endendalways(negedge clk)begin if(!rst)begin cnt2=0;n=0;end else if(rst)begin if(n=6)begin n=0;end else n=n+1;if(n=2)cnt2=cnt2;else if(n=5)cnt2=cnt2;endendendmodule模模7奇数分频器功能仿真波形图奇数分频器功能仿真波形图v2.半整数分频半整数分频 设有一个设有一个5MHz的时钟信号,但需要得到的时钟信号,但需要得到2MHz的时钟,分的时钟,分频比为频比为2.5,此时可采用半整数分频器。其设计思想为:要实,此时可采用半整数分频器。其设计思想为:要实现现2.5分频,可先设计一个模分频,可先设计一个模3分频器,再设计一个脉冲扣除分频器,再设计一个脉冲扣除电路,加在模电路,加在模3计数器之后,每来计数器之后,每来3个脉冲就扣除半个脉冲,个脉冲就扣除半个脉冲,即可实现分频系数为即可实现分频系数为2.5的半整数分频。采用类似的方法可实的半整数分频。采用类似的方法可实现任意半整数分频。下图所示为半整数分频器原理图。通过异现任意半整数分频。下图所示为半整数分频器原理图。通过异或门和或门和2分频模块组成脉冲扣除电路,脉冲扣除正是输入频率分频模块组成脉冲扣除电路,脉冲扣除正是输入频率与与2分频输出异或的结果。分频输出异或的结果。下面是采用上述原理设计的下面是采用上述原理设计的5.5分频的程序。分频的程序。module fdiv5_5(clkin,clr,clkout);input clkin,clr;output clkout;reg clkout,clk1;wire clk2;integer cnt;xor xor1(clk2,clkin,clk1);/异或异或always(posedge clkout or negedge clr)/2分频器分频器begin if(!clr)begin clk1=1b0;end else clk1=clk1;endalways(posedge clk2 or negedge clr)/模模5分频器分频器begin if(!clr)begin cnt=0;clkout=1b0;end else if(cnt=5)/更改更改cnt的值,即可实现不同模的半整数分频,比如的值,即可实现不同模的半整数分频,比如6.5,7.5等等 begin cnt=0;clkout=1b1;end else begin cnt=cnt+1;clkout=1b0;endendendmodule v3.小数分频小数分频 在实际应用中,还经常会遇到小数分频。实现小数在实际应用中,还经常会遇到小数分频。实现小数分频可采用两种方法:分频可采用两种方法:v一种是用数字锁相环实现,先利用锁相环电路将输入一种是用数字锁相环实现,先利用锁相环电路将输入时钟倍频,然后再利用分频器对新产生的高频信号进时钟倍频,然后再利用分频器对新产生的高频信号进行分频得到需要的时钟频率。比如要实现行分频得到需要的时钟频率。比如要实现5.7分频,分频,可以先将输入的时钟可以先将输入的时钟10倍频,然后再将倍频后的时倍频,然后再将倍频后的时钟钟57分频,这样即可精确实现分频,这样即可精确实现5.7的小数分频。这的小数分频。这种方法的好处是可以做到精确分频,但是需要器件内种方法的好处是可以做到精确分频,但是需要器件内包含锁相环电路包含锁相环电路PLL。v还有一种方法可大致实现小数分频(不精确),即先还有一种方法可大致实现小数分频(不精确),即先设计两个不同分频比的整数分频器,然后通过控制两设计两个不同分频比的整数分频器,然后通过控制两种分频比出现的不同次数来获得所需要的小数分频值,种分频比出现的不同次数来获得所需要的小数分频值,从而实现从而实现平均意义上的小数分频平均意义上的小数分频。下例就是实现的一个分频系数为下例就是实现的一个分频系数为8.1的小数分频器,通过计数器先做的小数分频器,通过计数器先做9次次8分频,分频,再做一次再做一次9分频,这样总的分频值分频,这样总的分频值(10次分频的平均值次分频的平均值)为为:N=(8*9+9*1)/(9+1)=8.1module fdiv8_1(clkin,rst,clkout);input clkin,rst;output clkout;reg clkout;reg3:0 cnt1,cnt2;always(posedge clkin or negedge rst)begin if(!rst)begin cnt1=0;cnt2=0;clkout=0;end else if(cnt19)/9次次8分频分频 begin if(cnt27)begin cnt2=cnt2+1;clkout=0;end else begin cnt2=0;cnt1=cnt1+1;clkout=1;end end else begin/1次次9分频分频 if(cnt28)begin cnt2=cnt2+1;clkout=0;end else begin cnt2=0;cnt1=0;clkout=1;end endendendmodule8.1小数分频功能仿真波形小数分频功能仿真波形思考:如果分频系数为思考:如果分频系数为 7.2 应该怎么做?应该怎么做?有限状态机设计有限状态机设计v有限状态机有限状态机(Finite State Machine,FSM)是一种是一种很重要的时序逻辑电路,尤其适合设计数字系统的控很重要的时序逻辑电路,尤其适合设计数字系统的控制模块,是许多数字电路的核心部件。有限状态机的制模块,是许多数字电路的核心部件。有限状态机的标准模型主要由三部分组成:一是次态组合逻辑电路,标准模型主要由三部分组成:一是次态组合逻辑电路,二是由状态触发器构成的现态时序逻辑电路,三是输二是由状态触发器构成的现态时序逻辑电路,三是输出组合逻辑电路。出组合逻辑电路。v根据电路的输出信号是否与电路的输入有关,有限状根据电路的输出信号是否与电路的输入有关,有限状态机可分为两种类型:一类是态机可分为两种类型:一类是Mealy(米莉米莉)型状态机,型状态机,其输出信号不仅与电路的当前状态有关,还与电路的其输出信号不仅与电路的当前状态有关,还与电路的输入有关;另一类是输入有关;另一类是Moore(摩尔摩尔)型状态机,其输出型状态机,其输出状态仅与电路的当前状态有关,与电路的输入无关。状态仅与电路的当前状态有关,与电路的输入无关。v状态机一般都应设计为同步方式,并由一个时钟信号来触发。实用的状态机一般都应设计为同步方式,并由一个时钟信号来触发。实用的状态机都应该设计为由唯一时钟边沿触发的同步运行方式。状态机都应该设计为由唯一时钟边沿触发的同步运行方式。状态转移图的绘制(检测序列状态转移图的绘制(检测序列110)s0:0 s1:1 s2:11 s3:110状态转移图的绘制(检测序列状态转移图的绘制(检测序列0101)s0:0 s1:01 s2:010 s3:1(无效状态无效状态)s4:0101如何进行状态机编程如何进行状态机编程对于对于Mealy型型FSM电路来说,由于电路的输出除了与电路的现态电路来说,由于电路的输出除了与电路的现态有关外,还与电路的输入信号有关,如果输入信号的变化不能及有关外,还与电路的输入信号有关,如果输入信号的变化不能及时被检测,而要等待时钟有效沿到来时才进行检测的话,则电路时被检测,而要等待时钟有效沿到来时才进行检测的话,则电路的输出很可能是错误的(例如在上次时钟有效沿和本次时钟有效的输出很可能是错误的(例如在上次时钟有效沿和本次时钟有效沿之间往自动售货机里快速投入一枚硬币)。所以在设计沿之间往自动售货机里快速投入一枚硬币)。所以在设计FSM电电路时,建议采用两个路时,建议采用两个always块或者三个块或者三个always块的方法进行描述。块的方法进行描述。也就是说,若时钟周期相对过长,则会漏掉输入信号。即与输入也就是说,若时钟周期相对过长,则会漏掉输入信号。即与输入信号有关的硬件描述语言采用组合逻辑形式。信号有关的硬件描述语言采用组合逻辑形式。状态编码的定义:状态编码的定义:parameter方式(一般采用该方式)和方式(一般采用该方式)和define方式。方式。状态转换的描述:一般使用状态转换的描述:一般使用case、casez和和casex语句来描述状语句来描述状态之间的转换,用态之间的转换,用case语句表述比用语句表述比用if-else语句更清晰明了。此语句更清晰明了。此外在外在case语句的最后,不要忘了加上语句的最后,不要忘了加上default分支语句,以避免锁分支语句,以避免锁存器的产生。存器的产生。用两个用两个always块描述电路块描述电路(检测序列检测序列110)module pusle(data,clk,nclr,out);input data,clk,nclr;output out;reg out;reg2:0 current_state,next_state;parameter1:0 s0=0,s1=1,s2=2,s3=3;always(posedge clk)/the state registerbegin if(!nclr)current_state=s0;else current_state=next_state;end/the combination logic,assign the next_statealways(current_state or data)begin case(current_state)s0:begin out=0;next_state=(data=1)?s1:s0;end s1:begin out=0;next_state=(data=1)?s2:s0;end s2:if(data=1)begin out=0;next_state=s2;end else begin out=1;next_state=s3;end s3:begin out=0;next_state=(data=1)?s1:s0;end endcaseendendmodule用三个用三个always块描述电路块描述电路(检测序列检测序列110)module pusle(data,clk,nclr,out);input data,clk,nclr;output out;reg out;reg2:0 current_state,next_state;parameter1:0 s0=0,s1=1,s2=2,s3=3;always(posedge clk)/the state registerbegin if(!nclr)current_state=s0;else current_state10),引起逻辑),引起逻辑错误。错误。v 格雷编码相邻状态每次只有一个比特位产生变格雷编码相邻状态每次只有一个比特位产生变化(化(00、01、11、10),减少了瞬变次数,),减少了瞬变次数,也减少了产生毛刺和一些暂态的可能。也减少了产生毛刺和一些暂态的可能。一位热码编码即采用一位热码编码即采用n位(或位(或n个触发器)来编码个触发器)来编码n个状态的状态机(如个状态的状态机(如1000、0100、0010、0001)。这样虽然多用了触发器)。这样虽然多用了触发器,但可以有效节省和简化组合电路。,但可以有效节省和简化组合电路。对于寄存器数量多而门逻辑相对缺乏的对于寄存器数量多而门逻辑相对缺乏的FPGA器件来器件来说,采用该方式可以有效提高电路的速度和可靠性,说,采用该方式可以有效提高电路的速度和可靠性,也有利于提高器件资源的利用率。因此,对于也有利于提高器件资源的利用率。因此,对于FPGA器件建议采用该编码方式。器件建议采用该编码方式。v采用一位热码编码后,会出现一些多余的状态,即一采用一位热码编码后,会出现一些多余的状态,即一些无效的状态。因此,如果用些无效的状态。因此,如果用case语句来描述的话,语句来描述的话,需要增加需要增加default分支项,以便在这些状态下能自动分支项,以便在这些状态下能自动回到起始状态。回到起始状态。v对于对于Mealy型型FSM电路来说,即使状态变化采用格雷码或一电路来说,即使状态变化采用格雷码或一位热码编码输出方式也不能保证输出稳定。因为一般位热码编码输出方式也不能保证输出稳定。因为一般Mealy型型FSM电路的最后一级是采用输入信号和当前状态组成组合逻电路的最后一级是采用输入信号和当前状态组成组合逻辑电路的方式,而组合逻辑电路不可避免的产生竞争冒险(如辑电路的方式,而组合逻辑电路不可避免的产生竞争冒险(如果输入信号是两位以上)。这时有一种方法可以很好地消除这果输入信号是两位以上)。这时有一种方法可以很好地消除这种输出结果不稳定现象:就是在最后的输出端再加一级钟控寄种输出结果不稳定现象:就是在最后的输出端再加一级钟控寄存器,就可以不受组合逻辑输出竞争冒险的影响。存器,就可以不受组合逻辑输出竞争冒险的影响。基于宏功能模块的设计基于宏功能模块的设计vQuartus II为设计者提供了丰富的宏功能模块库,采用宏功为设计者提供了丰富的宏功能模块库,采用宏功能模块完成设计可极大提高电路设计的效率和可靠性。能模块完成设计可极大提高电路设计的效率和可靠性。vQuartus II软件自带的宏模块库主要有三个,分别是软件自带的宏模块库主要有三个,分别是Megafunctions库、库、Maxplus2库和库和Primitives库。库。vMegafunctions库是参数化模块库(库是参数化模块库(Library of Parametrized Modules,LPM),库中是一些经过验证),库中是一些经过验证的功能模块,用户可以根据自己的需要设定模块的端口的功能模块,用户可以根据自己的需要设定模块的端口(Ports)和参数和参数(Parameters),即可完成模块的定制。,即可完成模块的定制。v按照按照Megafunctions库中模块的功能,将其分为算术运算模库中模块的功能,将其分为算术运算模块库块库(arithmetic)、逻辑门库、逻辑门库(gates)、存储器库、存储器库(storage)和和IO模块库模块库(I/O)四个子库。四个子库。v有乘法器模块、除法器模块、计数器模块、常数模块、锁相环有乘法器模块、除法器模块、计数器模块、常数模块、锁相环模块、存储器模块等。模块、存储器模块等。时钟树时钟树复杂的时钟方案复杂的时钟方案组合逻辑反馈循环和脉冲发生器组合逻辑反馈循环和脉冲发生器存储器,存储器,IO专用宏单元专用宏单元总做得和你一样好总做得和你一样好 综合工具不能胜任的工作设计的可综合性设计的可综合性综合工具善于优化组合逻辑。但设计中有很大一部分不是组合逻辑。综合工具善于优化组合逻辑。但设计中有很大一部分不是组合逻辑。例例如如,时时钟钟树树。时时钟钟树树是是全全局局的的、芯芯片片范范围围的的问问题题。在在没没有有版版图图布布局局信信息息的的情情况况下下,要给出较优的结果,综合工具对块的大小有一定的限制。要给出较优的结果,综合工具对块的大小有一定的限制。综综合合工工具具不不能能很很好好地地处处理理复复杂杂时时钟钟。通通常常,只只允允许许要要综综合合的的块块含含有有一一个个时时钟钟。但但设设计中经常使用两相时钟或在双沿时钟。计中经常使用两相时钟或在双沿时钟。综综合合工工具具不不易易实实现现脉脉冲冲产产生生逻逻辑辑,如如单单个个脉脉冲冲,或或结结果果依依赖赖于于反反馈馈路路径径延延迟迟的的组组合合反馈逻辑。对这种情况,插入延迟元件使一个信号推迟到达的效果并不好。反馈逻辑。对这种情况,插入延迟元件使一个信号推迟到达的效果并不好。不能用综合产生大块存储器,因为综合工具会用不能用综合产生大块存储器,因为综合工具会用flip-flop实现。实现。不不是是所所有有的的综综合合工工具具都都能能很很好好地地从从工工艺艺库库里里挑挑选选择择大大的的单单元元或或宏宏单单元元,这这需需要要用用户户人人工工实实例例化化。一一些些宏宏单单元元,例例如如大大的的结结构构规规则则的的数数据据通通路路元元件件,最最好好使使用用生生产产商商提提供的硅编译器产生。供的硅编译器产生。综合工具不保证产生最小结果。通常综合结果不如人工结果,只要你有足够的时间。综合工具不保证产生最小结果。通常综合结果不如人工结果,只要你有足够的时间。综合工具不能胜任的工作综合工具不能胜任的工作 不要引入不必要的不要引入不必要的latch 敏感表要完整敏感表要完整 非结构化的非结构化的for循环循环 资源共享资源共享其它要注意的问题其它要注意的问题 条件分支不完全的条件语句(条件分支不完全的条件语句(if和和case语句)将会产生锁存器语句)将会产生锁存器always(cond_1)begin if(cond_1)data_out=data_in;endalways(sel or a or b or c or d)begin case(sel)2b00:a=b;2b01:a=c;2b10:a=d;endcase end不要产生不需要的不要产生不需要的latch不完整的的敏感表将引起综合后网表的仿真结果与以前的不一致。不完整的的敏感表将引起综合后网表的仿真结果与以前的不一致。always(d or clr)if(clr)q=1b0;else if(e)q=d;always(d or clr or e)if(clr)q=1b0;else if(e)q=d;敏感表要完整敏感表要完整综合工具处理循环的方法是将循环内的结构重复。在循环中包含不变综合工具处理循环的方法是将循环内的结构重复。在循环中包含不变化的表达式会使综合工具花很多时间优化这些冗余逻辑。化的表达式会使综合工具花很多时间优化这些冗余逻辑。for(I=0;i4;i=i+1)begin sig1=sig2;-unchanging statement data_outI=data_inI;endsig1=sig2;-unchanging statementfor(I=0;i4;i=i+1)data_outI=data_inI;非结构化的非结构化的for循环循环只有在同一个条件语句只有在同一个条件语句(if和和case)不同的分支中的算术操作才会共享。不同的分支中的算术操作才会共享。条件操作符条件操作符?:中的算术操作不共享。中的算术操作不共享。if(cond)z=a+b;else z=c+d;Z=(cond)?(a+b):(c+d);资源共享资源共享利用括号分割逻辑。利用括号分割逻辑。z=a+b+c+d;Z=(a+b)+(c+d);+ab+c+zd+ab+cd+z括号的作用括号的作用在进行可综合的数字系统设计时,应特别注意以下一些要点:在进行可综合的数字系统设计时,应特别注意以下一些要点:v1).不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循环语句,如环语句,如forever,while等。等。v2).应尽量采用同步方式设计电路。应尽量采用同步方式设计电路。v3).除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。议采用行为语句来完成设计。v4).用用always过程块描述组合逻辑,应在敏感信号列表中列出块中出现的所过程块描述组合逻辑,应在敏感信号列表中列出块中出现的所有输入信号。有输入信号。v5).所有的内部寄存器都应该能够被复位。在使用所有的内部寄存器都应该能够被复位。在使用FPGA实现设计时,应尽量实现设计时,应尽量使用器件的全局复位端作为系统总的复位,因为该引脚的驱动功能最强,到使用器件的全局复位端作为系统总的复位,因为该引脚的驱动功能最强,到所有逻辑单元的延时也基本相同,同样的道理,应尽量使用器件的全局时钟所有逻辑单元的延时也基本相同,同样的道理,应尽量使用器件的全局时钟端作为系统外部时钟输入。端作为系统外部时钟输入。v6).在在Verilog HDL模块中,任务(模块中,任务(task)通常被综合成组合逻辑的形式;)通常被综合成组合逻辑的形式;每个函数(每个函数(function)在调用时通常也被综合为一个独立的组合电路形式。)在调用时通常也被综合为一个独立的组合电路形式。可综合设计总结可综合设计总结在节省资源的设计中应注意以下要点:在节省资源的设计中应注意以下要点:v1).尽量共享复杂的运算单元,可以采用函数和任务来尽量共享复杂的运算单元,可以采用函数和任务来定义这些共享的数据处理模块。定义这些共享的数据处理模块。v2).对综合后的结果要做到心中有数,可用括号等方式对综合后的结果要做到心中有数,可用括号等方式控制综合的结果,尽量实现资源的共享和重用已计算过控制综合的结果,尽量实现资源的共享和重用已计算过的结果。的结果。v3).模块数据宽度应该尽量小,以能满足设计要求为标模块数据宽度应该尽量小,以能满足设计要求为标准。准。可综合设计总结可综合设计总结使用阻塞和非阻塞赋值应遵循的原则:使用阻塞和非阻塞赋值应遵循的原则:v1).当用当用“always”块来描述组合逻辑时,既可以用阻塞赋值,块来描述组合逻辑时,既可以用阻塞赋值,也可以用非阻塞赋值,应尽量使用阻塞赋值。也可以用非阻塞赋值,应尽量使用阻塞赋值。v2).对时序逻辑描述和建模,使用非阻塞赋值方式。对时序逻辑描述和建模,使用非阻塞赋值方式。v3).为锁存器建模,应尽量使用非阻塞赋值方式。为锁存器建模,应尽量使用非阻塞赋值方式。v4).若在同一个若在同一个“always”过程块中既为组合逻辑建模,又为时过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻塞赋值方式。序逻辑建模,最好使用非阻塞赋值方式。v5).在一个在一个“always”过程块中,最好不要混合使用阻塞赋值和过程块中,最好不要混合使用阻塞赋值和非阻塞赋值(即使有的综合工具支持也不要用)。对同一个变量非阻塞赋值(即使有的综合工具支持也不要用)。对同一个变量不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错。不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错。v6).不能在不能在2个或个或2个以上的个以上的“always”过程块中对同一个变量赋过程块中对同一个变量赋值,这样会引发冲突,在综合时会报错。值,这样会引发冲突,在综合时会报错。v7).使用使用$strobe显示非阻塞赋值的变量。显示非阻塞赋值的变量。可综合设计总结可综合设计总结FPGA设计中毛刺的消除(一般为组合逻辑的输出):设计中毛刺的消除(一般为组合逻辑的输出):v任何一个门电路,只要有两个输入信号同时向相反的方向变化,其输出端都任何一个门电路,只要有两个输入信号同时向相反的方向变化,其输出端都有可能产生毛刺。判断一个逻辑电路在某些输入信号发生变化时是否会产生有可能产生毛刺。判断一个逻辑电路在某些输入信号发生变化时是否会产生冒险,首先要判断信号是否会同时变化,然后判断在信号同时变化时,是否冒险,首先要判断信号是否会同时变化,然后判断在信号同时变化时,是否会产生冒险。会产生冒险。v时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错。系统出错。v可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生:可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生:1).在数字电路设计中,采用格雷码计数器取代普通的二进制计数器。在数字电路设计中,采用格雷码计数器取代普通的二进制计数器。2).D触发器的触发器的D输入端对毛刺不敏感,只要毛刺不出现在时钟的上升沿并且满足输入端对毛刺不敏感,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对其产生影响。可以在易产生毛刺的电路输数据的建立和保持时间,就不会对其产生影响。可以在易产生毛刺的电路输出端接上一个出端接上一个D触发器,但要注意输出沿后一个时钟(见本书触发器,但要注意输出沿后一个时钟(见本书P243的例程)。的例程)。3).流水线设计技术由于是在复杂组合逻辑中加入寄存器,因此也可以有效减少流水线设计技术由于是在复杂组合逻辑中加入寄存器,因此也可以有效减少毛刺的产生。毛刺的产生。可综合设计总结可综合设计总结Verilog HDL结构可综合性说明module,marcomodulewire,reg,integer数据类型parameter端口类型说明input,output,inout运算符+,-,*,%,&,&,|,|,=,!=,&,|,!,&,|,?:,大部分可综合;全等运算符(=!=)不支持;多数工具对除法(/)和求模(%)有限制;如对除法操作,只有当除数是常数,且是2的指数时才支持基本门元件and,nand,nor,or,xor,xnor,buf,not,bufif1,bufif0,notif1,notif0,pullup,pulldown全部可综合;但某些综合器对取值x和z有所限制持续赋值assignVerilog HDL结构可综合性说明过程赋值:阻塞赋值(=)非阻塞赋值(=)支持,但对同一reg型变量只能采用阻塞或非阻塞赋值中的一种进行赋值条件语句:if-else,case,casex,casez,endcasefor循环语句always过程语句Begin-end语句function,endfunctiontask,endtask一般支持,少数综合器不支持编译向导:include,define,ifdef,else,endifp经常不断地学习,你就什么都知道。你知道得越多,你就越有力量pStu
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!