Альтера DE0-нано. Пытаюсь сделать ведомое устройство SPI

Я новичок в VHDL, и я подумал, что могу попытаться создать ведомое устройство SPI в качестве обучения, но оно не работает так, как ожидалось. Ниже моего текущего кода. Он компилируется и загружается просто отлично, но он не работает должным образом. Прямо сейчас у меня есть светодиоды, подключенные к сигналу «битовое число», битовое число должно увеличиваться на каждом нарастающем фронте CLK, а затем сбрасываться до нуля, когда вывод SS вытягивается НИЗКИМ (что указывает на то, что передача завершена), но это не так. не делай этого. Я подключил свой Altera DE0-nano к моему Arduino, который просто вытягивает SS LOW, отправляет четыре тактовых импульса, а затем возвращает SS обратно в высокий уровень, я установил задержку 1 с между каждым переходом. Светодиоды на моей плате Altera меняют свой шаблон каждую секунду, но это происходит как на переднем, так и на заднем фронте тактового сигнала, а также рисунок светодиодов кажется совершенно случайным, даже показывая некоторые светодиоды в затемненном состоянии. Светодиоды становятся черными, когда контакт SS возвращается в состояние HIGH, это хорошо.

enter code here
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SPI2 is
PORT (LED : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
                GPIO_0 : IN STD_LOGIC_VECTOR(7 DOWNTO 0));
end SPI2;
architecture SPI2_beh of SPI2 is
signal SPIdataregister : STD_LOGIC_VECTOR(7 DOWNTO 0);
signal bitnumber : STD_LOGIC_VECTOR(7 DOWNTO 0);
begin
LED <= bitnumber;
        process(GPIO_0(5), GPIO_0(3))
        begin
                if ((GPIO_0(5)) = '1') then
                        bitnumber <= (bitnumber + '1');
                end if;
                if ((GPIO_0(3)) = '1') then
                        bitnumber <= "00000000";               
                end if;
        end process;
        process(bitnumber)
        begin
                case bitnumber is
                        when "00000001" => SPIdataregister(0) <= GPIO_0(7);
                        when "00000010" => SPIdataregister(1) <= GPIO_0(7);
                        when "00000011" => SPIdataregister(2) <= GPIO_0(7);
                        when "00000100" => SPIdataregister(3) <= GPIO_0(7);
                        when "00000101" => SPIdataregister(4) <= GPIO_0(7);
                        when "00000110" => SPIdataregister(5) <= GPIO_0(7);
                        when "00000111" => SPIdataregister(6) <= GPIO_0(7);
                        when "00001000" => SPIdataregister(7) <= GPIO_0(7);
                        when others => SPIdataregister <= SPIdataregister;
                end case;
        end process;
end SPI2_beh;
enter code here

person Plecto    schedule 24.01.2014    source источник


Ответы (1)


Я бы начал с изменения основного процесса на:

    process(GPIO_0(5), GPIO_0(3))
            variable change_flag : STD_LOGIC := 1;
    begin
            if GPIO_0(3) = '1' then
                    bitnumber <= "00000000";   
            else 
                    if GPIO_0(5) = '0' --btw here, GPIO_0(3) = '0' also
                            change_flag := '1';
                    else --btw here, GPIO_0(3) = '0' and GPIO_0(5) = '1'
                            if change_flag = '1' then
                                    bitnumber <= bitnumber + 1;
                                    change_flag := '0';
                            end if;
                    end if;
            end if;
    end process;

Переменная change_flag вводит память, чтобы гарантировать, что процесс реагирует только один раз конкретно на нарастающий фронт GPIO_0(5). Без такой реализации памяти вы могли бы получить желаемый эффект, имея два процесса: один зависит от GPIO_0(5), а другой зависит от GPIO_0(3). В этом случае существует риск одновременного изменения и возникновения конфликта: два сигнала пытаются контролировать/изменять один и тот же вывод. Вышеупомянутый способ лучше и должен быть надежным для ваших целей.

Во-вторых, увеличить битовое число, используя битовое число ‹= битовое число + 1; обратите внимание, используйте 1 без кавычек. Насколько я понимаю, кавычки обозначают двоичные «1» и «0».

Удачи!!

person Bouen P.    schedule 27.07.2014