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

时间:2017-03-31 13:47:22

标签: vhdl multiplication unsigned alu

我正在制作一个ALU,可以选择做A + 2B 但我很难让我的头脑倍增2B并在我的测试台得到正确的答案。

EG:A = 0110 B = 0011 等式是A + 2B 我即将获得0110

我的代码的snippit是

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);

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的代码有几点需要注意。首先,对于任何算术,请避免使用SLV并坚持使用unsigned库中的signednumeric_std类型。

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

BTEMP1(4 DOWNTO 1)<= B;
BTEMP1(0)<= '0';

是,a)不是必需的,b)详细。您可以通过简单地执行BTEMP <= B & '0';来实现此目的,或者更好的是,甚至不使用中间信号并在switch语句中直接分配给FTEMP2。例如

when "1111" => FTEMP2 <= std_logic_vector(unsigned(A) + unsigned(B&'0'));

请注意上述行中的转化。它们是必需的,因为默认情况下,SLV不支持+运算符(除非您使用std_logic_unsignedstd_logic_signed库)。您需要包含numeric_std库。

编辑:

我也忘了提到FTEMP可能会溢出给定的函数; F <= A + 2B,其中AB均为4位,F为5位。

答案 1 :(得分:1)

除了GSM所说的,你还可以写下你想要的东西。即乘以2.综合软件足够聪明,可以识别你在做什么。 你要记住的是结果太大了,所以必须调整大小。

overflow:hidden

这将导致仅LUT ... nu乘数。

Vivado的结果: Result from Vivado

Quartus的结果: Result from Quartus