VHDL传递范围到程序

时间:2017-03-31 18:01:50

标签: vhdl

由于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个单独的索引来在本地计算它?

1 个答案:

答案 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;

在该文件中也可以找到更专门的功能来切片rowcolumn。它还提供了分配矩阵部分的程序。

该软件包适用于模拟和综合。

不幸的是,切片多维数组不会成为VHDL-2017的一部分。我将确保再次讨论VHDL-202x。

VHDL-2017将允许将范围传递到子程序。语言更改LCS 2016-099增加了此功能。