0

我刚开始 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;
4

2 回答 2

2

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

现在,您有四个低活性挖掘它为每个数字启用 DIGEN_L (顺便说一句,为什么你的向量有五个位?)

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

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 ,您将看到所有四个数字都显示它们各自的数字,因为视觉暂留。

但是,在您的示例中,您将从只有一个数字开始,未来的任务将是显示两个或更多数字,您将在其中学习如何多路复用,并可能关注用于调暗单个数字的脉宽调制。

于 2014-02-02T18:26:42.837 回答
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;
于 2015-12-03T23:40:55.143 回答