第6节 VHDL组合逻辑设计
第6节 VHDL组合逻辑设计
组合逻辑电路
- 组合电路在任一时刻的输出仅取决于该时刻电路的输入,与电路原来的状态无关。即无存储部件。
- 门电路
- 编码器
- 译码器
- 多路选择器
- 比较器
- 加法器
- ……
基本逻辑门
- 基本逻辑门电路是数字逻辑电路的基本电路。
--与门
--或门
--与非门
--或非门
--反相器
--异或门
--……
2输入与非门
- LIBRARY ieee;
USE ieee.std_logic_1164.all;
entity xx1 is
port(a,b: in std_logic;
y: out std_logic);
end xx1;
architecture nand2pp OF xx1 is
begin
y<=a nand b;
end nand2pp;
ARCHITECTURE dataflow OF nand2 IS
BEGIN
PROCESS(a,b)
VARIABLE comb:Std_Logic_Vector(1 DOWNTO 0);
BEGIN
comb:=a&b;
CASE comb IS
WHEN “00”=>y<=‘1’;
WHEN “01”=>y<=‘1’;
WHEN “10”=>y<=‘1’;
WHEN “11”=>y<=‘0’;
WHEN OTHERS=>y<=‘X’;
END CASE;
END PROCESS;
END dataflow;
2输入或非门
- LIBRARY ieee;
use ieee.std_logic_1164.all;
entity nor2 is
port(a,b: in std_logic;
y: out std_logic);
end nor2;
architecture nor_behave of nor2 is
begin
y<=a nor b;
end nor_behave;
library ieee;
use ieee.std_logic_1164.all;
entity xor2 is
port(a,b: in std_logic;
y: out std_logic);
end xor2;
architecture xor_behave of xor2 is
begin
y<=a xor b;
end xor_behave;
编码器
- 编码器可分为两类
--普通编码器
--优先编码器 - 普通编码器:在某一特定时刻,只能对一个输入信号进行编码,并且这种编码器的输入端不允许同一时刻出现两个以上的有效输入信号,否则编码器输出将会出现混乱;
- 优先编码器是指将所有的输入信号按优先级顺序进行排队,当几个输入信号同时出现(有效)时,只对其中优先级最高的一个输入信号进行编码的编码器.
普通编码器
- 例:8-3编码器。对输入的8个信号进行编码操作,然后在输出端以3位二进制码的形式进行输出.输入信号电平为低有效
CASE d IS
WHEN “01111111”=> q<=“111” ;
WHEN “10111111”=> q<=“110” ;
WHEN “11011111”=> q<=“101” ;
WHEN “11101111”=> q<=“100” ;
WHEN “11110111”=> q<=“011” ;
WHEN “11111011”=> q<=“010” ;
WHEN “11111101”=> q<=“001” ;
WHEN “11111111”=> q<=“000” ;
WHEN OTHERS=> q<=“XXX” ;
END CASE;
优先编码器
- if(input(0)='0') then y<="111";
elsif (input(1)='0') then y<="110";
elsif (input(2)='0') then y<="101";
elsif (input(3)='0') then y<=“100”;
elsif (input(4)='0') then y<="011";
elsif (input(5)='0') then y<="010";
elsif (input(6)='0') then y<="001";
elsif (input(7)='0') then y<="000";
end if;
译码器
- 译码器分为几类:
--变量译码器:
-把输入的二进制代码的各种组合状态翻译成对应的输出信号。
--码制变换译码器
-将一种代码变换为另一种代码的电路。
--显示译码器:
-如将数据显示在七段数码管上时的译码。
--地址译码器:
-将译码器输入端的输入地址信号翻译成相应的输出控制信号。
变量译码器
- 又称二进制译码器,把输入的二进制代码的各种组合状态翻译成对应的输出信号。如3-8译码器74LS138。
case indata is
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";
when others=>y<="XXXXXXXX";
end case;
多路选择器
- 多路选择器的逻辑功能是在地址选择信号的控制下从多路输入数据中选择一路数据作为输出端口的输出数据.
- 常见的多路选择器有:
--二选一选择器
-二路输入端口,一路信号选择端口,一路输出端口.
--四选一选择器
-四路输入端口,二路信号选择端口,一路输出端口.
--八选一选择器
-八路输入端口,三路信号选择端口,一路输出端口.
--十六选一选择器
-十六路输入端口,四路信号选择端口,一路输出端口. - 反过程:数据分配器。
例:四选一多路选择器
- process(input,sel)
begin
if(sel="00") then
y<=input(0);
elsif (sel="01") then
y<=input(1);
elsif (sel="10") then
y<=input(2);
else
y<=input(3);
end if;
end process; - 也可以使用其它语句设计多路选择器
--CASE-WHEN语句
--条件信号代入语句
--选择信号代入语句
半加器
- ENTITY half IS
PORT (a, b : IN std_LOGIC;
s,co : OUT std_LOGIC);
END half;
ARCHITECTURE half1 OF half IS
signal c,d :std_logic;
BEGIN
c<=a or b;
d<=a nand b;
co<=not d;
s<=c and d;
end half1;
全加器,由半加器组成,以元件方式调用
- LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY full IS
PORT (a, b,cin : IN std_LOGIC;
s,co : OUT std_LOGIC);
END full;
ARCHITECTURE full1 OF full IS
component half
PORT (a, b : IN std_LOGIC;
s,co : OUT std_LOGIC);
end component;
signal u0_co,u0_s,u1_co:std_logic;
begin
u0:half port map(a,b,u0_s,u0_co);
u1:half port map(u0_s,cin,s,u1_co);
co<=u0_co or u1_co;
end full1;
三态门及数据缓冲器
- 三态门和数据缓冲器是接口电路和总线驱动电路经常用到的器件。
- 三态门:除了逻辑0和逻辑1两个状态以外,还具有高阻输出状态(相当于开路)。
ENTITY tri IS
PORT (din, en : IN std_LOGIC;
dout : OUT std_LOGIC);
END tri;
ARCHITECTURE tri1 OF tri IS
BEGIN
tri_gate: process(din,en)
begin
if (en='1') then
dout<=din;
else
dout<='Z';
end if;
end process;
end tri1;
单向总线缓冲器
- 在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。
- 一个8位的单向总线缓冲器如图所示,8个输入端、8个输出端、一个使能信号,内部有 8个三态门。

双向总线缓冲器
- 双向总线缓冲器用于数据总线的驱动和缓冲,典型的双向总线缓冲器如图所示。
- 图中的双向总线缓冲器有两个数据输入/输出端A和B,一个方向控制端DIR和一个选通端EN。EN=0时双向缓冲器选通。若DIR=0,则A=B,反之则B=A。



