第二章(逻辑电路)_第1页
第二章(逻辑电路)_第2页
第二章(逻辑电路)_第3页
第二章(逻辑电路)_第4页
第二章(逻辑电路)_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章逻辑电路及verilog HDL简介主要内容 基本逻辑门和常用逻辑门 用Verilog HDL实现基本的逻辑操作 4 种风格的Verilog HDL描述逻辑门级的Verilog HDL数据流风格的Verilog HDL功能描述风格的Verilog HDL 常用的组合逻辑电路及其设计多路选择器设计译码器设计 32位移位器设计 时序电路的设计方法D锁存器D触发器状态转移图及时序电路设计2.1 基本逻辑门和常用逻辑门数字逻辑电路是实现数字计算机的物质基数字逻辑电路是实现数字计算机的物质基础。础。若将其做在一块集成电路上(被完整封装,看不到内部结构),称为数字集成电路,它是现代计算机的基本元件。

2、数字集成电路的基本元件是逻辑门,逻辑门由晶体管组成。这里只简介MOS晶体管(金属-氧化物-半导体场效应管)组成的逻辑门。MOS晶体管 按物质是否导电,可以分为:导体(双向导电)绝缘体(不导电)半导体 同时具备导体和绝缘体两种特性,其特性取决于在物体两端所施加电压的方向,当在一个方向上有正的电压存在时,可以允许电流流过(导体特性);而在相反的方向上施加一定大小的电压时,该物体中不会产生电流(绝缘体特性),即该物体只能在单个方向上导电。 半导体分为二极管MOS晶体管(三极管中的一种) N沟道MOS晶体管 P沟道MOS晶体管 N-MOS晶体管的符号如下源极S漏极D栅极G源极S(VS)漏极D(VD)栅

3、极G(VG) 在数字电路中,MOS管工作于开关状态,相当于一个可控开关。MOS管状态开关状态数字电路状态导通达到饱和接通0(L低电平)截止断开1(H高电平) 稳定状态下不允许工作于导通而又不饱和的状态(电压不允许处在不高、不低的模糊状态)。 高电平或低电平的具体数值与电路结构、材料等有关,下表为MOS数字电路的高低电平的典型值。 在数字电路中,MOS管相当于一个开关,可控信号是VG。如NMOS管,当VGSVH时NMOS管导通。电源电压(V)高电平(H)低电平(L)典型值范围典型值范围VD=55=30=20-与与-或。或。非门(NOT)非门的主要功能是对输入信号求反。其布尔表达式为 f= aVD

4、DRafNMOS非门VDDafCMOS非门RKU输入a a输出 f f 断(0)亮(1)合(1)灭(0)非门真值表xf非门符号 目前的集成电路以CMOS电路为主。 CMOS的优点功耗小从输入信号发生变化到输出信号变化的延迟时间小,因而速度快。 非门的波形图如下。fa不考虑延迟fa实际电路延迟时间td二输入二输入与门与或门 与门与或门真值表RK1UK2RK1UK2输入输出K1K2灯断(0) 断(0) 灭(0)断(0) 合(1) 灭(0)合(1) 断(0) 灭(0)合(1) 合(1) 亮(1)与门:灯亮=K1K2输入输出K1K2灯断(0) 断(0) 灭(0)断(0) 合(1) 亮(1)合(1) 断

5、(0) 亮(1)合(1) 合(1) 亮(1)或门:灯亮=K1+K2二输入二输入与非门和或非门 与非门和或非门真值表输入输出K1K2灯断(0) 断(0) 亮(1)断(0) 合(1) 灭(0)合(1) 断(0) 灭(0)合(1) 合(1) 灭(0)输入输出K1K2灯断(0) 断(0) 亮(1)断(0) 合(1) 亮(1)合(1) 断(0) 亮(1)合(1) 合(1) 灭(0)RK1UK2RK1UK2或非门:灯亮=K1+K2与非门:灯亮=K1K2二输入二输入与非门电路图VDDRbNMOS与非门affVDDbCMOS与非门aCMOS或非门fVDDba逻辑功能的表示和等效电路逻辑功能表示: 布尔代数式、

6、卡诺图、真值表、线路逻辑图下图是非门、二输入二输入与门、二输入二输入或门等的图形符号。 非门非门 与门与门 与非门与非门 或门或门 或非门或非门AYBA B Y 0 0 0 0 1 0 1 0 0 1 1 1A B Y 0 0 1 0 1 1 1 0 1 1 1 0Y=AB Y= AB Y=A+B Y=A+B 真值表真值表YYYAAABBBAY真值表和逻辑表达式的对应关系与门与门与非门与非门ABA B Y 0 0 0 0 1 0 1 0 0 1 1 1A B Y 0 0 1 0 1 1 1 0 1 1 1 0Y = A B Y = A B ABY1.1.用用与逻辑与逻辑写出真值表中写出真值表中

7、每一横行中输出为每一横行中输出为 1 1 的的逻辑表达式;逻辑表达式;2.2.用用或逻辑或逻辑汇总真值表中汇总真值表中全部输出为全部输出为 1 1 的逻辑。的逻辑。3.3.不必理睬那些输出为不必理睬那些输出为 0 0的各行的内容,它们已的各行的内容,它们已经隐含在通过经隐含在通过 1 1、2 2 两两步写出的表达式中。步写出的表达式中。Y= A * B + A * B + A * BY真值表真值表二输入异或门和同或门 二输入异或门是指输入的二个变量相异时输出为1,否则输出为0。 二输入同或门是指输入的二个变量相同时输出为1,否则输出为0。 可以看出两者的关系为非的关系。 真值表如下:ABY00

8、0011101110ABY001010100111异或门真值表异或门真值表同或门真值表同或门真值表异或门表达式异或门表达式 Y=AB+AB=A B同或门表达式同或门表达式 Y=AB+AB=A B 缓冲器缓冲器只能简单地把输入信号传送到输出器。主要用于当某个信号所驱动的负载特别大时能给出较大的电流,或为了避免延迟时间过长。 三态门电路三态门电路图和真值表如下:f电路图SaSMOS管af备注1导通00f=a1110截止X(任意)zf=z(高阻态) 三态门电路是一种构建计算机总线接口的理想电路,具有信号驱动能力强、传输速度快的特性,又有集电极开路电路的输出可以“线与”的优点。 用于实现从多个数据输入

9、中选择其一的场合。A B C/G1 /G2 /G3总线总线例如,当控制信号例如,当控制信号 /G1/G1为低电平,为低电平, /G2 /G2 和和 /G3/G3为高电平时,三态门的为高电平时,三态门的输入输入 A A 被送到总线上,被送到总线上,另外两个三态门的输出另外两个三态门的输出处于高阻态。处于高阻态。 2.2 t Verilog HDL实现基本的逻辑 下面先用C语言程序举例说明二个逻辑变量进行逻辑与操作,并将它们的真值表打印出来,要求使用函数来完成。A B Z=and(a,b) 0 0 0 0 1 0 1 0 0 1 1 1逻辑与真值表逻辑与真值表Using C function co

10、de/logic and functionbool and1(bool a,bool b) return a & b;/test fileincludeint main() int i,x,y;for(i=0;i4;i+) x=i%2; y=i/2;printf(“%d & %d=%dn”,x,y,and1(x,y);return 0;Verilog HDL code/source codemodule and1(x,y,z); input x,y; output z; assign z=x&y;endmodule注释注释模块名模块名模块端口定义模块端口定义分号结束分号结束端口功端口功能描述能

11、描述功能定义功能定义 其他的逻辑运算类推 模块代码写好后,首先看看它是否符合Verilog HDL的语法规则编译。 为了确认代码是否能完成所期望的任务,还要对它进行检查。检查的方法是给输入信号指定所有可能的输入组合,让模块的主体“计算”出相应的输出。然后抒计算出的输出与所期待的输出进行比较,检查它们是否正确。计算代码输出的任务由Verilog HDL“仿真器” 完成。 为此需要编写测试模块,测试模块大致由三部分组成。调用被测试的模块用各种输入组合来测试结果指定输出文件名(Quartus II不需要)Testbench code/testbench codemodule and1_tb; reg

12、 1:0 i; reg x,y; wire z; initial for(i=0;i=3;i=i+1) begin #10 x=i%2;y=i/2; end and1 m(.x(x),.y(y),.z(z); endmodule无输入输出无输入输出数据位数数据位数2位位寄存器类型寄存器类型初始化变量初始化变量线网类型线网类型10延时单延时单位后输出位后输出生成实例并代生成实例并代入参数运行入参数运行 运行2.3 逻辑门的CMOS晶体管实现以及晶体管的Verilog HDL 略2.4 四种风格的Verilog HDL描述 2.4.1 晶体管开关级的Verilog HDL 下面以CMOS反向器(非

13、门)的Verilog HDL代码为例进行说明。module cmosnot(f,a); input a; output f; supply1 vdd; supply0 gnd; pmos p1(f,vdd,a); nmos n1(f,gnd,a);endmodule测试代码include cmosnot.vmodule cmosnot_tb; reg a,b; wire f; cmosnot not_1(f,a); initial begin a=1; #1 a=0; #1 a=1; #1 $finish; end initial begin $dumpfile(test.vcd); $dum

14、pvars; $monitor(%gt a=%b;f=%b,$time,a,f); /disply end endmodule2.4.2 逻辑门级的Verilog HDL 下面给出两种逻辑门级的二选一多路器电路。使用三态门使用普通的与非门bufif0bufif1a0a1sya0a1ssna0_sna1_sy多路选择器(三态门)电路多路选择器(与或非门)电路模块代码/三态门实现module mux2X1_3s(a0,a1,s,y) input s,a0,a1; output y; bufif0 b0(y7,a0,s); bufif1 b0(y7,a1,s);endmodule/与或非门实现mod

15、ule mux2x1_gate(a0,a1,s,y) input s,a0,a1; output y; not i0(sn,s); and i1(a0_sn,a0,s); and i2(a1_s,a1,s); and i3(y,a0_sn,a1_s);endmodule 2.4.3 数据流风格的Verilog HDL 数据流风格的Verilog HDL不指定任何特定的器件。 主要特征是使用assign语句对变量赋值。 赋值语句的特点是等式右边的输入变量一旦发生变化,立即反映到等式左边的输出变量。 使用assign赋值时,对一个变量只能赋值一次。模块代码/逻辑表达式风格module mux2X1

16、_dataflow(a0,a1,s,y); input s,a0,a1; output y; assign y=s&a0|s&a1;endmodule/三目运算符?:形式module mux2x1_gate(a0,a1,s,y); input s,a0,a1; output y; assign y=s?a0:a1;endmodule运行2.4.4 功能描述风格的Verilog HDL 功能描述是Verilog HDL中层次最高的描述方法。 特点:靠“算法”设计电路的操作。 下面给出二选一多路器的部分版本。Always_if_elsemodule mux2x1_if_else(a0,a1,s,y

17、) input s,a0,a1; output y; reg y;/ycannot be a net always (s or a0 or a1) begin if(s) begin y=a1; end else begin y=a0; endendendmoduleAlways_casemodule mux2x1_case(a0,a1,s,y) input s,a0,a1; output y; reg y;/ycannot be a net always (s or a0 or a1) begin case(s) 1b0:y=a0; 1b1:y=a1; endcaseendendmodule

18、functionmodule mux2x1_function(a0,a1,s,y) input s,a0,a1; output y; assign y=sel(a0,a1,s); function sel; input a,b,c;/note the order case(c) 1b0:sel=a; 1b1:sel=b; endcase endfunctionendmoduleif(c) sel=b; else sel=a;逻辑电路的分类按是否有时序,分为: 组合逻辑电路的输出状态只取决于当前输入信号的状态,与过去的输入信号的状态无关。例如与门、加法器,译码器,编码器,数据选择器等电路。 时序

19、逻辑电路的输出状态不仅和当前的输入信号的状态有关,还与以前的输入信号的状态有关,即时序逻辑电路有记忆功能。最基本的记忆电路是触发器,包括电平触发器和边沿触发器,由基本触发器可以构成寄存器,计数器等部件。从器件的集成度和功能区分:低集成度的、只提供专用功能的器件。 加法器和算术逻辑单元 译码器和编码器 数据选择器 触发器和寄存器、计数器高集成度的、现场可编程的通用功能电路(阵列逻辑电路) 存储器芯片 RAM 和 ROM 通用阵列逻辑 GAL 复杂的可编程逻辑器件 CPLD: MACH器件 现场可编程门阵列 FPGA 器件2.5 常用的组合电路及其设计 常见的组合逻辑电路有加法器、译码器、数据选择

20、器等。2.5.1 半加器 不考虑进位输入时,两数码Xn,Yn相加称为半加。功能表如下。XnYnHn000011101110半加和Hn的表达式如下:Hn=XnYn+XnYn=XnYn 半加器可用反相门及与或非门来实现,也可用异或门来实现。用与、或、非门构成的半加器用异或门构成的半加器2.5.2 全加器 由Xn,Yn及低位来的进位输入Cn-1相加的器件称为全加器,下表是其真值表。由表可得全加和Fn和进位输出Cn的表达式:F Fn n=X=Xn nY Yn nC Cn-1n-1+X+Xn nY Yn nC Cn-1n-1+X+Xn nY Yn nC Cn-1n-1 +X+Xn nY Yn nC Cn

21、-1n-1C Cn n=X=Xn nY Yn nC Cn-1n-1+X+Xn nY Yn nC Cn-1n-1+X+Xn nY Yn nC Cn-1n-1 +X+Xn nY Yn nC Cn-1n-1全加器逻辑图全加器逻辑图Cn FnFAXn Yn Cn-1全加器符号全加器符号2.5. 3 加法器 串行加法器从低位向高位,每一次只完成一位二进制数的加法运算,完成两个n位数相加,需要进行n+1步加法运算。完成串行加法的加法器称为串行加法器。 串行加法器是由一位全加器、一个进位触发器及二个带移位的寄存器构成。 优点是结构简单,缺点是速度太慢。 串行进位的并行加法器并行加法是指全字长的两个相加数同时

22、相加,一步就能完成运算的加法。完成并行加法的加法器称为并行加法器。两个n位数相加,如果考虑符号,并行加法器由n+1个全加器构成。特点是把n+1个全加器的进位输入与进位输出首尾连接起来。缺点是速度受进位的影响,进位数越多,速度越慢。Cn FnFAXn Yn Cn-1Cn FnFAXn Yn Cn-1Cn FnFAXn Yn Cn-1Cn FnFAXn Yn Cn-1F0F1F2F3C-1C0C1C2C3X0X1X2X3Y0Y1Y2Y3串行进位的并行加法器Q3 Q2 Q1 Q0X寄存器Q3 Q2 Q1 Q0Y寄存器4位串行进位的并行加法器的逻辑电路图Adder code/adder.vmodule

23、 adder(cout,sum,a,b,cin); parameter bit_width=4; outputbit_width-1:0 sum; output cout; input cin; input bit_width-1:0 a,b; assign cout,sum=a+b+cin;endmodule /assign语句为总是执行后面语句,与时间无关。/ 把括号内作为一个整体看待。Adder testbench codemodule adder_tb; parameter bit_width=4; wire bit_width-1:0 sum; wire cout; reg cin;

24、 reg bit_width-1:0 a,b; integer i,k; initial begin k=1bit_width;cin=0; for(i=0;i=k*k;i=i+1) begin #100 a=i/k;b=i%k; end end adder m(.cout(cout),.sum(sum),.a(a),.b(b),.cin(cin);endmodule2.5.4 译码器 译码器有n个输入变量,有=2n个输出。当输入为某一组合时,对应的有且仅有一个输出为“1”,其余输出均为“0”。 译码器的用途是把输入代码翻译成相应的控制电位,以实现代码所要求的操作。二输入四输出译码器的逻辑图真

25、值表二输入四输出译码器二输入四输出译码器 译码器中常设置“使能”控制端,当该端为“1”时,译码器功能被禁止,此时所有输出均为“0”。 使能端的主要功能是用来扩充输入变量数(级连)。输入输入输出输出E#ABY0Y1Y2Y300010000010100010001001100011XX0000encoder codemodule encoder(en,in,yout); parameter bit_width=4; input en; output (1bit_width)-1:0 yout; /1-valid 0-invalid inputbit_width-1:0 in; reg (1bit_

26、width)-1:0 yout; initial yout=0; always (en or in) if(en=1) yout=0; else yout=1in; /技巧endmoduleEncoder testbench codetimescale 1ns/1nsmodule encoder_tp; parameter bit_width=4; reg en; wire (1bit_width)-1:0 yout; /1-valid 0-invalid reg bit_width-1:0 in; integer i,k; encoder encode(.en(en),.in(in),.yo

27、ut(yout); initial begin en=1;k=1bit_width; #100 en=0; for(i=0;ik;i=i+1) #100 in=i; #100 en=1; #2000 $stop; end endmodule使能端的应用举例 用1个3位二进制计数器(无使能端)、2个2-4译码器来控制八个发光二极管依次从右到左地连续发光,即一个灯灭,另一个灯才亮。 解: 电路图如下 2-4译码器 /E1 2-4译码器 /E0 Q2 Q1 Q03位二进制计数器清零R时钟CP启动电路与输入输出Q2/E1 /E00101012.5.5 数据(多路)选择器 数据选择器又称多路开关,它能在

28、选择信号的作用下,从多个输入通道中选择某一个通道的数据作为输出。 下图是“双四通道选一”数据选择器的逻辑图和真值表。其中S0,S1是通道选择信号,E是使能端,D0-D3是输入数据。 使能 E# 的作用和译码器中相似,可用它来扩展选择器的通道数。“双四通道选一”数据选择器的逻辑图和功能表真值表输入输入输出输出S1S0D3D2D1D0E#YXXXXXX1000XXXD00D001XXD1X0D110XD2XX0D211D3XXX0D3Data selector code/data_selector.v/data_selector.vmodule data_selector(s,en,data0,d

29、ata1,data2,data3,yout);module data_selector(s,en,data0,data1,data2,data3,yout); parameter bit_width=4; parameter bit_width=4; outputbit_width-1:0 yout; outputbit_width-1:0 yout; inputbit_width-1:0 data0,data1,data2,data3; inputbit_width-1:0 data0,data1,data2,data3; input 1:0 s; input en; input 1:0 s

30、; input en; reg bit_width-1:0 yout; reg bit_width-1:0 yout; always(s or en or data0 or data1 or data2 or data3) always(s or en or data0 or data1 or data2 or data3) begin begin if(en=1) yout=4bz; if(en=1) yout=4bz; else case (s) else case (s) 2b00:yout=data0; 2b00:yout=data0; 2b01:yout=data1; 2b01:yo

31、ut=data1; 2b10:yout=data2; 2b10:yout=data2; 2b11:yout=data3; 2b11:yout=data3; endcase endcase end end endmoduleendmodule高阻态高阻态Data selector testbench codetimescale 1ns/1nstimescale 1ns/1nsmodule data_selector_tb;module data_selector_tb; parameter bit_width=4; parameter bit_width=4; wire bit_width-1:

32、0 yout; wire bit_width-1:0 yout; reg bit_width-1:0 data0,data1,data2,data3; reg bit_width-1:0 data0,data1,data2,data3; reg en; reg 1:0 s; integer i; reg en; reg 1:0 s; integer i;initial begininitial begin en=1;data0=4;data1=5;data2=6;data3=7; en=1;data0=4;data1=5;data2=6;data3=7; #100 en=0; #100 en=

33、0; for(i=0;i=4;i=i+1) begin #100 s=i; end for(i=0;i=4;i=i+1) begin #100 s=i; end end end data_selector data_selector m(.s(s),.en(en),.data0(data0),.data1(data1),.data2(data2),.dm(.s(s),.en(en),.data0(data0),.data1(data1),.data2(data2),.data3(data3),.yout(yout);ata3(data3),.yout(yout);endmodule endmo

34、dule P40 多路选择器代码module mux4x32(data0,data1,data2,data3,s,yout);module mux4x32(data0,data1,data2,data3,s,yout); parameter bit_width=32; parameter bit_width=32; outputbit_width-1:0 yout; outputbit_width-1:0 yout; inputbit_width-1:0 data0,data1,data2,data3; inputbit_width-1:0 data0,data1,data2,data3; i

35、nput 1:0 s; input 1:0 s; reg bit_width-1:0 yout; reg bit_width-1:0 yout; always(s or data0 or data1 or data2 or data3) always(s or data0 or data1 or data2 or data3) begin begin case (s) case (s) 2b00:yout=data0; 2b00:yout=data0; 2b01:yout=data1; 2b01:yout=data1; 2b10:yout=data2; 2b10:yout=data2; 2b1

36、1:yout=data3; 2b11:yout=data3; endcase endcase end endendmoduleendmoduleTest Code include mux4x32.vinclude mux4x32.vmodule mux4x32_tb;module mux4x32_tb; parameter bit_width=32; parameter bit_width=32; reg 1:0 i; reg 1:0 i; reg bit_width-1:0 x,y,m,n; reg bit_width-1:0 x,y,m,n; wire bit_width-1:0 z; w

37、ire bit_width-1:0 z; mux4x32 mux4x32 mux4(.data0(x),.data1(y),.data2(m),.data3(n),.s(i),.yout(z); mux4(.data0(x),.data1(y),.data2(m),.data3(n),.s(i),.yout(z); initial begin initial begin x=32h2345; x=32h2345; y=32h5678; y=32h5678; m=x+1; m=x+1; n=y+32h10; n=y+32h10; for(i=0;i=3;i=i+1) begin #1 ; end

38、 for(i=0;i1; if(direc=0) x=x1; else else x=x1; x=x1; end end out=x; out=x; end endendmoduleendmoduleLogic shift testbech codetimescale 1ns/1nstimescale 1ns/1nsmodule shift_lr_tb;module shift_lr_tb; reg 7:0 in; reg 7:0 in; wire 7:0 out1; wire 7:0 out1; reg direction,clk,en; reg direction,clk,en; init

39、ial begin initial begin en=0; en=0; #1 clk=0;direction=1;in=8b0001_0000; #1 clk=0;direction=1;in=8b0001_0000; #1 en=1; #1 en=1; #19 en=0; #19 en=0; end end always #100 clk=clk; always #100 clk=clk; shift_lr shift_lr m(.in(in),.out(out1),.clk(clk),.en(en),.direction(direction);m(.in(in),.out(out1),.c

40、lk(clk),.en(en),.direction(direction); endmoduleendmoduleP46移位器代码shift.vmodule shift(d,sa,right,arith,sh);module shift(d,sa,right,arith,sh); input 31:0 d; input 31:0 d; input 4:0 sa; input 4:0 sa; input right,arith; input right,arith; output 31:0 sh; output 31:0 sh; reg 31:0 sh; reg 31:0 sh; always

41、always* * begin begin if(!right) begin sh=dsa; end if(!right) begin sh=dsa; / else if(!arith) sh=dsa; /shift right logicshift right logic else else sh=$signed(d) sh=$signed(d)sa;/sa;/shift right arithmeticshift right arithmetic end end endmoduleendmodule2.6.6 计数器 计数器按时钟作用方式,分为同步和异步两大类,其中同步计数器线路略复杂但性

42、能更好,用于脉冲分频和需要计数的场合,例如二进制或十进制计数。以二进制计数器为例说明。 Q3 Q2 Q1 Q0Q3Q2Q1Q000000001000100100010001100110100010001010101011001100111011110001000100110011010101010111011110011001101110111101110111111110000 注意:Q即为输入端D。 四位同步二进制计数器图如下。 根据真值表写出表达式,并化简,得出以下逻辑表达式:Q0=Q0Q1=Q1Q0+Q1Q0Q2= Q2Q1+Q2Q0+Q2Q1Q0Q3= Q3Q1+Q3Q2+Q3Q0+

43、Q3Q2Q1Q0Q/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RCPQ0Q1Q2Q3或门或门或门Counter codemodule counter(clk,rst,c,out); parameter bit_width=4; input rst,clk; output c;/carry outputbit_width-1:0 out; reg c; regbit_width-1:0 out; integer i; initial i=1bit_width;左移运算左移运算 always (posedge clk or negedge rst)always (p

44、osedge clk or negedge rst) begin begin if(!rst) begin outbit_width-1:0=0; if(!rst) begin outbit_width-1:0=0; c=0; endc=0; end else begin else begin if(outbit_width-1:0=i-1) if(outbit_width-1:0=i-1) begin c=1;outbit_width-1:0=0;end begin c=1;outbit_width-1:0=0;end else else begin begin outbit_width-1

45、:0=outbit_width-1:0+1;c=0;outbit_width-1:0=outbit_width-1:0+1;c=0; end end end end end end endmoduleendmoduleCounter testbench codetimescale 1ns/1nstimescale 1ns/1nsmodule counter_tp;module counter_tp; parameter bit_width=4; parameter bit_width=4; reg clk,rst; wire cout; reg clk,rst; wire cout; wire

46、bit_width-1:0 out; wirebit_width-1:0 out; counter cnt16(.clk(clk),.rst(rst),.c(cout),.out(out); counter cnt16(.clk(clk),.rst(rst),.c(cout),.out(out); always #20 clk=clk; always #20 clk=clk; initial initial begin begin clk=0; rst=0; clk=0; rst=0; #10 rst=1; #10 rst=1; #30 rst=0; #30 rst=0; #40 rst=1;

47、 #40 rst=1; #2000 $stop; #2000 $stop; end endendmoduleendmodule2.6.7 状态图及时序电路设计 下面设计一个平常的钟。需求分析需求分析 为了说明其设计原理,在此做一些简化。秒钟只有6个状态,即计到6向分针进位,同时置为0。分针只有6个状态,即计到6向时针进位,同时置为0。时针只有12个状态,即计到12时时针置0。能够清零。带使能端。能够显示时、分、秒,且动态的变化。 下面画出基本原理图如下。Q2 Q1 Q0六进制计数器0carry clkenable /rstQ2 Q1 Q0六进制计数器1carry clkenable /rstQ

48、2 Q1 Q0六进制计数器2carry clkenable /rstQ2 Q1 Q0六进制计数器3carry clkenable /rst显示部分及电路显示部分及电路显示部分及电路12时钟清零使能2个3位二进制转换成2个4位二进制电路00显示部分及电路时针显示分针显示秒针显示 从图中可以看出,需要设计:六进制计数器三输入的显示部分及其电路四输入的显示部分及其电路,并判断是否等于12 下面先设计六进制计数器。 这里采用状态转移图方法设计六进制计数器。 首先给每个状态起一个名字,分别用S0S5表示计数器的值05。则状态转移图如下。 其中 u 为输入。当u= 时,状态发生变化。书上是当u=1/0时,

49、状态变化。S0S1S2S5S4S3u=u= u= u= u= u= carry 如果将u换成脉冲clk,且根据原理图和状态转移图,可以编写六进制计数器的代码如下:module counter6(enable,clk,q,rst,carry);input enable,clk,rst;output 2:0 q;output carry;reg 2:0 q;reg carry;always (posedge clk or negedge rst) begin if(!rst) begin q=3b000;carry=0; end else if (enable) begin if(q=5) begin carry=!carry;q=3b000;end else begin q=q+3b001;end endendendmodule 显示部分采用七段数码管,它的显示构成如下图所示。agdbcfe 设数码管输入为低电平时亮,为高电平时不亮,则显示数字09的gfedcba编码如表所示。输出输入显示数字gfe dcba0100 00001111 10012010 01003011 000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论