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 添加了此功能。
由于 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 添加了此功能。