Altera DE0-nano。苦苦挣扎制造SPI从设备

时间:2014-01-24 17:10:42

标签: process spi

我是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

1 个答案:

答案 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”。

祝你好运!!