将`others`表达式与`signed` cast结合起来

时间:2016-11-26 19:34:02

标签: vhdl xilinx-ise

var代表大小为m的签名向量(图书馆IEEE.NUMERIC_STD.ALL)。

foo成为std_logic_vector(n-1 downto 0)类型的另一个变量,其中n小于m。

我想连接foo左边的'0',然后用右边的零填充它,直到它的大小为m,然后将结果存储在var中。

我试过

rdsor <= signed('0' & divisor & others=>'0');

但Xilinx抱怨以下关于综合的消息:

Syntax error near "others".

我如何做我想做的事?

2 个答案:

答案 0 :(得分:2)

假设rdsor等于你的理论var和等于foo的除数,你可以在一个过程陈述中使用两个赋值:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity jsevillamol is
end entity;

architecture fum of jsevillamol is
    constant M:     natural := 42;
    constant N:     natural := 23;
    signal rdsor:   signed (M - 1 downto 0);
    signal divisor: std_logic_vector (N - 1 downto 0);
begin
    -- rdsor <= signed('0' & divisor & others=>'0');
    process (divisor)
    begin
        rdsor <= (others => '0');
        rdsor (rdsor'LEFT downto rdsor'LEFT - divisor'LENGTH) 
            <= signed('0' & divisor);
    end process;
end architecture;

这是有效的,因为rdsor的每个元素都是一个单独的信号,并且投影输出波形中的任何特定时间只有一个值。通过不在第二个赋值的波形元素中提供after time_expression rdsor slice的元素将被赋予第二个赋值表达式值。 (第一个任务的元素被第二个赋值取代)。这种覆盖投影输出波形的方法通常用于在if语句覆盖不完整之前提供默认值。

这个例子分析,阐述和模拟,虽然没有做任何有趣的事情,但它证明索引范围是正确构建的。

请注意,它避免了马修泰勒回答引起的连接与聚合问题。

对于对工具VHDL版本不敏感的方法中的单个信号分配:

architecture fie of jsevillamol is
    constant M:     natural := 42;
    constant N:     natural := 23;
    signal rdsor:   signed (M - 1 downto 0);
    signal divisor: std_logic_vector (N - 1 downto 0);
    subtype other is signed (rdsor'LEFT - divisor'LENGTH - 1 downto 0);
begin
    -- rdsor <= signed('0' & divisor & others=>'0');
    rdsor <= '0' & signed(divisor)  &  other'(others => '0');
end architecture;

这使用连接并将others包含在聚合中。尾部'0'部分有一个子类型声明,允许聚合表达式成为限定表达式的目标。

该架构还分析,阐述和模拟证明索引算法是正确的。

答案 1 :(得分:1)

您需要将others用作聚合的一部分,而不是连接的一部分。这是使用聚合和属性的解决方案(依赖于您使用VHDL 2008):

rdsor <= (rdsor'LEFT => '0', (rdsor'LEFT-1) downto (rdsor'LEFT-divisor'LENGTH) => signed(divisor), others => '0');

https://www.edaplayground.com/x/5Yuw