2014-05-05 28 views
2

我用這個實體:VHDL GENERIC多維數組

ENTITY SPI_PT100 IS 
GENERIC 
(
    PT100_DATA_SIZE  : INTEGER := 8; --nombre de data à envoyer par trame 
    PT100_NB_MOSI  : INTEGER := 3; --nombre de ligne MOSI 
    PT100_10ms_CNT  : INTEGER := 400000; --nb tick in_clk entre deux trames (défaut 10ms @ 40Mhz) 
    PT100_500ns_CNT  : INTEGER := 20 --nb de tick in_clk entre deux changement d'état sur SCLK (1/2 periode) (défaut : sclk = 1Mhz) 
); 
PORT 
(
    --input 
    in_clk   : IN STD_LOGIC; --40Mhz 
    in_data   : IN STD_LOGIC_VECTOR((PT100_DATA_SIZE-1) DOWNTO 0); --data à envoyer 
    --output 
    out_spi_sclk : OUT STD_LOGIC := '0'; --clk du SPI 
    out_spi_u_sync : OUT STD_LOGIC := '1'; -- u_sync du SPI 
    out_spi_mosi : OUT STD_LOGIC := '0' -- mosi du SPI 
); 
END ENTITY; 

我想用PT100_NB_MOSI作爲通用multiaray尺寸:

in_data : IN STD_LOGIC_VECTOR((PT100_DATA_SIZE-1) DOWNTO 0); ==> 
in_data : IN STD_LOGIC_VECTOR((PT100_NB_MOSI-1) DOWNTO 0)) OF ((PT100_DATA_SIZE-1) DOWNTO 0); 

我知道我可以使用類型或亞型做但在這種情況下,我認爲我必須使用一個包。 是否有隻使用GENERIC機制的解決方案?

+1

這可以在VHDL-2008中完成。在工具供應商支持之前還有幾十年必須通過。 –

回答

0

不幸的不是。你可以做的是使用一維向量:用於訪問(i, j)數組元素

in_data : IN STD_LOGIC_VECTOR((PT100_NB_MOSI*PT100_DATA_SIZE-1) DOWNTO 0);

並獲得in_data(i*PT100_DATA_SIZE+j)

否則,必須聲明它在一個包文件作爲數組:

type my_arr is array(natural range <>) of std_logic_vector(PT100_DATA_SIZE-1 DOWNTO 0);

然後包括該陣列:use work.my_pkg.my_arr;(或use work.my_pkg.all;整個封裝)和在界面使用它: in_data : IN my_arr((PT100_NB_MOSI-1) DOWNTO 0);