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

下载本文档

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

文档简介

第2章逻辑电路及verilogHDL简介主要内容基本逻辑门和常用逻辑门用VerilogHDL实现基本的逻辑操作4种风格的VerilogHDL描述逻辑门级的VerilogHDL数据流风格的VerilogHDL功能描述风格的VerilogHDL常用的组合逻辑电路及其设计多路选择器设计译码器设计32位移位器设计时序电路的设计方法D锁存器D触发器状态转移图及时序电路设计2.1基本逻辑门和常用逻辑门数字逻辑电路是实现数字计算机的物质基础。若将其做在一块集成电路上(被完整封装,看不到内部结构),称为数字集成电路,它是现代计算机的基本元件。数字集成电路的基本元件是逻辑门,逻辑门由晶体管组成。这里只简介MOS晶体管(金属-氧化物-半导体场效应管)组成的逻辑门。MOS晶体管按物质是否导电,可以分为:导体(双向导电)绝缘体(不导电)半导体同时具备导体和绝缘体两种特性,其特性取决于在物体两端所施加电压的方向,当在一个方向上有正的电压存在时,可以允许电流流过(导体特性);而在相反的方向上施加一定大小的电压时,该物体中不会产生电流(绝缘体特性),即该物体只能在单个方向上导电。半导体分为二极管MOS晶体管(三极管中的一种)N沟道MOS晶体管P沟道MOS晶体管N--MOS晶体管的符号如下源极S漏极D栅极G源极S(VS)漏极D(VD)栅极G(VG)

在数字电路中,MOS管工作于开关状态,相当于一个可控开关。MOS管状态开关状态数字电路状态导通达到饱和接通0(L—低电平)截止断开1(H—高电平)稳定状态下不允许工作于导通而又不饱和的状态(电压不允许处在不高、不低的模糊状态)。高电平或低电平的具体数值与电路结构、材料等有关,下表为MOS数字电路的高低电平的典型值。在数字电路中,MOS管相当于一个开关,可控信号是VG。如NMOS管,当VGS>VH时NMOS管导通。电源电压(V)高电平(H)低电平(L)典型值范围典型值范围VD=55>=3≈0<=2VD=3.33.3>=2≈0<=1.3S(VS)DG(VG)NMOS管S(D)VDD=5VG(VG)PMOS管基本逻辑门

C语言中,最基本的逻辑运算有:与运算,或运算,非运算。与之对应的是最基本的逻辑电路:与门,或门,非门。用它们可以组合出实现任何复杂的逻辑运算功能的电路。逻辑关系是可以采用数学公式来表示和运算的,此数学工具就是布尔代数,又称逻辑代数。

例如,A=B*C+E*F;

A为输出(运算结果)。

B、C、E、F为输入,*、+、~分别代表与、或、非运算符。运算符的优先级(从高到低):非->与->或。非门(NOT)非门的主要功能是对输入信号求反。其布尔表达式为

f=aVDDRafNMOS非门VDDafCMOS非门R¤KU输入a输出f

断(0)亮(1)合(1)灭(0)非门真值表xf非门符号目前的集成电路以CMOS电路为主。CMOS的优点功耗小从输入信号发生变化到输出信号变化的延迟时间小,因而速度快。非门的波形图如下。fa不考虑延迟fa实际电路延迟时间td二输入与门与或门与门与或门真值表R¤K1UK2R¤K1UK2输入输出K1K2灯断(0)断(0)灭(0)断(0)合(1)灭(0)合(1)断(0)灭(0)合(1)合(1)亮(1)与门:灯亮=K1·K2输入输出K1K2灯断(0)断(0)灭(0)断(0)合(1)亮(1)合(1)断(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)R¤K1UK2R¤K1UK2或非门:灯亮=K1+K2与非门:灯亮=K1·K2二输入与非门电路图VDDRbNMOS与非门affVDDbCMOS与非门aCMOS或非门fVDDba逻辑功能的表示和等效电路逻辑功能表示:

布尔代数式、卡诺图、真值表、线路逻辑图下图是非门、二输入与门、二输入或门等的图形符号。

非门与门与非门

或门或非门AYBABY000010100111ABY001011101110Y=A•B

Y=A•B

Y=A+B

Y=A+B

真值表YYYAAABBBAY真值表和逻辑表达式的对应关系与门与非门ABABY000010100111ABY001011101110Y=A•B

Y=A•B

ABY用与逻辑写出真值表中每一横行中输出为1的逻辑表达式;用或逻辑汇总真值表中全部输出为1的逻辑。不必理睬那些输出为0的各行的内容,它们已经隐含在通过1、2两步写出的表达式中。Y=A*B+A*B+A*BY真值表二输入异或门和同或门二输入异或门是指输入的二个变量相异时输出为1,否则输出为0。二输入同或门是指输入的二个变量相同时输出为1,否则输出为0。可以看出两者的关系为非的关系。真值表如下:ABY000011101110ABY001010100111异或门真值表同或门真值表异或门表达式Y=AB+AB=A⊕B同或门表达式Y=AB+AB=A⊙B缓冲器缓冲器只能简单地把输入信号传送到输出器。主要用于当某个信号所驱动的负载特别大时能给出较大的电流,或为了避免延迟时间过长。三态门电路三态门电路图和真值表如下:f电路图SaSMOS管af备注1导通00f=a1110截止X(任意)zf=z(高阻态)

三态门电路是一种构建计算机总线接口的理想电路,具有信号驱动能力强、传输速度快的特性,又有集电极开路电路的输出可以“线与”的优点。用于实现从多个数据输入中选择其一的场合。ABC/G1/G2/G3总线例如,当控制信号/G1为低电平,/G2和/G3为高电平时,三态门的输入A被送到总线上,另外两个三态门的输出处于高阻态。

2.2tVerilogHDL实现基本的逻辑下面先用C语言程序举例说明二个逻辑变量进行逻辑与操作,并将它们的真值表打印出来,要求使用函数来完成。ABZ=and(a,b)000010100111逻辑与真值表UsingCfunctioncode//logicandfunctionbooland1(boola,boolb){returna&&b;}//testfileinclude<stdio.h>intmain(){inti,x,y;for(i=0;i<4;i++){x=i%2;y=i/2;printf(“%d&&%d=%d\n”,x,y,and1(x,y));}return0;}VerilogHDLcode//sourcecodemoduleand1(x,y,z);inputx,y;outputz;assignz=x&&y;endmodule注释模块名模块端口定义分号结束端口功能描述功能定义

其他的逻辑运算类推模块代码写好后,首先看看它是否符合VerilogHDL的语法规则--编译。为了确认代码是否能完成所期望的任务,还要对它进行检查。检查的方法是给输入信号指定所有可能的输入组合,让模块的主体“计算”出相应的输出。然后抒计算出的输出与所期待的输出进行比较,检查它们是否正确。计算代码输出的任务由VerilogHDL“仿真器”完成。为此需要编写测试模块,测试模块大致由三部分组成。调用被测试的模块用各种输入组合来测试结果指定输出文件名(QuartusII不需要)Testbenchcode//testbenchcodemoduleand1_tb;reg[1:0]i;regx,y;wirez;initialfor(i=0;i<=3;i=i+1)begin#10x=i%2;y=i/2;endand1m(.x(x),.y(y),.z(z));endmodule无输入输出数据位数2位寄存器类型初始化变量线网类型10延时单位后输出生成实例并代入参数运行{}运行2.3逻辑门的CMOS晶体管实现以及晶体管的VerilogHDL略2.4四种风格的VerilogHDL描述2.4.1晶体管开关级的VerilogHDL下面以CMOS反向器(非门)的VerilogHDL代码为例进行说明。modulecmosnot(f,a);inputa;outputf;supply1vdd;supply0gnd;pmosp1(f,vdd,a);nmosn1(f,gnd,a);endmodule测试代码`include"cmosnot.v"modulecmosnot_tb;rega,b;wiref;cmosnotnot_1(f,a);initialbegina=1;#1a=0;#1a=1;#1$finish;endinitialbegin$dumpfile("test.vcd");$dumpvars;$monitor("%g\ta=%b;f=%b",$time,a,f);//displyendendmodule2.4.2逻辑门级的VerilogHDL下面给出两种逻辑门级的二选一多路器电路。使用三态门使用普通的与非门bufif0bufif1a0a1sya0a1ssna0_sna1_sy多路选择器(三态门)电路多路选择器(与或非门)电路模块代码//三态门实现modulemux2X1_3s(a0,a1,s,y)inputs,a0,a1;outputy;bufif0b0(y7,a0,s);bufif1b0(y7,a1,s);endmodule//与或非门实现modulemux2x1_gate(a0,a1,s,y)inputs,a0,a1;outputy;noti0(sn,s);andi1(a0_sn,a0,s);andi2(a1_s,a1,s);andi3(y,a0_sn,a1_s);endmodule

2.4.3数据流风格的VerilogHDL数据流风格的VerilogHDL不指定任何特定的器件。主要特征是使用assign语句对变量赋值。赋值语句的特点是等式右边的输入变量一旦发生变化,立即反映到等式左边的输出变量。使用assign赋值时,对一个变量只能赋值一次。模块代码//逻辑表达式风格modulemux2X1_dataflow(a0,a1,s,y);inputs,a0,a1;outputy;assigny=~s&a0|s&a1;endmodule//三目运算符?:形式modulemux2x1_gate(a0,a1,s,y);inputs,a0,a1;outputy;assigny=s?a0:a1;endmodule运行2.4.4功能描述风格的VerilogHDL功能描述是VerilogHDL中层次最高的描述方法。特点:靠“算法”设计电路的操作。下面给出二选一多路器的部分版本。Always_if_elsemodulemux2x1_if_else(a0,a1,s,y)inputs,a0,a1;outputy;regy;//’y’cannotbeanetalways@(sora0ora1)beginif(s)beginy=a1;endelsebeginy=a0;endendendmoduleAlways_casemodulemux2x1_case(a0,a1,s,y)inputs,a0,a1;outputy;regy;//’y’cannotbeanetalways@(sora0ora1)begincase(s)1’b0:y=a0;1’b1:y=a1;endcaseendendmodulefunctionmodulemux2x1_function(a0,a1,s,y)inputs,a0,a1;outputy;assigny=sel(a0,a1,s);functionsel;inputa,b,c;//notetheordercase(c)1’b0:sel=a;1’b1:sel=b;endcaseendfunctionendmoduleif(c)sel=b;elsesel=a;逻辑电路的分类按是否有时序,分为:组合逻辑电路的输出状态只取决于当前输入信号的状态,与过去的输入信号的状态无关。例如与门、加法器,译码器,编码器,数据选择器等电路。时序逻辑电路的输出状态不仅和当前的输入信号的状态有关,还与以前的输入信号的状态有关,即时序逻辑电路有记忆功能。最基本的记忆电路是触发器,包括电平触发器和边沿触发器,由基本触发器可以构成寄存器,计数器等部件。从器件的集成度和功能区分:低集成度的、只提供专用功能的器件。加法器和算术逻辑单元译码器和编码器数据选择器触发器和寄存器、计数器高集成度的、现场可编程的通用功能电路(阵列逻辑电路)存储器芯片RAM和ROM通用阵列逻辑GAL复杂的可编程逻辑器件CPLD:MACH器件现场可编程门阵列FPGA器件2.5常用的组合电路及其设计常见的组合逻辑电路有加法器、译码器、数据选择器等。2.5.1半加器不考虑进位输入时,两数码Xn,Yn相加称为半加。功能表如下。XnYnHn000011101110半加和Hn的表达式如下:Hn=Xn·Yn+Xn·Yn=Xn⊕Yn 半加器可用反相门及与或非门来实现,也可用异或门来实现。用与、或、非门构成的半加器用异或门构成的半加器2.5.2全加器由Xn,Yn及低位来的进位输入Cn-1相加的器件称为全加器,下表是其真值表。由表可得全加和Fn和进位输出Cn的表达式:Fn=XnYnCn-1+XnYnCn-1+XnYnCn-1

+XnYnCn-1

Cn=XnYnCn-1+XnYnCn-1+XnYnCn-1

+XnYnCn-1

全加器逻辑图CnFnFAXnYnCn-1全加器符号2.5.3加法器串行加法器从低位向高位,每一次只完成一位二进制数的加法运算,完成两个n位数相加,需要进行n+1步加法运算。完成串行加法的加法器称为串行加法器。串行加法器是由一位全加器、一个进位触发器及二个带移位的寄存器构成。优点是结构简单,缺点是速度太慢。串行进位的并行加法器并行加法是指全字长的两个相加数同时相加,一步就能完成运算的加法。完成并行加法的加法器称为并行加法器。两个n位数相加,如果考虑符号,并行加法器由n+1个全加器构成。特点是把n+1个全加器的进位输入与进位输出首尾连接起来。缺点是速度受进位的影响,进位数越多,速度越慢。CnFnFAXnYnCn-1CnFnFAXnYnCn-1CnFnFAXnYnCn-1CnFnFAXnYnCn-1F0F1F2F3C-1C0C1C2C3X0X1X2X3Y0Y1Y2Y3串行进位的并行加法器Q3Q2Q1Q0X寄存器Q3Q2Q1Q0Y寄存器4位串行进位的并行加法器的逻辑电路图Addercode//adder.vmoduleadder(cout,sum,a,b,cin);parameterbit_width=4;output[bit_width-1:0]sum;outputcout;inputcin;input[bit_width-1:0]a,b;assign{cout,sum}=a+b+cin;endmodule//assign语句为总是执行后面语句,与时间无关。//{}把括号内作为一个整体看待。Addertestbenchcodemoduleadder_tb;parameterbit_width=4;wire[bit_width-1:0]sum;wirecout;regcin;reg[bit_width-1:0]a,b;integeri,k;initialbegink=1<<bit_width;cin=0;for(i=0;i<=k*k;i=i+1)begin#100a=i/k;b=i%k;endendadderm(.cout(cout),.sum(sum),.a(a),.b(b),.cin(cin));endmodule2.5.4译码器译码器有n个输入变量,有<=2n个输出。当输入为某一组合时,对应的有且仅有一个输出为“1”,其余输出均为“0”。译码器的用途是把输入代码翻译成相应的控制电位,以实现代码所要求的操作。二输入四输出译码器的逻辑图真值表二输入四输出译码器译码器中常设置“使能”控制端,当该端为“1”时,译码器功能被禁止,此时所有输出均为“0”。使能端的主要功能是用来扩充输入变量数(级连)。输入输出E#ABY0Y1Y2Y300010000010100010001001100011XX0000encodercodemoduleencoder(en,in,yout);parameterbit_width=4;inputen;output[(1<<bit_width)-1:0]yout;//1--valid0--invalidinput[bit_width-1:0]in;reg[(1<<bit_width)-1:0]yout;initialyout=0;always@(enorin)if(en==1)yout=0;elseyout=1<<in;//技巧endmoduleEncodertestbenchcode`timescale1ns/1nsmoduleencoder_tp;parameterbit_width=4;regen;wire[(1<<bit_width)-1:0]yout;//1--valid0--invalidreg[bit_width-1:0]in;integeri,k;encoderencode(.en(en),.in(in),.yout(yout));initialbeginen=1;k=1<<bit_width;#100en=0;for(i=0;i<k;i=i+1)#100in=i;#100en=1;#2000$stop;endendmodule使能端的应用举例用1个3位二进制计数器(无使能端)、2个2-4译码器来控制八个发光二极管依次从右到左地连续发光,即一个灯灭,另一个灯才亮。解:电路图如下¤¤¤¤2-4译码器

/E12-4译码器

/E0Q2Q1Q03位二进制计数器清零R时钟CP启动电路与¤¤¤¤输入输出Q2/E1/E00101012.5.5数据(多路)选择器数据选择器又称多路开关,它能在选择信号的作用下,从多个输入通道中选择某一个通道的数据作为输出。下图是“双四通道选一”数据选择器的逻辑图和真值表。其中S0,S1是通道选择信号,E是使能端,D0--D3是输入数据。使能E#的作用和译码器中相似,可用它来扩展选择器的通道数。“双四通道选一”数据选择器

的逻辑图和功能表真值表输入输出S1S0D3D2D1D0E#YXXXXXX1000XXXD00D001XXD1X0D110XD2XX0D211D3XXX0D3Dataselectorcode//data_selector.vmoduledata_selector(s,en,data0,data1,data2,data3,yout);parameterbit_width=4;output[bit_width-1:0]yout;input[bit_width-1:0]data0,data1,data2,data3;input[1:0]s;inputen;reg[bit_width-1:0]yout;always@(sorenordata0ordata1ordata2ordata3)beginif(en==1)yout=4'bz;elsecase(s)2'b00:yout=data0;2'b01:yout=data1;2'b10:yout=data2;2'b11:yout=data3;endcaseendendmodule高阻态Dataselectortestbenchcode`timescale1ns/1nsmoduledata_selector_tb;parameterbit_width=4;wire[bit_width-1:0]yout;reg[bit_width-1:0]data0,data1,data2,data3;regen;reg[1:0]s;integeri;initialbeginen=1;data0=4;data1=5;data2=6;data3=7;#100en=0;for(i=0;i<=4;i=i+1)begin#100s=i;endenddata_selectorm(.s(s),.en(en),.data0(data0),.data1(data1),.data2(data2),.data3(data3),.yout(yout));endmoduleP40多路选择器代码modulemux4x32(data0,data1,data2,data3,s,yout);parameterbit_width=32;output[bit_width-1:0]yout;input[bit_width-1:0]data0,data1,data2,data3;input[1:0]s;reg[bit_width-1:0]yout;always@(sordata0ordata1ordata2ordata3)begincase(s)2'b00:yout=data0;2'b01:yout=data1;2'b10:yout=data2;2'b11:yout=data3;endcaseendendmoduleTestCode`include"mux4x32.v"modulemux4x32_tb;parameterbit_width=32;reg[1:0]i;reg[bit_width-1:0]x,y,m,n;wire[bit_width-1:0]z;

mux4x32mux4(.data0(x),.data1(y),.data2(m),.data3(n),.s(i),.yout(z));initialbeginx=32'h2345;y=32'h5678;m=x+1;n=y+32'h10;for(i=0;i<=3;i=i+1)begin#1;endendendmodule2.6时序电路

触发器是典型的时序逻辑电路,有记忆功能,最简单的可以由两个交叉耦合的“与非”门组成的R-S触发器,2个输出分别为Q和/Q,两路输入分别为R和S。现态次态说明SRQnQn+1000禁止禁止001禁止禁止0100置001101001置110111100Qn1111Q/QSR2.6.1R-S触发器当把两个输入s和r变为一个d的互补输入后,可以通过控制信号c完成该触发器的写入操作,在c=1时,Q将随D而变化。现态次态说明cdQnQn+1000禁止禁止001禁止禁止010禁止禁止011禁止禁止1000置010101101置11111Q/Qdc2.6.2D锁存器下图就不会出现上面的情况。其真值表如下:现态次态说明cdQnQn+10XXQn1000置010101101置11111Q/QdcsrD锁存器代码moduled_latch(e,d,q,qn); inpute,d; outputq,qn; wirer,s; nandnand1(s,d,e); nandnand2(r,~d,e); rs_latchrslatch(s,r,q,qn);endmodulemodulers_latch(s,r,q,qn); inputs,r; outputq,qn; nandnand1(q,s,qn); nandnand2(qn,r,q);endmodule2.6.3D

型触发器

前面刚介绍的锁存器属于电平触发方式,输入R和S不能同时为低电平,而且R、S和D在触发器写入期间应保持不变,否则产生操作错误。

D型触发器是由3个基本触发器构成的,它属于边沿触发方式。输入信号D在触发脉冲Clock(时钟clk)的上升沿触发被写入触发器,其它时间D的变化不会影响触发器的状态。

D型触发器又被称为延时触发器,常用于构建寄存器,移位寄存器,计数器等部件。输入信号/S和/R用于触发器的清0和置1操作。与非1与非2与非4与非6与非3与非5/R/SQCLK/QDQ/Q/SCLKD/RDTriggerTruthTable现态次态说明/R/SCLKDQnQn+1110XXQn保持111XXQn11↑1X1D11↑0X001XXX0置010XXX1置1边沿触发的D触发器数据在计算机存放在下列地方:运算器中的寄存器主存储器(内存)外部存储器(外存)这里介绍用VerilogHDL语言描述边沿触发的D触发器如下图。D触发器的敏感信号清零信号reset时钟信号clockQQbclockDreset当reset=1且Clock发生正跳变时,触发器将输入信号D的值保存下来并送到输出端Q。触发器保持这个状态不变化,直到下一次reset和clock发生变化。根据reset和clock信号的关系,D触发器分为:带同步清零的边沿触发D触发器----在时钟上升沿处检查清零信号是否有效。带异步清零的边沿触发D触发器----清零端与时钟无关,只要有效就清零。DTriggerTruthTable输入输出Q清除时钟DLXXLH↑HHH↑LLHLXQHHXQ输入输出Q清除时钟DL↑XLH↑HHH↑LLHLXQHHXQ带异步清零端的D触发器带同步清零端的D触发器下面以带异步清零的D触发器为例,编写其VerilogHDL代码。异步清零D_triggercode//d_trigger.vmoduled_trigger(rst,clk,d,q,qb);outputq,qb;//qb=~q;inputrst,clk,d;regq,qb;initialbeginqb=~q;endalways@(negedgerstorposedgeclk)beginif(rst==0)q=0; elseq=d; qb=~q; end endmoduleD_triggertestbenchcode`timescale1ns/1ns`include"d_trigger.v"moduled_trigger_tb;regd;wireq,qb;regclk,rst;initialbeginclk=0;d=0;#1rst=0;#1rst=1;#100rst=0;endalways#1clk=~clk;always#2d=!d;d_triggerm(.rst(rst),.clk(clk),.d(d),.q(q),.qb(qb));endmodule由于clock是周期性信号,如果希望在某个时钟来到时寄存器不接受数据,就需要再加一层控制即使能控制。使用带使能控制和异步清零的D触发器构成的16位寄存器,如下图。QQbENclkD/RQQbENclkD/RQQbENclkD/RresetclockenableD0D1D15Q0Q1Q15数据总线…………使能信号enable控制寄存器是否接受数据。enable=0,寄存器不接受数据。enable=1,寄存器在clock正跳变且reset=1时接受数据。带使能控制和异步清零的16位寄存器的代码如下。Registercodemoduleregister(rst,en,clk,data,q,qb);parameterbit_width=16;input[bit_width-1:0]data;output[bit_width-1:0]q,qb;inputen;reg[bit_width-1:0]q,qb;inputrst,clk;initialbeginqb=~q;endalways@(posedgeclkornegedgerst)begin if(rst==0)q=0; elseif(en==1)q=data; qb=~q; endendmodule定义符号常量Registertestbenchcode`timescale1ns/1nsmoduleregister_tb;parameterbit_width=16;reg[bit_width-1:0]data;wire[bit_width-1:0]q,qb;regclk,rst,en;initialbeginrst=0;data=8'b0011_1000;clk=0;#100rst=1;en=0;#100en=1;#2000rst=0;endalways#100clk=~clk;registerm(.rst(rst),.en(en),.clk(clk),.data(data),.q(q),.qb(qb));endmodule2.6.4寄存器寄存器是用于暂存指令和数据等,通常选用多个并行操作的D触发器或锁存器组成。寄存器的位数是指一个寄存器所使用的触发器的数目。如4位、8位等等。从使用的角度,可以通过几个控制信号,控制寄存器是否可以接受输入,输出的是正常逻辑电平还是高阻态,是否具有清0寄存器内容的功能。以4位寄存器为例,来说明与总线的连接。Q/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RRCLKSD0D1D2D3Q0Q1Q2Q3数据总线74LS273寄存器74LS374锁存器常用的8位寄存器74LS374,74LS273,74LS373(注意时钟的区别)。输入输出Q清除时钟DLXXLH↑HHH↑LLHLXQ输出控制GD输出QLHHHLHLLLLXQHXXZ由D型触发器改良后构成的寄存器Register373codemoduleregister373(rst,clk,data,out,swicth);parameterbit_width=8;input[bit_width-1:0]data;output[bit_width-1:0]out;reg[bit_width-1:0]x,out;regflag;//onlyusingswicthinputrst,clk,swicth;//0--notswicth,1--swicthhighhalfpartwithlowerhalfpart,用于验证。

initialbeginx=0;flag=0;endalways@(posedgeclk)begin if(rst==0)beginx=0;flag=0;end elseif(flag==0)beginx=data;flag=1;end

if(swicth==1)x={x[bit_width/2-1:0],x[bit_width-1:bit_width/2]}; out=x;endendmoduleRegsiter373testbench`timescale1ns/1nsmoduleregister373_tb;parameterbit_width=8;reg[bit_width-1:0]data;wire[bit_width-1:0]out1;regswicth,clk,rst;initialbeginrst=0;swicth=1;clk=0;data=8'b0011_0000;#100rst=1;#2000rst=0;endalways#100clk=~clk;

register373m(.rst(rst),.clk(clk),.data(data),.out(out1),.swicth(swicth));

endmodule2.6.5移位器

移位寄存器有左/右移位、循环移位操作(用D触发器构成)。Q/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RCPDoutDinQ0Q1Q2Q3Q/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RCPDoutDinQ0Q1Q2Q3逻辑左移逻辑右移Logicshiftcode//不考虑复位和置位moduleshift_lr(in,out,clk,en,direction);input[7:0]in;output[7:0]out;reg[7:0]x,out;inputdirection,clk,en;//0--shift_r,1--shift_lregdirec;always@(posedgeclk)beginif(en==0)beginx=in;direc=direction;end elsebeginif(direc==0)x=x>>1;else x=x<<1;endout=x;endendmoduleLogicshifttestbechcode`timescale1ns/1nsmoduleshift_lr_tb;reg[7:0]in;wire[7:0]out1;regdirection,clk,en;initialbeginen=0;#1clk=0;direction=1;in=8'b0001_0000;#1en=1;#19en=0;endalways#100clk=~clk;shift_lrm(.in(in),.out(out1),.clk(clk),.en(en),.direction(direction));

endmoduleP46移位器代码shift.vmoduleshift(d,sa,right,arith,sh);input[31:0]d;input[4:0]sa;inputright,arith;output[31:0]sh;reg[31:0]sh;always@*beginif(!right)beginsh=d<<sa;end //shiftleftelseif(!arith)sh=d>>sa;//shiftrightlogicelse sh=$signed(d)>>>sa;//shiftrightarithmeticendendmodule2.6.6计数器

计数器按时钟作用方式,分为同步和异步两大类,其中同步计数器线路略复杂但性能更好,用于脉冲分频和需要计数的场合,例如二进制或十进制计数。以二进制计数器为例说明。

Q3Q2Q1Q0Q3’Q2’Q1’Q0’00000001000100100010001100110100010001010101011001100111011110001000100110011010101010111011110011001101110111101110111111110000注意:Q’即为输入端D。四位同步二进制计数器图如下。根据真值表写出表达式,并化简,得出以下逻辑表达式:Q0’=Q0Q1’=Q1Q0+Q1Q0Q2’=Q2Q1+Q2Q0+Q2Q1Q0Q3’=Q3Q1+Q3Q2+Q3Q0+Q3Q2Q1Q0Q/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RQ/Q/SCPD/RCPQ0Q1Q2Q3或门或门或门Countercodemodulecounter(clk,rst,c,out);parameterbit_width=4;inputrst,clk;outputc;//carryoutput[bit_width-1:0]out;regc;reg[bit_width-1:0]out;integeri;initiali=1<<bit_width;左移运算

always@(posedgeclkornegedgerst)beginif(!rst)beginout[bit_width-1:0]<=0;c<=0;endelsebeginif(out[bit_width-1:0]==i-1)beginc<=1;out[bit_width-1:0]<=0;endelsebeginout[bit_width-1:0]<=out[bit_width-1:0]+1;c<=0;endendendendmoduleCountertestbenchcode`timescale1ns/1nsmodulecounter_tp;parameterbit_width=4;regclk,rst;wirecout;wire[bit_width-1:0]out;countercnt16(.clk(clk),.rst(rst),.c(cout),.out(out));always#20clk=~clk;initialbeginclk<=0;rst<=0;#10rst<=1;#30rst<=0;#40rst<=1;#2000$stop;endendmodule2.6.7状态图及时序电路设计下面设计一个平常的钟。需求分析为了说明其设计原理,在此做一些简化。秒钟只有6个状态,即计到6向分针进位,同时置为0。分针只有6个状态,即计到6向时针进位,同时置为0。时针只有12个状态,即计到12时时针置0。能够清零。带使能端。能够显示时、分、秒,且动态的变化。下面画出基本原理图如下。Q2Q1Q0六进制计数器0carryclkenable/rstQ2Q1Q0六进制计数器1carryclkenable/rstQ2Q1Q0六进制计数器2carryclkenable/rstQ2Q1Q0六进制计数器3carryclkenable/rst显示部分及电路显示部分及电路显示部分及电路=12时钟清零使能2个3位二进制转换成2个4位二进制电路00显示部分及

温馨提示

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

评论

0/150

提交评论