-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlut_mul.v
More file actions
63 lines (53 loc) · 2.24 KB
/
lut_mul.v
File metadata and controls
63 lines (53 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
`default_nettype none
// ═══════════════════════════════════════════════════════════════════════════════
// LUT Multiplier for TRINITY CORE V2
// ═══════════════════════════════════════════════════════════════════════════════
//
// 32-bit × 32-bit → 32-bit multiplier (lower word)
// - 3-cycle pipeline latency
// - Uses LUT-based multiplication (compatible with nextpnr-xilinx)
//
// ═══════════════════════════════════════════════════════════════════════════════
module lut_mul (
input wire clk,
input wire rst_n,
input wire valid_in,
input wire [31:0] a,
input wire [31:0] b,
output wire [31:0] result,
output reg valid_out
);
// Pipeline registers
reg [31:0] a_reg[0:2];
reg [31:0] b_reg[0:2];
reg [2:0] valid_reg;
// LUT-based 32x32 multiplication
wire [63:0] mult_result = a_reg[2] * b_reg[2];
assign result = mult_result[31:0];
// Pipeline stages
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
a_reg[0] <= 32'd0;
a_reg[1] <= 32'd0;
a_reg[2] <= 32'd0;
b_reg[0] <= 32'd0;
b_reg[1] <= 32'd0;
b_reg[2] <= 32'd0;
valid_reg <= 3'd0;
valid_out <= 1'b0;
end else begin
// Stage 0: Capture inputs
a_reg[0] <= a;
b_reg[0] <= b;
// Stage 1: First pipeline register
a_reg[1] <= a_reg[0];
b_reg[1] <= b_reg[0];
// Stage 2: Second pipeline register (multiply happens here)
a_reg[2] <= a_reg[1];
b_reg[2] <= b_reg[1];
// Valid signal pipeline
valid_reg <= {valid_reg[1:0], valid_in};
valid_out <= valid_reg[2];
end
end
endmodule