您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 用VHDL语言设计基本逻辑电路
•在前面的学习中,我们对VHDL语言的语句、语法及利用VHDL语言设计逻辑电路的基本方法作了详细介绍。•为了深入理解使用VHDL语言设计逻辑电路的具体步骤和方法,本章以常用的基本逻辑电路设计为例,再次对其进行系统和详细的介绍,以使大家初步掌握用VHDL语言描述基本逻辑电路的方法。3.1SummaryofbasicstatementsinVHDLcodes1、SequentialAssignmentStatements1)IF、CASE、LOOP、NULLstatementsonlyusinginprocess,procedureandfunction.2)IF、CASE用于条件选择;LOOP用于循环控制偏重计算;NULL是一条空语句,一般用于CASE语句中。2、ConcurrentAssignmentStatements1)PROCESS语句注意敏感信号表,一般将进程中的输入信号或变量都写入敏感信号表中,如无敏感信号,则使用WAIT语句。2)BLOCK语句改善并行语句及其结构的可读性。3)并行信号赋值语句:(1)简单信号赋值语句(2)WHEN……ELSE语句(ELSE后面无符号)(3)选择信号赋值语句的用法ARCHITECTUREar_7OFfzh_2ISBEGINWITHqSELECTy=aWHEN″00″,--选择值用“,”结束bWHEN″01″,cWHEN″10″,dWHENOTHERS;ENDar_7;4)元件例化语句:主要用于在VHDL中的层次设计。5)生成语句:作用就是复制FOR循环变量IN取值范围GENERATE3.SubprogramVHDL中的子程序包括函数(FUNCTION)和过程(PROCEDURE)等两类。函数的作用就是输入若干个参数,通过函数运算求值,最后直接返回一个值。过程的调用是一条语句,调用时通过其接口返回0个或多个值。4.LibraryandPackage3.2VHDLforCombinationalCircuits•Havinglearnedanumberofusefulcircuitsthatcanbeusedasbuildingblocksinlargercircuitsinbeforecourses,suchaslogicgates,multiplexers,decodersandencoders,wewillnowconsiderhowsuchcircuitscanbedescribedinVHDL.3.2.1LogicGates简单门电路包括2输入“与非”门、集电极开路的2输入“与非”门、2输入“或非”门、反相器、集电极开路的反相器、3输入“与非”门、2输入“或”门和2输入“异或”门等,它们是构成所有逻辑电路的基本电路。Two-inputXORGatef.e.3.2.2Encoder,DecoderandMultiplexer编、译码器和选择器是组合电路中较简单的3种通用电路。它们可以由简单的门电路组合连接而成,但采用这种方式,只给出电路,让读者来判断该电路的功能,那么要读通该电路需要花较多的时间。如果采用VHDL语言,从行为、功能来描述,不仅逻辑设计变得非常容易,而且阅读也会很方便。例1:一位共阴七段数码管译码器LIBRARYieee;USEieee.std_logic_1164.ALL;entitybcd7ISPORT(d3,d2,d1,d0:INstd_logic;a,b,c,d,e,f,g:OUTstd_logic);END;ARCHITECTUREarc_bcd7OFbcd7ISSIGNALdin:std_logic_vector(3DOWNTO0);SIGNALdout:std_logic_vector(6DOWNTO0);BEGINdin=d3&d2&d1&d0;--&为并置运算符PROCESS(din)BEGINCASEdinIS--abcdefg,输出的7段码WHEN“0000”=dout=“1111110”;--显示0WHEN0001=dout=0110000;--显示1WHEN0010=dout=1101101;--显示2WHEN0011=dout=1111001;--显示3WHEN0100=dout=0110011;--显示4WHEN0101=dout=1011011;--显示5WHEN0110=dout=1011111;--显示6WHEN1000=dout=1111111;--显示8WHEN1001=dout=1111011;--显示9WHEN0111=dout=1110000;--显示7...ENDCASE;ENDPROCESS;a=dout(6);b=dout(5);c=dout(4);d=dout(3);e=dout(2);f=dout(1);g=dout(0);ENDarc_bcd7;2.PriorityEncoderf.e.23.2.3ComplementCircuits二进制运算经常要用到求补的操作。这里用八位二进制求补电路为例。我们当然可以采用结构描述方式来描述构造体,但是这样对每个门进行描述和连接太繁琐。这里采用RTL描述就显得更加简洁、清楚。1.二进制求补电路2.MultiplicationCircuitLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmulISPORT(A,B:INSTD_LOGIC_VECTOR(2DOWNTO0);M:OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDmul;ARCHITECTUREbehaOFmulISSIGNALtmp0:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALtmp1:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALtmp2:STD_LOGIC_VECTOR(4DOWNTO0);BEGINPROCESS(A,B)BEGINIFB(0)='1'THENtmp0=A;ELSEtmp0=000;ENDIF;IFB(1)='1'THENtmp1=A&'0';ELSEtmp1=0000;ENDIF;IFB(2)='1'THENtmp2=A&00;ELSEtmp2=00000;ENDIF;M=tmp0+tmp1+('0'&tmp2);ENDPROCESS;ENDbeha;Ex3:设计一个四位加减法器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadd_subISPORT(sub:INSTD_LOGIC;a,b:INSTD_LOGIC_VECTOR(3DOWNTO0);y:OUTSTD_LOGIC_VECTOR(3DOWNTO0);co:OUTSTD_LOGIC);ENDadd_sub;ARCHITECTURErtlOFadd_subISSIGNALtmp:STD_LOGIC_VECTOR(4DOWNTO0);BEGINPROCESS(sub,a,b)BEGINIFsub='0'THENtmp=‘0’&a+b;ELSEtmp=‘0’&a-b;ENDIF;ENDPROCESS;y=tmp(3DOWNTO0);co=tmp(4);ENDrtl;3.2.4Tristate-gateandBusBuffer三态门和双向缓冲器是接口电路和总线驱动电路经常用到的器件。它们虽然不属于组合电路,但我们也在这里进行介绍。f.e.1f.e.2f.e.3这里对一个实体采用了三种构造体进行描述,若要把上述三个例题写在一起,可以用配置来实现:…ENTITYtri_gateIS…ENDtri_gate;ARCHITECTUREzasIS…ENDzas;ARCHITECTUREblkIS…ENDblk;ARCHITECTUREnasIS…ENDnas;CONFIGURATIONtriifOFtri_gateISFORzasENDFOR;ENDtriif;CONFIGURATIONtriblkOFtri_gateISFORblkENDFOR;ENDtriblk;CONFIGURATIONtricaseOFtri_gateISFORnasENDFOR;ENDtricase;2、UnidirectionalBusBuffer在微机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。f.e.1f.e.2f.e.33、Bi-DirectionalBusBufferf.e.13.3DesignforSequentialCircuits•Sequentialcircuitsinwhichthevaluesoftheoutputsdependonnotonlyonthepresentvaluesoftheinputsbutalsoonthepastbehaviorofthecircuit.Suchcircuitsincludestorageelementsthatstorethevaluesoflogicsignals.3.3.1ClockSignalsandClearSignals1、ClockSignals任何时序电路都以时钟信号为驱动信号,时序电路只是在时钟信号的边沿到来时,其状态才发生改变。因此,时钟信号通常是描述时序电路的程序执行的条件。另外,时序电路也总是以时钟进程形式来进行描述的,其描述方式一般有两种:1)进程的敏感信号是时钟信号在这种情况下,时钟信号应作为敏感信号,显式的出现在PROCESS语句后跟的括号中,如PROCESS(clock_signal)。时钟信号边沿的到来,将作为时序电路语句执行的条件,如下例所示:该进程在时钟信号发生变化时被启动,而在时钟边沿的条件得到满足后才真正执行时序电路所对应的语句。f.e.12)用进程中的WAITON语句等待时钟在这种情况下,描述时序电路的进程将没有敏感信号,而是用WAITON语句来控制进程的执行。也就是说,进程通常停留在WAITON语句上,只有在时钟信号到来,且满足边沿条件时,其余的语句才能执行。如下例所示:f.e.2在编写上述两个程序时应注意:•无论是IF语句还是WAITON语句,在对时钟边沿说明时,一定要注明是上升沿还是下降沿,光说明边沿是不行的。•当时钟信号作为进程的敏感信号时,在敏感信号的表中不能出现一个以上的时钟信号,除时钟信号以外,像复位信号等是可以和时钟信号一起出现在敏感表中的。•WAITON语句只能放在进程的最前面或者最后面。3)时钟边沿的描述为了描述时钟边沿,一定要指定是上升沿还是下降沿,这一点可以使用时钟信号的属性描述来达到。也就是说,时钟信号的值是从“0”到“1”变化;还是从“1”到“0”变化。由此可以得知是时钟脉冲信号的上升沿还是下降沿。(a)时钟脉冲上升沿描述Ifrising_edge(clk)(b)时钟脉冲下降沿描述Iffalling_edge(clk)•根据上面的描述,时钟信号边沿检出条件可以统一描述如下:2、触发器的同步和非同步复位触发器的初始状态应由复位信号来设置,复位信号对触发器复位的操作不同,使其可以分为同步复位和非同步复位两种。所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位;而非同步复位则是,一旦复位信号有效,触发器就被复位。1)SynchronousClear在用VHDL语言描述时,同步复位一定在以时钟为敏感信号的进程中定义,且用IF语句来描述必要的复位条件。下面两个例子就是同步复位方式的描述实例:f.e.1f.e.22)AsynchronousClear非同步复位即异步复位,在描述时与同步方式不同:首先在进程的敏感信号中,除了时钟信号以外,还应加入复位信号;其次是用IF语句描述复位条件;最后在ELSIF段描述时钟边沿的条件,并加
本文标题:用VHDL语言设计基本逻辑电路
链接地址:https://www.777doc.com/doc-3872335 .html