VHDL /如何初始化我的信号?

时间:2013-05-16 16:47:26

标签: initialization signals vhdl fpga

我是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。

2 个答案:

答案 0 :(得分:6)

你不能使用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可能导致错配,如果它们的范围在低端不一致的话。

答案 1 :(得分:0)

使用ieee.numeric_std中的标准函数,您可以执行以下操作来填充MSB:

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

虽然你没有要求这个,但也可以这样签名扩展:

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

虽然我认为在这种情况下用户应该为A和dummyA使用签名数据类型,如果他们给出算术解释