fix(fft): update SdfUnit, Twiddle, and axi wrapper
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -233,7 +233,9 @@ assign tw_sel[0] = bf2_count[LOG_M-1];
|
|||||||
assign tw_num = bf2_count << (LOG_N-LOG_M);
|
assign tw_num = bf2_count << (LOG_N-LOG_M);
|
||||||
assign tw_addr = tw_num * tw_sel;
|
assign tw_addr = tw_num * tw_sel;
|
||||||
|
|
||||||
Twiddle TW (
|
Twiddle #(
|
||||||
|
.WIDTH (WIDTH)
|
||||||
|
) TW (
|
||||||
.clock (clock ), // i
|
.clock (clock ), // i
|
||||||
.addr (tw_addr), // i
|
.addr (tw_addr), // i
|
||||||
.tw_re (tw_re ), // o
|
.tw_re (tw_re ), // o
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
// Twiddle: 1024-Point Twiddle Table for Radix-2^2 Butterfly
|
// Twiddle: 1024-Point Twiddle Table for Radix-2^2 Butterfly
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
module Twiddle #(
|
module Twiddle #(
|
||||||
parameter TW_FF = 1 // Use Output Register
|
parameter TW_FF = 1, // Use Output Register
|
||||||
|
parameter WIDTH = 32
|
||||||
)(
|
)(
|
||||||
input clock, // Master Clock
|
input clock, // Master Clock
|
||||||
input [9:0] addr, // Twiddle Factor Number
|
input [9:0] addr, // Twiddle Factor Number
|
||||||
output [31:0] tw_re, // Twiddle Factor (Real)
|
output [WIDTH-1:0] tw_re, // Twiddle Factor (Real)
|
||||||
output [31:0] tw_im // Twiddle Factor (Imag)
|
output [WIDTH-1:0] tw_im // Twiddle Factor (Imag)
|
||||||
);
|
);
|
||||||
|
|
||||||
wire[31:0] wn_re[0:1023]; // Twiddle Table (Real)
|
wire[31:0] wn_re[0:1023]; // Twiddle Table (Real)
|
||||||
@@ -25,8 +26,8 @@ always @(posedge clock) begin
|
|||||||
ff_im <= mx_im;
|
ff_im <= mx_im;
|
||||||
end
|
end
|
||||||
|
|
||||||
assign tw_re = TW_FF ? ff_re : mx_re;
|
assign tw_re = TW_FF ? ff_re[31 -: WIDTH] : mx_re[31 -: WIDTH];
|
||||||
assign tw_im = TW_FF ? ff_im : mx_im;
|
assign tw_im = TW_FF ? ff_im[31 -: WIDTH] : mx_im[31 -: WIDTH];
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// Twiddle Factor Value
|
// Twiddle Factor Value
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
(* use_dsp = "no" *)
|
(* use_dsp = "no" *)
|
||||||
module fft_controller #(
|
module fft_controller #(
|
||||||
parameter FFT_LEN = 1024, // FFT处理长度
|
parameter FFT_LEN = 1024, // FFT处理长度
|
||||||
parameter BRAM_RD_LATENCY = 2 // 适配 BRAM 的读延迟 (通常 Block RAM 开启输出寄存器为 2)
|
parameter BRAM_RD_LATENCY = 2, // 适配 BRAM 的读延迟 (通常 Block RAM 开启输出寄存器为 2)
|
||||||
|
parameter FFT_DATA_WIDTH = 16
|
||||||
)(
|
)(
|
||||||
input aclk,
|
input aclk,
|
||||||
input aresetn,
|
input aresetn,
|
||||||
@@ -226,8 +227,8 @@ module fft_controller #(
|
|||||||
reg [10:0] out_cnt;
|
reg [10:0] out_cnt;
|
||||||
|
|
||||||
wire do_en;
|
wire do_en;
|
||||||
wire [31:0] do_re;
|
wire [FFT_DATA_WIDTH-1:0] do_re;
|
||||||
wire [31:0] do_im;
|
wire [FFT_DATA_WIDTH-1:0] do_im;
|
||||||
|
|
||||||
always @(posedge aclk) begin
|
always @(posedge aclk) begin
|
||||||
if (~aresetn) state <= IDLE;
|
if (~aresetn) state <= IDLE;
|
||||||
@@ -282,17 +283,22 @@ module fft_controller #(
|
|||||||
assign fft_finish = fft_status[1];
|
assign fft_finish = fft_status[1];
|
||||||
|
|
||||||
// BRAM 接口连线
|
// BRAM 接口连线
|
||||||
wire [31:0] in_re_dout;
|
wire [FFT_DATA_WIDTH-1:0] in_re_dout;
|
||||||
wire [31:0] in_im_dout;
|
wire [FFT_DATA_WIDTH-1:0] in_im_dout;
|
||||||
wire [31:0] out_re_dout;
|
wire [FFT_DATA_WIDTH-1:0] out_re_dout;
|
||||||
wire [31:0] out_im_dout;
|
wire [FFT_DATA_WIDTH-1:0] out_im_dout;
|
||||||
|
wire [31:0] out_re_sx = {{(32-FFT_DATA_WIDTH){out_re_dout[FFT_DATA_WIDTH-1]}}, out_re_dout};
|
||||||
|
wire [31:0] out_im_sx = {{(32-FFT_DATA_WIDTH){out_im_dout[FFT_DATA_WIDTH-1]}}, out_im_dout};
|
||||||
|
|
||||||
my_bram0 u_in0(
|
my_bram0 #(
|
||||||
|
.DATA_WIDTH (FFT_DATA_WIDTH),
|
||||||
|
.ADDR_WIDTH (10)
|
||||||
|
) u_in0(
|
||||||
.clka (aclk),
|
.clka (aclk),
|
||||||
.ena (w_active && hit_in_re), // 由 burst写逻辑产生
|
.ena (w_active && hit_in_re), // 由 burst写逻辑产生
|
||||||
.wea (1'b1),
|
.wea (1'b1),
|
||||||
.addra (aw_addr_reg[11:2]), // 取当前递增的突发写地址
|
.addra (aw_addr_reg[11:2]), // 取当前递增的突发写地址
|
||||||
.dina (s_wdata),
|
.dina (s_wdata[FFT_DATA_WIDTH-1:0]),
|
||||||
|
|
||||||
.clkb (aclk),
|
.clkb (aclk),
|
||||||
.enb (state == LOAD),
|
.enb (state == LOAD),
|
||||||
@@ -300,12 +306,15 @@ module fft_controller #(
|
|||||||
.doutb (in_re_dout)
|
.doutb (in_re_dout)
|
||||||
);
|
);
|
||||||
|
|
||||||
my_bram0 u_in1(
|
my_bram0 #(
|
||||||
|
.DATA_WIDTH (FFT_DATA_WIDTH),
|
||||||
|
.ADDR_WIDTH (10)
|
||||||
|
) u_in1(
|
||||||
.clka (aclk),
|
.clka (aclk),
|
||||||
.ena (w_active && hit_in_im),
|
.ena (w_active && hit_in_im),
|
||||||
.wea (1'b1),
|
.wea (1'b1),
|
||||||
.addra (aw_addr_reg[11:2]),
|
.addra (aw_addr_reg[11:2]),
|
||||||
.dina (s_wdata),
|
.dina (s_wdata[FFT_DATA_WIDTH-1:0]),
|
||||||
|
|
||||||
.clkb (aclk),
|
.clkb (aclk),
|
||||||
.enb (state == LOAD),
|
.enb (state == LOAD),
|
||||||
@@ -320,7 +329,10 @@ module fft_controller #(
|
|||||||
b_rd_addr[5], b_rd_addr[6], b_rd_addr[7], b_rd_addr[8], b_rd_addr[9]
|
b_rd_addr[5], b_rd_addr[6], b_rd_addr[7], b_rd_addr[8], b_rd_addr[9]
|
||||||
};
|
};
|
||||||
|
|
||||||
my_bram0 u_out0(
|
my_bram0 #(
|
||||||
|
.DATA_WIDTH (FFT_DATA_WIDTH),
|
||||||
|
.ADDR_WIDTH (10)
|
||||||
|
) u_out0(
|
||||||
.clka (aclk),
|
.clka (aclk),
|
||||||
.ena (do_en),
|
.ena (do_en),
|
||||||
.wea (1'b1),
|
.wea (1'b1),
|
||||||
@@ -333,7 +345,10 @@ module fft_controller #(
|
|||||||
.doutb (out_re_dout)
|
.doutb (out_re_dout)
|
||||||
);
|
);
|
||||||
|
|
||||||
my_bram0 u_out1(
|
my_bram0 #(
|
||||||
|
.DATA_WIDTH (FFT_DATA_WIDTH),
|
||||||
|
.ADDR_WIDTH (10)
|
||||||
|
) u_out1(
|
||||||
.clka (aclk),
|
.clka (aclk),
|
||||||
.ena (do_en),
|
.ena (do_en),
|
||||||
.wea (1'b1),
|
.wea (1'b1),
|
||||||
@@ -358,7 +373,7 @@ module fft_controller #(
|
|||||||
(BRAM_RD_LATENCY == 3) ? di_en_shift[2] : di_en_shift[3];
|
(BRAM_RD_LATENCY == 3) ? di_en_shift[2] : di_en_shift[3];
|
||||||
|
|
||||||
FFT #(
|
FFT #(
|
||||||
.WIDTH(32)
|
.WIDTH(FFT_DATA_WIDTH)
|
||||||
) u_FFT (
|
) u_FFT (
|
||||||
.clock (aclk),
|
.clock (aclk),
|
||||||
.reset (~aresetn),
|
.reset (~aresetn),
|
||||||
@@ -373,8 +388,8 @@ module fft_controller #(
|
|||||||
// 读取返回数据选择
|
// 读取返回数据选择
|
||||||
wire [31:0] rdata_d =
|
wire [31:0] rdata_d =
|
||||||
(ar_addr_reg[15:0] == `FFT_CSR_ADDR) ? fft_csr :
|
(ar_addr_reg[15:0] == `FFT_CSR_ADDR) ? fft_csr :
|
||||||
hit_out_re ? out_re_dout :
|
hit_out_re ? out_re_sx :
|
||||||
hit_out_im ? out_im_dout :
|
hit_out_im ? out_im_sx :
|
||||||
32'h0;
|
32'h0;
|
||||||
|
|
||||||
always @(*) begin
|
always @(*) begin
|
||||||
|
|||||||
Reference in New Issue
Block a user