4

我是 VHDL 的初学者,我有一个基本问题。

让我们考虑以下输入:

A  : in std_logic_vector(22 downto 0);

这个信号:

signal dummyA : std_logic_vector(47 downto 0);

我想用 A 初始化 dummyA 所以我所做的是:

dummyA <= A;

这个对吗 ?我的意思是它相当于:

dummyA <= "0000000000000000000000000" & A;? 或者我应该像这样明确添加 0 。

4

2 回答 2

7

您不能使用dummyA <= A;,因为存在类型不匹配,并且任何好的 VHDL 编译器都会拒绝它。

你可能会使用类似的东西

dummyA <= (A'RANGE => A, OTHERS => '0');

或(仅在顺序上下文中)

dummyA <= (OTHERS => '0');
dummyA(A'RANGE) <= A;

或者

FOR i IN dummyA'RANGE LOOP
    IF i >= A'LOW AND i <= A'HIGH THEN
        dummyA(i) <= A(i);
    ELSE
        dummyA(i) <= '0';
    END IF;
END LOOP;

在并发上下文中,您可以使用

FOR i IN dummyA'RANGE GENERATE
    IF i >= A'LOW AND i <= A'HIGH GENERATE
        dummyA(i) <= A(i);
    END GENERATE;
    -- ELSE
    IF i < A'LOW OR i > A'HIGH GENERATE
        dummyA(i) <= '0';
    END GENERATE;
END GENERATE;

上述所有保证dummyA(i)均载有A(i). 但"00000" & A如果它们的范围在低端不一致,可能会导致错误配对。

于 2013-05-16T17:13:59.750 回答
1

使用标准函数,ieee.numeric_std您可以执行以下操作以对 MSB 进行零填充:

dummyA <= std_logic_vector(resize(unsigned(A), dummyA'length));

尽管您没有要求这样做,但也可以像这样进行签名扩展:

dummyA <= std_logic_vector(resize(signed(A), dummyA'length));

尽管在那种情况下我会争辩说,如果用户给他们算术解释,他们应该为 A 和 dummyA 使用带符号的数据类型

于 2013-05-17T09:26:52.460 回答