在VHDL中,如何在前面添加零的情况下将2位逻辑矢量信号扩展到4位逻辑矢量?

时间:2013-06-15 15:52:55

标签: vhdl

这是一个初学者的问题。

我想执行以下操作,

我有一个std_logic_vector(1 downto 0)输入。我应该把它扩展到四位;

喜欢11 => 0011

或10 => 0010

我尝试了这个但它失败了。

(Data0 is declared as input at entity port list)

Signal Data0_4bit: std_logic_vector(3 downto 0) :=B"0000";

Data0_4bit(1 downto 0)<=Data0(1 downto 0);

提前致谢。

3 个答案:

答案 0 :(得分:4)

VHDL不会允许这样做,因为你试图双重分配Data0_4bit的底部两位(一旦在声明中,再次为你指定Data0)。

尝试使用连接运算符在单个操作中分配整个向量:

Signal Data0_4bit: std_logic_vector(3 downto 0) := B"00" & Data0(1 downto 0);

或者,您可以将分配分为两行:

Signal Data0_4bit: std_logic_vector(3 downto 0);  -- note that Data0_4bit is only declared here, not assigned a value
Data0_4bit(3 downto 2) <= B"00";                  -- assign top two bits to 0
Data0_4bit(1 downto 0) <= Data0(1 downto 0);      -- assign bottom two bits to Data0

免责声明:我编写VHDL已有10年了,而且我没有办法测试该代码。

答案 1 :(得分:0)

更一般地说:

signal Data1: std_logic_vector(M downto 0);
signal Data0: std_logic_vector(N downto 0); -- N < M

data1(data0'range) <= data0;
data1(data1'high downto data0'length) <= (others => '0');

或使用移位功能 shift a std_logic_vector of n bit to right or left

答案 2 :(得分:0)

您可以使用数字标准包中为有符号和无符号类型定义的resize函数:

    use ieee.numeric_std.all;
    (...)
    Data0_4bit <= std_logic_vector( resize(unsigned(Data0), Data0_4bit'length)); --