将端口与bram接口相结合

时间:2017-10-13 14:23:07

标签: vhdl xilinx vivado

我想写一个IP来使用BRAM存储/读取数据。

到目前为止,我使用(C)DMA从RAM中读取内存映射数据并获得AXIS。

然后我在VHDL中创建了一个新的源文件,以接受一侧的AXIS,它就像一个魅力。 另一方面,我想创建一个BRAM接口,但vivado不会为BRAM接口组合端口。

位于“vivado / data / ip / interfaces / bram_v1_0”文件夹中,存在文件“bram_rtl.xml”。 我试图使用xml文件中使用的端口。 特别是带有“必需”标签的端口。

AXI BRAM控制器正在将它们组合在一起,所以我很确定我犯了一个错误。使用与AXI BRAM Controller相同的命名也不起作用。

我的VHDL看起来像这样:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity AXIS_TO_BRAM is
    generic (
        addr_size : integer range 1 to 12 := 10
    );
    Port (
        --axistream
        tdata : in std_logic_vector(31 downto 0);
        tkeep : in std_logic_vector(3 downto 0);
        tlast : in std_logic;
        tready : out std_logic;
        tvalid : in std_logic;
        aclk : in std_logic;    

        --BRAM
        en : out std_logic;
        dout : in std_logic_vector(31 downto 0);
        din : out std_logic_vector(31 downto 0);
        we : out std_logic;
        addr : out std_logic_vector(addr_size-1 downto 0);
        clk : out std_logic;
        rst : out std_logic);
end AXIS_TO_BRAM;

architecture Behavioral of AXIS_TO_BRAM is

begin    
end Behavioral;

我在Linux上使用vivado 2016.4 for Zynq 7020。

VHDL代码中是否缺少vivado将我的端口识别为BRAM接口,或者这是此版本中的错误?

感谢您的任何想法

1 个答案:

答案 0 :(得分:5)

这是完整的工作和可综合的VHDL代码。

Vinay Madapura的评论中给出了正确的解决方案(或至少是重要部分)。

预定义的接口可以在$ vivado / $ version / data / ip / interfaces文件夹中找到。

我希望这段代码可以帮助其他人解决类似的问题。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity AXIS_TO_BRAM is
generic(
    addr_size : integer range 1 to 12 := 10
);
Port(
    tdata : in std_logic_vector(31 downto 0);
    tkeep : in std_logic_vector(3 downto 0);
    tlast : in std_logic;
    tready : out std_logic;
    tvalid : in std_logic;
    aclk : in std_logic;

    addra : out std_logic_vector(addr_size-1 downto 0);
    clka : out std_logic;
    dina : out std_logic_vector(31 downto 0);
    douta : in std_logic_vector(31 downto 0);
    ena : out std_logic;
    rsta : out std_logic;
    wea : out std_logic_vector(0 downto 0)
);
end AXIS_TO_BRAM;

architecture Behavioral of AXIS_TO_BRAM is

    ATTRIBUTE X_INTERFACE_INFO : string;
    ATTRIBUTE X_INTERFACE_INFO OF addra: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR";
    ATTRIBUTE X_INTERFACE_INFO OF clka: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK";
    ATTRIBUTE X_INTERFACE_INFO OF dina: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN";
    ATTRIBUTE X_INTERFACE_INFO OF douta: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT";
    ATTRIBUTE X_INTERFACE_INFO OF ena: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA EN";
    ATTRIBUTE X_INTERFACE_INFO OF rsta: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA RST";
    ATTRIBUTE X_INTERFACE_INFO OF wea: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA WE";

begin
end Behavioral;