写入avalon从模块的问题

时间:2017-08-18 23:04:25

标签: vhdl fpga intel-fpga nios

我正在研究一个辅助项目,我需要能够将数据写入avalon从模块,以便在DE0板上运行的nios系统上从2个不同的输入中选择数据。经过多次努力,我无法将运行在nios核心上的C应用程序的数据写入avalon slave。我已经验证我能够通过使用一些硬编码值从从属设备读取数据。我还验证了我的应用程序正在运行,因为我在jtag uart上看到了我期望的消息,按钮,LED和LED显示屏按预期工作。

我简化了我的奴隶,以便我直接读回写入它的数据。 VHDL代码是:

override func prepareForReuse() {
    super.prepareForReuse() 
    //Reset label to clear color
    self.highestBacLabel.textColor = UIColor.clear
}

C代码是

library ieee;
use ieee.std_logic_1164.all;
USE IEEE.NUMERIC_STD.ALL;

entity FIFO_Control is
    port (clk : IN std_logic; 
            reset : IN std_logic;
            read : IN std_logic; 
            readdata : OUT std_logic_vector(7 DOWNTO 0); 
            write : IN std_logic; 
            writedata : IN std_logic_vector(7 DOWNTO 0);
            din1 : in std_logic_vector(4 DOWNTO 0);
            din2 : in std_logic_vector(4 DOWNTO 0)
            );
end FIFO_Control;


architecture FIFO_CTRL of FIFO_Control is

    signal int_data : std_logic_vector(7 DOWNTO 0) := "00000000"; -- a hard coded test value to check the read works

    begin
        with (write) SELECT
            int_data <= writedata when '1',
                            "01010101" when others;

            readdata <= int_data;


end FIFO_CTRL;

我无法理解为什么我无法向avalon slave&#34; Fifo_control&#34;写任何东西。有人可以建议问题是什么吗?

1 个答案:

答案 0 :(得分:1)

如果您查看实体/组件上的端口声明,然后查看代码,您可能已经看到自己做错了,因为您没有使用所有端口。

因此,您的问题表明您要将数据写入Avalon slave。因此,您希望组件记住您编写的数据(即内存)。但是代码中没有内存组件。只有一个组合表达。

在设计Avalon组件时,您应该阅读Avalon Interface Specification

因此,阅读文档,您会看到您应该拥有写端口的进程/语句和读端口的进程。每个都需要一个时钟周期来处理(如果读取延迟为1)。 E.g。

write_proc: process(clk) begin
    if rising_edge(clk) then
        if write = '1' then
            int_data <= writedata;
        end if;
        -- reset statement
        if reset = '1' then
            int_data <= (others => '0');
        end if;
    end if;
end process;

read_proc: process(clk) begin
    if rising_edge(clk) then
        if read = '1' then
            readdata <= int_data;
        end if;
        -- reset statement
        if reset = '1' then
            readdata <= (others => '0');
        end if;
    end if;
end process;