对于此问题,请考虑我有以下信号并使用概要软件包std_logic_unsigned
和std_logic_arith
。
signal o : std_logic;
signal i : std_logic_vector(parameter downto 0);
constant c : integer := 5;
我希望将o
信号设置为(i-c)
结果的最左边一位。在一个过程中,我有类似的东西:
o <= (i-c)(i'left);
在我的模拟器中无法编译。
我知道我可以通过引入一个中间变量来解决这个问题,但是有一个句法结构可以直接执行吗?
答案 0 :(得分:5)
您正尝试从表达式的结果中为o
分配索引名称值。
索引名称前缀可以是名称或函数调用。
indexed_name ::= prefix ( expression { , expression } )
prefix ::=
name
| function_call
函数是表达式,与大多数预定义属性一样,例如i'length
或i'left
。
但函数调用具有特定格式:
function_call ::=
function_name [ ( actual_parameter_part ) ]
actual_parameter_part ::= parameter_association_list
记住所有这些以及使用包numeric_std(在这种情况下没有numeric_std_unsigned)给出:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity indexing is
constant parameter: natural :=7;
end entity;
architecture foo of indexing is
signal o : std_logic;
signal i : signed(parameter downto 0);
constant c : integer := 5;
begin
o <= "-"(i,to_signed(c,i'length)) (i'left);
end architecture;
当然,您可以在&#34; - &#34;的关联列表中使用类型转换。函数调用关联列表,
选择了类型signed
,因为您的常量c
被指定为整数类型。它可以很容易地使用无符号类型,或使用包numeric_std_unsigned的std_logic_vector。选择签名类型部分是异想天开,o
以这种方式指定结果符号。
上面的示例分析,阐述和运行,实际上并没有太多有趣,同时演示语法是有效的。
可以类似地操纵切片名称。
(是的,这适用于Synopsys的软件包std_logic_unsigned,没有类型转换并指定i
类型std_logic_vector。使用函数调用时没什么优势。)