1

这里有一个初学者的问题。

我想执行以下操作,

我有一个 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);

提前致谢。

4

3 回答 3

5

Data0_4bitVHDL 不允许这样做,因为您试图双重分配(一次在声明中,然后再次分配 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 年了,我没有办法测试该代码。

于 2013-06-15T16:07:00.653 回答
1

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

    use ieee.numeric_std.all;
    (...)
    Data0_4bit <= std_logic_vector( resize(unsigned(Data0), Data0_4bit'length)); --  
于 2015-09-02T09:34:54.203 回答
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');

或使用移位函数 将 n 位的 std_logic_vector 向右或向左移动

于 2015-08-07T05:10:42.313 回答