在VHDL中,如何将2位逻辑向量信号扩展为4位逻辑向量,并在前面添加零?

在VHDL中,如何将2位逻辑向量信号扩展为4位逻辑向量,并在前面添加零?,vhdl,Vhdl,这里是初学者的问题 我想执行以下操作 我有一个标准逻辑向量(1到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); (数据0在实体端口列表中声明

这里是初学者的问题

我想执行以下操作

我有一个标准逻辑向量(1到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);
(数据0在实体端口列表中声明为输入)
信号数据0_4位:标准逻辑向量(3到0):=B“0000”;

Data0_4bit(1到0)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
信号数据0_4位:标准逻辑向量(从3向下到0);--注意,这里只声明了Data0_4bit,没有赋值

Data0_4bit(3到2)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
信号数据0_4位:标准逻辑向量(从3向下到0);--注意,这里只声明了Data0_4bit,没有赋值
Data0_4bit(3到2)更一般地说:

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');
信号数据1:std_逻辑_向量(M到0);
信号数据0:std_逻辑_向量(N到0);--N
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');
信号数据1:std_逻辑_向量(M到0);
信号数据0:std_逻辑_向量(N到0);--Ndata1(data0'range)您可以使用数字std包中为有符号和无符号类型定义的resize函数:

    use ieee.numeric_std.all;
    (...)
    Data0_4bit <= std_logic_vector( resize(unsigned(Data0), Data0_4bit'length)); --  
使用ieee.numeric\u std.all;
(...)

Data0_4bit您可以使用数字std包中为有符号和无符号类型定义的调整大小功能:

    use ieee.numeric_std.all;
    (...)
    Data0_4bit <= std_logic_vector( resize(unsigned(Data0), Data0_4bit'length)); --  
使用ieee.numeric\u std.all;
(...)

数据0_4位语法错误已消失。谢谢你,德鲁!我还没有做任何模拟来测试它,但希望它能工作。语法错误已经消失了。谢谢你,德鲁!我还没有做任何模拟来测试它,但希望它能工作。