Светодиодные биты строки матрицы не сдвигаются - PullRequest
0 голосов
/ 31 мая 2019

Я новичок в VHDL и пытаюсь сделать простое приложение со светодиодной матрицей (8x8).Моя цель - включить светодиоды матрицы, чтобы я мог видеть улыбающееся лицо.По какой-то причине ни один из светодиодов не включается.

Чтобы увидеть, что не так, я попытался включить все светодиоды в каждой строке за раз, комментируя инструкцию case и давая cols <= "00000000" передутверждение, что результат заключается в том, что единственная строка, которая включается, является первой, она продолжает включаться и выключаться каждую секунду. </p>

Я сделал делитель частоты в течение 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 ]

1 голос
/ 31 мая 2019

Понимаете ли вы, что if clk1Hz(26) = '1' then остается истинным от X "4000000" до X "5F5E0FF"?
Скорее всего, вы хотите изменить счет только на точное значение X "4000000", нет?И не непрерывно в течение 1/3 времени ...

0 голосов
/ 31 мая 2019

Я могу сказать, что вы не симулировали это. Сигнал clk1Hz не был инициализирован и не был сброшен. Без этого он не будет вращаться в симе, поскольку инициализируется в X. Однако на оборудовании он будет работать просто отлично.

Итак, когда ваш счетчик кликов достигает x400_0000, устанавливается бит (26) и ваши переключатели строк / столбцов начинают сходить с ума в течение 1/3 секунды. Затем, когда счетчик clk сбрасывается, вся деятельность прекращается. Это действительно то, что вы хотите? Из симуляции видно, что строки и столбцы смещаются правильно, хотя и только на треть секунды.

Во время паузы строки останавливаются на 0x80, а столбцы на 0xFF.

...