直接索引一些算术结果

时间:2014-09-22 16:10:25

标签: vhdl

对于此问题,请考虑我有以下信号并使用概要软件包std_logic_unsignedstd_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);

在我的模拟器中无法编译。

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

1 个答案:

答案 0 :(得分:5)

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

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

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

 prefix ::=  
       name
     | function_call

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