基于移位加法的乘法器---Verilog实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/alangaixiaoxiao/article/details/81676071

无符号数的乘法,根据乘数的数位计算位积,再将一系列位积相加。便可以得到两个无符号二进制数的乘积。这里可以选择移位的方式。比如out= in * 13,in为4位,则out为8位,的计算:assign out = a + a << 2 + a <<3;实现。

组合逻辑电路乘法器实现:

module mult_module#(
                 parameter  WIDTH  = 8
)
                 (
                  input           [WIDTH-1:0]     S_data1,
                  input           [WIDTH-1:0]     S_data2,
                  output  reg     [2*WIDTH-1:0]   F_mult
                 );

integer index;
reg   [2*WIDTH-1:0] S_data2_temp;

always@(*)
   begin
      F_mult = 0;
      S_data2_temp = { {WIDTH{1'b0}}, S_data2 };
      for(index = 0;index <WIDTH ; index = index + 1 )
         begin
             F_mult = F_mult + ({ 2*WIDTH{S_data1[index]}} & (S_data2_temp << index));
         end
   end



endmodule

仿真文件:

module tb_mult_module(
    );

parameter  WIDTH  = 8;
reg       [WIDTH-1:0]     S_data1;
reg       [WIDTH-1:0]     S_data2;
wire      [2*WIDTH-1:0]   F_mult;

reg  clk;


initial begin
   clk = 0;
   S_data1 = 0;
   S_data2 = 0;
   #20;
   S_data1 = 2;
   S_data2 = 5;
   #20;
   S_data1 = 2;
   S_data2 = 7;
   #20;
   S_data1 = 5;
   S_data2 = 10;      
   #10;
   S_data1 = 0;
   S_data2 = 0; 
   #10;          
   repeat(30) @(posedge clk)
      begin
         S_data1[WIDTH-1:0] <= $random;
         S_data2[WIDTH-1:0] <= $random;         
      end
end

always #5 clk <= ~clk;

mult_module 
#(
        .WIDTH(WIDTH)
  )
mult_module_inst
  (        
       .S_data1(S_data1),
       .S_data2(S_data2),
       .F_mult(F_mult)
    );



endmodule

仿真:


这里写图片描述

展开阅读全文

没有更多推荐了,返回首页