2017-03-31 24 views
2

由於VHDL-2008(我只關心編譯和仿真暫時),我正在編寫我自己的程序包來處理通用矩陣類對象。 我的目標是從一個矩陣M_in使得得到一個矩陣M_out:VHDL通過範圍到程序

M_out(i downto 0, j downto 0) <= M_in(k+i downto k, l+j downto l); 

使用排序的子例程。因爲,讓我們說,語義方便和類比軟件編程語言我子程序原型最好應該是這個樣子:

type matrix is array(natural range <>, natural range <>) of std_logic; 
... 
procedure slice_matrix(signal m_out: out matrix; 
         constant rows: natural range<>; 
         constant cols: natural range<>; 
         signal m_in: in matrix); 

編譯程序但認爲這是一個錯誤:

** Error: custom_types.vhd(9): near "<>": syntax error 
** Error: custom_types.vhd(9): near "<>": syntax error 

是否有可能以某種方式通過一個範圍作爲論點,還是我應該放棄並通過4個單獨的指數在當地進行計算?

回答

1

無約束索引範圍natural range <>不是類信號,變量,常量或文件的VHDL對象。因此它不能傳遞給子程序。我不會將切片操作作爲一個過程來實現,因爲它是一種類似於行爲的函數。

PoC-Library提供了用於處理矩陣和其片的實現。該實現在vectors package中提供。

function slm_slice(slm : T_SLM; RowIndex : natural; ColIndex : natural; Height : natural; Width : natural) return T_SLM is 
    variable Result  : T_SLM(Height - 1 downto 0, Width - 1 downto 0)  := (others => (others => '0')); 
begin 
    for i in 0 to Height - 1 loop 
    for j in 0 to Width - 1 loop 
     Result(i, j)  := slm(RowIndex + i, ColIndex + j); 
    end loop; 
    end loop; 
    return Result; 
end function; 

更專業的功能,切掉一個rowcolumn可以在該文件中找到了。它還提供了分配矩陣部分的過程。

該軟件包可用於仿真和綜合。

不幸的是,切分多維數組將不會成爲VHDL-2017的一部分。我會確保它再次討論VHDL-202x。

VHDL-2017允許將範圍傳遞給子程序。語言更改LCS 2016-099增加了此功能。

+0

看到我大學服務器上的編譯器不支持VHDL-2008,但我想我很快就不能訪問新功能,但很高興知道。然後傳遞整數。 – RookieHere