VHDL必会基础代码一:组合逻辑电路

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

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值