blob: bd8a6db6c49e3e8c22c55a94e046aa103c961718 [file] [log] [blame]
`default_nettype none
module tiny_fft (
input [7:0] io_in,
output [7:0] io_out
);
wire clk = io_in[0];
wire reset = io_in[1];
wire wrEn = io_in[2];
wire [3:0] data_in = io_in[7:4];
reg [1:0] wrIdx;
reg [2:0] rdIdx;
reg signed [3:0] input_reg[0:3];
assign io_out[0] = (rdIdx == 0) ? 1'b1 : 1'b0;
// Signal high when output value is real
assign io_out[1] = ~rdIdx[0];
always @(posedge clk) begin
if (reset) begin
wrIdx <= 0;
end else if(wrEn) begin
input_reg[wrIdx] <= data_in;
wrIdx <= wrIdx + 1;
end
end
wire [5:0] stage0_0 = input_reg[0] + input_reg[2];
wire [5:0] stage0_1 = input_reg[0] + ((~input_reg[2]) + 1);
wire [5:0] stage0_2 = input_reg[1] + input_reg[3];
wire [5:0] stage0_3 = input_reg[1] + ((~input_reg[3]) + 1);
wire [5:0] stage1[0:7];
// Freq bin 0 real + complex
assign stage1[0] = stage0_0 + stage0_2;
assign stage1[1] = 0;
// Freq bin 1 real + complex
assign stage1[2] = stage0_1;
assign stage1[3] = ((~stage0_3) + 1);
// Freq bin 2 real + complex
assign stage1[4] = ((~stage0_2) + 1) + stage0_0;
assign stage1[5] = 0;
// Freq bin 3 real + complex
assign stage1[6] = stage0_1;
assign stage1[7] = stage0_3;
assign io_out[7:2] = stage1[rdIdx];
always @(posedge clk) begin
if (reset) begin
rdIdx <= 0;
end else begin
rdIdx <= rdIdx + 1;
end
end
endmodule