1.1概述——电路无记忆功能
从逻辑上讲,组合电路在任一时刻的输出状态仅由该时刻的信号决定,而与电路原来的状态无关。
从结构上讲,组合电路都是单纯由逻辑门组成,且输出不存在反馈路径。(不含存储单元)
常见的组合逻辑电路:简单门电路、选择器、译码器、三态门等
1.2译码器
实现译码的组合逻辑电路称为译码器。它的输入是一组二进制代码,输出是一组高低电平信号。每输入一组不同的代码,只有一个输出呈有效状态。其功能是对具有特定含义的输入代码进行“翻译”,将其转换成相应的输出信号。
74LS138译码器引脚图如下所示,A0、A1、A2为3个二进制输入端,右侧为输出端,低电平有效,S0、S1、S2为选通信号,只有当S0=1&&S1=0&&S2=0时,译码器才正常译码。这里有效电平是这么理解的,有在引脚处加⭕就是低电平有效,没加就是高电平有效。
case语句实现
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY decoder_38 is
PORT(S0,S1,S2,A0,A1,A2 : in STD_LOGIC;
y : out STD_LOGIC_VECTOR(7 downto 0)
);
END decoder_38;
ARCHITECTURE behave OF decoder_38 is
SIGNAL indata : STD_LOGIC_VECTOR(2 downto 0);
BEGIN
indata <= A2 & A1 & A0;--将输入信号合并并赋值
PROCESS(indata,S0,S1,S2)
IF( S0='1' and S1='0' and S2='0') THEN
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;
ELSE y<="11111111";
END IF;
END PROCESS;
END behave;
if语句实现
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY decoder_38 is
PORT(S0,S1,S2,A0,A1,A2 : in STD_LOGIC;
y : out STD_LOGIC_VECTOR(7 downto 0)
);
END decoder_38;
ARCHITECTURE behave OF decoder_38 is
SIGNAL indata : STD_LOGIC_VECTOR(2 downto 0);
BEGIN
indata <= A2 & A1 & A0;--将输入信号合并并赋值
PROCESS(indata,S0,S1,S2)
IF(S0='1' and S1='0' and S2='0') then
IF(indata="000") then y<="11111110";
ELSIF(indata="001") then y<="11111101";
ELSIF(indata="010") then y<="11111011";
ELSIF(indata="011") then y<="11110111";
ELSIF(indata="100") then y<="11101111";
ELSIF(indata="101") then y<="11011111";
ELSIF(indata="110") then y<="10111111";
ELSIF(indata="111") then y<="01111111";
ELSE y<="11111111";
END IF;
END PROCESS;
END behave;
1.3优先级编码器
74LS148是一个8输入,3位二进制码输出的优先级编码器。当某一个输入有效时(低电平),就可以输出一个对应的3位二进制编码。当同时有几个输入有效时,将输出优先级最高的那个输入对应的二进制编码。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY encoder IS
PORT(input : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END encoder;
ARCHITECTURE behave OF encoder IS
BEGIN
PROCESS(input)
BEGIN
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";
ELSE y<="XXX";
END IF;
END PROCESS;
END behave;
IF语句是按顺序从上到下判断条件的,因此优先级编码器应该使用IF语句。IF语句可不用将条件全部举例完毕。但是case语句不同,无先后顺序,且条件同时只能满足一个,所以必须把全部有可能都出现的情况举例出来(用others)。
1.4加法器
加法器分为半加器和全加器。半加器:不考虑由低位来的进位,只有本位两个数相加。全加器:除本位两个数相加外,还要加上从低位来的进位数。
半加器
逻辑图如下所示。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY halfadder IS
PORT( X,Y : IN STD_LOGIC;
Sum,Carry :OUT STD_LOGIC);
END halfadder;
ARCHITECTURE behave OF halfadder IS
BEGIN
Sum <= X or Y;
Carry <= X and Y;
END behave;
全加器
全加器逻辑图如下所示。由于全加器考虑低位进位,所以全加器有三个输入端。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY fullcoder IS
PORT( X,Y,Z : IN BIT;
Sum,Carry : OUT BIT);
END fullcoder;
ARCHITECTURE behave OF fullcoder IS
BEGIN
Sum <= X xor Y xor Z;
Carry <= (X and Y) or (Y and Z) or (Z and X);
END behave;
加法器的模块化
当全加器设计完成后,采用模块化设计方法,将全加器作为一个组件(component)定义,加入名为components的程序包中,以后可以统一将设计的组件放在这个程序包中。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE components IS
COMPONENT fulladd IS
PORT(a,b,ci : IN STD_LOGIC;
sum,co : OUT STD_LOGIC);
END fulladd;
END components;
四位串行进位全加器的设计
根据模块化设计思想,多位的加法器可将全加器作为一个基本组件多个级联,如图所示。在设计中,使用Component语句,与Port Map语句结合搭建出较为复杂的电路。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE work.components.all;
ENTITY fadd4 IS
PORT(a,b : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ci : IN STD_LOGIC;
co : OUT STD_LOGIC;
sum : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END fadd4;
ARCHITECTURE behave OF fadd4 IS
SIGNAL ci_ns : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
U0:fadd PORT MAP (a(0),b(0),ci,ci_ns(0),sum(0));
U1:fadd PORT MAP (a(1),b(1),ci_ns(0),ci_ns(1),sum(1));
U2:fadd PORT MAP (a(2),b(2),ci_ns(1),ci_ns(2),sum(2));
U3:fadd PORT MAP (a(3),b(3),ci_ns(2),co,sum(3));
END behave;
1.5 4选1多路选择器
多路选择器是数据选择器的别称。根据需要,在地址选择信号的控制下,从多路输入数选择任意一路数据作为输出端口的输出数据。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
PORT(input : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
a,b : IN STD_LOGIC;
y : OUT STD_LOGIC);
END mux4;
ARCHITECTURE behave OF mux4 IS
SIGNAL sel : STD_LOGIC_VETCTOR(1 DOWNTO 0);
BEGIN
sel <= b & a;
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);
ELSEIF(sel="11") then y<=input(3);
ELSE y<='Z';
END IF;
END PROCESS;
END behave;
1.6三态门
三态门的逻辑门输出有三种状态:高电平、低电平、高阻态(相当于隔断状态)。三态门都有一个EN控制使能端,来控制门电路的通断。使能端使能,则该运算器正常执行功能;否则,输出为高阻态‘Z’。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY tri_gate IS
PORT(din,en : IN STD_LOGIC;
dout : OUT STD_LOGIC);
END tri_gate;
ARCHITECTURE behave OF tri_gate IS
BEGIN
PROCESS(din,en)
BEGIN
IF(en='1') then dout<=din;
ELSE dout<='Z';
END IF;
END PROCESS;
END behave;
---------------------------------------------------------------------------------------------------------------------------------
本篇为视频笔记,原复习课视频链接为:【VHDL】 复习课(1)_哔哩哔哩_bilibili