我是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;
答案 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处。