




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四讲第四讲 Verilog HDL高级编程技术高级编程技术参见课本的第参见课本的第4,9,10章章v加法器设计加法器设计v乘法器设计乘法器设计v除法器的设计除法器的设计v奇数分频与小数分频奇数分频与小数分频v有限状态机设计有限状态机设计v基于宏功能模块的设计基于宏功能模块的设计v设计的可综合性设计的可综合性加法器设计加法器设计v加法、乘法作为基本的运算,大量应用在数字信加法、乘法作为基本的运算,大量应用在数字信号处理和数字通信的各种算法中。由于加法器、号处理和数字通信的各种算法中。由于加法器、乘法器使用频繁,所以其速度往往影响着整个系乘法器使用频繁,所以其速度往往影响着整个系统的运行速度。如
2、果可实现快速加法器和快速乘统的运行速度。如果可实现快速加法器和快速乘法器的设计,则可以提高整个系统的速度。法器的设计,则可以提高整个系统的速度。v加法运算是最基本的运算,在多少情况下,无论加法运算是最基本的运算,在多少情况下,无论是乘法、除法、加法还是是乘法、除法、加法还是FFT等运算,最终都可等运算,最终都可以分解为加法运算来实现。以分解为加法运算来实现。v加法运算有:级连加法器、并行加法器、超前进加法运算有:级连加法器、并行加法器、超前进位加法器、流水线加法器等位加法器、流水线加法器等v 1.级连加法器的设计见课本级连加法器的设计见课本P184-P185。 级连加法器是由级连加法器是由1位
3、全加器级连构成的,本级的进位输出作为位全加器级连构成的,本级的进位输出作为下一级的进位输入。下一级的进位输入。 级连加法器结构简单,但级连加法器结构简单,但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),(m
4、2,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_
5、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描述语言,实现起来很容易,描述语言,实现起来很容易,其运算速度快,但耗用其运算速度快,但耗用资源多,尤其是当加法运算的位数较宽时资源多,尤
6、其是当加法运算的位数较宽时,其耗用的,其耗用的资源将会较大。资源将会较大。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.流水线加法器:流水线加法器: 为保证数据吞吐率,电路设计中的一个主要问题就为保证数据吞吐率,电路设计中的一个主要问题就是要维持系统时钟的速度处于或高于某一频率。例如,是要维持系统时钟的速度处于或高于某一频率。例如,如果整个系统是一个全同步时钟,同时又必须运行在如果整个系统是一个全同
7、步时钟,同时又必须运行在25MHz的频率上,那么,从任何寄存器的输出到它的频率上,那么,从任何寄存器的输出到它馈给信号的寄存器输入路径间的最大时延必须小于馈给信号的寄存器输入路径间的最大时延必须小于40ns。如果通过某些复杂逻辑的延时路径比较长,。如果通过某些复杂逻辑的延时路径比较长,系统时钟的速度就很难维持。这时,就必须在组合逻系统时钟的速度就很难维持。这时,就必须在组合逻辑间插入触发器,使复杂的组合逻辑形成流水线。虽辑间插入触发器,使复杂的组合逻辑形成流水线。虽然流水线会增加器件资源的使用,但它降低了寄存器然流水线会增加器件资源的使用,但它降低了寄存器间的传播延时,保证系统维持高的系统时钟
8、速度。间的传播延时,保证系统维持高的系统时钟速度。 v 流水线设计的基本思想是在逻辑电路中加入若干寄存器来暂存流水线设计的基本思想是在逻辑电路中加入若干寄存器来暂存中间结果,虽然多用了一些寄存器资源,但减少了每一级组合中间结果,虽然多用了一些寄存器资源,但减少了每一级组合电路的时延,因此可提高整个电路的运行效率。电路的时延,因此可提高整个电路的运行效率。v 流水线设计可有效提高系统的工作频率,尤其是对于流水线设计可有效提高系统的工作频率,尤其是对于FPGA器器件。件。FPGA的逻辑单元中有大量的逻辑单元中有大量4到到5变量的查找表变量的查找表(LUT)以以及大量的触发器,因此在及大量的触发器,
9、因此在FPGA设计中采用流水线技术可以有设计中采用流水线技术可以有效提高系统的速度。效提高系统的速度。v 实际中的乘法器大多是有时钟引脚的,以连续不断地进行乘法实际中的乘法器大多是有时钟引脚的,以连续不断地进行乘法运算。在有时钟信号的乘法器中,可以采用流水线设计技术,运算。在有时钟信号的乘法器中,可以采用流水线设计技术,以提高系统的运行频率。同样加法器也可以采用流水线设计。以提高系统的运行频率。同样加法器也可以采用流水线设计。v 下面的例子就是一个两个流水下面的例子就是一个两个流水8位加法,由两个位加法,由两个4位加法器构位加法器构成,输出存储在寄存器中。成,输出存储在寄存器中。module
10、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;endendmo
11、dule乘法器设计乘法器设计v乘法器也频繁使用在数字信号处理和数字通信的各种乘法器也频繁使用在数字信号处理和数字通信的各种算法中,并且往往影响着整个系统的运行速度,所以算法中,并且往往影响着整个系统的运行速度,所以如果能实现快速乘法器的设计,可提高整个系统的处如果能实现快速乘法器的设计,可提高整个系统的处理速度。乘法器的设计方法主要有:并行运算理速度。乘法器的设计方法主要有:并行运算(纯组合纯组合逻辑逻辑)、移位相加、查找表、加法树等。、移位相加、查找表、加法树等。v1.并行乘法器:并行乘法器是纯组合逻辑的乘法器,并行乘法器:并行乘法器是纯组合逻辑的乘法器,完全由逻辑门实现。对于完全由逻辑门实
12、现。对于11乘法,只需乘法,只需1个与门即个与门即可实现,可实现,P=AB。对于。对于22乘法,根据课本乘法,根据课本P189的真值表可以得出结果表达式:的真值表可以得出结果表达式: 因此我们可以用与门、或门来实现。因此我们可以用与门、或门来实现。,011101201013bbabaapbbaap0000010110101011,bapbaabbabbabaapv 并行乘法器示例:并行乘法器示例:module mult(outcome,a,b);parameter size=8;inputsize:1 a,b; output2*size:1 coutcome;assign outcom=a*b
13、;endmodule并行乘法器随着操作数位数加宽,耗用的资源迅速变多,如果将并行乘法器随着操作数位数加宽,耗用的资源迅速变多,如果将上面的上面的8位并行乘法器适配到位并行乘法器适配到Cyclone系列的系列的EP1C3器件实器件实现的话,需耗用现的话,需耗用106个个LE单元。单元。而如果所用的而如果所用的FPGA器件中有嵌入式乘法器的话,则可采用嵌入器件中有嵌入式乘法器的话,则可采用嵌入式乘法器来实现乘法,比如将上例适配到式乘法器来实现乘法,比如将上例适配到Cyclone II系列的系列的EP2C5器件的话,只耗用器件的话,只耗用1个个LE单元和单元和1个个9位位*9位的嵌入式位的嵌入式乘法
14、器单元。乘法器单元。 因此,如果所用的因此,如果所用的FPGA器件中有硬件乘法器,建议用硬件乘器件中有硬件乘法器,建议用硬件乘法器来实现乘法操作,具有速度快,资源利用合理等优点。法器来实现乘法操作,具有速度快,资源利用合理等优点。v2.移位相加乘法器移位相加乘法器 移位相加乘法器将乘法变为加法实现,其设计思路是:乘法移位相加乘法器将乘法变为加法实现,其设计思路是:乘法通过逐次移位相加实现,每次判断乘数的最低位,若为通过逐次移位相加实现,每次判断乘数的最低位,若为1则将则将被乘数移位相加。被乘数移位相加。被乘数被乘数A 1101乘数乘数B 1011部分积部分积0 1101A左移左移 11010
15、部分积部分积1 100111A左移左移 000000部分积部分积2 100111A左移左移 1101000积积 10001111v 对于乘数中的第对于乘数中的第i位,若为位,若为1,则,则将被乘数左移将被乘数左移i位,并加到上次的位,并加到上次的部分积结果上。部分积结果上。(若为若为0可以看作可以看作只移位不相加。只移位不相加。)v 也可以依次判断乘数也可以依次判断乘数B的最低有的最低有效位是否为效位是否为1,若为,若为1则则P=P+A(部分积(部分积P在刚开始时要清在刚开始时要清0),),然后将被乘数然后将被乘数A左移左移1位,乘数位,乘数B右移右移1位位(并用并用0填补高位填补高位);当被
16、当被乘数全部变为乘数全部变为0后,乘法运算完后,乘法运算完成。成。 注:如果注:如果B的最低有效位为的最低有效位为0时,只需接着移位,不要相加时,只需接着移位,不要相加v移位相加乘法器是一种相对节省资源的设计方法,移位相加乘法器是一种相对节省资源的设计方法,为了实现为了实现nn乘法,需要一个乘法,需要一个2n位的左移寄存器位的左移寄存器(存放部分积),一个(存放部分积),一个n位的右移寄存器(可用除数位的右移寄存器(可用除数寄存器代替),一个寄存器代替),一个2n位加法器(被加数为部分积位加法器(被加数为部分积和被乘数,所以还需要一个被乘数寄存器),再加和被乘数,所以还需要一个被乘数寄存器),
17、再加少量的控制逻辑即可实现。尤其是当操作数位宽增少量的控制逻辑即可实现。尤其是当操作数位宽增加时,移位相加乘法器耗用的逻辑资源不会像并行加时,移位相加乘法器耗用的逻辑资源不会像并行乘法器那样急剧增加。乘法器那样急剧增加。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
18、 = 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
19、; 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.查找表乘法器查找表
20、乘法器 查找表乘法器将乘积直接放在存储器中,将操作查找表乘法器将乘积直接放在存储器中,将操作数数(乘数和被乘数乘数和被乘数)作为地址访问存储器,得到的输作为地址访问存储器,得到的输出数据就是乘法运算的结果。查找表方式的乘法器出数据就是乘法运算的结果。查找表方式的乘法器速度只局限于所使用存储器的存取速度。速度只局限于所使用存储器的存取速度。 但由于查找表的规模随着操作数位数的增加而迅但由于查找表的规模随着操作数位数的增加而迅速增大,因此如果用于实现位数宽的乘法操作,需速增大,因此如果用于实现位数宽的乘法操作,需要要FPGA器件具有较大的片内存储器模块。比如,器件具有较大的片内存储器模块。比如,要
21、实现要实现8*8乘法器的地址位宽为乘法器的地址位宽为16位,字长为位,字长为16位(可能性为:位(可能性为:28*28=256*256),即存储器),即存储器大小为大小为1048576(1M)比特,用这么大的存储器来比特,用这么大的存储器来实现实现8*8乘法运算,显然是不经济的。乘法运算,显然是不经济的。v3.除法器设计:多数工具对除法(除法器设计:多数工具对除法(/)和求模)和求模(%)有有限制。如对除法操作,只有当除数是常数,且是限制。如对除法操作,只有当除数是常数,且是2的的指数时才支持。指数时才支持。v两个无符号数相除的时序算法是要从被除数中重复地两个无符号数相除的时序算法是要从被除数
22、中重复地减去除法,直到已检测到余数小于除数。可以通过累减去除法,直到已检测到余数小于除数。可以通过累计减法运算的次数而得到商;余数的最终值是减法运计减法运算的次数而得到商;余数的最终值是减法运算序列结束时被除数中的剩余值。算序列结束时被除数中的剩余值。v两个有符号数相除的最简单方法是先将两数相除,然两个有符号数相除的最简单方法是先将两数相除,然后调整结果的符号。其他方法则都比较复杂。后调整结果的符号。其他方法则都比较复杂。v 除法器的设计方法:除法器的设计方法:1. 一种是直接采用一种是直接采用Verilog的除法指令,如:的除法指令,如:k = 127 / i;(注意此种方法有综合工具的限制
23、)(注意此种方法有综合工具的限制)2. 另一种是采用移位减法来实现除法运算(先移位另一种是采用移位减法来实现除法运算(先移位后减);后减);3. 再一种是采用基于除法器宏功能模块的设计。再一种是采用基于除法器宏功能模块的设计。4. 还有一种是将整数除法转换为小数乘法的方法实还有一种是将整数除法转换为小数乘法的方法实现。(此时除数应为常数)现。(此时除数应为常数)v移位减法式除法器设计:移位减法式除法器设计:v除数应大于被除数的高部分除数应大于被除数的高部分 (否则不能保证商位为否则不能保证商位为1) ;在通用程序的编写中,可以通过在被除数前面补在通用程序的编写中,可以通过在被除数前面补0来来实
24、现。实现。v运算时先将运算时先将 被除数(被除数( 商商+余数)一起左移余数)一起左移1位,然后位,然后用被除数的高部分减去除数;用被除数的高部分减去除数;v判断前面的减法是否够减:够减,则商加判断前面的减法是否够减:够减,则商加1,减法结,减法结果保存为新的余数;果保存为新的余数; 不够减,则商不加不够减,则商不加1,减法结果也不要保存;,减法结果也不要保存;v 循环次数的确定:根据被除数位宽循环次数的确定:根据被除数位宽-除数位宽确定,因为移位减法到除数位宽确定,因为移位减法到最后被除数由余数最后被除数由余数+商给代替,而商给代替,而余数总是和除数的位宽相同,剩下余数总是和除数的位宽相同,
25、剩下的就是商的宽度(也就是需要循环的就是商的宽度(也就是需要循环的次数)。的次数)。v 如果保证程序的通用性的话(即被如果保证程序的通用性的话(即被除数的高位部分小于或等于除数),除数的高位部分小于或等于除数),一般在被除数前面一般在被除数前面+(除数位宽)(除数位宽)个个0,构成新的被除数,这时的循,构成新的被除数,这时的循环次数也就等于(原来被除数的位环次数也就等于(原来被除数的位宽数)。宽数)。100 | 00010100010100- 100 0101000- 100 1010000- 100 0010001- 101 0100010移位相减移位相减移位相减移位相减商要加商要加1010
26、0010移位相减移位相减移位相减移位相减余数余数+商商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
27、; end else F0 = 0; if(C | F0) Result0 = 1; /商加商加1 end 思考:如果要把此除法变为流水线方式应该如何设计程序?思考:如果要把此除法变为流水线方式应该如何设计程序? 整数除法整数除法-小数乘法小数乘法v 整数除法也可以转化为小数乘法,可以通过整数除法也可以转化为小数乘法,可以通过SD编码方式转化为移位加减编码方式转化为移位加减法实现。如:法实现。如:x/278=x*0.0036vSD编码(编码(Signed Digit Numbers)是将十进制数用数相加减)是将十进制数用数相加减 的形式表示出来,该编码与传统的二进制编码不同,它使用的形式表示出
28、来,该编码与传统的二进制编码不同,它使用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 1SD101100sd)1101.00101100(sd) 11000. 0(v t1 = v v t2 = v 得到:得到:x1 *
29、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 v x27, x27, x27, x27, x27, x27, x27:5v 得到结果后,再将结果右移得到结果后,再将结果右移7位位(因为刚开始的小数乘以了因为刚开始的小数乘以了128)。v 注:乘以注:乘以128的目的是把的目的是把SD码的小数部分转化为小于码的小数部分转化为小于8位(最位(最大大7位)的二进制小数,这样计算结果的右移位数就可以控制位)的二进制小数,这样计算结果的右移位数就可以控制在在
30、7位之内(最多右移位之内(最多右移7位),因为当一个字节右移位),因为当一个字节右移8位后就什位后就什么都没有,只剩下么都没有,只剩下0了。了。sd) 11000. 0(sd)1101.00101100(奇数分频与小数分频奇数分频与小数分频v1.奇数分频奇数分频 在实际应用中,我们经常会遇到这样的问题,需要在实际应用中,我们经常会遇到这样的问题,需要进行奇数次分频,同时又要得到占空比是进行奇数次分频,同时又要得到占空比是50%的方的方波波形。如果是偶数次分频的话,得到占空比是波波形。如果是偶数次分频的话,得到占空比是50%的方波并不困难,比如进行的方波并不困难,比如进行2N次分频,只需在次分频
31、,只需在计数到计数到N-1(从从0开始开始)时,波形翻转即可;或者在最时,波形翻转即可;或者在最后一级加一个后一级加一个2分频器也可实现。如果是奇数次分频分频器也可实现。如果是奇数次分频的话,可采用如下方法:用两个计数器,一个由输入的话,可采用如下方法:用两个计数器,一个由输入时钟上升沿触发,一个由输入时钟下降沿触发,最后时钟上升沿触发,一个由输入时钟下降沿触发,最后将两个计数器的输出相或,即可得到占空比为将两个计数器的输出相或,即可得到占空比为50%的方波波形。的方波波形。 下面的示例就实现了对输入时钟下面的示例就实现了对输入时钟CLK的的7分频,同分频,同时得到了占空比为时得到了占空比为5
32、0%的方波。的方波。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
33、; 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奇数分频器功能仿真波形图奇数分频器功能仿真波形图v 2.半整数分频半整数分频 设有一个设有一个5MHz的时钟信号,但需要得到的时钟信号,但需要得到2MHz的时钟,分的时钟,分频比为频比为2.5,此时可采用半整数分频器。其设计思想为:要实,
34、此时可采用半整数分频器。其设计思想为:要实现现2.5分频,可先设计一个模分频,可先设计一个模3分频器,再设计一个脉冲扣除分频器,再设计一个脉冲扣除电路,加在模电路,加在模3计数器之后,每来计数器之后,每来3个脉冲就扣除半个脉冲,个脉冲就扣除半个脉冲,即可实现分频系数为即可实现分频系数为2.5的半整数分频。采用类似的方法可实的半整数分频。采用类似的方法可实现任意半整数分频。下图所示为半整数分频器原理图。通过异现任意半整数分频。下图所示为半整数分频器原理图。通过异或门和或门和2分频模块组成脉冲扣除电路,脉冲扣除正是输入频率分频模块组成脉冲扣除电路,脉冲扣除正是输入频率与与2分频输出异或的结果。分频
35、输出异或的结果。XOR输入时钟 clkin2分频模N计数器clk2clk1输出时钟 clkout下面是采用上述原理设计的下面是采用上述原理设计的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
36、; 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.小数分频小数分频 在实际应用中,还经常会遇到小数分频。实现小在实
37、际应用中,还经常会遇到小数分频。实现小数分频可采用两种方法:数分频可采用两种方法:v一种是用数字锁相环实现,先利用锁相环电路将输入一种是用数字锁相环实现,先利用锁相环电路将输入时钟倍频,然后再利用分频器对新产生的高频信号进时钟倍频,然后再利用分频器对新产生的高频信号进行分频得到需要的时钟频率。比如要实现行分频得到需要的时钟频率。比如要实现5.7分频,分频,可以先将输入的时钟可以先将输入的时钟10倍频,然后再将倍频后的时倍频,然后再将倍频后的时钟钟57分频,这样即可精确实现分频,这样即可精确实现5.7的小数分频。这的小数分频。这种方法的好处是可以做到精确分频,但是需要器件内种方法的好处是可以做到
38、精确分频,但是需要器件内包含锁相环电路包含锁相环电路PLL。v还有一种方法可大致实现小数分频(不精确),即先还有一种方法可大致实现小数分频(不精确),即先设计两个不同分频比的整数分频器,然后通过控制两设计两个不同分频比的整数分频器,然后通过控制两种分频比出现的不同次数来获得所需要的小数分频值,种分频比出现的不同次数来获得所需要的小数分频值,从而实现从而实现平均意义上的小数分频平均意义上的小数分频。下例就是实现的一个分频系数为下例就是实现的一个分频系数为8.1的小数分频器,通过计数器先做的小数分频器,通过计数器先做9次次8分频,分频,再做一次再做一次9分频,这样总的分频值分频,这样总的分频值(1
39、0次分频的平均值次分频的平均值)为为: 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
40、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)是一种是一种很重要的时序逻辑电路,尤其适合设计数
41、字系统的控很重要的时序逻辑电路,尤其适合设计数字系统的控制模块,是许多数字电路的核心部件。有限状态机的制模块,是许多数字电路的核心部件。有限状态机的标准模型主要由三部分组成:一是次态组合逻辑电路,标准模型主要由三部分组成:一是次态组合逻辑电路,二是由状态触发器构成的现态时序逻辑电路,三是输二是由状态触发器构成的现态时序逻辑电路,三是输出组合逻辑电路。出组合逻辑电路。v根据电路的输出信号是否与电路的输入有关,有限状根据电路的输出信号是否与电路的输入有关,有限状态机可分为两种类型:一类是态机可分为两种类型:一类是Mealy(米莉米莉)型状态机,型状态机,其输出信号不仅与电路的当前状态有关,还与电路
42、的其输出信号不仅与电路的当前状态有关,还与电路的输入有关;另一类是输入有关;另一类是Moore(摩尔摩尔)型状态机,其输出型状态机,其输出状态仅与电路的当前状态有关,与电路的输入无关。状态仅与电路的当前状态有关,与电路的输入无关。v 状态机一般都应设计为同步方式,并由一个时钟信号来触发。实用的状态机一般都应设计为同步方式,并由一个时钟信号来触发。实用的状态机都应该设计为由唯一时钟边沿触发的同步运行方式。状态机都应该设计为由唯一时钟边沿触发的同步运行方式。组合逻辑状态寄存器组合逻辑Mealy型Moore型时钟输入状态转移图的绘制(检测序列状态转移图的绘制(检测序列110)s00/01/0s10/
43、0s21/01/0s30/10/01/0s0:0 s1:1 s2:11 s3:110起始状态状态转移图的绘制(检测序列状态转移图的绘制(检测序列0101)s00/0s11/0s0:0 s1:01 s2:010 s3:1(无效状态无效状态) s4:0101s20/0s31/00/0s41/11/01/00/00/00/0起始状态如何进行状态机编程如何进行状态机编程v对于对于Mealy型型FSM电路来说,由于电路的输出除了与电路的现电路来说,由于电路的输出除了与电路的现态有关外,还与电路的输入信号有关,如果输入信号的变化不能态有关外,还与电路的输入信号有关,如果输入信号的变化不能及时被检测,而要等
44、待时钟有效沿到来时才进行检测的话,则电及时被检测,而要等待时钟有效沿到来时才进行检测的话,则电路的输出很可能是错误的(例如在上次时钟有效沿和本次时钟有路的输出很可能是错误的(例如在上次时钟有效沿和本次时钟有效沿之间往自动售货机里快速投入一枚硬币)。所以在设计效沿之间往自动售货机里快速投入一枚硬币)。所以在设计FSM电路时,建议采用两个电路时,建议采用两个always块或者三个块或者三个always块的方法进行描块的方法进行描述。也就是说,若时钟周期相对过长,则会漏掉输入信号。即与述。也就是说,若时钟周期相对过长,则会漏掉输入信号。即与输入信号有关的硬件描述语言采用组合逻辑形式。输入信号有关的硬
45、件描述语言采用组合逻辑形式。v状态编码的定义:状态编码的定义:parameter方式(一般采用该方式)和方式(一般采用该方式)和define方式。方式。v状态转换的描述:一般使用状态转换的描述:一般使用case、casez和和casex语句来描述语句来描述状态之间的转换,用状态之间的转换,用case语句表述比用语句表述比用if-else语句更清晰明了。语句更清晰明了。此外在此外在case语句的最后,不要忘了加上语句的最后,不要忘了加上default分支语句,以避免分支语句,以避免锁存器的产生。锁存器的产生。用两个用两个always块描述电路块描述电路(检测序列检测序列110)module pu
46、sle(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_stat
47、e 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块描述电路
48、块描述电路(检测序列检测序列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 格雷编码相邻状态每次只有一个比特位产生变格雷编码相邻状态每次
49、只有一个比特位产生变化(化(00、01、11、10),减少了瞬变次数,),减少了瞬变次数,也减少了产生毛刺和一些暂态的可能。也减少了产生毛刺和一些暂态的可能。 一位热码编码即采用一位热码编码即采用n位(或位(或n个触发器)来编码个触发器)来编码n个状态的状态机(如个状态的状态机(如1000、0100、0010、0001)。这样虽然多用了触发器)。这样虽然多用了触发器 ,但可以有效节省和简化组合电路。,但可以有效节省和简化组合电路。对于寄存器数量多而门逻辑相对缺乏的对于寄存器数量多而门逻辑相对缺乏的FPGA器件来器件来说,采用该方式可以有效提高电路的速度和可靠性,说,采用该方式可以有效提高电路的
50、速度和可靠性,也有利于提高器件资源的利用率。因此,对于也有利于提高器件资源的利用率。因此,对于FPGA器件建议采用该编码方式。器件建议采用该编码方式。v采用一位热码编码后,会出现一些多余的状态,即一采用一位热码编码后,会出现一些多余的状态,即一些无效的状态。因此,如果用些无效的状态。因此,如果用case语句来描述的话,语句来描述的话,需要增加需要增加default分支项,以便在这些状态下能自动分支项,以便在这些状态下能自动回到起始状态。回到起始状态。v 对于对于Mealy型型FSM电路来说,即使状态变化采用格雷码或一电路来说,即使状态变化采用格雷码或一位热码编码输出方式也不能保证输出稳定。因为
51、一般位热码编码输出方式也不能保证输出稳定。因为一般Mealy型型FSM电路的最后一级是采用输入信号和当前状态组成组合电路的最后一级是采用输入信号和当前状态组成组合逻辑电路的方式,而组合逻辑电路不可避免的产生竞争冒险逻辑电路的方式,而组合逻辑电路不可避免的产生竞争冒险(如果输入信号是两位以上)。这时有一种方法可以很好地消(如果输入信号是两位以上)。这时有一种方法可以很好地消除这种输出结果不稳定现象:就是在最后的输出端再加一级钟除这种输出结果不稳定现象:就是在最后的输出端再加一级钟控寄存器,就可以不受组合逻辑输出竞争冒险的影响。控寄存器,就可以不受组合逻辑输出竞争冒险的影响。 组合逻辑状态寄存器组
52、合逻辑Mealy型Moore型时钟输入输出缓冲寄存器基于宏功能模块的设计基于宏功能模块的设计v Quartus II为设计者提供了丰富的宏功能模块库,采用宏功为设计者提供了丰富的宏功能模块库,采用宏功能模块完成设计可极大提高电路设计的效率和可靠性。能模块完成设计可极大提高电路设计的效率和可靠性。v Quartus II软件自带的宏模块库主要有三个,分别是软件自带的宏模块库主要有三个,分别是Megafunctions库、库、Maxplus2库和库和Primitives库。库。v Megafunctions库是参数化模块库(库是参数化模块库(Library of Parametrized Modu
53、les, LPM),库中是一些经过验证),库中是一些经过验证的功能模块,用户可以根据自己的需要设定模块的端口的功能模块,用户可以根据自己的需要设定模块的端口(Ports)和参数和参数(Parameters),即可完成模块的定制。,即可完成模块的定制。v 按照按照Megafunctions库中模块的功能,将其分为算术运算库中模块的功能,将其分为算术运算模块库模块库(arithmetic)、逻辑门库、逻辑门库(gates)、存储器库、存储器库(storage)和和IO模块库模块库(I/O)四个子库。四个子库。v 有乘法器模块、除法器模块、计数器模块、常数模块、锁相环有乘法器模块、除法器模块、计数器
54、模块、常数模块、锁相环模块、存储器模块等。模块、存储器模块等。时钟树时钟树复杂的时钟方案复杂的时钟方案组合逻辑反馈循环和脉冲发生器组合逻辑反馈循环和脉冲发生器存储器,存储器,IO专用宏单元专用宏单元总做得和你一样好总做得和你一样好 综合工具不能胜任的工作设计的可综合性设计的可综合性综合工具善于优化组合逻辑。但设计中有很大一部分不是组合逻辑。综合工具善于优化组合逻辑。但设计中有很大一部分不是组合逻辑。例如,时钟树。时钟树是全局的、芯片范围的问题。在没有版图布局信息的情况下,例如,时钟树。时钟树是全局的、芯片范围的问题。在没有版图布局信息的情况下,要给出较优的结果,综合工具对块的大小有一定的限制。
55、要给出较优的结果,综合工具对块的大小有一定的限制。综合工具不能很好地处理复杂时钟。通常,只允许要综合的块含有一个时钟。但设综合工具不能很好地处理复杂时钟。通常,只允许要综合的块含有一个时钟。但设计中经常使用两相时钟或在双沿时钟。计中经常使用两相时钟或在双沿时钟。综合工具不易实现脉冲产生逻辑,如单个脉冲,或结果依赖于反馈路径延迟的组合综合工具不易实现脉冲产生逻辑,如单个脉冲,或结果依赖于反馈路径延迟的组合反馈逻辑。对这种情况,插入延迟元件使一个信号推迟到达的效果并不好。反馈逻辑。对这种情况,插入延迟元件使一个信号推迟到达的效果并不好。不能用综合产生大块存储器,因为综合工具会用不能用综合产生大块存
56、储器,因为综合工具会用flip-flop实现。实现。不是所有的综合工具都能很好地从工艺库里挑选择大的单元或宏单元,这需要用户不是所有的综合工具都能很好地从工艺库里挑选择大的单元或宏单元,这需要用户人工实例化。一些宏单元,例如大的结构规则的数据通路元件,最好使用生产商提人工实例化。一些宏单元,例如大的结构规则的数据通路元件,最好使用生产商提供的硅编译器产生。供的硅编译器产生。综合工具不保证产生最小结果。通常综合结果不如人工结果,只要你有足够的时间。综合工具不保证产生最小结果。通常综合结果不如人工结果,只要你有足够的时间。 综合工具不能胜任的工作综合工具不能胜任的工作 不要引入不必要的不要引入不必
57、要的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不完整的的
58、敏感表将引起综合后网表的仿真结果与以前的不一致。不完整的的敏感表将引起综合后网表的仿真结果与以前的不一致。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; i
59、4; 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 +
60、d;Z = (cond) ? (a + b) : (c + d);资源共享资源共享利用括号分割逻辑。利用括号分割逻辑。z = a + b + c + d;Z = (a + b) + (c + d);+ab+c+zd+ab+cd+z括号的作用括号的作用在进行可综合的数字系统设计时,应特别注意以下一些要点:在进行可综合的数字系统设计时,应特别注意以下一些要点:v 1).不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循环语句,如环语句,如forever,while等。等。v 2 ).应尽量采用同步方式设计电路。应尽量采用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 债转股投资合同协议格式3篇
- 快递取件授权书格式3篇
- 无机盐在金属表面处理的应用考核试卷
- 农药对非靶标生物的影响考核试卷
- 篮球运动器材选购指南考核试卷
- 印刷技术在艺术品复制中的精细度考核试卷
- 电池制造自动化与智能化考核试卷
- 2025海鲜冷库租赁合同范本
- 2025合同法与侵权法简易速记口诀
- 2025商业房产租赁合同和转租合同模板
- 《单轴面筋脱水机设计报告(论文)》
- 内分泌系统 肾上腺 (人体解剖生理学课件)
- GPS静态数据观测记录表
- 山西省城镇教师支援农村教育工作登记表
- 软件项目周报模板
- 著名中医妇科 夏桂成教授补肾调周法
- VSM(价值流图中文)课件
- 考古发掘中文物的采集与保存课件
- 人工气道的护理刘亚课件
- 专业技术人员
- 拌和场安全检查表
评论
0/150
提交评论