【发布时间】:2014-01-24 17:10:42
【问题描述】:
我是 VHDL 的新手,我想我可以尝试制作一个从属 SPI 设备作为培训,但它的工作方式不如预期。在我当前的代码下方。它的编译和上传都很好,但它没有按预期工作。现在我将 LED 连接到信号“bitnumber”,bitnumber 应该在 CLK 的每个上升沿递增,然后在 SS 引脚拉低时重置为零(表示传输完成),但它没有不要那样做。我已经将我的 Altera DE0-nano 连接到我的 arduino,它只是将 SS 拉低,发送四个时钟脉冲,然后将 SS 拉回高电平,我在每次转换之间设置了 1 秒的延迟。我的 Altera 板上的 LED 确实每秒都会改变它的模式,但它在时钟的上升沿和下降沿都会这样做,而且 LED 模式似乎完全随机,甚至显示一些 LED 处于变暗状态。不过,当 SS 引脚回到高电平时,LED 会变黑,这很好。
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
【问题讨论】: