乘法器设计实验

假设芯片在200MHZ的条件下ain和bin均为OXFFFF时需要16个时钟周期才能够得到乘法结果,那么芯片在200MHZ的条件下的数据吞吐量就为:200MHZ/16=12.5HMZ

IO接口定义如下:

clk              input    时钟信号,50M

rst_n           input    复位信号,低电平有效

Start           input    使能信号,为0时信号无效,为1时表示读入乘数和被乘数,该信号由0变到1时,会进行一次当前ain和bin的乘法操作,进行下一次运算则需要重新拉低该信号后拉高。

ain              input    输入a(被乘数),其数据位宽为16bit

bin              input    输入b(乘数),其数据宽度为16bit;

yout           output      乘积输出 ,其数据宽度为32bit;

done          output      输出有效标志,有效时保持一个时钟周期高电平。为1表示乘法运算完成,yout端口的数据稳定,得到最终的乘积;为0表示乘法运算未完成,yout数据不稳定。

module mux16(
                clk,rst_n,
                start,ain,bin,done
);

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

reg  [15:0]  areg,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)  begin
    if(!rst_n)  begin
                        areg <=  16'h0000;
                        breg <=  16'h0000;
                        yout_r<=32'h0000_0000;
                    end
  else if (start) begin
                    if (i==5'd0)  begin
                                   areg <= ain;
                                   breg <= bin;
                                   end
                   else if (i>5'd0 && i< 5'd16)   beign
                            if (areg[i-1])          
                        yout_r={ 1'b0,yout[30:15]+breg,yout_r[14:1] };
                     else    yout_r  <=  yout_r>>1;
                       end
                  else if (i==5'd16 && areg[15])      
                          yout_r[31:16]  <=  yout_r[31:16]+breg;
                  end
end

assign yout =yout_r;

endmodule

posted on 2010-09-08 20:34  齐威王  阅读(662)  评论(1编辑  收藏  举报

导航