我是VHDL的新手,我想我可以尝试将一个从属SPI设备作为培训,但它并没有像预期的那样工作。在我当前的代码下面。它的编译和上传就好了,但它没有按预期工作。现在我将LED连接到信号" bitnumber",bitnumber应该在CLK的每个上升沿递增,然后在SS引脚拉低时复位为零(表示传输完成) ,但它没有做到这一点。我已将Altera DE0-nano连接到我的arduino,它只是将SS拉低,发送四个时钟脉冲,然后将SS拉回高电平,我在每次转换之间放置1s延迟。我的altera板上的LED每秒都会改变它的模式,但它在时钟的上升沿和下降沿都是这样,而且led模式似乎完全随机,甚至显示一些处于暗淡状态的LED。当SS引脚返回HIGH时,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
答案 0 :(得分:0)
我首先将主要流程更改为:
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)。然后风险是同时改变并引起冲突:两个信号试图控制/改变相同的输出。以上方式更好,应该可靠。
其次,使用增加位数 bitnumber&lt; = bitnumber + 1; 请注意,使用不带引号的1。引号表示我理解的二进制“1”和“0”。
祝你好运!!