BEGIN
SEL<=B&A;
PROCESS(INP,SEC) IS BEGIN
IF(SEL=\; ELSIF (SEL=\; ELSIF (SEL=\;
ELSE Y<=INP(3); END IF; END PROCESS;
END ARCHITECTURE ART;
4.三态门及总线缓冲器
三态门和总线缓冲器是驱动电路经常用到的器件。 2) 单向总线驱动器
在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。一个8位的单向总线缓冲器。
TRI_BUF8ENDIN[7..0]ENDOUT[7..0]DIN[7..0]
【例3.9.8】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY TRI_BUF8 IS
PORT (DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0); EN:IN STD_LOGIC;
DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY TRI_BUF8;
ARCHITECTURE ART OF TRI_BUF8 IS BEGIN
PROCESS(EN,DIN) IS BEGIN
IF(EN=‘1’)THEN DOUT<=DIN;
ELSE DOUT<=\; END IF;
END PROCESS;
END ARCHITECTURE ART; 3) 双向总线缓冲器
双向总线缓冲器用于数据总线的驱动和缓冲,典型的双向总线缓冲器。图中
DOUT[7..0]的双向总线缓冲器有两个数据输入/输出端A和B,一个方向控制端DIR和一个选通端EN。EN=0时双向缓冲器选通。若DIR=0,则A=B,反之则B=A。
BIDIRENDIRA[7..0]ENDIRA[7..0]
【例3.9.9】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY BIDIR IS
PORT(A,B:INOUTSTD_LOGIC_VECTOR(7 DOWNTO 0); EN,DIR:IN STD_STD_LOGIC); END ENTITY BIDIR;
ARCHITECTURE ART OF BIDIR IS
SIGNA AOUT,BOUT: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN
PROCESS(A,EN,DIR) IS --A为输入 BEGIN
IF((EN=‘0’)AND (DIR=‘1’))THEN BOUT<=A; ELSE BOUT<=\; END IF ;
B<=BOUT; --B为输出 END PROCESS;
PROCESS(B,EN,DIR) IS --B为输入 BEGIN
IF((EN=‘0’)AND (DIR=‘1’))THEN AOUT<=B; ELSE AOUT<=\; END IF ;
A<=AOUT; --A为输出 END PROCESS;
END ARCHITECTURE ART;
5. 时序逻辑电路设计
本节的时序电路设计主要有触发器、寄存器、计数器、序列信号发生器和序列信号检测器等的设计实例。 1.触发器
1) D触发器 【例3.9.10】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
B[7..0]B[7..0]ENTITY DCFQ IS
PORT(D,CLK:IN STD_LOGIC; Q:OUT STD_LOGIC); END ENTITY DCFQ;
ARCHITECTURE ART OF DCFQ IS BEGIN
PROCESS(CLK) IS BEGIN
IF (CLK'EVENT AND CLK=‘1’)THEN
Q<=D; END IF;
END PROCESS;
END ARCHITECTURE ART;
4) JK触发器 【例3.9.13】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY JKCFQ IS
PORT(J,K,CLK:IN STD_LOGIC; Q,QB:BUFFER STD_LOGIC); END ENTITY JKCFQ;
ARCHITECTURE ART OF JKCFQ IS SIGNA Q_S,QB_S:STD_LOGIC; BEGIN
PROCESS(CLK,J,K) IS BEGIN
IF (CLK'EVENT AND CLK=‘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<=NOT Q_S;
QB_S<=NOT QB_S; END IF; END IF ; Q<=Q_S; QB<=QB_S; END PROCESS;
END ARCHITECTURE ART;
-- 时钟上升沿触发
6. 触发器的同步和非同步复位
触发器的初始状态应由复位信号来设置。按复位信号对触发器复位的操作不同,可以分为同步复位和非同步复位两种。所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位;非同步复位,也称异步复位,则是当复位信号有效时,触发器就被复位,不用等待时钟边沿信号。下面以D触发器为例分别予以举例。 1) 非同步复位/置位的D触发器 【例3.9.14】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ASYNDCFQ IS
PORT(CLK,D,PRESET,CLR:IN STD_LOGIC;
Q:OUT STD_LOGIC); END ENTITY ASYNDCFQ;
ARCHITECTURE ART OF ASYNDCFQ IS BEGIN
PROCESS(CLK,PRESET,CLR) IS BEGIN
IF(PRESET='1')THEN --置位信号为1,则触发器被置位 Q<='1';
ELSIF(CLR='1')THEN --复位信号为1,则触发器被复位 Q<='0';
ELSIF(CLK'EVENT AND CLK=‘1’)THEN Q<=D; END IF; END PROCESS;
END ARCHITECTURE ART; 2) 同步复位的D触发器 【例3.9.15】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY SYNDCFQ IS
PORT(D, CLK,RESET:IN STD_LOGIC;
Q:OUT STD_LOGIC); END ENTITY SYNDCFQ;
ARCHITECTURE ART OF SYNDCFQ IS BEGIN
PROCESS(CLK) IS BEGIN
IF(CLK'EVENT AND CLK=‘1’)THEN IF(PRESET=‘0’)THEN
Q<=‘0’; --时钟边沿到来且有复位信号,触发器被复位 ELSE Q<=D;
END IF; END IF;
END PROCESS;
END ARCHITECTURE ART; 7. 计数器
计数器是在数字系统中使用最多的时序电路,它不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。 1) 同步计数器
下面是一个模为60,具有异步复位、同步置数功能的8421BCD码计数器。 【例3.9.18】 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNTM60 IS
PORT(CI:IN STD_LOGIC; --计数控制
NRESET:IN STD_LOGIC; --异步复位控制 LOAD:IN STD_LOGIC; --置数控制 D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK:IN STD_LOGIC;
CO:OUT STD_LOGIC; --进位输出
QH:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0); --输出高4位 QL:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); --输出低4位 END ENTITY CNTM60; ARCHITECTURE ART OF CNTM60 IS BEGIN
CO<=‘1’WHEN(QH=\ QL=\‘1’)ELSE'0'; --进位输出的产生 PROCESS(CLK,NRESET) IS BEGIN
IF(NRESET=‘0’)THEN --异步复位
QH<=\; QL<=\;
ELSIF(CLK'EVENT AND CLK=‘1’)THEN --同步置数 IF(LOAD=‘1’)THEN
QH<=D(7 DOWNTO 4); Q L<=D(3 DOWNTO 0); ELSIF(CI=‘1’)THEN --模60的实现 IF(QL=9)THEN
QL<=\; IF(QH=5)THEN
QH<=\;
ELSE --计数功能的实现
QH<=QH+1;
END IF;