今天的笔记是关于传统的乘法器,乘法器还是蛮有用的吧,也比较简单。
首先是说一下计算机中数值的存储问题。在计算机中正数是以二进制来表示的,而负数则是以补码的形式来表示的,补码就是对正数二进制取反然后再加1,则形成负数的表达。
比如说4和-4,4:0000_0100 表示正4;
1111_1011 进行取反;
1111_1100 加1,表示负4;
数制转换中,正数取反加1表示负数,同样的负数取反加1也表示正数。
然后是乘法器,设计的思路是首先判断最高位的符号位,因为在乘法计算中,我们知道最后算出的数值和符号无关,所以把符号单独判断,最后加上,乘法的计算就是把乘数加上被乘数个。代码不是自己写的,只是做下笔记整理的哦,代码如下:
//模块名:整数乘法器
//作者:昌磊
//单位:电子科技大学
//时间:2017.9.30
module multiplier_module (
input clk,
input rst_n,
input Start_Sig,
input [7:0]Multiplicand,
input [7:0]Multiplier,
output Done_Sig,
output [15:0]Product
);
/********************************/
reg [1:0]i;
reg [7:0]Mcand;
reg [7:0]Mer;
reg [15:0]Temp;
reg isNeg;
reg isDone;
always@(posedge clk or negedge rst_n)
if(rst_n==1'b0)
begin
i<=2'd0;
Mcand<=8'd0; //给乘数的寄存器
Mer<=8'd0; //给被乘数的寄存器
Temp<=16'd0; //给相乘的结果的寄存器
isNeg<=1'b0; //符号标志寄存器
isDone<=1'b0; //相乘结束标志信号
end
else if(Start_Sig)
case(i)
0:
begin
isNeg<=Multiplicand[7]^Multiplier[7];
Mcand<=Multiplicand[7]?(~Multiplicand+1'b1):Multiplicand;
//判断是否为正数,若是正数则直接计算,若不是,则要转换成正数
Mer<=Multiplier[7]?(~Multiplier+1'b1):Multiplier;
Temp<=16'd0;
i<=i+1'b1;
end
1:
if(Mer==0) i<=i+1'b1;
else begin Temp<=Temp+Mcand;Mer<=Mer-1'b1;end
//乘法就是把乘数相加被乘数次数的累加和
2:
begin
isDone<=1'b1; i<=i+1'b1;
end
3:
begin
isDone<=1'b0;i<=2'd0;
end
endcase
/********************************************************/
assign Done_Sig=isDone;
assign Product=isNeg?(~Temp+1'b1):Temp;
/*******************************************************/
endmodule