直接索引一些算术结果

Qua*_*ple 1 vhdl

对于这个问题,请考虑我有以下信号,并使用了Synopsis包std_logic_unsignedstd_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)

哪个不能在我的模拟器中编译.

我知道我可以通过引入一个中间变量来解决这个问题,但是有一个语法结构可以直接执行吗?

use*_*120 5

您正尝试o从表达式的结果中分配索引名称值.

索引名称前缀可以是名称或函数调用.

 indexed_name ::=  prefix ( expression { , expression } )

 prefix ::=  
       name
     | function_call
Run Code Online (Sandbox Code Playgroud)

函数是表达式,与大多数预定义属性一样,例如i'lengthi'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.使用函数调用时没有什么优势.)