《组合与时序逻辑电路设计演示文档》由会员分享,可在线阅读,更多相关《组合与时序逻辑电路设计演示文档(78页珍藏版)》请在金锄头文库上搜索。
1、第第4 4章章 组合与时序逻辑电路设计组合与时序逻辑电路设计201801.主要内容主要内容 一、基本组合电路设计一、基本组合电路设计 二、基本时序电路设计二、基本时序电路设计201801.1、组合逻辑电路概念:、组合逻辑电路概念:是由门电路组合而成的具有某种功能的电路,电路中没有记忆单元,没有反馈是由门电路组合而成的具有某种功能的电路,电路中没有记忆单元,没有反馈电路,输入决定输出。电路,输入决定输出。组合逻辑电路x1x2xiy1y2yj每个输出变量是输入变量的逻辑函每个输出变量是输入变量的逻辑函数,每个时刻的输出状态仅与当时数,每个时刻的输出状态仅与当时输入有关,与输入的原状态无关。输入有关
2、,与输入的原状态无关。一、一、 基本组合电路设计基本组合电路设计201801.实际逻辑问题真值表逻辑表达式最简(或最合理)逻辑表达式逻辑图化简变换2、组合逻辑电路设计方法、组合逻辑电路设计方法传统逻辑电路设计方法传统逻辑电路设计方法Verilog HDL逻辑电路设计方法逻辑电路设计方法只需根据实际的逻辑功能用只需根据实际的逻辑功能用Verilog HDL语言对其进行描述就可以,然语言对其进行描述就可以,然后仿真得到结果,观察是否符合实际逻辑功能。后仿真得到结果,观察是否符合实际逻辑功能。常用三种描述方法是:常用三种描述方法是:结构描述法、数据流和行为描述方法结构描述法、数据流和行为描述方法。传
3、统方法通常采用逻辑电路图输入方式,由底层到高层进行设计。缺点传统方法通常采用逻辑电路图输入方式,由底层到高层进行设计。缺点是效率低,设计设计时间长,容易出错。前面章节介绍的各种算数路径电路、是效率低,设计设计时间长,容易出错。前面章节介绍的各种算数路径电路、数字选择电路等均是典型组合电路例子,下面通过程序输入法设计较复杂组数字选择电路等均是典型组合电路例子,下面通过程序输入法设计较复杂组合逻辑电路。合逻辑电路。201801.简单组合电路设计简单组合电路设计(可采用结构描述和数据流描述)(可采用结构描述和数据流描述)门级结构描述门级结构描述 module gate1(F,A,B,C,D);inp
4、ut A,B,C,D;output F;wire F1,F2;/ 中间变量可以省略定义中间变量可以省略定义nand(F1,A,B); /调用门元件调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule数据流描述数据流描述module gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D);endmoduleF1F2201801.3、典型组合电路设计多位二进制加法器设计多位二进制加法器设计由于位数较多采用结构描述和层次调用相对复杂,所以直接采用行为描述由于位数较多采用结构描述和层次调用相对复杂,所以直
5、接采用行为描述进行设计。进行设计。例例4.1 8位二进制加法器设计位二进制加法器设计201801.仿真结果这种描述设计比较抽象但简单,无需了解内部是怎样的逻辑实现方式。这种描述设计比较抽象但简单,无需了解内部是怎样的逻辑实现方式。201801.BCD编解码器设计编解码器设计BCD码是一种二进制数字编码形式,利用4位二进制单元存储一位十进制的数码,使得二进制与十进制转换得以快速进行。BCD码有多种编码方式,现采用8421码编码。如图如图in0in9代表对应代表对应09共共10个数字输入端,输入高电个数字输入端,输入高电平为有效输入,平为有效输入,out0out3对对应输出的应输出的BCD码。码。
6、BCD码编码器in0in2in3in4out0out1out2out3in1in5in6in7in9in8201801.输入端口输入端口输出端口输出端口in0in1in2in3in4in5in6in7in8in9out0out1out2out310000000000000010000000000010010000000001000010000000011000010000001000000010000010100000010000110000000010001110000000010100000000000011001BCD编码器真值表编码器真值表201801.由由BCD码真值表可得其输入与输
7、出的逻辑关系为:码真值表可得其输入与输出的逻辑关系为:out0=in8+in9out1=in4+in5+in6+in7out2=in2+in3+in6+in7out3=in1+in3+in5+in7+in9可以根据上述输入与输出的逻辑关系采用可以根据上述输入与输出的逻辑关系采用结构描述和数据结构描述和数据流描述流描述实现该实现该BCD编码器逻辑电路功能。编码器逻辑电路功能。201801.module BCD_Enc(in,out);input9:0 in;output3:0 out; reg3:0out; always (in) /always过程语句过程语句 begin case(in) 1
8、0b00_0000_0001:out=0; 10b00_0000_0010:out=1; 10b00_0000_0100:out=2; 10b00_0000_1000:out=3; 10b00_0001_0000:out=4; 10b00_0010_0000:out=5; 10b00_0100_0000:out=6; 10b00_1000_0000:out=7; 10b01_0000_0000:out=8; 10b10_0000_0000:out=9; endcase endendmoduleBCD码编码器程序码编码器程序例例4.2201801.仿真结果如图:仿真结果如图:可见输出完全由输入决
9、定,为组合逻辑电路。可见输出完全由输入决定,为组合逻辑电路。BCD码译码器in0in2in3in4out0out1out2out3in1in5in6in7in9in8下面的译码器设计电路功能正好与编码器相反设计过程,详细设计下面的译码器设计电路功能正好与编码器相反设计过程,详细设计作业作业。201801.module bcd_enc(in,out); input9:0in; output3:0out; assign out=func_enc(in); /函数调用 function 3:0 func_enc; /函数定义 input9:0 in; case(in) 10b00_0000_0001
10、:func_enc=0; 10b00_0000_0010:func_enc=1; 10b00_0000_0100:func_enc=2; 10b00_0000_1000:func_enc=3; 10b00_0001_0000:func_enc=4; 10b00_0010_0000:func_enc=5; 10b00_0100_0000:func_enc=6; 10b00_1000_0000:func_enc=7; 10b01_0000_0000:func_enc=8; 10b10_0000_0000:func_enc=9;endcaseendfunctionendmodule也可以通过以下函数
11、调用方法实现:也可以通过以下函数调用方法实现:例例4.3201801.BCD加法器设计对多位对多位BCD码做加法与减法运算时,当结果对应的码做加法与减法运算时,当结果对应的BCD值超宽值超宽9或低位向前有进位或借位时就要进行或低位向前有进位或借位时就要进行+6与与-6修正。修正。【例例4.5】 一位一位BCD码加法器设计程序码加法器设计程序module add4_bcd(cout,sum,ina,inb,cin);input cin; input3:0 ina,inb;output3:0 sum; reg3:0 sum; output cout; reg cout; reg4:0 temp;a
12、lways (ina,inb,cin) /always过程语句过程语句 begin temp9) cout,sum=temp+6; /两重选择的两重选择的IF语句语句 else cout,sum=temp; endendmodule201801.一位一位BCD码加法器仿真结果码加法器仿真结果 作业作业:设计一位设计一位BCD码减法器。码减法器。201801. 74LS138译码器的Verilog描述【例例4.6】74LS138译码器译码器module ttl74138(a,y,g1,g2a,g2b);input2:0 a; input g1,g2a,g2b; output reg7:0 y;a
13、lways (*) begin if(g1 & g2a & g2b) /只有当只有当g1、g2a、g2b为为100时,译码器使能时,译码器使能begin case(a)3b000:y=8b11111110; /译码输出译码输出3b001:y=8b11111101;3b010:y=8b11111011;3b011:y=8b11110111;3b100:y=8b11101111;3b101:y=8b11011111;3b110:y=8b10111111;3b111:y=8b01111111;default:y=8b11111111;endcase endelse y=8b11111111; end
14、endmodule74LS138a(0)a(1)a(2)g1y(7:0)201801.8 8线线33线优先编码器线优先编码器74LS14874LS148的的VerilogVerilog描述描述【例例4.7】module ttl74148(din,ei,gs,eo,dout);input7:0 din; input ei; output reg gs,eo; output reg2:0 dout;always (ei,din) begin if(ei) begin dout=3b111;gs=1b1;eo=1b1; endelse if(din=8b111111111) begin dout=3
15、b111;gs=1b1;eo=1b0;endelse if(!din7) begin dout=3b000;gs=1b0;eo=1b1;endelse if(!din6) begin dout=3b001;gs=1b0;eo=1b1;endelse if(!din5) begin dout=3b010;gs=1b0;eo=1b1;endelse if(!din4) begin dout=3b011;gs=1b0;eo=1b1;endelse if(!din3) begin dout=3b100;gs=1b0;eo=1b1;endelse if(!din2) begin dout=3b101;g
16、s=1b0;eo=1b1;endelse if(!din1) begin dout=3b110;gs=1b0;eo=1b1;endelse begin dout=3b111;gs=1b0;eo=1b1;end endendmodule201801.【例例4.8】 module parity(even_bit,odd_bit,a);input7:0 a; output even_bit,odd_bit;assign even_bit=a; /是规约运算符是规约运算符,异或异或 /生成偶校验位生成偶校验位assign odd_bit=even_bit; /生成奇校验位生成奇校验位endmodule
17、 奇偶校验位生成电路201801.通用奇偶校验发生器module parity_gen(bout,ain);input7:0 ain; output 8:0 bout;assign temp=ain;assign bout=temp,ain ;endmodule /1的个数为偶首位加的个数为偶首位加0,否则加,否则加1【例例4.9】201801.二、二、 Verilog基本时序电路设计基本时序电路设计 1、时序电路概述、时序电路概述时序逻辑电路:电路的任意时刻的输出状态不仅取决于该时刻的输入状态,还与电路的原状态有关。所以时序电路都有记忆功能。组合逻辑电路存储电路x1xnyny1q1qnpnp
18、1y1=f(x1,xn,q1,qn)yn=f(x1,xn,q1,qn):时序电路状态的改变只发生在时钟边时序电路状态的改变只发生在时钟边缘触发的一瞬间,该时刻的输入决定缘触发的一瞬间,该时刻的输入决定输出,其它时间都是由系统当前状态输出,其它时间都是由系统当前状态决定。决定。201801.2、时序电路设计方法、时序电路设计方法时序电路一般都是采用过程语句进行硬件描述,采时序电路一般都是采用过程语句进行硬件描述,采用边沿或电平触发进行控制。常见的时序电路有各种触发用边沿或电平触发进行控制。常见的时序电路有各种触发器、锁存器、寄存器、移位寄存器、分频器和计数器等。器、锁存器、寄存器、移位寄存器、分
19、频器和计数器等。下面将对各种时序电路进行下面将对各种时序电路进行Vierlog设计。设计。clkD基本触发器的基本触发器的Vierlog描述描述【例例4.104.10】 一位一位D D触发器的触发器的VerilogVerilog描述描述module dff(Q,D,clk);input D,clk; output reg Q;always (posedge clk)begin Q=D;endendmoduleD触发器触发器201801.【例例4.11】 JK触发器触发器module jkff_rs(clk,j,k,q);input clk,j,k; output reg q;always (p
20、osedge clk)begin case(j,k)2b00:q=q;2b01:q=1b0;2b10:q=1b1;2b11:q=q;default:q=1bx;endcaseendendmoduleJK触发器描述触发器描述jk说明说明00保持功能保持功能010置置0101置置111翻转功能翻转功能作业:设计作业:设计RS和和T触发器,并仿真。触发器,并仿真。201801.寄存器和锁存器的寄存器和锁存器的Vierlog设计设计 触发器是时序逻辑电路中最基本的存储单元。由于触发器是时序逻辑电路中最基本的存储单元。由于寄存器和锁存器均由触发器组成,并带有复位或置位等寄存器和锁存器均由触发器组成,并带
21、有复位或置位等功能。下面介绍的寄存器和锁存器均由功能。下面介绍的寄存器和锁存器均由D触发器构成。触发器构成。当当D和和Q定义多位矢量时,可形成多位寄存器。定义多位矢量时,可形成多位寄存器。寄存器设计寄存器设计A:一位简单寄存器设计:一个一位简单寄存器设计:一个D触发器就是一位寄存器,触发器就是一位寄存器,如例如例4.10程序描述。程序描述。 不带复位端口的简单寄存器可以由一个在不带复位端口的简单寄存器可以由一个在always语句语句中被中被赋值的变量描述赋值的变量描述,并且该,并且该always语句的敏感列表中只语句的敏感列表中只包含包含一个边沿敏感的信号一个边沿敏感的信号。在描述寄存器的。在
22、描述寄存器的always语句中,语句中,应该使用应该使用非阻塞赋值非阻塞赋值(Non-blocking assignment)来给变量来给变量赋值,以保证生成正确的寄存器电路,并且在仿真中避免赋值,以保证生成正确的寄存器电路,并且在仿真中避免产生竞争产生竞争(Simulation race)。 201801.异步寄存器设计B:带异步复位和使能带异步复位和使能的一位寄存器设计:的一位寄存器设计:可见寄存器的复位和使能都不受可见寄存器的复位和使能都不受时钟控制,只要满足条件就可能时钟控制,只要满足条件就可能发生复位的过程为发生复位的过程为异步控制过程异步控制过程。即各输入控制相对独立。即各输入控制
23、相对独立。例例4.12 带异步复位和使能的一位寄存器带异步复位和使能的一位寄存器201801.【例例4.13】 带异步清带异步清0/异步置异步置1(低电平有效)的一位寄存器(低电平有效)的一位寄存器module dff_asyn(q,qn,d,clk,set,reset);input d,clk,set,reset; output reg q,qn;always (posedge clk , negedge set , negedge reset) beginif(reset) begin q=1b0;qn=1b1; end/异步清异步清0,低电平有效,低电平有效else if(set) be
24、gin q=1b1;qn=1b0; end/异步置异步置1,低电平有效,低电平有效else begin q=d;qn=d; end endendmodule寄存器dclkresetsetqqn异步寄存器设计201801. 带异步复位或置位端口的寄存器可以由一个在带异步复位或置位端口的寄存器可以由一个在always语语句中被赋值的变量描述,并且该句中被赋值的变量描述,并且该always语句的敏感列表中包语句的敏感列表中包含含至少两个边沿敏感的信号至少两个边沿敏感的信号,但不包含任何电平敏感的信号但不包含任何电平敏感的信号。此外,该此外,该always语句必须包含一个语句必须包含一个if条件语句,
25、来指定寄存器条件语句,来指定寄存器的第一个异步赋值行为(如异步复位、置位等等),以及可的第一个异步赋值行为(如异步复位、置位等等),以及可选的选的else if嵌套条件语句来指定额外的异步赋值行为。最后一嵌套条件语句来指定额外的异步赋值行为。最后一个个else语句用于指定同步的寄存器赋值行为。异步赋值语句的语句用于指定同步的寄存器赋值行为。异步赋值语句的输入信号通常连接到寄存器的复位或置位端口,而同步赋值输入信号通常连接到寄存器的复位或置位端口,而同步赋值语句的输入信号则连接在寄存器的数据输入端口,即通常所语句的输入信号则连接在寄存器的数据输入端口,即通常所说的说的D端口。端口。 异步寄存器设
26、计201801.C:带同步复位的一位带同步复位的一位寄存器设计:寄存器设计:可见复位的发生是由时钟决定的,也就是说无论复位和使能都在时钟可见复位的发生是由时钟决定的,也就是说无论复位和使能都在时钟统一控制下进行的过程为统一控制下进行的过程为同步寄存器同步寄存器。例例4.14 带同步复位的一位寄存器带同步复位的一位寄存器同步寄存器设计201801.【例例4.15】 带同步清带同步清0/同步置同步置1(低电平有效)的一位寄存器(低电平有效)的一位寄存器module dff_syn(q,qn,d,clk,set,reset);input d,clk,set,reset; output reg q,q
27、n;always (posedge clk) begin if(reset) begin q=1b0;qn=1b1;end/同步清同步清0,低电平有效,低电平有效else if(set) begin q=1b1;qn=1b0;end/同步置同步置1,低电平有效,低电平有效else begin q=d; qn=d; end endendmodule同步寄存器设计201801.锁存器设计锁存器设计 在描述锁存器时,在描述锁存器时,always语句中所有赋值表达式等号语句中所有赋值表达式等号右边参与赋值的信号必须全部在敏感列表中列出,并且右边参与赋值的信号必须全部在敏感列表中列出,并且应该使用非阻塞
28、赋值应该使用非阻塞赋值(Non-blocking assignment)来给锁存来给锁存器变量赋值。器变量赋值。该变量在该变量在alwaysalways语句中存在有语句中存在有没有赋值的没有赋值的情况。情况。A: 一位一位简单锁存器简单锁存器注意这里采用触发条件是电平触发(与寄存器采用的边缘触发不同),并注意这里采用触发条件是电平触发(与寄存器采用的边缘触发不同),并且条件语句是不完备的。且条件语句是不完备的。201801.B: 含清含清0控制的锁存器及其控制的锁存器及其Verilog表述表述 201801.module sel(CLK,D,Q);input CLK,D;output reg
29、Q;always (CLK or D) if (CLK) Q = D;else Q = 1b0;endmodule 注意触发器与组合逻辑电路区别,都采用过程语句描述,又都是电平触发,区别注意触发器与组合逻辑电路区别,都采用过程语句描述,又都是电平触发,区别是触发器不用完备的赋值,而组合电路必须将所有可能的赋值都考虑到。是触发器不用完备的赋值,而组合电路必须将所有可能的赋值都考虑到。/ 变量变量Q不会不会生成锁存器,生成锁存器,而是生产而是生产组合组合逻辑逻辑,因为在,因为在always语句语句中,中,q没有存没有存在不被赋值的在不被赋值的情况,即条件情况,即条件判别的所有分判别的所有分支都给支
30、都给Q指定指定了赋值语句。了赋值语句。201801.3、时序电路设计典型应用、时序电路设计典型应用移位寄存器设计移位寄存器设计 由于存放二进制数据、信息的电路称为寄存器。用移位方式存储数据的由于存放二进制数据、信息的电路称为寄存器。用移位方式存储数据的寄存器,称为寄存器,称为移位寄存器移位寄存器。可以在移位脉冲作用下将寄存器内部的二进制数据。可以在移位脉冲作用下将寄存器内部的二进制数据顺序向左或向右移动,实现数据的串、并行转换和处理等操作。顺序向左或向右移动,实现数据的串、并行转换和处理等操作。单向移位寄存器工作原理单向移位寄存器工作原理是将寄存器的数据在相邻位之间单方向移动过程,分为左移移位
31、寄存器和是将寄存器的数据在相邻位之间单方向移动过程,分为左移移位寄存器和右移移位寄存器。串行输入数据一般是从低位开始输入。右移移位寄存器。串行输入数据一般是从低位开始输入。串行输出串行输出D串行输入串行输入DQCFF3CPQ3DDQCFF3Q2DQCFF3Q1DQCFF3Q0并行输出并行输出4位右移移位寄存器位右移移位寄存器如下如下4位移位寄存器,首先初始复位,位移位寄存器,首先初始复位,4个触发器输出均为个触发器输出均为0,以后每一个,以后每一个CP上升沿到来,将上升沿到来,将D=1101数据右移一次,数据右移一次,4个个CP后,串行输入完毕。后,串行输入完毕。201801.CP输入输入数据
32、数据D右移移位寄存器右移移位寄存器Q3Q2Q1Q0000000111000200100311010411101右移输出例表右移输出例表在在CP脉冲作用下,输入一个脉冲,数据就向右移动一位。输出可以有两种方脉冲作用下,输入一个脉冲,数据就向右移动一位。输出可以有两种方式:一种是数据从右端式:一种是数据从右端Q0依次输出,称为依次输出,称为串行输出,这种输出至少需要串行输出,这种输出至少需要8个时个时钟脉冲才能完成输出钟脉冲才能完成输出;另一种是由;另一种是由Q3 、Q2、Q1 、Q0端同时输出,称为端同时输出,称为并行输并行输出,这种输出只需出,这种输出只需4个时钟脉冲就可同时输出个时钟脉冲就可
33、同时输出。所以并行输出比串行输出速度。所以并行输出比串行输出速度快。快。CPDQ3Q2Q1Q0右移时序逻辑图右移时序逻辑图201801.双向移位寄存器工作原理双向移位寄存器工作原理如上图,双向移位寄存器就是数据既可以从如上图,双向移位寄存器就是数据既可以从Q3输入实现右移操作,相反输入实现右移操作,相反也可以从也可以从Q0输入实现向左操作的过程。输入实现向左操作的过程。下图为下图为4位双向移位寄存器,通过控制位双向移位寄存器,通过控制dir实现左移和右移。实现左移和右移。si为串行输入口,为串行输入口,set为置位端,为置位端,clk为时钟输入端,为时钟输入端,clr为清零端。为清零端。set
34、sidirclkclr201801.可见实现双向控制的逻辑电路是非常复杂,位数越大越复可见实现双向控制的逻辑电路是非常复杂,位数越大越复杂,采用传统方式设计就容易出现错误。下面采用杂,采用传统方式设计就容易出现错误。下面采用Verilog硬件描述方法进行设计。硬件描述方法进行设计。4位位双双向向移移位位寄存器寄存器setsidirclkclrQ3Q2Q1Q0/移位寄存器shft_regmodule shft_reg(data_out,clk,clr,set,dir,si);output3:0 data_out;input clk,clr,set,dir,si;reg3:0data_out;al
35、ways (posedge clk)beginif(!clr)data_out=4b0000;else if(!set)data_out=4b1111;else if(dir)data_out=si,data_out3:1;else data_out=data_out2:0,si;Endendmodule201801.上图演示的是上图演示的是si给定给定0时,时,dir=0左移操作,左移操作,si给定给定1时时,dir=1右移操作的过右移操作的过程仿真结果。程仿真结果。通过通过Verilog语言描述设计的双向移位寄存器比传统设计相对简单,这充语言描述设计的双向移位寄存器比传统设计相对简单,这充
36、分体现硬件描述语言的优势。分体现硬件描述语言的优势。201801.生成的双向移位寄存器逻辑功能示意图(RTL)RTL)201801.计数器设计计数器设计计数器能够累计输入脉冲个数,包含若干个触发器,并按预定顺序改变计数器能够累计输入脉冲个数,包含若干个触发器,并按预定顺序改变各触发器的状态,是一种应用广泛的时序电路,按照各个触发器状态翻转的各触发器的状态,是一种应用广泛的时序电路,按照各个触发器状态翻转的时间,可分为同步和异步计数器;按照计数过程中的数字的增减规律,可分时间,可分为同步和异步计数器;按照计数过程中的数字的增减规律,可分为加法、减法和可逆计数器;按照计数器循环长度,可分为二进制和
37、为加法、减法和可逆计数器;按照计数器循环长度,可分为二进制和N进制进制计数器。计数器。二进制计数器设计二进制计数器设计/异步使能二进制计数器:异步使能二进制计数器:module count_w(en,clk,reset,out);input clk,reset,en;parameter WIDTH=2; /参数定义参数定义outputWIDTH-1:0 out; regWIDTH-1:0 out;always (posedge clk or negedge reset)if(!reset) out=0;else if(en) out=out+1;endmodule当当width=2时,为二位二
38、时,为二位二进制加法计数器。进制加法计数器。00011011也称四进制加法计数器也称四进制加法计数器201801.module jsq_b(en,clk,reset,out);input clk,reset,en;parameter WIDTH=4; /参数定义参数定义outputWIDTH-1:0 out; regWIDTH-1:0 out;always (posedge clk )if(reset) out=0;else if(en) out=out+1;endmodule当当width=4时,为时,为4位同步复位和使能的二进制加法计数器位同步复位和使能的二进制加法计数器201801.当当
39、width为任意为任意N位二进制值时,则可实现位二进制值时,则可实现N位二进制加法计数器。也可以位二进制加法计数器。也可以设为减法计数器。设为减法计数器。N=4时的四位加法计数器仿真结果,也可称为时的四位加法计数器仿真结果,也可称为16进制加法计数器。进制加法计数器。如何实现如何实现10进制加法计数器?进制加法计数器?0000000100100011010001010110011110001001111111101011101011011100无效状态右图可见,只有选择右图可见,只有选择00001001这这10个状态作为个状态作为10进制的基本状进制的基本状态,并构成循环。其它状态均是无态,并
40、构成循环。其它状态均是无效状态,如果不加以限制就是普通效状态,如果不加以限制就是普通的二进制加法计数器(或称的二进制加法计数器(或称16进制进制加法计数器)加法计数器)201801.10进制加法计数器电路结构图进制加法计数器电路结构图201801.同步十进制加法计数器/clr为清零输入端/C为进位输出端/为避免进入无效状态,初始清零可见这种硬件描述设计比直接电路设计相对简单,凸显这种设计的优越性。可见这种硬件描述设计比直接电路设计相对简单,凸显这种设计的优越性。201801.生成的10进制加法计数器电路RTL201801.二位十进制计数器设计通常采用多位十进制计数器进行计数,优点是输出便于显示
41、控制。通常采用多位十进制计数器进行计数,优点是输出便于显示控制。201801.分频器设计分频器设计分频器是数字系统设计中的基本电路,也是分频器是数字系统设计中的基本电路,也是FPGA设计中频繁使用的设计中频繁使用的基本单元之一,尽管目前在大部分设计中还广泛使用集成锁相环(基本单元之一,尽管目前在大部分设计中还广泛使用集成锁相环(PLL)来进行时钟的分频、倍频以及相移设计。但是,对于时钟要求不太严格的来进行时钟的分频、倍频以及相移设计。但是,对于时钟要求不太严格的场合,通过自行设计分频器进行时钟分频的方法仍然非常流行。首先,这场合,通过自行设计分频器进行时钟分频的方法仍然非常流行。首先,这种方法
42、可以节省锁相环资源,其次,这种方式只消耗不多的逻辑单元就可种方法可以节省锁相环资源,其次,这种方式只消耗不多的逻辑单元就可以达到对时钟的操作的目的。以达到对时钟的操作的目的。分频器就是使得单位时间内的脉冲次数减小的电路,亦即降低脉分频器就是使得单位时间内的脉冲次数减小的电路,亦即降低脉冲频率。降低冲频率。降低1/2倍频率的为二分频器,降低倍频率的为二分频器,降低1/4倍频率的为倍频率的为4分频分频器,以此类推。器,以此类推。偶数倍分频器设计偶数倍分频器设计201801.D0Q0CPQbD0Q1CPQbQ1CPQ0QbQ1由上图可知每输入一个脉冲,触发器状态翻转一次,每翻转两次,由上图可知每输入
43、一个脉冲,触发器状态翻转一次,每翻转两次,触发器的输出可以得到一个完整的矩形波,即触发器翻转两次所用的触发器的输出可以得到一个完整的矩形波,即触发器翻转两次所用的前沿脉冲来自原始时钟信号的两个周期波形。所以,一个前沿脉冲来自原始时钟信号的两个周期波形。所以,一个D触发器实触发器实现了现了2分频电路,两个分频电路,两个D触发器可实现触发器可实现4分频器电路,以此增加触发器分频器电路,以此增加触发器个数可以得到个数可以得到8、16、32等类型的触发器。等类型的触发器。偶数分频器工作原理:偶数分频器工作原理:A:简单偶数倍分频器设计:简单偶数倍分频器设计:201801.2/4分频器分频器Verilo
44、g描述程序:可实现描述程序:可实现2和和4分频功能分频功能module div_2_4(reset,clk_in,clk2_out,clk4_out); input clk_in,reset; output clk2_out,clk4_out; reg clk2_out,clk4_out; always (posedge clk_in) /时钟上升沿触发 begin if(reset)begin /同步复位 clk2_out=0; clk4_out=0; end else begin clk2_out= clk2_out ; if( clk2_out) clk4_out= clk4_out ;
45、 end endendmodule201801.2/4分频器仿真结果如再加入一个触发器可以得到什么分频器结果?可见这种方法只能得如再加入一个触发器可以得到什么分频器结果?可见这种方法只能得到到2、4、8、16、32等偶数倍分频器。等偶数倍分频器。考虑如何得到其它更多偶数考虑如何得到其它更多偶数倍分频器设计?如倍分频器设计?如6、10、12、14等分频器等分频器。2T4T一般偶数倍分频器可以通过待分频的时钟触发计数器计数,一般偶数倍分频器可以通过待分频的时钟触发计数器计数,当计数器从当计数器从0计数到计数到N/2-1时,输出时钟进行翻转并给计数器一时,输出时钟进行翻转并给计数器一个复位信号,以使
46、下一个时钟从零开始计数,以此循环,就可以个复位信号,以使下一个时钟从零开始计数,以此循环,就可以实现任意的偶数倍分频。实现任意的偶数倍分频。B:一般任意偶数分频器设计:一般任意偶数分频器设计:201801.1/6分频参考程序module div_6(reset,clk_in,clk6_out); input clk_in,reset; output clk6_out; reg clk6_out; parameter WIDTH=2; reg WIDTH:0temp; always (posedge clk_in) begin if(reset)begin clk6_out=0; clk10_o
47、ut=0; temp2) begin clk6_out= clk6_out ; temp1clkinqout2qout1clkout201801.三分频器实现原理图T3T 采集上升沿,计数小于(N-1)/2置1,否则置0 采集下升沿,计数小于(N-1)/2置1,否则置0N=3,从0到N-1重复计数将采集的上升和下降沿进行相“或”运算,得到1/3分频输出。201801.占空比为占空比为50%50%的三分频器的三分频器VerilogVerilog描述程序描述程序module fen3(clkin,qout1,qout2,clkout); input clkin; output reg qout1,
48、qout2; output clkout; wire clkout; assign clkout=qout1|qout2; always (posedge clkin) begin : blk1 reg1:0 cnt; if(clkin=1b1)begin if(cnt1)begin qout1=1b1; cnt=cnt+1;end else begin qout1=1b0; cnt1) cnt=0;end end end always (negedge clkin) begin : blk2 reg1:0 cnt; if(clkin=1b0)begin if(cnt1)begin qout2
49、=1b1; cnt=cnt+1;end else begin qout2=1b0; cnt1) cnt=0;end end end endmodule 201801.三分频器Verilog仿真结果3T201801.module fen3(clkin,qout1,qout2,clkout); input clkin; output qout1,qout2; output clkout; reg qout1,qout2; wire clkout; assign clkout=qout1|qout2; always (posedge clkin) begin:blk1 reg 1:0 cnt; if
50、(clkin=1b1)begin if(cnt=2)begin cnt=0; qout1=1b1; end else begin cntcnt+1; qout1=1b0; end endend always (negedge clkin) begin:blk2 reg 1:0 cnt; if(clkin=1b1)begin if(cnt=2)begin cnt=0; qout2=1b1; end else begin cntcnt+1; qout2=1b0; end endendendmodule 占空比为占空比为50%50%的三分频器的三分频器VerilogVerilog描述参考程序描述参考
51、程序201801.结束结束201801.【例例7.30】 电平敏感的电平敏感的1位数据锁存器位数据锁存器module latch1(q,d,le);input d,le; output q;assign q=le?d:q; /le为高电平时,将输入端数据锁存为高电平时,将输入端数据锁存endmodule201801.【例例7.31】 带置位带置位/复位端的复位端的1位数据锁存器位数据锁存器module latch2(q,d,le,set,reset);input d,le,set,reset; output q;assign q=reset?0:(set? 1:(le?d:q);endmodu
52、le201801.【例例7.32】 8位数据锁存器(位数据锁存器(74LS373)module ttl373(le,oe,q,d);input le,oe; input7:0 d; output reg7:0 q;always * /或写为或写为always (le,oe,d)begin if(oe & le) q=d; /或写为或写为if(!oe) & (le)else q=8bz;endendmodule201801.【例例7.33】 数据寄存器数据寄存器module reg_w(dout,din,clk,clr);parameter WIDTH=7;input clk,clr; inpu
53、tWIDTH:0 din;output regWIDTH:0 dout;always (posedge clk, posedge clr)begin if(clr) dout=0;else dout=din; endendmodule201801.【例例7.35】 可变模加法可变模加法/减法计数器减法计数器module updown_count(d,clk,clear,load,up_down,qd);input clk,clear,load,up_down;input7:0 d; output7:0 qd; reg7:0 cnt;assign qd=cnt;always (posedge c
54、lk)begin if(!clear) cnt=8h00; /同步清同步清0,低电平有效,低电平有效else if(load) cnt=d;/同步预置同步预置else if(up_down) cnt=cnt+1; /加法计数加法计数else cnt=cnt-1; /减法计数减法计数endendmodule201801.7.9 三态逻辑设计三态逻辑设计 【例例7.39】 行为描述的三态门行为描述的三态门module tristate1(in,en,out);input in,en; output reg out;always (in or en)begin if(en) out=in; else
55、 out=1bz; endendmodule201801.【例例7.40】 调用门元件调用门元件bufif1描述的三态门描述的三态门module tristate2(in,en,out);input in,en; output out; tri out;bufif1 b1(out,in,en);/注意三态门端口的排列顺序注意三态门端口的排列顺序endmodule201801.【例例7.41】 数据流描述的三态门数据流描述的三态门module tristate3(out,in,en);input in,en; output out;assign out=en?in:1bz; /若若en=1,ou
56、t=in;/若若en=0,out为高阻态为高阻态endmodule201801.【例例7.42】 三态双向驱动器三态双向驱动器module bidir(y,a,en,b);input a,en; output b; inout y;assign y=en?a:bz; assign b=y;endmodule201801.【例例7.44】 三态双向总线缓冲器三态双向总线缓冲器module ttl245(a,b,oe,dir);input oe,dir; /使能信号和方向控制使能信号和方向控制inout7:0 a,b; /双向数据线双向数据线assign a=(oe,dir=2b00)?b:8bz
57、;assign b=(oe,dir=2b01)?a:8bz;endmodule201801.7.10 RAM存储器设计存储器设计 生成一个新的宏模块生成一个新的宏模块 201801.设置输出文件的类型、目录和名字设置输出文件的类型、目录和名字 201801.定制定制RAM模块的数据宽度和深度模块的数据宽度和深度 201801.指定指定RAM模块的初始化数据文件模块的初始化数据文件 201801.【例例7.46】 用文本方式调用用文本方式调用RAM存储器模块存储器模块module ram_dy(addr,clk,din,wr,qout); /端口定义端口定义input6:0 addr;input
58、 clk; input7:0 din;input wr; output7:0 qout;myram u1(address(addr),.clock(clk),.data(din),.wren(wr),.q(qout); /元件例化元件例化endmodule201801.7.11 FIFO缓存器设计缓存器设计 用用MegaWizard Plug-in Manager工具定制工具定制FIFO模块模块 201801.定制定制FIFO模块的数据宽度和深度模块的数据宽度和深度 201801.定制定制FIFO模块的端口模块的端口 201801.设定速度优先还是面积优先设定速度优先还是面积优先 201801
59、.FIFO模块的功能仿真波形图(模块的功能仿真波形图(Quartus ) 201801.习习 题题 77.1 Verilog支持哪几种描述方式,各有什么特点?支持哪几种描述方式,各有什么特点?7.2 分别用结构描述和行为描述方式设计一个基本的分别用结构描述和行为描述方式设计一个基本的D触发器,在此基础上,采用结构描述的方式,用触发器,在此基础上,采用结构描述的方式,用8个个D触发器构成一个触发器构成一个8位移位寄存器。位移位寄存器。7.3 分别用结构描述和行为描述方式设计一个分别用结构描述和行为描述方式设计一个JK触发器,触发器,并进行综合。并进行综合。7.4 试编写同步模试编写同步模5计数器
60、程序,有进位输出和异步复计数器程序,有进位输出和异步复位端。位端。7.5 编写编写4位串位串/并转换程序。并转换程序。7.6 编写编写4位并位并/串转换程序。串转换程序。7.7 编写编写4位除法电路程序。位除法电路程序。201801.7.8 用用Verilog编写一个将带符号二进制数的编写一个将带符号二进制数的8位原码转换成位原码转换成8位补码的电路,并基于位补码的电路,并基于Quartus 软件进行综合和仿真。软件进行综合和仿真。7.9 编写一个编写一个8路彩灯控制程序,要求彩灯有以路彩灯控制程序,要求彩灯有以下下3种演示花型。种演示花型。(1)8路彩灯同时亮灭;路彩灯同时亮灭;(2)从左至右逐个亮(每次只有)从左至右逐个亮(每次只有1路亮);路亮);(3)8路彩灯每次路彩灯每次4路灯亮,路灯亮,4路灯灭,且亮灭相路灯灭,且亮灭相间,交替亮灭;间,交替亮灭;在演示过程中,只有当一种花型演示完毕才能转在演示过程中,只有当一种花型演示完毕才能转向其他演示花型。向其他演示花型。习习 题题 7201801.