基本算法
移位相加即是日常我们使用的手算算法,移位相加的描述如下
- 设置积的初值为0
- 若乘数的最低位为0,则积不变,否则累加被乘数
- 若乘数的第一位为0,则积不变,否则累加向左移位一位的被乘数
- ...
- 若乘数的第n位(最高位)为0,则积不变,否则累加向左移位n位的被乘数
RTL代码
module serial_shiftadder_multipcation # (
parameter WIDTH = 4
)(
input clk, // Clock
input rst_n, // Asynchronous reset active low
input multiplier_valid,
input [WIDTH - 1:0]multiplier1,
input [WIDTH - 1:0]multiplier2,
output reg product_valid,
output reg [2 * WIDTH - 1:0]product
);
接口定义部分,采用参数化设计,WIDTH为乘数/被乘数的位宽,multiplier_valid拉高时表示输入有效,并开始计算。product_valid被拉高时表示计算完成,当前的输出是有效的
/*****************buffer and shift*******************/
reg [WIDTH - 1:0]min_mult;
reg [2 * WIDTH - 1:0]max_mult;
always @ (posedge clk or negedge rst_n) begin
if(~rst_n) begin
{max_mult,min_mult} <= 'b0;
end else if(multiplier_valid == 1'b1)