BCD到7段解码器

时间:2014-02-02 09:20:38

标签: vhdl led segment decoder bcd

我刚开始进行VHDL编码,现在必须将BCD编码为7段解码器。我正在进行行为设计(这是必需的)但是现在我在如何编码显示器时遇到了麻烦。

我知道如何用一个输入和一个输出对这个解码器进行编码,但我们有一个名为DIGEN_L的第二个输出用作我们的显示器。它是一个有源低总线输出,可以在我们的电路板上显示7段显示器的每个数字。

他告诉我们只是把它编程为'01110所以第四个数字总是打开而其他三个数字都关闭。

我不知道如何将DIGEN_L编码到我的代码中,并且不知道上面的语句实际意味着什么(代码明智)。有人可以帮忙吗? 如果需要对此问题做出任何澄清,请发表评论并进行编辑。

这是我的代码:

library IEEE;
ise IEEE.std_logic_1164.all;
library unisim;
use unisim.vcomponents.all;

entity decoder is
    port( BCD: in STD_LOGIC_VECTOR (3 downto 0);
        ( SEGS_L: out STD_LOGIC_VECTOR(5 downto 0);
        ( DIGEN_L: out STD_LOGIC_VECTOR(3 downto 0));
end decoder;

architecture decoder_arc of decoder is
    begin
       process(BCD)
          begin
         DIGEN_L <= "0111";
         case BCD is
            when "0000"=> SEGS_L <="1111110";  -- '0'
            when "0001"=> SEGS_L <="0110000";  -- '1'
            when "0010"=> SEGS_L <="1101101";  -- '2'
                when "0011"=> SEGS_L <="1111001";  -- '3'
                when "0100"=> SEGS_L <="0110011";  -- '4' 
            when "0101"=> SEGS_L <="1011011";  -- '5'
            when "0110"=> SEGS_L <="1011111";  -- '6'
            when "0111"=> SEGS_L <="1110000";  -- '7'
            when "1000"=> SEGS_L <="1111111";  -- '8'
            when "1001"=> SEGS_L <="1111011";  -- '9'
            when others=> SEGS_L <="-";
             end case;
       end process;
end decoder_arc;

2 个答案:

答案 0 :(得分:2)

所以基本上,你有一个4位数的显示器,每个数字是7段显示器。

现在,您有四个 l ow-active 挖掘 en 每个数字的DIGEN_L。 (顺便说一下,为什么你的矢量有五位?)

这里的想法是你像往常一样将BCD编码为7-seg解码器。所以我们有我们的实体

entity bcd2sevseg {

    BCD       : in std_logic_vector(3 downto 0);
    SEVEN_SEG : out std_logic_vector(6 downto 0);
    DIGEN_L   : out std_logic_vector(3 downto 0)

};

现在,您说了如何编码实际的解码器,因此BCD和SEVEN_SEG应该清楚。你的教授要求你为DIGEN_L提供一个静态值。所以,请继续这样做:

DIGEN_L <= "0111";

这里的想法是所有7段显示器为各个段共享相同的信号(如果愿意,则为SEVEN_SIG)。但是,LED的所有漏极都连接到单独的线路DIGEN_L(或编程为由DIGEN_L控制的晶体管)。 因此,如果您在每个开关上提供不同的数字时快速切换DIGEN_L ,您将看到所有四位数都显示其各自的数字,因为视觉持续存在。

但是,在您的示例中,您将从只有一个数字开始,将来的分配将显示两个或更多数字,您将学习如何多路复用并可能关注自己的脉冲宽度调制以调节个体位数。

答案 1 :(得分:1)

LIBRARY IEEE;   
USE IEEE.STD_LOGIC_1164.ALL;    
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL;


ENTITY seven_segment IS

    port(BCD: in std_logic_vector(3 downto 0);
        clk,reset: in std_logic;
        sseg: out std_logic_vector(6 downto 0));

END seven_segment;

ARCHITECTURE SSD OF seven_segment IS

signal temp: unsigned(6 downto 0);

BEGIN

process(clk,temp)

BEGIN
if reset = '1' OR BCD > "1001" then
    temp <= (others => '0');

    elsif rising_edge(clk) then
                              -- abcdefg
elsif BCD = "0000" then temp <= "1111110"; -- 0
elsif BCD = "0001" then temp <= "0110000"; -- 1
elsif BCD = "0010" then temp <= "1101101"; -- 2
elsif BCD = "0011" then temp <= "1111001"; -- 3
elsif BCD = "0100" then temp <= "0110011"; -- 4
elsif BCD = "0101" then temp <= "1011011"; -- 5
elsif BCD = "0110" then temp <= "1011111"; -- 6
elsif BCD = "0111" then temp <= "1110000"; -- 7
elsif BCD = "1000" then temp <= "1111111"; -- 8
elsif BCD = "1001" then temp <= "1111011"; -- 9

end if;

sseg <= std_logic_vector(temp);

END process;
END SSD;