结合端口bram接口
问题描述:
我想写一个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接口,或者这是此版本中的错误?
感谢您的任何意见
答
这里是完整的工作和可综合的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;
你看过\ Vivado \ 2016.4 \ data \ ip \ xilinx \ axi_bram_ctrl_v4_0 \ component.xml吗?在那里你可以看到端口连接的方式。 – JHBonarius
我试过了,但不幸的是名字是我已经尝试过的。 也许这只有在我将vhdl代码打包在一个IP中并为其创建一个component.xml的情况下才有可能。 –
您必须在您的架构中添加属性,如'ATTRIBUTE X_INTERFACE_INFO OF dout:SIGNAL IS“xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT”;'。然后它将被推断为Xilinx的BRAM端口。或者创建一个IP并将您的BRAM端口映射到现有的Xilinx接口 –