我在VHDL包中有几个函数和过程。 我想问一下是否有办法忽略这些项目。 我知道端口映射的open关键字。 我正在使用分配给程序的虚拟信号。但这可能是更有效的方法。
¿VHDL有这样的东西吗? 如果我将输出信号设置为打开,我会收到以下错误: “模式输出的正式e5必须具有相关的实际”
提前致谢, 安东尼奥
已编辑:代码
procedure reg2ind
(signal reg : in std_logic_vector(15 downto 0);
signal e1,e2,e3,e4,e5,e6,e7,e8 : out std_logic;
signal e9,e10,e11,e12,e13,e14,e15,e16 : out std_logic) is
begin
e1 <= reg(0);
e2 <= reg(1);
e3 <= reg(2);
e4 <= reg(3);
e5 <= reg(4);
e6 <= reg(5);
e7 <= reg(6);
e8 <= reg(7);
e9 <= reg(8);
e10 <= reg(9);
e11 <= reg(10);
e12 <= reg(11);
e13 <= reg(12);
e14 <= reg(13);
e15 <= reg(14);
e16 <= reg(15);
end reg2ind;
当我使用它时:
reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18,
ord_p.err.err_19,ord_p.err.err_20,open,open,open,open,open,open,
open,open,open,open, open,open);
答案 0 :(得分:1)
缺少MCVE对于理解分析错误并不重要。
参见IEEE Std 107-2008,10.7程序调用声明,第4段:
对于过程的每个形式参数,过程调用应指定一个对应的实际参数。此实际参数由关联列表中的关联元素(除了实际的 open )显式指定,或者在没有这种关联元素的情况下由默认表达式指定(参见6.5.2) )。
见4.2子程序声明,4.2.2.3信号参数第1段:
对于类信号的形式参数,对信号,信号驱动器或两者的引用将传递到子程序调用中。
和第6段:
如果实际信号与任何模式的信号参数相关联,则实际信号应由静态信号名称表示。如果转换函数或类型转换出现在将实际信号与形式信号参数相关联的关联元素的形式部分或实际部分中,则会出错。
另见14.6动态阐述,第2段,b)(部分):
执行子程序调用涉及详细说明参数关联列表。 ...
动态详细说明与打开不兼容,后者会删除对同一过程的其他调用可能需要的驱动程序。
因此,4.2子程序声明4.2.2.3信号参数第6段所示的规则要求实际为静态信号名称。
这个特定的过程示例是无趣的,只需将数组输入的元素分配给信号输出即可。
MCVE:
library ieee;
use ieee.std_logic_1164.all;
entity foo is
end entity;
architecture fum of foo is
procedure reg2ind
(signal reg : in std_logic_vector(15 downto 0);
signal e1,e2,e3,e4,e5,e6,e7,e8 : out std_logic;
signal e9,e10,e11,e12,e13,e14,e15,e16 : out std_logic) is
begin
e1 <= reg(0);
e2 <= reg(1);
e3 <= reg(2);
e4 <= reg(3);
e5 <= reg(4);
e6 <= reg(5);
e7 <= reg(6);
e8 <= reg(7);
e9 <= reg(8);
e10 <= reg(9);
e11 <= reg(10);
e12 <= reg(11);
e13 <= reg(12);
e14 <= reg(13);
e15 <= reg(14);
e16 <= reg(15);
end procedure reg2ind;
signal val183: std_logic_vector (15 downto 0);
type err_record is
record
err_17: std_logic;
err_18: std_logic;
err_19: std_logic;
err_20: std_logic;
end record;
type some_record is
record
err: err_record;
end record;
signal ord_p: some_record;
signal open5, open6, open7,
open8, open9, open10,
open11, open12, open13,
open14, open15, open16: std_logic;
begin
reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18,
ord_p.err.err_19,ord_p.err.err_20,open5,open6,open7,open8,open5,open6,
open7,open8,open9,open10, open11,open12); -- with dummy outputs
-- reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18,
-- ord_p.err.err_19,ord_p.err.err_20,open,open,open,open,open,open,
-- open,open,open,open, open,open); -- as presented FAILS
end architecture;
感兴趣的读者可以探讨使用基于信号的参数的局限性。
最简单的解决方案可能是使用聚合分配目标,重新排列元素以匹配实际的顺序而不是过程调用:
(ord_p.err.err_20, ord_p.err.err_19, ord_p.err.err_18, ord_p.err.err_17) <=
val183(3 downto 0);
重新安排目标允许右侧是切片名称,而不是也需要合格表达式的聚合。这比程序调用的文本复杂性要小。
使用过程调用隐藏细节的任何动力都可以伴随着提供参数较少的过程。
函数调用是表达式,并且在语义上不可能忽略它们的结果值。您可以在有条件执行的语句中包含一个包含函数调用或过程调用语句的语句(例如if语句,case语句)。