




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章VHDL基本逻辑电路设计7.1组合逻辑电路设计7.2时序逻辑电路设计7.3输入输出电路设计7.4有限状态机设计
7.1组合逻辑电路设计
7.1.1基本门电路
1.“与”门电路
在数字电路中,最简单的“与”门电路是二输入“与”门电路,它的逻辑表达式如下所示:
F = A·B
二输入“与”门电路的逻辑符号如图7-1所示,真值表如表7-1所示。图7-1二输入“与”门电路逻辑符号由于VHDL语法的多样性和灵活性,通常可以采用不同的方式来对门电路的逻辑功能进行描述。根据二输入“与”门电路的逻辑表达式,可以采用行为描述方式,它的VHDL设计程序如例7.1所示。根据二输入“与”门电路的真值表,也可以采用寄存器传输描述方式(或称数据流描述方式),它的VHDL设计程序如例7.2所示。
【例7.1】二输入“与”门电路的VHDL程序一。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYand_gateIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
F:OUTSTD_LOGIC);
ENDand_gate;
ARCHITECTUREbehaveOFand_gateIS
BEGIN
F<=AANDB;
ENDbehave;
【例7.2】二输入“与”门电路的VHDL程序二。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYand_gateIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
F:OUTSTD_LOGIC);
ENDand_gate;
ARCHITECTURErtlOFand_gateIS
BEGIN
PROCESS(A,B)
VARIABLEcomb:STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
comb:=A&B;
CASEcombIS
WHEN"00"=>F<='0':
WHEN“01”=>F<=‘0’;
WHEN“10”=>F<=‘0’;
WHEN“11”=>F<=‘1’;
WHENOTHERS=>F<=‘X’;
ENDCASE;
ENDPROCESS;
ENDrtl;对二输入“与”门电路的VHDL设计程序进行仿真,不难得到VHDL设计程序的仿真波形如图7-2所示。图7-2二输入“与”门仿真波形
2.“或”门电路
在数字电路中,最简单的“或”门电路是二输入“或”门电路,它的逻辑表达式如下所示:
F=A+B
二输入“或”门电路的逻辑符号如图7-3所示,真值表如表7-2所示。图7-3二输入“或”门电路逻辑符号根据二输入“或”门电路的逻辑表达式,可以给出采用行为描述方式的VHDL设计程序,如例7.3所示;根据二输入“或”门电路的真值表,也可以给出采用寄存器传输描述方式的VHDL设计程序,如例7.4所示。
【例7.3】二输入“或”门电路的VHDL程序一。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor_gateIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
F:OUTSTD_LOGIC);
ENDor_gate;
ARCHITECTUREbehaveOFor_gateIS
BEGIN
F<=AORB;
ENDbehave;
【例7.4】二输入“或”门电路的VHDL程序二。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor_gateIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
F:OUTSTD_LOGIC);
ENDand_gate;
ARCHITECTURErtlOFor_gateIS
BEGIN
PROCESS(A,B)
VARIABLEcomb:STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
comb:=A&B;
CASEcombIS
WHEN"00"=>F<='0':
WHEN“01”=>F<=‘1’;
WHEN“10”=>F<=‘1’;
WHEN“11”=>F<=‘1’;
WHENOTHERS=>F<=‘X’;
ENDCASE;
ENDPROCESS;
ENDrtl;对二输入“或”门电路的VHDL设计程序进行仿真,不难得到VHDL设计程序的仿真波形,如图7-4所示。图7-4二输入“或”门电路仿真波形
3.“非”门电路
数字电路中,“非”门电路的逻辑表达式如下所示:
F =A
“非”门电路的逻辑符号如图7-5所示,真值表如表7-3所示。图7-5“非”门电路逻辑符号根据“非”门电路的逻辑表达式,可以给出采用行为描述方式的VHDL设计程序,如例7.5所示;根据“非”门电路的真值表,也可以给出采用寄存器传输描述方式的VHDL,设计程序如例7.6所示。
【例7.5】“非”门电路的VHDL程序一。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYnot_gateIS
PORT(A:INSTD_LOGIC;
F:OUTSTD_LOGIC);
ENDnot_gate;
ARCHITECTUREbehaveOFnot_gateIS
BEGIN
F<=NOTA;
ENDbehave;
【例7.6】“非”门电路的VHDL程序二。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYnot_gateIS
PORT(A:INSTD_LOGIC;
F:OUTSTD_LOGIC);
ENDnot_gate;
ARCHITECTURErtlOFnot_gateIS
BEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN‘0’=>F<=‘1’;
WHEN'1'=>F<='0';
WHENOTHERS=>F<=‘X’;
ENDCASE;
ENDPROCESS;
ENDrtl;
对“非”门电路的VHDL设计程序进行仿真,不难得出VHDL设计程序的仿真波形,如图7-6所示。图7-6“非”门电路仿真波形
4.多输入逻辑门电路
在数字电路设计的过程中,逻辑门电路的输入往往不止一个(对于非门电路来说是一个)或者两个,有时候还存在多个输入的情况,这时就需要采用多输入逻辑门电路来进行相应的设计。下面我们以8输入“或”门为例来介绍多输入逻辑门电路的VHDL程序设计,其设计程序如例7.7所示。
【例7.7】8输入“或”门电路程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor8_gateIS
PORT(A:INSTD_LOGIC_VECTOR(7DOWNTO0);
F:OUTSTD_LOGIC);
ENDor8_gate;
ARCHITECTUREbehaveOFor8_gateIS
BEGIN
F<=A(7)ORA(6)ORA(5)ORA(4)ORA(3)ORA(2)ORA(1)ORA(0);
ENDbehave;7.1.2数据选择器
数据选择器具有2N条输入数据线、N条地址选择线和一条输出数据线。下面我们以四选一数据选择器为例来介绍数据选择器的VHDL设计过程,它的逻辑符号如图7-7所示,功能如表7-4所示。图7-7四选一数据选择器的逻辑符号由于VHDL语法的多样性和灵活性,通常可以采用IF语句、CASE语句、选择信号赋值语句和条件信号赋值语句来描述四选一数据选择器的逻辑功能。由于篇幅限制,下面仅给出采用IF语句描述四选一数据选择器的VHDL程序,其他方式读者可参照例7.8自行完成。
【例7.8】四选一数据选择器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTlTYmux4IS
PORT(d0:INSTD_LOGIC;
d1:INSTD_LOGIC;
d2:INSTD_LOGIC;
d3:INSTD_LOGIC;
s0:INSTD_LOGIC;
s1:INSTD_LOGIC;
y:OUTSTD_LOGIC);
ENDmux4;
ARHCITECTURErtlOFmux4IS
BEGIN
PROCESS(d0,d1,d2,d3,s0,s1)
BEGIN
IFs1=‘0’ANDs0=‘0’THEN
y<=d0;
ELSIFs1=‘0’ANDs0=‘1’THEN
y<=d1;
ELSIFs1=‘1’ANDs0=‘0’THEN
y<=d2;
ELSIFs1=‘1’ANDs0=‘1’THEN
y<=d3;
ELSE
y<=‘Z’;
ENDIF;
ENDPROCESS;
ENDrtl;
对四选一数据选择器的VHDL程序进行仿真验证,不难得到相应设计的时序仿真波形,如图7-8所示。图7-8四选一数据选择器的仿真波形
【例7.9】八选一数据选择器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux8IS
PORT(data:INSTD_LOGIC_VECTOR(7DOWNTO0);
s0:INSTD_LOGIC;
s1:INSTD_LOGIC;
s2:INSTD_LOGIC;
y:OUTSTD_LOGIC);ENDmux8;
ARCHITECTURErtlOFmux8IS
SIGNALsel:STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
sel<=s2&s1&s0;
PROCESS(data,sel)
BEGIN
CASEselIS
WHEN"000"=>y<=data(0);
WHEN"001"=>y<=data(1);
WHEN“010”=>y<=data(2);
WHEN“011”=>y<=data(3);
WHEN“100”=>y<=data(4);
WHEN“101”=>y<=data(5);
WHEN“110”=>y<=data(6);
WHENOTHERS=>y<=data(7);
ENDCASE;
ENDPROCESS;
ENDrtl;对上述的八选一数据选择器进行仿真验证,其功能仿真波形如图7-9所示。图7-9八选一数据选择器的功能仿真波形7.1.3编码器和译码器
1.编码器
在数字电路中,为了区分一系列不同的事物,将其中的每一个事物用一个二进制代码来表示,这就是编码的含义。编码器的逻辑功能就是把编码器输入的每一个高、低电平的信号编写成一个对应的二进制信号,即把2N个输入信号转化为N位编码输出。图7-108-3编码器的逻辑符号
1)普通编码器
最简单的普通编码器是8-3编码器,它的逻辑符号如图
7-10所示,真值表如表7-5所示。可以看出8-3编码器的功能是对8个输入信号进行编码操作,然后以3位二进制码的形式输出(这里输入信号是低电平有效)。
【例7.10】8-3普通编码器的VHDL程序设计。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYencoderIS
PORT(din:INSTD_LOGIC_VECTOR(7DOWNTO0);
y:OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDencoder;ARCHITECTURErtlOFencoderIS
BEGIN
PROCESS(din)
BEGIN
CASEdinIS
WHEN"01111111"=>y<="111";
WHEN"10111111"=>y<="110";
WHEN"11011111"=>y<="101";
WHEN"11101111"=>y<="100";
WHEN"11110111"=>y<="011";
WHEN“11111011”=>y<=“010”;
WHEN“11111101”=>y<=“001”;
WHEN“11111110”=>y<=“000”;
WHENOTHERS=>y<=”ZZZ”;
ENDCASE;
ENDPROCESS;
ENDrtl;对上述8-3普通编码器的VHDL设计程序进行仿真验证,其仿真波形如图7-11所示。图7-118-3普通编码器的仿真波形
2)优先编码器
在某一个给定时刻,输入端允许同时出现两个或两个以上的输入信号,而且只对优先级最高的输入信号进行编码的编码器称为优先编码器。可以看出,优先编码器与普通编码器的最大不同是允许在同一时刻出现多个有效的输入信号,同时所有的有效输入信号按照优先级高低进行排序,当几个输入信号同时出现时,只对其中优先级最高的一个输入信号进行编码。常用的简单优先编码器是74LS148,它的逻辑符号如图
7-12所示,它的功能表如表7-6所示。在功能表中,“X”代表任意项;EI是74LS148的使能控制端,低电平有效;EO是无编码信号输入状态标志端,低电平有效;GS是有编码信号输入状态标志端,低电平有效。EO和GS两个控制端对于编码器的级联是十分有用的。由74LS148的功能表可以看出,它的逻辑功能是对8个输入信号进行带有优先级的编码操作,然后将编码结果以3位二进制码的形式送到输出端,这里输入信号D7的优先级最高。根据优先编码器74LS148的功能表来进行相应的VHDL设计,其对应的VHDL设计程序如例7.11所示。由于目前VHDL还不能用来描述任意项,因此语句“WHEN“0XXXXXXX”=>
q<=“000”;”是非法的,所以在这里采用IF语句而没有采用CASE语句来描述74LS148的功能。图7-1274LS148的逻辑符号
【例7.11】74LS148优先编码器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYencoder_priorityIS
PORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);
EI:INSTD_LOGIC;
Q:OUTSTD_LOGIC_VECTOR(2DOWNTO0);
GS:OUTSTD_LOGIC;
EO:OUTSTD_LOGIC);
ENDencoder_priority;
ARCHITECTURErtlOFencoder_priorityIS
BEGIN
PROCESS(EI,D)
BEGIN
IF(EI='1')THEN
GS<='1';
EO<='1';
ELSIF(D=“11111111”ANDEI='0')THEN
Q<=“111”;
GS<='1';
EO<='0';
ELSIF(D(7)='0'ANDEI='0')THEN
Q<=“000”;
GS<='0';
EO<='1';
ELSIF(D(6)='0'ANDEI='0')THEN
Q<=“001”;
GS<='0';
EO<='1';
ELSIF(D(5)='0'ANDEI='0')THEN
Q<=“010”;
GS<='0';
EO<='1';
ELSIF(D(4)='0'ANDEI='0')THEN
Q<=“011”;
GS<='0';
EO<='1';
ELSIF(D(3)='0'ANDEI='0')THEN
Q<=“100”;
GS<='0';
EO<='1';
ELSIF(D(2)='0'ANDEI='0')THEN
Q<=“101”;
GS<='0';
EO<='1';
ELSIF(D(1)='0'ANDEI='0')THEN
Q<=“110”;
GS<='0';
EO<='1';
ELSIF(D(0)='0'ANDEI='0')THEN
Q<=“111”;
GS<='0';
EO<='1';
ELSE
Q<=“111”;
GS<='1';
EO<='0';
ENDI;
ENDPROCESS;
ENDrtl;下面对优先编码器74LS148的VHDL设计程序进行仿真验证,不难得出如图7-13所示的仿真波形。图7-13优先编码器74LS148的仿真波形
2.译码器
1)二进制译码器
二进制译码器的逻辑功能是把输入的二进制代码的各种组合状态翻译成对应的输出信号,有时也称为变量译码器。在数字电路中,最常用的二进制译码器是74LS138,它的逻辑符号如图7-14所示,功能表如表7-7所示。可以看出,译码器74LS138的功能是对3个输入信号进行译码以确定8个信号的输出,因此它也称为3-8译码器。图7-1474LS138译码器逻辑符号
【例7.12】74LS138译码器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYvariable_decoderIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC:
C:INSTD_LOGIC;
G1:INSTD_LOGIC;
G2A:INSTD_LOGIC;
G2B:INSTD_LOGIC;
Y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDvariable_decoder;
ARCHITECTURErtlOFvariable_decoderIS
BEGIN
PROCESS(G1,G2A,G2B,A,B,C)
VARIABLECOMB:STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
IF(G1=‘1’ANDG2A=‘0’ANDG2B=‘0’)THEN
COMB:=C&B&A;
CASECOMBIS
WHEN"000"=>Y<="11111110";WHEN"001"=>Y<="11111101";
WHEN"010"=>Y<="11111011";
WHEN"011"=>Y<="11110111";
WHEN"100"=>Y<="11101111";
WHEN"101"=>Y<="11011111";
WHEN"110"=>Y<="10111111";
WHEN"111"=>Y<="01111111";
WHENOTHERS=>Y<="XXXXXXXX";
ENDCASE;
ELSE
Y<=“11111111”;
ENDIF;
ENDPROCESS;
ENDrtl;
下面对译码器74LS138的VHDL设计程序进行仿真验证,不难得出如图7-15所示的仿真波形。图7-1574LS138仿真波形
2)数码显示译码器
数码显示译码器用来驱动各种显示器件,从而将用二进制代码表示的数字、文字、符号直观地显示出来。其结构如图
7-16所示,数码显示译码器的真值表如表7-8所示。图7-16数码显示器的结构
【例7.13】七段数码管显示译码电路的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYxsymIS
PORT(num:INSTD_LOGIC_VECTOR(3DOWNTO0);
dout:OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDxsym;
ARCHITECTURErtlOFxsymIS
BEGIN
WITHNUMSELECT
dout<="1111110"WHEN"0000",--0 "0110000"WHEN"0001",--1
"1101101"WHEN"0010",--2
"1111001"WHEN"0011",--3
"0110011"WHEN"0100",--4
"1011011"WHEN"0101",--5
"1011111"WHEN"0110",--6
"1110000"WHEN"0111",--7
"1111111"WHEN"1000",--8
"1111011"WHEN"1001",--9
"0000000"WHENOTHERS;
ENDrtl;下面我们对上述的VHDL程序进行仿真验证,其仿真波形如图7-17所示。图7-17数码显示译码电路的仿真波形7.1.4加法器
1.半加器
1位半加器有两个输入端,两个输出端。其逻辑符号如图7-18所示,其中a、b为被加数和加数输入端,s为和输出端,co为进位输出端,其真值表如表7-9所示。图7-18半加器逻辑符号
【例7.14】1位半加器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYhalf_adderIS
PORT(a:INSTD_LOGIC;
b:INSTD_LOGIC;
s:OUTSTD_LOGIC;
co:OUTSTD_LOGIC);
ENDhalf_adder;
ARCHITECTURErtlOFhalf_adderIS
SIGNALc,d:STD_LOGIC;
BEGIN
c<=aORb;
d<=aNANDb;
co<=NOTd;
s<=cANDd;
ENDrtl;下面对半加器的VHDL设计程序进行仿真验证,不难得出如图7-19所示的仿真波形。图7-19半加器的仿真波形
2.全加器
全加器有3个二进制输入端a、b和低位进位端cin,以及1位和的输出端s和进位输出端cout,其真值表如表7-10所示,逻辑功能符号如图7-20所示。图7-20全加器的逻辑符号根据表7-10所示的真值表,可以得到一位全加器的输出和与进位输出的逻辑表达式如下所示:
【例7.15】1位全加器的VHDL程序(寄存器描述方式)。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYfull_adderIS
PORT(a:INSTD_LOGIC;
b:INSTD_LOGIC;
cin:INSTD_LOGIC;
s:OUTSTD_LOGIC;
co:OUTSTD_LOGIC);
ENDfull_adder;
ARCHITECTURErtlOFfull_adderIS
SIGNALtmp1,tmp2:STD_LOGIC;
BEGIN
tmp1<=aORb;
tmp2<=tmp1ANDcin;
s<=tmp1XORcin;
co<=tmp2OR(aANDb);
ENDrtl;下面将对1位全加器的VHDL设计程序进行仿真验证,可以得到相应的仿真波形如图7-21所示。图7-211位全加器的仿真波形在实际设计中,1位全加器通常采用2个半加器来构成,则全加器的电路图如图7-22所示。图7-22用2个半加器构成的全加器
【例7.16】1位全加器的VHDL程序(结构化描述方式)。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYfull_adderIS
PORT(a:INSTD_LOGIC;
b:INSTD_LOGIC;
cin:INSTD_LOGIC;
s:OUTSTD_LOGIC;
cout:OUTSTD_LOGIC);
ENDfull_adder;
ARCHITECTUREstructureOFfull_adderIS
COMPONENThalf_adder
PORT(a:INSTD_LOGIC;
b:INSTD_LOGIC;
s:INSTD_LOGIC;
co:OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALtemp1,temp2,temp3:STD_LOGIC;
BEGIN
u0:half_adderPORTMAP(a,b,temp1,temp2);
u1:half_adderPORTMAP(temp1,cin,s,temp3);
cout<=temp2ORtemp3;
ENDstructure;
对上述1位全加器的仿真验证波形同图7-21,这里留给读者自行完成。7.1.5比较器
表7-11给出了一种最简单的1位数值比较器的功能表,可以看出它具有等于、大于和小于三种比较结果。根据表7-11可以很容易地给出描述其逻辑功能的VHDL设计程序,如例7.17所示。
【例7.17】 1位比较器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcompIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
Q:OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDcomp;
ARCHITECTURErtlOFcompIS
BEGIN
PROCESS(A,B)
BEGIN
IF(A=B)THEN
Q<=“001”;
ELSIF(A>B)THEN
Q<=“010”;
ELSE
Q<=“100”;
ENDIF;
ENDPROCESS;
ENDrtl;
对1位数值比较器的VHDL设计程序进行仿真验证,可以得到如图7-23所示的仿真波形。图7-231位数值比较器的仿真波形实际使用中,应用较为广泛的数值比较器是4位数数值比较器CC14585,它的逻辑符号如图7-24所示,功能表如表7-12所示。可以看出,4位数值比较器CCl4585的具体逻辑功能如下:
(1)当输入数据A大于输入数据B时,有GT=l,EQ=LT=0。
(2)当输入数据A小于输入数据B时,有LT=1,GT=EQ=0。
(3)如果输入数据A等于输入数据B,则当I1=1时,GT=1,EQ=LT=0;当I2=1时,EQ=1,GT=LT=0;当I3=1时,LT=1,GT=EQ=0。图7-24CC14585数值比较器符号图
【例7.18】4位数值比较器CC14585的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcomp4IS
PORT(A:INSTD_LOGIC_VECTOR(3DOWNTO0);
B:INSTD_LOGIC_VECTOR(3DOWNTO0);
I1:INSTD_LOGIC;
I2:INSTD_LOGIC;
I3:INSTD_LOGIC;
GT:OUTSTD_LOGIC;
EQ:OUTSTD_LOGIC;
LT:OUTSTD_LOGIC);
ENDcomp4;
ARCHITECTURErtlOFcomp4IS
BEGIN
GT<=‘0’WHENA<BOR((A=B)ANDI2=‘1’)OR((A=B)ANDI3=‘1’)
ELSE‘1’WHENA>BOR((A=B)ANDI1=‘1’)
ELSE‘Z’;
EQ<='0'WHENA>BORA<BOR((A=B)ANDI1='1')OR((A=B)ANDI3='1')
ELSE‘1’WHEN((A=B)ANDI2=‘1’)
ELSE‘Z’;
LT<=‘0’WHENA>BOR((A=B)ANDI2=‘1’)OR((A=B)ANDI1=‘1’)
ELSE‘1’WHENA<BOR((A=B)ANDI3=‘1’)
ELSE‘Z’;
ENDrtl;对上述的4位数值比较器CC14585的VHDL设计程序进行仿真验证,不难得出相应的仿真波形,如图7-25所示。图7-254位数值比较器CC14585的仿真波形7.1.6三态门和总线缓冲器
1.三态门
三态门电路是在普通门电路的基础上附加控制电路构成的。三态门电路的逻辑符号如图7-26所示,真值表如表7-13所示。可以看出,如果控制端口的输入信号EN=1,那么输入数据直接送到dout端口上;否则,输出端口为高阻状态。图7-26三态门逻辑符号
【例7.19】三态门的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYtri_state_gateIS
PORT(din:INSTD_LOGIC;
en:INSTD_LOGIC;
dout:OUTSTD_LOGIC);
ENDtri_state_gate;
ARCHITECTUREbehaveOFtri_state_gateIS
BEGIN
PROCESS(en,din)
BEGIN
IF(en=‘1’)THEN
dout<=din;
ELSE
dout<=‘Z’;
ENDIF;
ENDPROCESS;
ENDbehave;下面我们对三态门的VHDL程序进行验证,其仿真波形如图7-27所示。图7-27三态门仿真波形
2.总线缓冲器
1)单向总线缓冲器
典型的8位单向总线缓冲器如图7-28所示,真值表如表
7-14所示。8位单向总线缓冲器由8个三态门组成,具有8个输入和输出端口。所有三态门的控制端连在一起,由一个控制输入端en控制。图7-288位单向总线缓冲器符号
【例7.20】8位单向总线缓冲器的VHDL设计程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYsingle_buff8IS
PORT(din:INSTD_LOGIC_VECTOR(7DOWNTO0);
en:INSTD_LOGIC;
dout:OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDsingle_buff8;
ARCHITECTUREbehaveOFsingle_buff8IS
BEGIN
PROCESS(en,din)
BEGIN
IF(en=‘1’)THEN
dout<=din;
ELSE
dout<=“ZZZZZZZZ”;
ENDIF;
ENDPROCESS;
ENDbehave;图7-298位单向总线缓冲器仿真波形
2)双向总线缓冲器
典型的8位双向总线缓冲器如图7-30所示。图中的双向缓冲器有两个数据输入输出端a、b,一个方向控制端dir和一个选通端en。当en=1时,双向总线缓冲器未被选通,a和b呈现高阻状态;当en=0时,双向总线缓冲器被选通,如果dir=0,那么a=b,如果dir=1,那么b=a。双向总线缓冲器的真值表如表
7-15所示。图7-30双向总线缓冲器
【例7.21】双向总线缓冲器的VHDL设计程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYbi_buff8IS
PORT(a,b:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);
en,dir:INSTD_LOGIC);
ENDbi_buff8;ARCHITECTUREbehaveOFbi_buff8IS
SIGNALaout,bout:STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(a,dir,en)
BEGIN
IF(en='0')AND(dir='1')THEN
bout<=a;
ELSE
bout<="ZZZZZZZZ";
ENDIF;
b<=bout;ENDPROCESS;
PROCESS(b,dir,en)
BEGIN
IF(en='0')AND(dir='0')THEN
aout<=b;
ELSE
aout<="ZZZZZZZZ";
ENDIF;
a<=aout;
ENDPROCESS;
ENDbehave;
从例7.21可以看出,双向总线缓冲器由两组三态门组成,利用信号aout和bout将两组三态门连接起来。由于在实际工作中a、b都不可能同时出现“0”和“1”,故在这里没有使用判决
函数。图7-318位双向总线缓冲器仿真波形7.2时序逻辑电路设计
7.2.1时钟信号和复位信号
1.时钟信号
(1)进程的敏感信号是时钟信号。在这种情况下,时钟信号应作为敏感信号,显式地出现在PROCESS语句后跟的括号中,例如PROCESS(clock_signal)。时钟信号边沿的到来,将作为时序电路语句执行的条件,如例7.22所示。
【例7.22】进程的敏感信号是时钟信号示例。
PROCESS(clk_signal)
BEGIN
IF(clock_edge_condition)THEN
signal_out<=signal_in
ENDIF;
ENDPROCESS;
(2)用进程中的WAITON语句等待时钟。在这种情况下,描述时序电路的进程将没有敏感信号,而是用WAITON语句来控制进程的执行。也就是说,进程通常停留在WAITON语句上,只有在时钟信号到来且满足边沿条件时,其余的语句才能执行,如例7.23所示。
【例7.23】用进程中的WAITON语句等待时钟示例。
PROCESS
BEGIN
WAITON(clock_signal)UNTIL(clock_edge_condition)
signal_out<=signal_in
ENDPROCESS;在编写上述程序时应注意以下几点:
①无论IF语句还是WAITON语句,在时钟边沿说明时,一定要注明是上升沿还是下降沿,仅仅说明边沿还是不行的。
②当时钟信号作为进程敏感信号时,在敏感信号列表中不能出现一个以上的时钟信号,除时钟信号以外,像复位信号等是可以和时钟信号一起出现在敏感信号列表中的。
③WAITON语句只能放在进程的最前面或是最后面。
(3)时钟边沿的描述。为了描述时钟边沿,一定要指定是上升沿还是下降沿,这一点可以使用时钟信号的属性描述来实现。也就是说,时钟信号的值是从“0”到“1”变化,还是从“1”到“0”变化,由此可以得知是时钟脉冲信号的上升沿还是下
降沿。
①时钟脉冲的上升沿描述。时钟脉冲上升沿波形与时钟信号属性的描述关系如图7-32所示。从图中可以看出,时钟信号起始值为“0”,故其属性值clk’LAST_VALUE=‘0’;上升沿的到来表示发生了一个事件,故用clk’EVENT表示;上升沿以后,时钟信号的值为“1”,故其当前值为clk=‘1’,这样,表示上升沿到来的条件可以写为
IFclk='1'ANDclk'LAST_VALUE='0'ANDclk'EVENT;图7-32时钟脉冲上升沿波形和时钟信号属性描述关系②时钟脉冲下降沿描述。时钟信号下降沿波形与时钟信号属性的描述关系如图7-33所示。其关系与图7-32类同,此时clk’LAST_VALUE=‘1’;时钟信号当前值为clk=‘0’;下降沿到来的事件为clk’EVENT。这样表示下降沿到来的条件可写为
IFclk='0'ANDclk'LAST_VALUE='0'ANDclk'EVENT;根据上面的上升沿和下降沿的描述,时钟信号边沿检出条件可以统一描述如下:
IFclock_signal=current_valueAND
clock_signal‘LAST_VALUE=’0‘AND
clock_signal’EVENT;
实际中,经常将边沿检出的条件简写为如下形式:
IFclock_signal=current_valueANDclock_signal'EVENT图7-33时钟脉冲下降沿波形和时钟信号属性描述关系
2.复位信号
1)同步复位
在使用VHDL语言描述时,同步复位一定在以时钟为敏感信号的进程中定义,且用IF语句来描述必要的复位条件。下面两个例子就是同步复位的描述实例。
【例7.24】同步复位描述方式一。
PROCESS(clock_signal)
BEGIN
IF(clock_edge_condition)THEN
IF(reset_condition)THEN
signal_out<=reset_value;
ELSE
signal_out<=signal_in;
ENDIF;
ENDIF;
ENDPROCESS;
【例7.25】同步复位描述方式二。
PROCESS
BEGIN
WAITON(clock_signal)UNTIL(clock_edge_condition)
IF(reset_condition)
ELSE
signal_out<=signal_in;
ENDIF;
ENDIF;
ENDPROCESS;
2)异步复位
异步复位在描述时与同步方式不同。首先在进程的敏感信号中除时钟信号以外,还应加上复位信号;其次是用IF语句描述复位条件;最后在ELSIF段描述时钟信号边沿的条件,并加上EVENT属性。其描述方式如例7.26所示。
【例7.26】异步复位描述方式示例。
PROCESS(reset_signal,clock_signal)
BEGIN
IF(reset_condition)THEN
signal_out<=reset_value;
ELSIF(clock_eventANDclock_edge_condition)THEN
signal_out<=signal_in;
ENDIF;
ENDPROCESS;从例7.26可以看出,非同步时的信号和变量的代入值必须在时钟信号边沿有效的范围内进行,如在例7.26中的ELSIF后进行的那样。
另外,添加clock_event是为了防止没有时钟信号发生时的误操作。譬如,现在时钟事件没有发生而是发生了复位事件,这样该进程就得到了启动。7.2.2触发器和锁存器
1.触发器
1) D触发器
D触发器是一种应用十分广泛的钟控触发器,它是构成各种复杂系统的基本单元。一个基本的D触发器的逻辑符号如图7-34所示,它的真值表如表7-16所示。图7-34D触发器逻辑符号
【例7.27】D触发器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdff1IS
PORT(d,cp:INSTD_LOGIC;
q:OUTSTD_LOGIC;
qb:OUTSTD_LOGIC);
ENDdff1;
ARCHITECTURErtlOFdff1IS
BEGIN
PROCESS(cp)
BEGIN
IF(cp=‘1’)AND(cp‘EVENT)THEN
q<=d;
qb<=NOTd;
ENDIF;
ENDPROCESS;
ENDrtl;下面对D触发器的VHDL设计程序进行仿真验证,不难得出其设计的仿真波形如图7-35所示。图7-35D触发器的时序仿真波形一般来说,实际设计中并非所有的器件在上电时都能处于复位或置位状态,因此实际应用中的器件都会含有相应的复位或置位控制端口。同样,所有实用的D触发器也都含有复位或置位控制端口。常用的异步置位/复位D触发器的逻辑符号如图7-36所示,它的功能表如表7-17所示。图7-36异步置位/复位D触发器符号
【例7.28】异步置位/复位D触发器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdffcsIS
PORT(d,cp,clr,set:INSTD_LOGIC;
q,qb:OUTSTD_LOGIC);
ENDdffcs;
ARCHITECTURErtlOfdffcsIS
BEGIN
PROCESS(cp,clr,set)
BEGIN
IF(clr='0')THEN
q<='0';
qb<='1';
ELSIF(set=‘0’)THEN
q<='1';
qb<='0';
ELSIF(cp‘EVENTANDcp='1')THEN
q<=d;
qb<=NOTd;
ENDIF;
ENDPROCESS;
ENDrtl;
下面对例7.28的VHDL设计程序进行仿真验证,其仿真波形如图7-37所示。图7-37异步置位/复位D触发器的仿真波形
2) JK触发器
在数字电路中,JK触发器也是一种应用较为广泛的触发器。一般来说,JK触发器的种类很多,可以用在不同目的的数字电路设计中。这里将讨论一个异步置位/复位的JK触发器的VHDL设计,该触发器的逻辑符号如图7-38所示,它的功能表如表7-18所示。图7-38异步置位/复位JK触发器逻辑符号
【例7.29】用VHDL程序描述JK触发器的功能。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYjkffIS
PORT(j,k,cp,clr,set:INSTD_LOGIC;
q,qb:OUTSTD_LOGIC);
ENDjkff;
ARCHITECTURErtlOFjkffIS
SIGNALq_s,qb_s:STD_LOGIC;
BEGIN
PROCESS(cp,clr,set,j,k)
BEGIN
IF(clr='0')AND(set=1')THEN
q_s<='0';
qb_s<='1';
ELSIF(clr='1')AND(set='0')THEN
q_s<='1';
qb_s<='0';
ELSIF(cp‘EVENTANDcp='1')THEN
IF(j='0')AND(k='1')THEN
q_s<='0';
qb_s<='1';
ELSIF(j='1')AND(k='0')THEN
q_s<='1';
qb_s<='0';
ELSIF(j='1')AND(k='1')THEN
q_s<=NOTq_s;
qb_s<=NOTqb_s;
ELSE
q_s<=q_s;
qb_s<=qb_s;
ENDIF;
q<=q_s;
qb<=qb_s;
ENDIF;
ENDPROCESS;
ENDrtl;
下面对异步置位/复位JK触发器的VHDL设计程序进行仿真验证,不难得到其设计对应的仿真波形,如图7-39示。图7-39异步置位/复位JK触发器仿真波形
2.锁存器
锁存器是触发器的一种应用类型,广泛用于计算机与数字系统的输入缓冲电路,其作用是将输入信号暂时寄存,等待处理。下面我们就对D锁存器作以介绍,其逻辑符号如图7-40所示,真值表如表7-19所示。图7-40D锁存器逻辑符号
【例7.30】 D锁存器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYlatchIS
PROT(d,cp:INSTD_LOGIC;
q:OUTSTD_LOGIC);
ENDlatch;
ARCHITECTURErtlOFlatchIS
BEGIN
PROCESS(cp)
BEGIN
IF(cp=‘1’)THEN
q<=d;
ENDIF;
ENDPROCESS
ENDrtl;
下面我们对D锁存器的VHDL设计程序进行仿真验证,如图7-41所示。图7-41D锁存器仿真波形7.2.3计数器
1.同步计数器
下面给出一个带有异步复位、同步置数功能的8421BCD码计数器的例子,来说明同步计数器的VHDL设计过程。8421BCD码计数器的逻辑符号如图7-42所示,计数器功能表如表7-20所示。图7-428421BCD码计数器逻辑符号
【例7.31】同步计数器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcntm60IS
PORT(ci:INSTD_LOGIC;
nreset:INSTD_LOGIC;
load:INSTD_LOGIC;
data:INSTD_LOGIC_VECTOR(7DOWNTO0);
clk:INSTD_LOGIC;
co:OUTSTD_LOGIC;
qh:OUTSTD_LOGIC_VECTOR(3DOWNTO0);
ql:OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDENTITYcntm60;
ARCHITECTUREartOFcntm60IS
SIGNALqh_tmp,ql_tmp:STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
co<=‘1’WHEN(qh_tmp=“0101”ANDql_tmp=“1001”ANDci=‘1’)ELSE‘0’; --进位输出
PROCESS(clk,nreset)
BEGIN
IF(nreset='0')THEN--异步复位
qh_tmp<="0000";
ql_tmp<="0000";
ELSIF(clk'EVENTANDclk='1')THEN --同步置数
IF(load='1')THEN
qh_tmp<=data(7DOWNTO4);
ql_tmp<=data(3DOWNTO0);
ELSIF(ci=‘1’)THEN --模60的实现
IF(ql_tmp=9)THEN
ql_tmp<=“0000”;
IF(qh_tmp=5)THEN
qh_tmp<=“0000”;
ELSE
--计数功能实现
qh_tmp<=qh_tmp+1;
ENDIF;
ELSE
ql_tmp<=ql_tmp+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
qh<=qh_tmp;
ql<=ql_tmp;
ENDARCHITECTUREart;下面对8421BCD码同步计数器的VHDL程序进行仿真验证,其仿真波形如图7-43所示。图7-438421BCD码同步计数器仿真波形
2.异步计数器
在数字电路中,常见的一种4位异步计数器的逻辑电路如图7-44所示。这种计数器是由4个具有异步复位控制端口的D触发器构成的。其中,第1个触发器的时钟输入端口用来接收外来的时钟信号,而其余触发器的时钟信号则来自于前一个触发器的反相输出。图7-444位异步计数器的逻辑电路
【例7.32】异步复位D触发器的VHDL程序。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdffIS
PORT(d:INSTD_LOGIC;
cp:INSTD_LOGIC;
r:INSTD_LOGIC;
q:OUTSTD_LOGIC;
qb:OUTSTD_LOGIC);
ENDENTITYdff;
ARCHITECTUREartOFdffIS
BEGIN
PROCESS(cp,r)
BEGIN
IF(r=‘0’)THEN
q<=‘0’;
qb<='1';
ELSIF(cp‘EVENTANDcp=’1‘)THEN
q<=d;
qb<=NOTd;
ENDIF
ENDPROCESS;
ENDARCHITECTUREart;
【例7.33】4位异步计数器VHDL程序。
LIBRARYIEEE;
USEIE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加盟投资合同范例
- 单位打井工程合同标准文本
- 个人坟地买卖合同标准文本
- 农村拆迁收款合同范例
- 2025二手房买卖阴阳合同存在哪些风险?合同问题需警惕
- 华英证券合同范例
- 买方有两个单位合同范本
- 农村土地购买合同标准文本
- 卖茶叶佣金合同范例
- 2025办公楼设计合同书范本
- 第5课+光色交汇+课件-2024-2025学年浙人美版(2024)初中美术七年级下册
- 临沂考科目一试题及答案
- 2025年初级等保测评试题及答案
- 2025年全国中小学生安全知识竞赛参考试题库500题(含答案)
- DB11∕T493.1-2024道路交通管理设施设置规范 第1部分:道路交通标志
- 教师如何使用AI开展教学DeepSeek使用指南人工智能 课件
- 2025新人教版七年级下语文-4.16《有为有不为》教案教学设计
- 如何做好护理实习生的带教
- (二调)武汉市2025届高中毕业生二月调研考试 生物试卷(含标准答案)
- 2025年宁夏建设职业技术学院单招职业倾向性测试题库一套
- 《智能家居控制系统方案》课件
评论
0/150
提交评论