首页->【FPGA/CPLD助学小组】

802 2

刚学FPGA,看到特权同学视频讲的16位乘法器,代码没有看懂,不知道为什么要右移,我以前学C语言都是左移的,比如a=55乘以b=12,是2乘以55=110,1乘以55=55,110不移位,55左移一位,变成550,然后550+110=660。我用特权同学的程序得出55555乘以44444的结果是错的,不知道怎么回事,以下是我写的:

module my_mux16(

                                     clk,rst_n,   

                                     start,ain,bin,yout,done   
                                  );
input clk;
input rst_n;
input start;
input [15:0] ain;
input [15:0] bin;
output [31:0] yout;
output done;

reg[31:0] areg;
reg[31:0] breg;
reg[31:0] yout_r;
reg done_r;
reg[4:0] i;


//-----------------------------------

always@(posedge clk or negedge rst_n)
    if(!rst_n) i<=5'd0;
    else if(start && i<5'd17) i<=i+1'b1;
    else if(!start) i<=5'd0;

//------------------------------------

always@(posedge clk or negedge rst_n)
    if(!rst_n) done_r<=1'b0;
    else if(i==5'd16) done_r<=1'b1;
    else if(i==5'd17) done_r<=1'b0;
assign done=done_r;

//------------------------------------

always@(posedge clk or negedge rst_n)
   if(!rst_n)     
       begin
            areg<=32'h00000000;
            breg<=32'h00000000;
            yout_r<=32'h00000000;
       end
   else if(start)
       begin  
         if(i==5'd0) 
               begin
                    areg<={16'd0,ain[15:0]};
                    breg<={16'd0,bin[15:0]};
               end
          else if(i>5'd0 && i<5'd17)
               begin
                  if(areg[i-1])
                      yout_r=yout_r+(breg<<(i-1));
              end   
      end       
assign yout=yout_r;  
endmodule
楼主可见

  1. lizhiyu 2#
    你的应该是对的,但是可能在资源方面要浪费一些,本来是两个16位的数相乘的,而你却把它扩充为两个32位的寄存器来操作!!
  2. 木易 1#
    你写的对就成。