VHDL 4位向量中的无符号乘法?

VHDL 4位向量中的无符号乘法?,vhdl,multiplication,unsigned,alu,Vhdl,Multiplication,Unsigned,Alu,我正在做一个ALU,可以选择做A+2B 但是我很难把2B乘以,在我的测试台上得到正确的答案 例:A=0110 B=0011 方程式为A+2B 我得到0110分 我的一小部分代码是 entity ALU is port( A :IN STD_LOGIC_VECTOR(3 DOWNTO 0) ; B :IN STD_LOGIC_VECTOR(3 DOWNTO 0) ; S0 :IN

我正在做一个ALU,可以选择做A+2B 但是我很难把2B乘以,在我的测试台上得到正确的答案

例:A=0110 B=0011 方程式为A+2B 我得到0110分

我的一小部分代码是

entity ALU is 
         port( A     :IN     STD_LOGIC_VECTOR(3 DOWNTO 0) ;
               B     :IN     STD_LOGIC_VECTOR(3 DOWNTO 0) ;
               S0    :IN     STD_LOGIC ;
               S1    :IN     STD_LOGIC ;
               M     :IN     STD_LOGIC ;
                    C0    :IN     STD_LOGIC ;

               Cout  :OUT    STD_LOGIC ;    
               Z     :OUT    STD_LOGIC ;
               F     :OUT    STD_LOGIC_VECTOR(3 DOWNTO 0));







  SIGNAL VariableAlu : STD_LOGIC_VECTOR(3 DOWNTO 0);
    SIGNAL FTEMP       : STD_LOGIC_VECTOR(3 DOWNTO 0);  
    SIGNAL FTEMP2      : STD_LOGIC_VECTOR(4 DOWNTO 0);
    SIGNAL ZTEMP        : STD_LOGIC;
    SIGNAL BTEMP1        : STD_LOGIC_VECTOR(4 DOWNTO 0);

        END ALU ;
        PROCESS(A,B,S0,S1,M,C0)
        BEGIN   

                VariableAlu <= (S0 & S1 & C0 & M); 
                 --M = 1 ARITHMETIC

  (part that shifts it, lab teacher told us to do this)
                    BTEMP1(4 DOWNTO 1)<= B;
                    BTEMP1(0)<= '0';

when "1111" => FTEMP2 <= ((A) + BTEMP1);
实体ALU是
端口(A:标准逻辑向量(3到0);
B:标准逻辑向量(3到0);
S0:标准逻辑中;
S1:标准逻辑中;
M:标准逻辑;
C0:标准逻辑中;
Cout:输出标准逻辑;
Z:输出标准逻辑;
F:输出标准逻辑向量(3到0);
信号变量LU:标准逻辑向量(3到0);
信号FTEMP:标准逻辑向量(3到0);
信号FTEMP2:STD_逻辑_向量(4到0);
信号ZTEMP:STD_逻辑;
信号BTEMP1:STD_逻辑_向量(4到0);
末端ALU;
过程(A、B、S0、S1、M、C0)
开始

VariableAlu关于代码,有几点需要注意。首先,对于任何算术,避免使用SLV,并坚持使用
数字标准库中的
无符号
有符号
类型

操作数B的显式移位(乘以2):

BTEMP1(4 DOWNTO 1)<= B;
BTEMP1(0)<= '0';
注意上面一行中的转换。它们是必需的,默认情况下,SLV不支持
+
运算符(除非使用
std\u logic\u unsigned
std\u logic\u signed
库)。为此,您需要包含
数字\u std

编辑:


我还忘了提到FTEMP可能会为给定函数溢出
F除了GSM所说的之外,您还可以编写您想要的内容。也就是说,乘以2。合成软件足够智能,可以识别您正在做什么。
您必须记住的是,结果将太大,因此必须调整大小

library IEEE;
use IEEE.std_logic_1164.all;

entity input_output_adder is
    port (
        input_a : in  std_logic_vector(4 downto 0);
        input_b : in  std_logic_vector(4 downto 0);
        output  : out std_logic_vector(4 downto 0)
        );
end entity;

architecture rtl of input_output_adder is
    use IEEE.numeric_std.all;
begin
    output <= std_logic_vector(unsigned(input_a) + resize((unsigned(input_b) * 2), 5));
end architecture;
IEEE库;
使用IEEE.std_logic_1164.all;
实体输入\输出\加法器为
港口(
输入a:标准逻辑向量(4到0);
输入_b:在标准逻辑_向量中(4到0);
输出:输出标准逻辑向量(4到0)
);
终端实体;
介绍了输入输出加法器的rtl结构
使用IEEE.numeric_std.all;
开始

输出是否也可以包含实体声明?我假设这定义了A,B,m等。嘿,是的,当然,现在就做。嘿,是的,我使用未签名的库,是的,我认为在A+2b之前做这两个操作可以用B&0代替。但让我困惑的是,它的移动是如何等于它的乘以。0011然后移位00110,但不是0011*2=1001还是我完全偏离了标记?(我们的老师没有告诉我们为什么就提出了这个方法,所以我真的想正确地理解它)0011,然后移位00110,但不是0011*2=1001,还是我完全错了?0011是十进制的3;乘以2得到十进制的6,即二进制的0110(这是正确答案;十进制的1001是9)。移位的原因相当于2的乘法(或除法,取决于方向),因为二进制是基数2。类似于10进制(十进制)算术;当你乘/除10时,你是在“移动”小数点(即3*10=30;3/10=0.3)。哦,我完全没有注意到这一点,我觉得自己像个傻瓜。感谢Heapsalth尽管有这1个小问题,我还是用你的BTEMP i做了一次双重检查(尽管这是一个极简设计/tb)
library IEEE;
use IEEE.std_logic_1164.all;

entity input_output_adder is
    port (
        input_a : in  std_logic_vector(4 downto 0);
        input_b : in  std_logic_vector(4 downto 0);
        output  : out std_logic_vector(4 downto 0)
        );
end entity;

architecture rtl of input_output_adder is
    use IEEE.numeric_std.all;
begin
    output <= std_logic_vector(unsigned(input_a) + resize((unsigned(input_b) * 2), 5));
end architecture;