《第4章 数字逻辑单元设计》由会员分享,可在线阅读,更多相关《第4章 数字逻辑单元设计(115页珍藏版)》请在金锄头文库上搜索。
1、数字逻辑单元设计xxx1 1第4章数字逻辑单元设计-本章概要 在复杂数字系统中,其结构总可以用若干基本逻辑单元的组合进行描述。 基本逻辑单元一般分为组合逻辑电路和时序电路两大类。 在此基础上,可以更进一步进行组合.本章所介绍的存储器、运算单元和有限自动状态机就是由基本逻辑单元组合而成的。 本章首先介绍基本的组合逻辑电路和时序电路设计,然后介绍在数字系统设计中普遍使用的存储器电路、运算单元和有限自动状态机。2 2组合逻辑电路设计 组合逻辑电路是指输出状态只决定于同一时刻各个输入状态的组合,而与先前状态无关的逻辑电路称为组合逻辑电路。组合逻辑电路主要包括简单门电路、编码器和译码器、数据选择器、数字
2、比较器、运算单元和三态门等。 3 3组合逻辑电路设计-基本逻辑门电路设计 Verilog HDL对基本逻辑门电路的描述可以使用门级描述、数据流描述和行为描述三种方式。门级描述主要是通过调用门级描述语句实现,而其它方式是通过调用Verilog HDL中关于逻辑描述符来实现门电路。 4 4组合逻辑电路设计-基本逻辑门电路设计【例例4.1】基本门电路的Verilog HDL行为描述 module g1(o,a,b,c,d);input a,b,c,d; output reg o;always (a or b or c or d)begin o=(a&b)|(b&c&d);end endmodule5
3、 5组合逻辑电路设计-基本逻辑门电路设计【例例4.2】基本门电路的Verilog HDL数据描述module g2(o,a,b,c,d);input a,b,c,d; output o;assign o=(a&b)|(b&c&d);endmodule6 6组合逻辑电路设计-基本逻辑门电路设计【例例4.3】基本门电路的Verilog HDL门级描述module g3(o,a,b,c,d);input a,b,c,d; output o;nand(o1,a,b);and(o2,b,c,d);or(o,o1,o2);endmodule7 7组合逻辑电路设计-编码器和译码器设计 在数字系统中,常常会将
4、某一信息用特定的代码进行描述,这称为编码过程。编码过程可以通过编码器电路实现。 同时,将某一特定的代码翻译成原始的信息,这称为译码过程。译码过程可以通过译码器电路实现。 8 8组合逻辑电路设计-编码器设计 将某一信息用一组按一定规律排列的二进制代码描述称为编码。典型的有8421码、BCD码等。在使用Verilog HDL 语言设计编码器时,通过使用CASE和IF语句实现对编码器的描述。9 9【例例4.4】使用if-else语句实现一个8-3线优先编码器的Verilog HDL描述。module v_priority_encoder_1(sel,code);input 7:0 sel;outpu
5、t 2:0 code;reg 2:0 code;always (sel)组合逻辑电路设计-编码器设计 1010beginif (sel0) code = 3b000;else if (sel1) code = 3b001;else if (sel2) code = 3b010;else if (sel3) code = 3b011;else if (sel4) code = 3b100;else if (sel5) code = 3b101;else if (sel6) code = 3b110;else if (sel7) code = 3b111;else code = 3bxxx;end
6、endmodule组合逻辑电路设计-编码器设计 1111组合逻辑电路设计-译码器设计 译码的过程实际上就是编码过程的逆过程,即将一组按一定规律排列的二进制数还原为原始的信息。1212组合逻辑电路设计-译码器设计【例例4.5】使用case实现3-8译码器的Verilog HDL语言描述。module v_decoders_1 (sel, res);input 2:0 sel;output 7:0 res;reg 7:0 res;always (sel or res)begin1313case (sel)3b000 : res = 8b00000001;3b001 : res = 8b000000
7、10;3b010 : res = 8b00000100;3b011 : res = 8b00001000;3b100 : res = 8b00010000;3b101 : res = 8b00100000;3b110 : res = 8b01000000;default : res = 8b10000000;endcaseendendmodule组合逻辑电路设计-译码器设计1414组合逻辑电路设计-译码器设计【例例4.6】十六进制数的共阳极7段数码显示Verilog HDL描述 module seven_segment_led(o,i);input3:0 i; output reg6:0 o;
8、always (i)begin case (i)1515组合逻辑电路设计-译码器设计4b0001 : o = 7b1111001; / 1 4b0010 : o = 7b0100100; / 2 4b0011 : o = 7b0110000; / 3 4b0100 : o = 7b0011001; / 4 4b0101 : o = 7b0010010; / 5 4b0110 : o = 7b0000010; / 6 4b0111 : o = 7b1111000; / 7 4b1000 : o = 7b0000000; / 81616 4b1001 : o = 7b0010000; / 9 4b
9、1010 : o = 7b0001000; / A 4b1011 : o = 7b0000011; / b 4b1100 : o = 7b1000110; / C 4b1101 : o = 7b0100001; / d 4b1110 : o = 7b0000110; / E 4b1111 : o = 7b0001110; / F default : o = 7b1000000; / 0 endcaseendendmodule组合逻辑电路设计-译码器设计1717组合逻辑电路设计-数据选择器设计设计CASE和IF语句描述数据选择器 在数字系统设计中,常使用CASE和IF语句描述数据选择器。下面给出
10、这两种描述方法。1818组合逻辑电路设计-数据选择器设计设计【例例4.7】使用case语句实现多路选择器module full_mux (sel, i1, i2, i3, i4, o1);input 1:0 sel;input 1:0 i1, i2, i3, i4;output 1:0 o1;reg 1:0 o1;always (sel or i1 or i2 or i3 or i4)begin case (sel)2b00: o1 = i1;2b01: o1 = i2;2b10: o1 = i3;2b11: o1 = i4; endcaseendendmodule1919组合逻辑电路设计-数
11、据选择器设计设计【例例4.8】使用if-else语句实现多路选择器module v_multiplexers_1 (a, b, c, d, s, o);input a,b,c,d;input 1:0 s;output reg o;always (a or b or c or d or s)beginif (s = 2b00) o = a;else if (s = 2b01) o = b;else if (s = 2b10) o = c;else o = d;endendmodule2020组合逻辑电路设计-三态缓冲描述数据选择器 使用三态缓冲语句也可以描述多路数据选择器。图4.5给出了4选1多
12、路选择器的三态的原理。图4.5 三态缓冲实现4选1多路选择器2121组合逻辑电路设计-三态缓冲描述数据选择器【例例4.9】三态缓冲描述数据选择器的Verilog HDL描述module v_multiplexers_3 (a, b, c, d, s, o);input a,b,c,d;input 3:0 s;output o;assign o = s3 ? a :1bz;assign o = s2 ? b :1bz;assign o = s1 ? c :1bz;assign o = s0 ? d :1bz;endmodule2222组合逻辑电路设计-数字比较器比较器就是对输入数据进行比较,并判
13、断其大小的逻辑电路。在数字系统中,比较器是基本的组合逻辑单元之一,比较器主要是使用关系运算符实现的。2323组合逻辑电路设计-数字比较器【例例4.10】数字比较器的Verilog HDL描述module v_comparator_1 (A, B, CMP);input 7:0 A;input 7:0 B;output CMP;assign CMP = (A = B) ? 1b1 : 1b0;endmodule2424组合逻辑电路设计-运算单元数据运算单元主要包含加法器、减法器、乘法器和除法器,由这四种运算单元和逻辑运算单元一起,可以完成复杂数学运算。在Verilog HDL语言中,支持的几种运
14、算有:加(+)、减(-)、乘(*)、除(/)、取余(MOD)、幂乘(*)。2525组合逻辑电路设计-加法器设计 在Verilog HDL描述加法器时,使用+运算符比门级描述更简单。2626组合逻辑电路设计-加法器设计【例例4.11】带进位输入和输出的无符号加法器的Verilog HDL描述module v_adders_2(A, B, CI, SUM);input 7:0 A;input 7:0 B;input CI;output 7:0 SUM;assign SUM = A + B + CI;endmodule2727组合逻辑电路设计-减法器设计 减法是加法的反运算,采用Verilog HD
15、L语言的-符号描述减法器,比用门级描述更简单。2828组合逻辑电路设计-减法器设计【例例4.12】无符号8位带借位的减法器的Verilog HDL描述module v_adders_8(A, B, BI, RES);input 7:0 A;input 7:0 B;input BI;output 7:0 RES;assign RES = A - B - BI;endmodule2929组合逻辑电路设计-乘法器设计 用Verilog HDL语言实现乘法器时,乘积和符号应该为2的幂次方。PLD的优点就是在内部集成了乘法器的硬核,具体在IP核的设计中详细讨论。3030组合逻辑电路设计-乘法器设计【例例
16、4.13】乘法器的Verilog HDL描述module v_multipliers_1(A, B, RES);input 7:0 A;input 3:0 B;output 11:0 RES;assign RES = A * B;endmodule3131组合逻辑电路设计-除法器设计 除法器可以用Verilog HDL语言的/符号实现,需要注意的是在使用/符号进行除法运算时,除数必须是常数,而且是2的整数幂。因为除法器的运行有这样的限制,实际上除法也可以用移位运算实现。3232组合逻辑电路设计-除法器设计【例例4.14】除法器的Verilog HDL描述module v_divider_1 (
17、DI, DO);input 7:0 DI;output 7:0 DO;assign DO = DI / 2;endmodule 3333组合逻辑电路设计-总线缓冲器设计【例例4.15】三态缓冲器的Verilog HDL描述module v_three_st_1 (T, I, O);input T, I;output reg O;always (T or I)beginif (T) O = I;else O = 1bZ;endendmodule3434组合逻辑电路设计-总线缓冲器设计【例例4.16】三态缓冲器的Verilog HDL描述 module v_three_st_2 (T, I, O)
18、; input T, I; output O; assign O = (T) ? I: 1bZ; endmodule3535组合逻辑电路设计-总线缓冲器设计【例4.17】三态双向驱动器的Verilog HDL描述module bidir(tri_inout,out,in,en,b);inout tri_inout;output out;input in,en,b;assign tri_inout = en ? in : bz;assign out = tri_inout b;endmodule3636第4章数字逻辑单元设计-时序逻辑电路设计时序逻辑电路的输出状态不仅与输入变量的状态有关,而且还
19、与系统原先的状态有关。时序电路最重要的特点是存在着记忆单元部分,时序电路主要包括:时钟和复位、基本触发器、计数器、移位寄存器等。3737时序逻辑电路设计 -时钟和复位设计 时序电路由时钟驱动,时序电路只有在时钟信号的边沿到来时,其状态才发生改变。在数字系统中,时序电路的时钟驱动部分一般包括时钟信号和系统复位信号。根据时钟和复位的描述不同,时序电路一般分成同步复位电路和异步复位电路两类。3838 在时序电路中,不论采用什么方法描述时钟信号,必须指明时钟的边沿条件(clock edge condition)。时钟沿条件有上升沿和下降沿两种。 时钟的上升沿条件可以用下面的语句描述: always (
20、posedge clk) 时钟的下降沿条件可以用下面的语句描述: always (negedge clk)时序逻辑电路设计 -时钟和复位设计 3939 根据复位和时钟信号的关系不同。时序电路分为同步复位电路和异步复位电路两大类。 1、同步复位描述 同步复位指:当复位信号有效,并且在给定的时钟边沿有效时,时序电路才被复位。只有时钟信号出现在always块的敏感信号中。时序逻辑电路设计 -时钟和复位设计 4040 【例例4-18】同步复位的Verilog HDL描述 module asyn_reset(other_signal,.,clk,rst); input clk,reset; /other
21、_signal declaration always (posedge clk) if(rst) /statement1 else /statement2endmodule时序逻辑电路设计 -时钟和复位设计 4141 2、异步复位描述 异步复位指:当复位信号有效时,时序电路就被复位。时钟信号和复位信号同时出现在always块的敏感信号中。时序逻辑电路设计 -时钟和复位设计 4242【例例4-19】异步复位的Verilog HDL描述module asyn_reset(other_signal,.,clk,rst); input clk,reset; /other signal declarat
22、ion always (posedge rst or posedge clk) if(rst) /statement1 else /statement2endmodule时序逻辑电路设计 -时钟和复位设计 4343时序逻辑电路设计 -触发器设计触发器是时序逻辑电路的最基本单元,触发器具有“记忆”能力。根据沿触发、复位和置位方式的不同触发器可以有多种实现方式。在PLD中经常使用的触发器有D触发器、JK触发器和T触发器等。4444时序逻辑电路设计 -触发器设计【例例4-20】带时钟使能和异步复位/置位的D触发器的Verilog HDL描述D触发器是数字电路中应用最多的一种时序电路。表4.1给出了带
23、时钟使能和异步复位/置位的D触发器的真值表。输入输出CLRPRECEDCQ1XXXX001XXX1000XX无变化00100001114545时序逻辑电路设计 -触发器设计module v_registers_5 (C, D, CE, PRE, Q);input C, CE, PRE;input 3:0 D;output reg 3:0 Q;always (posedge C or posedge PRE)beginif (PRE) Q = 4b1111; elseif (CE) Q = D;endendmodule4646时序逻辑电路设计 -触发器设计【例例4-21】双数据率IOB的Veri
24、log HDL描述module ddr_input (data_out,data_in,clk,rst);input data_in, clk, rst;output data_out;reg q1, q2;always (posedge clk, posedge rst)beginif (rst) q1 =1b0;else q1 = data_in;endalways (negedge clk, posedge rst)beginif (rst) q2 =1b0;else q2 = data_in;endassign data_out = q1 & q2;end module4747时序逻辑
25、电路设计 -触发器设计【例例4.22】带异步清0、异步置1 的JK 触发器的Verilog HDL描述module JK_FF(CLK,J,K,Q,RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always (posedge CLK or negedge RS or negedge SET)beginif(!RS) Q = 1b0;else if(!SET) Q = 1b1;else4848case(J,K)2b00 : Q = Q;2b01 : Q = 1b0;2b10 : Q = 1b1;2b11 : Q = Q;default: Q= 1bx;e
26、ndcaseendendmodule时序逻辑电路设计 -触发器设计4949时序逻辑电路设计 -锁存器设计锁存器和触发器不同之处,就在于触发方式的不同,触发器是靠敏感信号的边沿出发,而锁存器是靠敏感信号的电平触发。5050时序逻辑电路设计 -锁存器设计【例例4.23】带清零信号锁存器的Verilog HDL描述module v_latches_2 (G, D, CLR, Q);input G, D, CLR;output Q;reg Q;always (G or D or CLR)beginif (CLR) Q = 1b0;else if (G) Q = D;endendmodule5151时序
27、逻辑电路设计 -计数器设计 根据计数器的触发方式不同,计数器可以分为:同步计数器和异步计数器两种。当赋予计数器更多的功能时,计数器的功能就非常复杂了。需要注意的是,计数器是常用的定时器的核心部分,当计数器输出控制信号时,计数器也就变成了定时器了。所以只要掌握了计数器的设计方法,就可以很容易的设计定时器。本书中主要介绍同步计数器的设计。 同步计数器指在时钟脉冲(计数脉冲)的控制下,计数器做加法或减法的运算。5252时序逻辑电路设计 -计数器设计【例例4.24】可逆计数器的Verilog HDL描述module v_counters_6 (C, CLR, UP_DOWN, Q);input C,
28、CLR, UP_DOWN;output 3:0 Q;reg 3:0 tmp;always (posedge C or posedge CLR)beginif (CLR) tmp = 4b0000;else if (UP_DOWN) tmp = tmp + 1b1;else tmp = tmp - 1b1;endassign Q = tmp;endmodule5353时序逻辑电路设计 -计数器设计【例例4.25】可加载计数器的Verilog HDL描述module v_counters_3 (C, ALOAD, D, Q);input C, ALOAD;input 3:0 D;output 3:
29、0 Q;reg 3:0 tmp;always (posedge C or posedge ALOAD)beginif (ALOAD) tmp = D;else tmp = tmp + 1b1;endassign Q = tmp;endmodule5454时序逻辑电路设计 -计数器设计【例例4.26】带有最大计数值限制计数器的Verilog HDL描述,可实现不同进制的计数module v_counters_8 (C, CLR, Q);parameterMAX_SQRT = 4,MAX = (MAX_SQRT*MAX_SQRT);input C, CLR;output MAX_SQRT-1:0
30、Q;reg MAX_SQRT-1:0 cnt;always (posedge C or posedge CLR)beginif (CLR) cnt = 0;else cnt = (cnt + 1) %MAX;endassign Q = cnt;endmodule5555时序逻辑电路设计 -移位寄存器设计 移位寄存器在数字系统中有着非常重要的应用,其实现的方法也比较多。主要的方法有:1)通过Verilog HDL语言的连接符实现2)通过Verilog HDL语言中的移位操作符实现3)通过 Verilog HDL语言中的for循环实现5656【例例4.27】采用连接符的8位串入/串出移位寄存器的V
31、erilog HDL描述module v_shift_registers_1 (C, SI, SO);input C,SI;output SO;reg 7:0 tmp;always (posedge C)begin tmp = tmp6:0, SI;end assign SO = tmp7;endmodule时序逻辑电路设计 -移位寄存器设计5757时序逻辑电路设计 -移位寄存器设计【例例4.28】采用移位操作符的8位并入/并出移位寄存器的Verilog HDL描述module v_logical_shifters_1 (DI, SEL, SO);input 7:0 DI;input 1:0
32、SEL;output reg 7:0 SO;reg 7:0 SO;always (DI or SEL)begincase (SEL)2b00 : SO = DI;2b01 : SO = DI 1;2b10 : SO = DI 2;default : SO = DI 3;endcaseendendmodule5858时序逻辑电路设计 -移位寄存器设计【例例4.29】采用for循环语句的8位并入/并出移位寄存器的Verilog HDL描述module shiftn(r,l,w,clk,q);parameter n=8;inputn-1:0 r;input l,w,clk;output reg n-
33、1:0 q;integer k;always (posedge clk)begin if(l) q=r; else5959begin if(l) q=r; else begin for(k=0;kn-1;k=k+1) qk=qk+1; qn-1=w; endend endmodule时序逻辑电路设计 -移位寄存器设计6060第4章数字逻辑单元设计-存储器设计存储器按其类型主要分为只读存储器和随机存储器两种。 虽然存储器从其工艺和原理上各不相同,但有一点是相同的,即存储器是单个存储单元的集合体,并且按照顺序排列。其中的每一个存储单元由N位二进制位构成,表示存放的数据的值。6161第4章数字逻辑单
34、元设计-存储器设计需要注意的是,虽然在本节给出了存储器的原理描述和实现方法,但在实际中,尤其是在FPGA的设计中,存储器在FPGA内作为核提供给设计人员进行使用,设计人员只需要对这些核进行配置,就可以生成高性能的存储器模块,根本没有必要用Verilog HDL语言进行原理和功能的描述。6262存储器设计-设计只读存储器的数据被事先保存到了每个存储单元中,在PLD中保存数据的方法有很多。当对ROM进行读操作时,只要在控制信号的控制下,对操作的单元给出读取的数值即可。【例例4.30】ROM的Verilog HDL描述 EN为ROM的使能信号,ADDR为ROM的地址信号,CLK为ROM的时钟信号,D
35、ATA为数据信号。图4.16 ROM的结构图6363module v_rams_21a (clk, en, addr, data);input clk;input en;input 5:0 addr;output reg 19:0 data;always (posedge clk) begin存储器设计-设计6464if (en)case(addr)6b000000: data = 20h0200A; 6b100000: data = 20h02222;6b000001: data = 20h00300; 6b100001: data = 20h04001;6b000010: data = 2
36、0h08101; 6b100010: data = 20h00342;6b000011: data = 20h04000; 6b100011: data = 20h0232B;6b000100: data = 20h08601; 6b100100: data = 20h00900;6b000101: data = 20h0233A; 6b100101: data = 20h00302;6b000110: data = 20h00300; 6b100110: data = 20h00102;6b000111: data = 20h08602; 6b100111: data = 20h04002;
37、6b001000: data = 20h02310; 6b101000: data = 20h00900;存储器设计-设计65656b001001: data = 20h0203B; 6b101001: data = 20h08201;6b001010: data = 20h08300; 6b101010: data = 20h02023;6b001011: data = 20h04002; 6b101011: data = 20h00303;6b001100: data = 20h08201; 6b101100: data = 20h02433;6b001101: data = 20h005
38、00; 6b101101: data = 20h00301;6b001110: data = 20h04001; 6b101110: data = 20h04004;6b001111: data = 20h02500; 6b101111: data = 20h00301;6b010000: data = 20h00340; 6b110000: data = 20h00102;6b010001: data = 20h00241; 6b110001: data = 20h02137;6b010010: data = 20h04002; 6b110010: data = 20h02036;6b010
39、011: data = 20h08300; 6b110011: data = 20h00301;存储器设计-设计66666b010100: data = 20h08201; 6b110100: data = 20h00102;6b010101: data = 20h00500; 6b110101: data = 20h02237;6b010110: data = 20h08101; 6b110110: data = 20h04004;6b010111: data = 20h00602; 6b110111: data = 20h00304;6b011000: data = 20h04003; 6
40、b111000: data = 20h04040;6b011001: data = 20h0241E; 6b111001: data = 20h02500;6b011010: data = 20h00301; 6b111010: data = 20h02500;6b011011: data = 20h00102; 6b111011: data = 20h02500;6b011100: data = 20h02122; 6b111100: data = 20h0030D;6b011101: data = 20h02021; 6b111101: data = 20h02341;6b011110:
41、data = 20h00301; 6b111110: data = 20h08201;6b011111: data = 20h00102; 6b111111: data = 20h0400D;endcaseendendmodule存储器设计-设计6767存储器设计-RAM设计 RAM和ROM的区别,在于RAM有读写两种操作,而ROM只有读操作。另外,RAM对读写的时序也有着严格的要求。【例例4-31】一个单端口RAM的Verilog HDL的描述EN为RAM使能信号,WE为RAM写信号,DI为RAM数据输入信号,ADDR为RAM地址信号,CLK为RAM时钟信号,DO为RAM数据输出信号。图4.
42、17 单端口RAM的结构6868module v_rams_01 (clk, en, we, addr, di, do);input clk;input we;input en;input 5:0 addr;input 15:0 di;output reg 15:0 do;reg 15:0 RAM 63:0;always (posedge clk)存储器设计-RAM设计 6969beginif (en)begin if (we) RAMaddr=di;do = RAMaddr; endendendmodule存储器设计-RAM设计 7070第4章 数字逻辑单元设计-FSM设计 有限自动状态机F
43、SM(Finate State Machine)的设计是复杂数字系统中非常重要的一部分,是实现高效率高可靠性逻辑控制的重要途径。大部分数字系统都是由控制单元和数据单元组成的。数据单元负责数据的处理和传输,而控制单元主要是控制数据单元的操作的顺序。而在数字系统中,控制单元往往是通过使用有限状态机实现的,有限状态机接受外部信号以及数据单元产生的状态信息,产生控制信号序列。7171FSM设计 -FSM原理7272FSM设计 -FSM原理从上面的数学模型可以看出,如果在数字系统中实现有限状态机,则应该包含三部分:状态寄存器;下状态转移逻辑;输出逻辑。描述有限状态机的关键是状态机的状态集合以及这些状态之
44、间的转移关系。描述这种转换关系除了数学模型外,还可以用状态转移图或状态转移表来实现。状态转移图由三部分组成:表示不同状态的状态点、连接这些状态点的有向箭头以及标注在这些箭头上的状态转移条件。状态转移表采用表格的方式描述状态机。状态转移表由三部分组成:当前状态、状态转移事件和下一状态。7373FSM设计 -FSM分类 状态机分类很多,主要分为Moore状态机、Mealy状态机和扩展有限状态机。 下面就Moore状态机、Mealy状态机的原理和应用进行详细的介绍。 7474FSM设计 -Mealy型状态机 Mealy型状态机的输出由状态机的输入和状态机的状态共同决定;【例例4.32】4状态Meal
45、y型状态机的Verilog HDL描述。7575 parameter = 2b00; parameter = 2b01; parameter = 2b10; parameter = 2b11; (* FSM_ENCODING=SEQUNTIAL, SAFE_IMPLEMENTATION=NO *) reg 1:0 state = ; always(posedge ) if () begin state = ; endFSM设计 -Mealy型状态机 7676 else (* FULL_CASE, PARALLEL_CASE *) case (state) : begin if () state
46、 = ; else if () state = ; else state = ; endFSM设计 -Mealy型状态机 7777 : begin if () state = ; else if () state = ; else state = ; endFSM设计 -Mealy型状态机 7878 : begin if () state = ; else if () state = ; else state = ; endFSM设计 -Mealy型状态机 7979 : begin if () state = ; else if () state = ; else state = ; end
47、endcase assign = ; assign = ; / Add other output equations as necessaryFSM设计 -Mealy型状态机 8080FSM设计 -Moore型状态机 Moore型状态机的输出仅与状态机的状态有关,与状态机的输入无关。8181【例例4.33】Moore型状态机的Verilog HDL语言的描述 parameter = 4b0001; parameter = 4b0010; parameter = 4b0100; parameter = 4b1000; (* FSM_ENCODING=ONE-HOT, SAFE_IMPLEMENT
48、ATION=NO *) reg 3:0 state = ;FSM设计 -Moore型状态机8282 always(posedge ) if () begin state = ; = ; end else (* FULL_CASE, PARALLEL_CASE *) case (state)FSM设计 -Moore型状态机8383 : begin if () state = ; else if () state = ; else state = ; = ; endFSM设计 -Moore型状态机8484 : begin if () state = ; else if () state = ; e
49、lse state = ; = ; endFSM设计 -Moore型状态机8585 : begin if () state = ; else if () state = ; else state = ; = ; endFSM设计 -Moore型状态机8686 : begin if () state = ; else if () state = ; else state = ; = ; end endcaseFSM设计 -Moore型状态机8787FSM设计 -Moore型状态机 虽然在这里将两种类型的状态机加以区分,但是在实际的状态机的设计中,设计人员根本不需要这些差别,只要满足状态机设计的规
50、则和状态机运行的条件,采用任何一种状态机都可以实现,并且设计人员可以在实际的设计过程中形成自己独特的状态机的Verilog HDL的设计风格。8888FSM设计 -设计原则有限状态机的设计应遵循以下原则:、分析控制器设计指标, 建立系统算法模型图,即状态转移图; 、分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入、输出条件; 、使用Verilog HDL语言完成状态机的描述。 8989FSM设计 -FSM设计优点采用有限状态机描述有以下方面的优点:、可以采用不同的编码风格,在描述状态机时,设计者常采用的编码有二进制、格雷码、one hot编码,用户可以根据自己的需要在综合时确定,
51、而不需要修改源文件或修改源文件中的编码格式以及状态机的描述。 、可以实现状态的最小化,(如果one hot编码,控制信号数量庞大)。 、设计灵活,将控制单元与数据单元分离开。 9090FSM设计 -状态编码 FSM的状态可以采用的状态编码规则有很多,在Xilinx的状态编码“One_Hot”;“Gray”;”Compact”;”Johnson”;“Sequential”;“Speed1”;“User”的编码方式;下面对这些状态编码的性能进行简单的介绍。9191FSM设计 -状态编码1、One_Hot状态编码ONE HOT的编码方案对每一个状态采用一个触发器,即4个状态的状态机需4个触发器。同一
52、时间仅1个状态位处于有效电平(如逻辑“l”)。在使用One_Hot状态编码时,触发器使用较多,但逻辑简单,速度快。9292FSM设计 -状态编码 2、Gray状态编码 Gray码编码每次仅一个状态位的值发生变化。在使用Gray状态编码时,触发器使用较少,速度较慢,不会产生两位同时翻转的情况。采用格雷码进行状态编码时,采用T触发器是最好的实现方式。 9393FSM设计 -状态编码 3、Compact状态编码 Compact状态编码能够使所使用的状态变量位和触发器的数目变得最少。该编码技术基于超立方体浸润技术。当进行面积优化的时候可以采用Compact状态编码9494FSM设计 -状态编码4、Jo
53、hnson状态编码 Johnson状态编码能够使状态机保持一个很长的路径,而不会产生分支。 5、Sequential状态编码 Sequential状态编码采用一个可标示的长路径,并采用了连续的基2编码描述这些路径。下一个状态等式被最小化。 6、Speed1状态编码 Speed1状态编码用于速度的优化。状态寄存器中所用的状态的位数取决于特定的有限自动状态及FSM,但一般情况下它要比FSM的状态要多。9595FSM设计 -状态定义设计者可以在使用状态机之前应该定义状态变量的枚举类型,定义可以在状态机描述的源文件中,也可以在专门的程序包中。 【例例4.34】状态定义的Verilog HDL描述 pa
54、rameter 3:0 s1 = 4b0001, s2 = 4b0010, s3 = 4b0100, s4 = 4b1000; reg 3:0 state;9696FSM设计 -状态机描述规则状态机描述方式:三进程;两进程;单进程;图4.6给出了下面所用到的状态机的模型。图4.6 状态机模型9797FSM设计 -状态机描述规则1、单进程状态机的实现方法 如图4.7单进程的mealy状态机所示,采用单进程状态机描述时,状态的变化、状态寄存器和输出功能描述用一个进程进行描述。9898【例例4.35】单进程状态机的Verilog HDL的描述module v_fsm_1 (clk, reset, x
55、1, outp);input clk, reset, x1;output outp;reg outp;reg 1:0 state;parameter s1 = 2b00; parameter s2 = 2b01;parameter s3 = 2b10; parameter s4 = 2b11;initial beginstate = 2b00;endFSM设计 -状态机描述规则9999always(posedge clk or posedge reset)begin if (reset) begin state = s1; outp = 1b1; end elseFSM设计 -状态机描述规则1
56、00100begin case (state) s1: begin if (x1=1b1) begin state = s2; outp = 1b1; end elseFSM设计 -状态机描述规则101101 begin state = s3; outp = 1b0; end ends2: begin state = s4; outp = 1b1;endFSM设计 -状态机描述规则102102s3: begin state = s4; outp = 1b0;ends4: begin state = s1; outp = 1b0;endendcaseendendendmoduleFSM设计 -状
57、态机描述规则103103FSM设计 -状态机描述规则2、双进程状态机的实现方法 如图4.8所示,与单进程状态机不同的是,采用双进程状态机时,输出函数用一个进程描述,而状态寄存器和下一状态函数用另一个进程描述。104104【例例4.36】双进程状态机的Verilog HDL的描述module v_fsm_2 (clk, reset, x1, outp);input clk, reset, x1;output outp;reg outp;reg 1:0 state;parameter s1 = 2b00; parameter s2 = 2b01;parameter s3 = 2b10; param
58、eter s4 = 2b11;FSM设计 -状态机描述规则105105initial begin state = 2b00; endalways (posedge clk or posedge reset)begin if (reset) state = s1; elseFSM设计 -状态机描述规则106106 begin case (state) s1: if (x1=1b1) state = s2; else state = s3; s2: state = s4; s3: state = s4; s4: state = s1; endcase endendFSM设计 -状态机描述规则107
59、107always (state)begin case (state) s1: outp = 1b1; s2: outp = 1b1; s3: outp = 1b0; s4: outp = 1b0; endcase endendmoduleFSM设计 -状态机描述规则1081083、三进程状态机的实现规则如图4.9所示,与双进程状态机不同的是,采用三进程状态机时,输出函数用一个进程描述,而状态寄存器和下一状态函数分别用两个进程描述。FSM设计 -状态机描述规则109109【例例4.37】三进程状态机的Verilog HDL的描述module v_fsm_3 (clk, reset, x1, o
60、utp);input clk, reset, x1;output outp;reg outp;reg 1:0 state;reg 1:0 next_state;parameter s1 = 2b00; parameter s2 = 2b01;parameter s3 = 2b10; parameter s4 = 2b11;FSM设计 -状态机描述规则110110initial begin state = 2b00; endalways (posedge clk or posedge reset)begin if (reset) state = s1; else state = next_sta
61、te;endFSM设计 -状态机描述规则111111always (state or x1)begin case (state) s1: if (x1=1b1) next_state = s2; else next_state = s3; s2: next_state = s4; s3: next_state = s4; s4: next_state = s1; endcaseendFSM设计 -状态机描述规则112112always (state)begin case (state) s1: outp = 1b1; s2: outp = 1b1; s3: outp = 1b0; s4: ou
62、tp = 1b0; endcaseendendmoduleFSM设计 -状态机描述规则113113习题1、用Verilog HDL语言设计一个3:8译码器。2、用Verilog HDL语言描述D触发器和JK触发器。3、用Verilog HDL语言设计一个16位的计数器。4、用Verilog HDL设计一个100分频的分频器。5、使用不同的方法完成一个32位的移位寄存器的设计。6、比较RAM和FIFO的特点和区别。1141147、用Verilog HDL语言描述一个512*16(深度512,数据宽度16比特)的单端口RAM存储器。8、用Verilog HDL语言描述一个512*16的先进先出队列FIFO。9、用Verilog HDL语言描述一个y=a*b+a*c的乘法和加法单元的实现。10、用Verilog HDL语言描述一个y=(a-b)/16的乘减运算的实现。11、有限自动状态机的分类及其特点。 12、有限自动状态机的编码方式及其特点。13、有限自动状态机的描述规则及其特点。习题115115