VHDL 传递范围到过程

VHDL pass range to procedure

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

不受约束的索引范围 natural range <> 不是 class 信号、变量、常量或文件的 VHDL 对象。因此它不能传递到子程序中。我不会将切片操作作为过程来实现,因为它是一个类似于行为的函数。

PoC-Library. The implementation is provided in the 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 or column 的更多专用函数。它还提供了分配矩阵部分的过程。

此包适用于模拟和综合。

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

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