Я новичок в 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