实验题目:
基本组合逻辑部件的设计
实验目的:
1. 加深理解译码器和编码器的工作原理;
2. 熟悉VHDL实现译码器和编码器的方法;
3. 掌握数据选择器的逻辑功能和特点;
4. 熟悉VHDL实现数据选择器的方法;
5. 进一步熟悉EDA软件——Quartus。
实验要求:
1. 设计4-16译码器,要求:
(1)具有使能端。使能端有效时,译码器根据输入状态,使输出通道中相应的一路有信号输出(为‘0’),其余为‘1’;使能端无效时,译码器被禁止,所有输出无效(为‘1’)。
(2) VHDL编程实现,在QuartusⅡ环境中进行仿真。
2. 设计BCD码编码器,要求:
(1)具有使能端。使能端有效时,编码器处于正常工作状态,根据输入(10个数码之一),产生4位输出。
(2) VHDL编程实现, QuartusⅡ环境中仿真。
3.设计4路数据选择器,要求:
(1)输入:4个数据,每个数据是16位的二进制数;选择控制端2位,根据控制端的二进制编码,从4个输入数据中选择一个需要的数据送到输出端;使能端,当使能端有效时,输入的4个数据中的某个数据输送到输出端,当使能端无效时,输出为高阻态“ZZZZZZZZZZZZZZZZ”。
(2) 输出:一个16位的二进制数或者高阻态。
(3) VHDL编程实现,在QuartusⅡ环境中进行仿真。
实验步骤:
1. 译码器
(1)逻辑符号
(2)具体设计
library ieee;
use ieee.std_logic_1164.all;
entity beyimaqi is
port( S: in bit;
A: in std_logic_vector(3 downto 0);
Y: out std_logic_vector(15 downto 0)
);
end entity beyimaqi;
architecture yima of beyimaqi is
begin
process(A)
begin
If S = '1' then
Y <= "1111111111111111";
case A is
when "0000" => Y(0) <= '0';
when "0001" => Y(1) <= '0';
when "0010" => Y(2) <= '0';
when "0011" => Y(3) <= '0';
when "0100" => Y(4) <= '0';
when "0101" => Y(5) <= '0';
when "0110" => Y(6) <= '0';
when "0111" => Y(7) <= '0';
when "1000" => Y(8) <= '0';
when "1001" => Y(9) <= '0';
when "1010" => Y(10) <= '0';
when "1011" => Y(11) <= '0';
when "1100" => Y(12) <= '0';
when "1101" => Y(13) <= '0';
when "1110" => Y(14) <= '0';
when "1111" => Y(15) <= '0';
when others => Y <= "ZZZZZZZZZZZZZZZZ";
end case;
else Y <= "ZZZZZZZZZZZZZZZZ";
end if;
end process;
end yima;
(3)测试及分析
S是使能端,A是4位的输入,Y是16位的输出。
当使能端S为1时:当输入A为“0000”,则输出Y的第1位变成0,其他位都为1;当输入A为“0001”,则输出Y的第2位变成0,其他位都为1;当输入A为“0010”,则输出Y的第3位变成0,其他位都为1;以此类推,直到当输入A为“1111”,则输出Y的第16位变成0,其他位都为1。当使能端S为0时:直接输出Y为16位的‘1’,代表输出无效。
上图中,前面当使能端S为0时,输出Y为“1111111111111111”,代表输出无效。后面使能端S为1的情况,输入A为“0111”,说明要把输出Y的第8位变成0,其他位都为1,即输出Y为“1111111101111111”。
2. 编码器
(1)逻辑符号
(2)具体设计
library ieee;
use ieee.std_logic_1164.all;
entity bcdbianma is
port(I : in std_logic_vector(9 downto 0);
E : in std_logic;
O : buffer std_logic_vector(3 downto 0)
);
end bcdbianma;
architecture bcd of bcdbianma is
begin
process(E,I,O)
begin
if E='1' then
if I = "0000000001" then O <= "0000";
elsif I = "0000000010" then O <= "0001";
elsif I = "0000000100" then O <= "0010";
elsif I = "0000001000" then O <= "0011";
elsif I = "0000010000" then O <= "0100";
elsif I = "0000100000" then O <= "0101";
elsif I = "0001000000" then O <= "0110";
elsif I = "0010000000" then O <= "0111";
elsif I = "0100000000" then O <= "1000";
elsif I = "1000000000" then O <= "1001";
else O <= "ZZZZ";
end if;
else O <= "ZZZZ";
end if;
end process;
end bcd;
(3)测试及分析
I是输入,E是使能端(高电平有效),O是8421码的BCD编码的输出。
当使能端E为1时:看输入I,当I的第1位是1,其余位是0时,将“0000”赋值给输出O;当I的第2位是1,其余位是0时,将“0001”赋值给输出O;当I的第3位是1,其余位是0时,将“0010”赋值给输出O;以此类推,直到当I的第10位是1,其余位是0时,将“1001”赋值给输出O;其他情况,我个人选择把高阻态赋值给输出O。当使能端E为0时,编码器不工作,直接给输出O赋值高阻态。
上图中,最前面一段时间使能端为0,编码器不工作,直接输出“ZZZZ”高阻态。中间一段时间使能端有效,编码器处于工作状态,此时输入I的第8位是1,其他位都是0,所以把“0111”赋值给输出O。最后面一段时间使能端有效,编码器处于工作状态,此时输入I的第4位是1,其他位都是0,所以把“0011”赋值给输出O。
3. 数据选择器
(1)逻辑符号
(2)具体设计
library ieee;
use ieee.std_logic_1164.all;
entity choice4lu is
port( E:in bit;
a, b, c, d:in std_logic_vector(15 downto 0);
s1,s2:in std_logic;
y :out std_logic_vector(15 downto 0)
);
end entity choice4lu;
architecture choice of choice4lu is
signal S : std_logic_vector(1 downto 0);
begin
process(s2,s1)
begin
if E = '1' then
S <= s2 & s1;
case(S) is
when "00" => y <= a;
when "01" => y <= b;
when "10" => y <= c;
when "11" => y <= d;
when others => y <= null;
end case;
else
y <= "ZZZZZZZZZZZZZZZZ";
end if;
end process;
end choice;
(3)测试及分析
E为使能端,a、b、c、d是四个16位的二进制数,s1、s2是两个选择控制端,y是16位的二进制输出。
当使能端E为1时,从a、b、c、d四个数选择1个输送到输出y;当使能端E为0时,输出y为高阻态“ZZZZZZZZZZZZZZZZ”。
上图中,前面当使能端E为0时,直接输出y为16位的高阻态,即“ZZZZZZZZZZZZZZZZ”。后面是使能端E为1的情况,两个选择控制端s2、s1为“01”,根据我写的代码,得把b赋值给输出y,而因为输入b为“0010010010010010”,所以最终的输出y也是“0010010010010010”。其他情况类似。
总结与思考
第一个是4-16译码器,有5个输入,其中1个是使能端(高电平有效),有16个输出;第二个是BCD码编码器,有11个输入,其中1个是使能端(高电平有效),有4个输出;
第三个是4路数据选择器,有67个输入,其中16个代表a的16位,16个代表b的16位,16个代表c的16位,16个代表d的16位,2个是选择控制端,1个使能端,有16个输出。经过我的仔细思考和参考部分相关资料,以上三个基本组合逻辑部件都能成功实现各种的功能(VHDL代码能成功编译通过,仿真的结果也是正确的)。经过这次的实验,我加深理解了译码器和编码器的工作原理,熟悉了VHDL实现译码器和编码器的方法,掌握了数据选择器的逻辑功能和特点,熟悉了VHDL实现数据选择器的方法,进一步熟悉了EDA软件——Quartus。
组合逻辑部件的用途:加法器(半加器、全加器、超前进位加法器等),比较器(多位数值比较器等),译码器(二进制译码器、显示译码器、二-十进制译码器等),编码器(普通编码器、优先编码器等),选择器(4选1数据选择器等)……
以上就是本次我给大家分享的全部内容啦,喜欢的记得点个赞收藏哦!感谢!