【问题标题】:Altera DE0-nano. Struggling to make a SPI slave deviceAltera DE0-纳米。努力做一个SPI从设备
【发布时间】: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

【问题讨论】:

    标签: process spi


    【解决方案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)。那么风险是同时改变并导致冲突:两个信号试图控制/改变相同的输出。上述方法更好,并且对于您的目的应该是可靠的。

    其次,使用 位号

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多