2017-05-29 58 views
0

此問題涉及定義可接受參數化長度數組的模塊的功能。模塊端口中的陣列參數化

我目前擁有的是:

use work.my_types.all; 

entity Calc is 
    port (clk    : in std_logic; 
     y1, y2, yc, y3, y4 : in u8exrow; 
     lap_l, lap_r  : out s9row) ; 
end Calc; 

在類型u8exrow和s9row都在my_types包中定義的數組。

我想這些數組的長度以某種方式使用泛型來改變。

例如,這(除了是不太好的,因爲它不使用類型)是不允許的:

entity Calc is 
generic (row_end : in integer); 
    port (clk    : in std_logic; 
     y1, y2, yc, y3, y4 : in array (0 to row_end+1) of u8 ; 
     lap_l, lap_r  : out array (0 to row_end) of s9) ; 
end Calc; 

由於VHDL不喜歡在其港口陣列(沒有很好的理由,我認爲)。

任何定義可以接受參數化長度數組的模塊的方法?

謝謝!

+0

VHDL沒有模塊稱爲設計實體,由實體聲明和匹配的體系結構體組成。 VHDL允許使用數組類型的端口對象,但是您不要在端口聲明的子類型指示中聲明類型。類型是單獨聲明的,用於包中的端口使用,或者作爲泛型子句中的接口類型聲明(後者在綜合中不被廣泛支持)中使用。該類型可以具有部分由端口聲明的子類型指示中的通用常量提供的延遲範圍。你的語法不正確。 – user1155120

+0

你的意思是typer應該被定義爲:type u8row是u8的數組(integer rage <>) ?通用值如何在稍後在端口中定義其長度? – Ran

回答

1

VHDL沒有模塊稱爲設計實體,由實體聲明(主要單元)和匹配的體系結構體(輔助單元)組成。

VHDL允許數組類型的端口對象很好,但是您不要在端口聲明的子類型指示中聲明類型。

類型是單獨聲明的,用於包中的端口或泛型子句中的接口類型聲明(後者在綜合中不被廣泛支持)。

該類型可以有一個無約束的範圍,稍後部分由端口聲明的子類型指示中的泛型常量提供。

您的語法不正確。

一種包裝聲明數組類型與無約束範圍:

package my_types_deferred_ranges is 
    type u8 is range 0 to 40; 
    type u8row is array (natural range <>) of u8; 
    type u9 is range 0 to 80; 
    type u9row is array (natural range <>) of u9; 
end package; 

甲計算值設計實體與端口聲明提供亞型適應症:

library ieee; 
use ieee.std_logic_1164.all; 
use work.my_types_deferred_ranges.all; 

entity Calc is 
    generic (row_end : in integer); 
    port (
     clk:     in std_logic; 
     y1, y2, yc, y3, y4: in u8row (0 to row_end + 1); 
     lap_l, lap_r:  out u9row (0 to row_end) 
    ); 
end entity Calc; 

architecture foo of Calc is 
begin 
end architecture; 

當實例化:

library ieee; 
use ieee.std_logic_1164.all; 
use work.my_types_deferred_ranges.all; 

entity top is 
end entity; 

architecture foo of top is 
    constant row_end:   natural := 25; 
    signal clk:     std_logic; 
    signal y1, y2, yc, y3, y4: u8row (0 to row_end + 1); 
    signal lap_l, lap_r:  u9row (0 to row_end); 
begin 
INST: 
    entity work.Calc -- an enity instantiation, no component declaration 
     generic map (row_end => row_end) 
     port map (
      clk => clk, 
      y1 => y1, 
      y2 => y2, 
      yc => yc, 
      y3 => y3, 
      y4 => y4, 
      lap_l => lap_l, 
      lap_r => lap_r 
     ); 

end architecture; 

當這些示例按順序進行分析,頂層可以詳細闡述和模擬,演示註冊端口映射子類型指示是有效的。

通用值如何在稍後在端口中定義其長度?

分析是設計單元的語法和語義分析,導致設計單元被存儲在庫中,類似於庫存檔中的對象文件。

詳細說明導致聲明生效。考慮鏈接和加載。

分析後不變的值(由表達式提供)是本地靜態的。精化時固定的值是全局靜態的。

通用常量是全局靜態的,在闡述過程中需要有效。當端口聲明的接口列表被闡述時,實例化的組件被詳細描述爲泛型值作爲約束的一部分,作爲端口子類型指示的一部分。

一種類型的對象的子類型指示(約束)可以通過在端口映射闡述之前詳細闡述的通用映射聲明的細化來提供。

+0

不錯。您可以添加有關軟件包泛型的信息,例如'u8'和'u9'的長度/範圍也是可配置的。但是這可能會超出目標。 – JHBonarius

+0

@ J.H.Bonarius - 當您在-2008年時,您可以在受約束類型的子類型指示中提供子集索引約束。注意它也可能不支持合成。 (這是關於問題的麻煩[tag:fpga]標籤)。 – user1155120

+0

謝謝你們 - 非常感謝我所需要的!哦,並且對於「模塊」術語感到抱歉(它對我來說比實體更有意義。) – Ran

1

在pkg:

type t_u8_array is array (integer range <>) of u8; 
type t_s9_array is array (integer range <>) of s9; 

實體:

entity Calc is 
generic (row_end : in integer); 
    port (clk    : in std_logic; 
     y1, y2, yc, y3, y4 : in t_u8_array(0 to row_end+1); 
     lap_l, lap_r  : out t_s9_array(0 to row_end) 
    ); 
end Calc; 

而且非常有用的要被添加到包(新與VHDL-2008):

type slv_array is array(integer range<>) of std_logic_vector; 
type u_array is array(integer range<>) of unsigned; 
type s_array is array(integer range<>) of signed; 

然後,使用這些是簡單地說:

signal sMySig : slv_array(1 downto 0)(2 downto 0) := (others => (others => '0')); 
+0

謝謝你們 - 非常感謝我所需要的! – Ran