将端口组合到 bram 接口
combine ports to bram interface
我想使用 BRAM 将 IP 写入 store/read 数据。
到目前为止,我所做的是使用 (C)DMA 从 RAM 中读取内存映射数据并获取 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;
我在 Linux.
上为 Zynq 7020 使用 vivado 2016.4
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;
我想使用 BRAM 将 IP 写入 store/read 数据。
到目前为止,我所做的是使用 (C)DMA 从 RAM 中读取内存映射数据并获取 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;
我在 Linux.
上为 Zynq 7020 使用 vivado 2016.4VHDL 代码中是否缺少某些内容,无法让 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;