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