2013-05-16 95 views
3

我是VHDL的初学者,我有一个基本问题。VHDL /如何初始化我的信号?

让我们考虑这个下面输入:

A : in std_logic_vector(22 downto 0); 

而这个信号:

signal dummyA : std_logic_vector(47 downto 0); 

我想用一个如此我做了什么来初始化dummyA是:

dummyA <= A; 

这是正确吗?我的意思是相当于:

dummyA <= "0000000000000000000000000" & A;?或者我应该像这样明确地添加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可能会导致配对错误,如果他们的范围不同意低端。

+0

是'dummyA <=(A'RANGE => A,OTHERS =>'0');'相当于'dummyA <=“0000000000000000000000000”& A;'? – user2336315

+0

@ user2336315:它应该是,但是你不必跟踪多少个额外的零。 –

+0

如果A的范围优于dummyA的范围,它是否会截断A的数据? – user2336315

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的签名数据类型,如果他们给他们算术解释

+1

@downvoter ......谨慎地阐述为什么? –