16位乘法器芯片verilog设计实验Quartus9.1工程源码+设计说明文件,可以做为的学习实验设计参考。
module mux16(
clk,rst_n,
start,ain,bin,yout,done
);
input clk; //芯片的时钟信号。
input rst_n; //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。
input start; //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。
input[15:0] ain; //输入a(被乘数),其数据位宽为16bit.
input[15:0] bin; //输入b(乘数),其数据位宽为16bit.
output[31:0] yout; //乘积输出,其数据位宽为32bit.
output done; //芯片输出标志信号。定义为1表示乘法运算完成.
reg[15:0] areg; //乘数a寄存器
reg[15:0] breg; //乘数b寄存器
reg[31:0] yout_r; //乘积寄存器
reg done_r;
reg[4:0] i; //移位次数寄存器
always@(posedge clk)
begin
if(!rst_n) begin
areg <= 16'h0000;
breg <= 16'h0000;
done_r <= 1'b0;
yout_r <= 32'h00000000;
i <= 5'd0;
end
else if(start) //启动运算
begin
if(i < 5'd21) i <= i+1'b1;
if(i == 5'd0) begin //锁存乘数、被乘数
areg <= ain;
breg 5'd0 && i < 5'd16) begin
if(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]}; //累加并移位
else yout_r >1; //移位不累加
end
else if(i == 5'd16 && areg[15]) yout_r[31:16] <= yout_r[31:16]+breg; //累加不移位
else if(i == 5'd18) done_r <= 1'b1; //乘完成标志位置位
else if(i == 5'd20) done_r <= 1'b0; //乘完成标志位清除
end
else i <= 5'd0;
end
assign done = done_r;
assign yout = yout_r;