首页 > 解决方案 > 在 VHDL 中为多个 IP 使用相同的组件

问题描述

我的 Vivado 项目中有多个相同 IP 的实例。它们都公开相同的端口,但内部配置不同。假设我现在有三个

具有以下架构:

    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 的一个实例。我正在考虑配置声明,但我不确定在这种情况下如何使用它。

任何想法?

标签: vhdlvivado

解决方案


推荐阅读