LED矩阵行位不移位

时间:2019-05-31 14:36:21

标签: vhdl

我是VHDL的新手,我正在尝试使用led矩阵(8x8)做一个简单的应用程序。我的目标是打开矩阵的LED,以便可以看到笑脸。出于某种原因,所有LED都没有亮起。

为了查看问题所在,我尝试通过注释case语句并在该语句之前提供cols <=“ 00000000”来一次打开每一行的所有led,结果是打开的唯一一行是首先,它保持每秒打开和关闭的状态。

我做了分频器1秒钟,只是看代码是否正常工作。

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.std_logic_unsigned.all;

entity main is
    Port ( clk : in STD_LOGIC;
           rows : out STD_LOGIC_VECTOR (7 downto 0);
           cols : out STD_LOGIC_VECTOR (7 downto 0));
end main;

architecture Behavioral of main is

signal count: std_logic_vector(7 downto 0):= "00000001";
signal clk1Hz: std_logic_vector(26 downto 0);

begin

process(clk)
begin
    if rising_edge(clk) then
        if clk1Hz = X"5F5E0FF" then
            clk1Hz <= "000" & X"000000";
        else
            clk1Hz <= clk1Hz + 1;
        end if;

        if clk1Hz(26) = '1' then
            if count = "10000000" then
                count <= "00000001";
             else 
                count(7 downto 1) <= count(6 downto 0);
                count(0) <= '0';
            end if;

         rows <= count;

        case count is
            when "00000001" => cols <= "11111111";
            when "00000010" => cols <= "11011011";
            when "00000100" => cols <= "11011011";
            when "00001000" => cols <= "11111111";
            when "00010000" => cols <= "00111100";
            when "00100000" => cols <= "10000001";
            when "01000000" => cols <= "11000011";
            when "10000000" => cols <= "11111111";
            when others => cols <= "11111111";
         end case;
     end if;


    end if;  


end process;
end Behavioral;

2 个答案:

答案 0 :(得分:1)

您是否意识到if clk1Hz(26) = '1' then从X“ 4000000”到X“ 5F5E0FF”仍然是正确的?
您最有可能只想更改X的确切“ 4000000”值,不是吗?而且不是连续三分之一的时间...

答案 1 :(得分:0)

我可以告诉你没有模拟这个。 clk1Hz信号未初始化,也未复位。没有它,它将不会在sim中旋转,因为它将初始化为X。但是,在硬件上,它将工作得很好。

因此,当clk计数器达到x400_0000时,位(26)被置位,并且行/列移位器开始疯狂1/3秒。然后,当clk计数器重置时,所有活动都会停止。 这真的是您想要的吗?通过模拟,我可以看到行和列都正确移位,尽管只有三分之一的时间。

在暂停期间,行在0x80处停止,列在0xFF处。