如何在VHDL中将4位标准向量转换为5位向量?

时间:2018-11-02 06:55:56

标签: vhdl alu

我被困在将4位标准向量转换为5位的过程中。我应该使用4位输入进行逻辑运算和算术运算。 (4位ALU)但是,对于算术运算,我可能会有一个进位位,并且我不知道如何保存它。这是我的代码,我试图定义一个临时5位向量并使temp(4)执行。

    architecture Behavioral of alusmall is
    signal temp: std_logic_vector (4 downto 0);
    begin
    --.--Here we write which operations are launched according to M and S signals:
    temp <= (A and B) when (M='0' and S="00") else
    (A or B) when (M='0' and S="01") else
    (A xor B) when (M='0' and S="10") else
    (A xnor B) when (M='0' and S="11") else
std_logic_vector(unsigned(A) + unsigned(C1)) when (M='1' and S="00") else --.--now, the arithmetic part starts (M is one).
std_logic_vector(unsigned(A) + unsigned(B) + unsigned(C1)) when (M='1' and S="01") else
std_logic_vector(unsigned(A) + unsigned(not B) + unsigned(C1)) when (M='1' and S="10") else
std_logic_vector(unsigned(not A) + unsigned(B) + unsigned(C1));

如何在4对1多路复用器中分离temp(4)和temp(3降至0)?

1 个答案:

答案 0 :(得分:0)

VHDL中的加法不会自动进行位增长。要允许进位,只需将“ 0”附加到操作数的MSB即可。 (为带符号算术附加符号位)。这意味着您可以简单地将生成的MSB用作进位位。

例如

op <= ('0' & A) + ('0' & B);
carry <= op(op'high);

数字std还具有调整大小的功能(针对有符号和无符号):

op <= resize(A, op'length) + resize(B, op'length)
carry <= op(op'high);

另一点-为什么不将输入和输出设为无符号,而不是SLV?那么您将不需要所有类型转换(或者您可以使用VHDL 2008中的numeric_std_unsigned库对std_logic_vector进行算术运算)。