由于VHDL-2008不可用,我正在编写自己的包以处理类似通用矩阵的对象(我暂时只关注编译和模拟)。 我的目标是从矩阵M_in获取矩阵M_out,使得:
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个单独的索引来在本地计算它?
答案 0 :(得分: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;
在该文件中也可以找到更专门的功能来切片row或column。它还提供了分配矩阵部分的程序。
该软件包适用于模拟和综合。
不幸的是,切片多维数组不会成为VHDL-2017的一部分。我将确保再次讨论VHDL-202x。
VHDL-2017将允许将范围传递到子程序。语言更改LCS 2016-099增加了此功能。