Update matmul RTL, remove shift_add_mult.v
This commit is contained in:
@@ -1,3 +1,60 @@
|
|||||||
|
// ═══════════════════════════════════════════════════════
|
||||||
|
// 基础时序乘法器模块 (无 DSP,移位累加,32个周期)
|
||||||
|
// ═══════════════════════════════════════════════════════
|
||||||
|
module shift_add_mult (
|
||||||
|
input clk,
|
||||||
|
input rstn,
|
||||||
|
input start,
|
||||||
|
input [31:0] a,
|
||||||
|
input [31:0] b,
|
||||||
|
output reg [63:0] p,
|
||||||
|
output reg done
|
||||||
|
);
|
||||||
|
reg [5:0] cnt;
|
||||||
|
reg [63:0] a_reg;
|
||||||
|
reg [31:0] b_reg;
|
||||||
|
reg busy;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (!rstn) begin
|
||||||
|
busy <= 1'b0;
|
||||||
|
done <= 1'b0;
|
||||||
|
p <= 64'b0;
|
||||||
|
cnt <= 6'd0;
|
||||||
|
a_reg<= 64'b0;
|
||||||
|
b_reg<= 32'b0;
|
||||||
|
end else begin
|
||||||
|
if (start && !busy) begin
|
||||||
|
a_reg <= {32'b0, a};
|
||||||
|
b_reg <= b;
|
||||||
|
p <= 64'b0;
|
||||||
|
cnt <= 6'd0;
|
||||||
|
busy <= 1'b1;
|
||||||
|
done <= 1'b0;
|
||||||
|
end else if (busy) begin
|
||||||
|
if (cnt == 6'd32) begin
|
||||||
|
busy <= 1'b0;
|
||||||
|
done <= 1'b1;
|
||||||
|
end else begin
|
||||||
|
// 如果 b 的当前最低位为 1,则累加 a
|
||||||
|
if (b_reg[0]) begin
|
||||||
|
p <= p + a_reg;
|
||||||
|
end
|
||||||
|
a_reg <= a_reg << 1;
|
||||||
|
b_reg <= b_reg >> 1;
|
||||||
|
cnt <= cnt + 6'd1;
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
done <= 1'b0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// ═══════════════════════════════════════════════════════
|
||||||
|
// 矩阵乘法器顶层模块 (AXI Burst Slave + Ping-Pong)
|
||||||
|
// ═══════════════════════════════════════════════════════
|
||||||
module matmul_axi_slave (
|
module matmul_axi_slave (
|
||||||
input clk,
|
input clk,
|
||||||
input resetn,
|
input resetn,
|
||||||
@@ -259,12 +316,13 @@ module matmul_axi_slave (
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
// 修复:将 wire 声明提取到 always 块外部
|
||||||
|
wire [11:0] current_r_offset = (r_state == R_DATA) ? r_offset : s_axi_araddr[11:0];
|
||||||
|
|
||||||
// 组合逻辑准备 Read 数据
|
// 组合逻辑准备 Read 数据
|
||||||
always @(*) begin
|
always @(*) begin
|
||||||
s_axi_rdata = 32'b0;
|
s_axi_rdata = 32'b0;
|
||||||
if (r_state == R_DATA || (r_state == R_IDLE && s_axi_arvalid)) begin
|
if (r_state == R_DATA || (r_state == R_IDLE && s_axi_arvalid)) begin
|
||||||
wire [11:0] current_r_offset = (r_state == R_DATA) ? r_offset : s_axi_araddr[11:0];
|
|
||||||
|
|
||||||
if (current_r_offset == ADDR_CTRL)
|
if (current_r_offset == ADDR_CTRL)
|
||||||
s_axi_rdata = {30'b0, req_1, req_0};
|
s_axi_rdata = {30'b0, req_1, req_0};
|
||||||
else if (current_r_offset == ADDR_STATUS)
|
else if (current_r_offset == ADDR_STATUS)
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
module shift_add_mult (
|
|
||||||
input clk,
|
|
||||||
input rstn,
|
|
||||||
input start,
|
|
||||||
input [31:0] a,
|
|
||||||
input [31:0] b,
|
|
||||||
output reg [63:0] p,
|
|
||||||
output reg done
|
|
||||||
);
|
|
||||||
reg [5:0] cnt;
|
|
||||||
reg [63:0] a_reg;
|
|
||||||
reg [31:0] b_reg;
|
|
||||||
reg busy;
|
|
||||||
|
|
||||||
always @(posedge clk) begin
|
|
||||||
if (!rstn) begin
|
|
||||||
busy <= 1'b0;
|
|
||||||
done <= 1'b0;
|
|
||||||
p <= 64'b0;
|
|
||||||
cnt <= 6'd0;
|
|
||||||
a_reg<= 64'b0;
|
|
||||||
b_reg<= 32'b0;
|
|
||||||
end else begin
|
|
||||||
if (start && !busy) begin
|
|
||||||
a_reg <= {32'b0, a};
|
|
||||||
b_reg <= b;
|
|
||||||
p <= 64'b0;
|
|
||||||
cnt <= 6'd0;
|
|
||||||
busy <= 1'b1;
|
|
||||||
done <= 1'b0;
|
|
||||||
end else if (busy) begin
|
|
||||||
if (cnt == 6'd32) begin
|
|
||||||
busy <= 1'b0;
|
|
||||||
done <= 1'b1;
|
|
||||||
end else begin
|
|
||||||
// 如果 b 的当前最低位为 1,则累加 a
|
|
||||||
if (b_reg[0]) begin
|
|
||||||
p <= p + a_reg;
|
|
||||||
end
|
|
||||||
a_reg <= a_reg << 1;
|
|
||||||
b_reg <= b_reg >> 1;
|
|
||||||
cnt <= cnt + 6'd1;
|
|
||||||
end
|
|
||||||
end else begin
|
|
||||||
done <= 1'b0;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endmodule
|
|
||||||
Reference in New Issue
Block a user