vhdl - 在 VHDL 中为多个 IP 使用相同的组件
问题描述
我的 Vivado 项目中有多个相同 IP 的实例。它们都公开相同的端口,但内部配置不同。假设我现在有三个
- axi_data_samples_0_FIFO
- axi_data_samples_1_FIFO
- axi_data_samples_2_FIFO
具有以下架构:
component axi_data_samples_N_FIFO
port (
wr_clk : in STD_LOGIC;
wr_rst : in STD_LOGIC;
rd_clk : in STD_LOGIC;
rd_rst : in STD_LOGIC;
din : in STD_LOGIC_VECTOR(255 - 1 downto 0);
wr_en : in STD_LOGIC;
rd_en : in STD_LOGIC;
dout : out STD_LOGIC_VECTOR(255 - 1 downto 0);
valid : out STD_LOGIC;
);
end component;
在我的代码中,我使用泛型来了解是否必须实例化 0、1 或 2。这会导致如下情况:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.MATH_REAL.ALL;
use work.JESD_INTERFACE_PKG.ALL;
entity samples_interface is
generic (
INSTANCE_MODEL: integer := 1
);
end samples_interface;
architecture behavioral of samples_interface is
component axi_data_samples_0_FIFO
port (
wr_clk : in STD_LOGIC;
wr_rst : in STD_LOGIC;
rd_clk : in STD_LOGIC;
rd_rst : in STD_LOGIC;
din : in STD_LOGIC_VECTOR(255 - 1 downto 0);
wr_en : in STD_LOGIC;
rd_en : in STD_LOGIC;
dout : out STD_LOGIC_VECTOR(255 - 1 downto 0);
valid : out STD_LOGIC;
);
end component;
component axi_data_samples_1_FIFO
port (
wr_clk : in STD_LOGIC;
wr_rst : in STD_LOGIC;
rd_clk : in STD_LOGIC;
rd_rst : in STD_LOGIC;
din : in STD_LOGIC_VECTOR(255 - 1 downto 0);
wr_en : in STD_LOGIC;
rd_en : in STD_LOGIC;
dout : out STD_LOGIC_VECTOR(255 - 1 downto 0);
valid : out STD_LOGIC;
);
end component;
component axi_data_samples_2_FIFO
port (
wr_clk : in STD_LOGIC;
wr_rst : in STD_LOGIC;
rd_clk : in STD_LOGIC;
rd_rst : in STD_LOGIC;
din : in STD_LOGIC_VECTOR(255 - 1 downto 0);
wr_en : in STD_LOGIC;
rd_en : in STD_LOGIC;
dout : out STD_LOGIC_VECTOR(255 - 1 downto 0);
valid : out STD_LOGIC;
);
end component;
-- Some code
begin
-- Some code
instance_0_i: if INSTANCE_MODEL = 0 then
fifo_i : axi_data_samples_0_FIFO
port map (
wr_clk => in_clk,
wr_rst => RST,
wr_en => fifo_samples_in_valid_r,
din => fifo_vector_in,
rd_clk => out_clk,
rd_rst => RST_out,
rd_en => out_samples_enable,
dout => fifo_vector_out,
valid => fifo_samples_out_valid
);
end generate;
instance_1_i: if INSTANCE_MODEL = 1 then
fifo_i : axi_data_samples_1_FIFO
port map (
wr_clk => in_clk,
wr_rst => RST,
wr_en => fifo_samples_in_valid_r,
din => fifo_vector_in,
rd_clk => out_clk,
rd_rst => RST_out,
rd_en => out_samples_enable,
dout => fifo_vector_out,
valid => fifo_samples_out_valid
);
end generate;
instance_2_i: if INSTANCE_MODEL = 2 then
fifo_i : axi_data_samples_2_FIFO
port map (
wr_clk => in_clk,
wr_rst => RST,
wr_en => fifo_samples_in_valid_r,
din => fifo_vector_in,
rd_clk => out_clk,
rd_rst => RST_out,
rd_en => out_samples_enable,
dout => fifo_vector_out,
valid => fifo_samples_out_valid
);
end generate;
end behavioral;
在我的实际项目中,我没有 3 个实例,但其中有 8 个实例,每个实例有 26 个端口。目前,我的代码基本上是不可读的。所以我正在寻找一种简化它的方法,因为所有组件都具有相同的端口并且是相同 IP 的一个实例。我正在考虑配置声明,但我不确定在这种情况下如何使用它。
任何想法?
解决方案
推荐阅读
- css - 如何禁用过渡或动画时间的悬停效果,然后在过渡或动画在 css 中完成后启用它?
- python - 如何在python中将数据写入excel工作表时删除jpg超链接
- mediawiki - 使用可视化编辑器更改子页面名称
- firebase - 如何限制一个集合中的读写并限制另一个集合中的写入,这两个集合都与云 Firestore 中的同一用户相关?
- python - websocket 消费者可以处理多少数据?
- laravel - laravel 链接到 src 的资产返回 404
- python - python上的奇怪字典行为
- c++ - 将 st_mtime 转换为 C++ 字符串
- r - 将 ggplot 图例与线型、形状和颜色与不同的 aes 合并
- reactjs - React BootstrapTable如何设置每页的行数?