Vhdl Led矩阵行位不移位
我是VHDL新手,我正在尝试用led矩阵8x8做一个简单的应用程序。我的目标是打开矩阵的LED,这样我就可以看到一张笑脸。由于某些原因,没有一个LED亮起 为了查看出了什么问题,我试图一次打开每条线路上的所有LED,方法是评论案例陈述并给出cols您是否意识到如果clk1Hz26='1',则从X4000000到X5F5E0FF保持为真?Vhdl Led矩阵行位不移位,vhdl,Vhdl,我是VHDL新手,我正在尝试用led矩阵8x8做一个简单的应用程序。我的目标是打开矩阵的LED,这样我就可以看到一张笑脸。由于某些原因,没有一个LED亮起 为了查看出了什么问题,我试图一次打开每条线路上的所有LED,方法是评论案例陈述并给出cols您是否意识到如果clk1Hz26='1',则从X4000000到X5F5E0FF保持为真? 您很可能只想更改精确的X4000000值的计数,不是吗?而且在三分之一的时间里没有持续…我可以告诉你,你没有模拟这个。clk1Hz信号未初始化且未重置。没有这个
您很可能只想更改精确的X4000000值的计数,不是吗?而且在三分之一的时间里没有持续…我可以告诉你,你没有模拟这个。clk1Hz信号未初始化且未重置。没有这个,它不会在sim卡中旋转,因为它初始化为X。然而,在硬件上它可以正常工作 因此,当clk计数器达到x400_0000时,设置了位26,行/列移位器开始疯狂地移动1/3秒。然后,当clk计数器复位时,所有活动停止。 这真的是你想要的吗?我可以从模拟中看出,行和列都在正确移动,尽管只有三分之一秒
暂停期间,行在0x80处停止,列在0xFF处停止。我设法解决了这个问题,您是对的,在x400_0000处,位26设置为1,而不是将其与1进行比较,我必须检查是否上升。不,它很好用。非常感谢。我解决了这个问题,我犯了一个错误,将最后一位与“1”进行了比较,我将该语句替换为上升边,现在一切正常。非常感谢。信息方面,即使rising_edge在模拟中起作用,它也可能不适用于目标失败合成。例如,请参阅,在这种情况下,您可以测试完整值或检查前一个时钟周期中的一位是否为0
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;