2012-11-02 112 views
4

我有一個組件:是否可以使用循環創建同一個組件的多個實例?

Component CAU is 
    port 
    (
     CLK    : in std_logic; 
     RESET   : in std_logic; 
     START   : in std_logic; 
     V_DIRECTION  : in vector_3d; 
     P_ORIGIN   : in vector_3d;  
     V_NORMAL_IN  : in vector_3d; 
     DOT_A   : in vector_3d; 
     DOT_B   : in vector_3d; 
     DOT_C   : in vector_3d; 
     ID_DATA_IN  : in scalar; 

     ID_DATA_OUT  : out scalar; 
     V_REFLECT  : out vector_3d;   
     V_PASS   : out vector_3d;   
     P_INTERSECT  : out vector_3d; 
     V_NORMAL_OUT  : out vector_3d; 
     T_OUT   : out scalar; 
     SUCCESS   : out std_logic; 
     FINISH   : out std_logic 
    ); 
end Component; 

我想創建它的8個實例。每個被稱爲CAU_inst0,CAU_inst1,依此類推。每個實例的連接方式如下:

CAU_inst0 : CAU 
PORT MAP 
(
    CLK    => CLK_CAU, 
    RESET   => RESET, 
    START   => start_0_sig, 
    V_DIRECTION  => v_direction_0_sig, 
    P_ORIGIN   => p_origin_0_sig, 
    V_NORMAL_IN  => v_normal_in_0_sig, 
    DOT_A   => dot_a_0_sig, 
    DOT_B   => dot_b_0_sig, 
    DOT_C   => dot_c_0_sig, 
    ID_DATA_IN  => id_data_in_0_sig, 

    ID_DATA_OUT  => id_data_out_0_sig 
    V_REFLECT  => v_reflect_0_sig, 
    V_PASS   => v_pass_0_sig, 
    P_INTERSECT  => p_intersect_0_sig, 
    V_NORMAL_OUT  => v_normal_out_0_sig, 
    T_OUT   => t_0_sig, 
    SUCCESS   => success_0_sig, 
    FINISH   => finish_0_sig 
); 

其中對於每個實例i數量0替換i。我所做的是創建一個Matlab腳本,用正確的編號創建8個不同的實例。但這是一個非常難看的解決方案,因爲它需要170行代碼,只需要很少的更改。有沒有一種方法可以在代碼中的循環中創建組件(如果可能的話還有適當的信號),以減少垃圾郵件和線路?

回答

11

您正在使用的是for ... generate語句。

這裏是一個example,類似於你想要達到的目標:

architecture GEN of REG_BANK is 
    component REG 
    port(D,CLK,RESET : in std_ulogic; 
     Q   : out std_ulogic); 
    end component; 
begin 
    GEN_REG: 
    for I in 0 to 3 generate 
     REGX : REG port map 
     (DIN(I), CLK, RESET, DOUT(I)); 
    end generate GEN_REG; 
end GEN; 

在你的情況,你需要讓所有連接到你的塊載體和或載體的矢量信號。

例如,如果你的信號目前被定義爲:

signal v_normal_in_0_sig : std_logic_vector(7 downto 0); 

您需要將其更改爲:

type vector16 is array (natural range <>) of std_logic_vector(15 downto 0); 
signal v_normal_in_sig : vector16(7 downto 0); 

在這種情況下,你現在可以使用你的信號作爲v_normal_in_sig(i)到連接到您的實體/組件的生成實例。

請注意,如果您正在使用VHDL-2008,你可以做以下的,而不是...

type vector_array is array (natural range <>) of std_logic_vector; 
signal v_normal_in_sig : vector_array(7 downto 0)(15 downto 0); 
+0

如何實例產生後命名的? – SIMEL

+0

@IlyaMelamed不知道你的意思。有循環的標籤:GEN_REG,循環變量I和實例REGX。你想知道如何引用循環生成的特定實例嗎?出於什麼目的? – Josh

+2

@IlyaMelamed在模擬設計時,上面代碼中生成的REGX實例將被命名爲GEN_REG(0),GEN_REG(1)和GEN_REG(2)。 –

相關問題