2017-10-13 155 views
3

我想寫一個IP來存儲/讀取數據使用BRAM。結合端口bram接口

我到目前爲止使用(C)DMA從內存中讀取內存映射數據並獲得一個AXIS。

然後,我用VHDL創建了一個新的源文件,以接受AXIS的工作方式,就像魅力一樣。 另一方面,我想創建一個BRAM接口,但是vivado並沒有爲BRAM接口組合端口。

位於「vivado/data/ip/interfaces/bram_v1_0」文件夾中的文件「bram_rtl.xml」存在。 我試圖使用xml文件中使用的端口。 特別是帶有「required」標籤的端口。

AXI BRAM控制器正在將它們組合在一起,所以我很確定我犯了一個錯誤。使用與AXI BRAM控制器相同的命名也不起作用。

我的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; 

我使用vivado 2016.4 Linux上ZYNQ 7020。

VHDL代碼中是否缺少某些東西讓vivado將我的端口識別爲BRAM接口,或者這是此版本中的錯誤?

感謝您的任何意見

+0

你看過\ Vivado \ 2016.4 \ data \ ip \ xilinx \ axi_bram_ctrl_v4_0 \ component.xml嗎?在那裏你可以看到端口連接的方式。 – JHBonarius

+1

我試過了,但不幸的是名字是我已經嘗試過的。 也許這隻有在我將vhdl代碼打包在一個IP中併爲其創建一個component.xml的情況下才有可能。 –

+2

您必須在您的架構中添加屬性,如'ATTRIBUTE X_INTERFACE_INFO OF dout:SIGNAL IS「xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT」;'。然後它將被推斷爲Xilinx的BRAM端口。或者創建一個IP並將您的BRAM端口映射到現有的Xilinx接口 –

回答

4

這裏是完整的工作和可綜合的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;