VHDL:数字逻辑实验之基本组合逻辑部件的设计实验报告(精心书写,代码绝对正确,思路清晰)

实验题目:

        基本组合逻辑部件的设计

实验目的:

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数据选择器等)……

以上就是本次我给大家分享的全部内容啦,喜欢的记得点个赞收藏哦!感谢!

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寥若晨星666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值