|
发表于 2011-8-4 21:13:38
|
显示全部楼层
点击此处下载 ourdev_664278XLOK5M.rar(文件大小:4.70M) (原文件名:fft8_copy.rar)
这是我一年前自己写的一个8点FFT,因为当时时间不是很多,自己从头到尾的进行摸索,主要是理论感觉不是很好理解,然后就找了大把参考书,弄懂了理论之后才去动手写代码,参考网上的一些例子,终于还是给我成功了,虽然弄的是比较简单的,代码也比较不简洁,所有都放在一个文件了,很不好的习惯,但起码也是完成了,之后就没进一步深入研究了,
希望这个小小资料能给需要的人一点点的帮助,哪怕很渺小
module fft8 ( r_in,i_in,r_out,i_out,clk,rst_n );
input [15:0] r_in,i_in;
input clk,rst_n;
output [15:0] r_out,i_out;
reg [15:0] r_out,i_out;
reg [15:0] r0_in_reg[7:0],i0_in_reg[7:0];
reg [15:0] r1_in_reg[7:0],i1_in_reg[7:0];
reg [15:0] r2_in_reg[7:0],i2_in_reg[7:0];
wire [15:0] r0_out_reg[7:0],i0_out_reg[7:0];
wire [15:0] r1_out_reg[7:0],i1_out_reg[7:0];
wire [15:0] r2_out_reg[7:0],i2_out_reg[7:0];
wire [15:0] r0_out_reg55,r0_out_reg77;
wire [15:0] i0_out_reg55,i0_out_reg77;
integer k0,k1,k2;
reg [5:0] count;
reg [4:0] count_in;
//////////////////////////////////////////////////////////////////////////////////////////////////STATE0
lpm_add_sub0 r0_0(.add_sub(1'b1),.dataa(r0_in_reg[0]),.datab(r0_in_reg[4]),.result(r0_out_reg[0]));
lpm_add_sub0 r0_1(.add_sub(1'b1),.dataa(r0_in_reg[1]),.datab(r0_in_reg[5]),.result(r0_out_reg[1]));
lpm_add_sub0 r0_2(.add_sub(1'b1),.dataa(r0_in_reg[2]),.datab(r0_in_reg[6]),.result(r0_out_reg[2]));
lpm_add_sub0 r0_3(.add_sub(1'b1),.dataa(r0_in_reg[3]),.datab(r0_in_reg[7]),.result(r0_out_reg[3]));
lpm_add_sub0 r0_4(.add_sub(1'b0),.dataa(r0_in_reg[0]),.datab(r0_in_reg[4]),.result(r0_out_reg[4]));
lpm_add_sub0 r0_5(.add_sub(1'b0),.dataa(r0_in_reg[1]),.datab(r0_in_reg[5]),.result(r0_out_reg[5]));
lpm_add_sub0 r0_6(.add_sub(1'b0),.dataa(r0_in_reg[2]),.datab(r0_in_reg[6]),.result(r0_out_reg[6]));
lpm_add_sub0 r0_7(.add_sub(1'b0),.dataa(r0_in_reg[3]),.datab(r0_in_reg[7]),.result(r0_out_reg[7]));
lpm_add_sub0 r0_55(.add_sub(1'b1),.dataa(shift07(r0_out_reg[5])),.datab(shift07(i0_out_reg[5])),.result(r0_out_reg55));
lpm_add_sub0 r0_77(.add_sub(1'b0),.dataa(shift07(i0_out_reg[7])),.datab(shift07(r0_out_reg[7])),.result(r0_out_reg77));
lpm_add_sub0 i0_0(.add_sub(1'b1),.dataa(i0_in_reg[0]),.datab(i0_in_reg[4]),.result(i0_out_reg[0]));
lpm_add_sub0 i0_1(.add_sub(1'b1),.dataa(i0_in_reg[1]),.datab(i0_in_reg[5]),.result(i0_out_reg[1]));
lpm_add_sub0 i0_2(.add_sub(1'b1),.dataa(i0_in_reg[2]),.datab(i0_in_reg[6]),.result(i0_out_reg[2]));
lpm_add_sub0 i0_3(.add_sub(1'b1),.dataa(i0_in_reg[3]),.datab(i0_in_reg[7]),.result(i0_out_reg[3]));
lpm_add_sub0 i0_4(.add_sub(1'b0),.dataa(i0_in_reg[0]),.datab(i0_in_reg[4]),.result(i0_out_reg[4]));
lpm_add_sub0 i0_5(.add_sub(1'b0),.dataa(i0_in_reg[1]),.datab(i0_in_reg[5]),.result(i0_out_reg[5]));
lpm_add_sub0 i0_6(.add_sub(1'b0),.dataa(i0_in_reg[2]),.datab(i0_in_reg[6]),.result(i0_out_reg[6]));
lpm_add_sub0 i0_7(.add_sub(1'b0),.dataa(i0_in_reg[3]),.datab(i0_in_reg[7]),.result(i0_out_reg[7]));
lpm_add_sub0 i0_55(.add_sub(1'b0),.dataa(shift07(i0_in_reg[5])),.datab(shift07(r0_in_reg[5])),.result(i0_out_reg55));
lpm_add_sub0 i0_77(.add_sub(1'b1),.dataa(shift07(r0_in_reg[7])),.datab(shift07(i0_in_reg[7])),.result(i0_out_reg77));
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////STATE1
lpm_add_sub0 r1_0(.add_sub(1'b1),.dataa(r1_in_reg[0]),.datab(r1_in_reg[2]),.result(r1_out_reg[0]));
lpm_add_sub0 r1_1(.add_sub(1'b1),.dataa(r1_in_reg[1]),.datab(r1_in_reg[3]),.result(r1_out_reg[1]));
lpm_add_sub0 r1_2(.add_sub(1'b0),.dataa(r1_in_reg[0]),.datab(r1_in_reg[2]),.result(r1_out_reg[2]));
lpm_add_sub0 r1_3(.add_sub(1'b0),.dataa(r1_in_reg[1]),.datab(r1_in_reg[3]),.result(r1_out_reg[3]));
lpm_add_sub0 r1_4(.add_sub(1'b1),.dataa(r1_in_reg[4]),.datab(r1_in_reg[6]),.result(r1_out_reg[4]));
lpm_add_sub0 r1_5(.add_sub(1'b1),.dataa(r1_in_reg[5]),.datab(r1_in_reg[7]),.result(r1_out_reg[5]));
lpm_add_sub0 r1_6(.add_sub(1'b0),.dataa(r1_in_reg[4]),.datab(r1_in_reg[6]),.result(r1_out_reg[6]));
lpm_add_sub0 r1_7(.add_sub(1'b0),.dataa(r1_in_reg[5]),.datab(r1_in_reg[7]),.result(r1_out_reg[7]));
lpm_add_sub0 i1_0(.add_sub(1'b1),.dataa(i1_in_reg[0]),.datab(i1_in_reg[2]),.result(i1_out_reg[0]));
lpm_add_sub0 i1_1(.add_sub(1'b1),.dataa(i1_in_reg[1]),.datab(i1_in_reg[3]),.result(i1_out_reg[1]));
lpm_add_sub0 i1_2(.add_sub(1'b0),.dataa(i1_in_reg[0]),.datab(i1_in_reg[2]),.result(i1_out_reg[2]));
lpm_add_sub0 i1_3(.add_sub(1'b0),.dataa(i1_in_reg[1]),.datab(i1_in_reg[3]),.result(i1_out_reg[3]));
lpm_add_sub0 i1_4(.add_sub(1'b1),.dataa(i1_in_reg[4]),.datab(i1_in_reg[6]),.result(i1_out_reg[4]));
lpm_add_sub0 i1_5(.add_sub(1'b1),.dataa(i1_in_reg[5]),.datab(i1_in_reg[7]),.result(i1_out_reg[5]));
lpm_add_sub0 i1_6(.add_sub(1'b0),.dataa(i1_in_reg[4]),.datab(i1_in_reg[6]),.result(i1_out_reg[6]));
lpm_add_sub0 i1_7(.add_sub(1'b0),.dataa(i1_in_reg[5]),.datab(i1_in_reg[7]),.result(i1_out_reg[7]));
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////STATE2
lpm_add_sub0 r2_0(.add_sub(1'b1),.dataa(r2_in_reg[0]),.datab(r2_in_reg[1]),.result(r2_out_reg[0]));
lpm_add_sub0 r2_1(.add_sub(1'b0),.dataa(r2_in_reg[0]),.datab(r2_in_reg[1]),.result(r2_out_reg[1]));
lpm_add_sub0 r2_2(.add_sub(1'b1),.dataa(r2_in_reg[2]),.datab(r2_in_reg[3]),.result(r2_out_reg[2]));
lpm_add_sub0 r2_3(.add_sub(1'b0),.dataa(r2_in_reg[2]),.datab(r2_in_reg[3]),.result(r2_out_reg[3]));
lpm_add_sub0 r2_4(.add_sub(1'b1),.dataa(r2_in_reg[4]),.datab(r2_in_reg[5]),.result(r2_out_reg[4]));
lpm_add_sub0 r2_5(.add_sub(1'b0),.dataa(r2_in_reg[4]),.datab(r2_in_reg[5]),.result(r2_out_reg[5]));
lpm_add_sub0 r2_6(.add_sub(1'b1),.dataa(r2_in_reg[6]),.datab(r2_in_reg[7]),.result(r2_out_reg[6]));
lpm_add_sub0 r2_7(.add_sub(1'b0),.dataa(r2_in_reg[6]),.datab(r2_in_reg[7]),.result(r2_out_reg[7]));
lpm_add_sub0 i2_0(.add_sub(1'b1),.dataa(i2_in_reg[0]),.datab(i2_in_reg[1]),.result(i2_out_reg[0]));
lpm_add_sub0 i2_1(.add_sub(1'b0),.dataa(i2_in_reg[0]),.datab(i2_in_reg[1]),.result(i2_out_reg[1]));
lpm_add_sub0 i2_2(.add_sub(1'b1),.dataa(i2_in_reg[2]),.datab(i2_in_reg[3]),.result(i2_out_reg[2]));
lpm_add_sub0 i2_3(.add_sub(1'b0),.dataa(i2_in_reg[2]),.datab(i2_in_reg[3]),.result(i2_out_reg[3]));
lpm_add_sub0 i2_4(.add_sub(1'b1),.dataa(i2_in_reg[4]),.datab(i2_in_reg[5]),.result(i2_out_reg[4]));
lpm_add_sub0 i2_5(.add_sub(1'b0),.dataa(i2_in_reg[4]),.datab(i2_in_reg[5]),.result(i2_out_reg[5]));
lpm_add_sub0 i2_6(.add_sub(1'b1),.dataa(i2_in_reg[6]),.datab(i2_in_reg[7]),.result(i2_out_reg[6]));
lpm_add_sub0 i2_7(.add_sub(1'b0),.dataa(i2_in_reg[6]),.datab(i2_in_reg[7]),.result(i2_out_reg[7]));
/////////////////////////////////////////////////////////////////////////////////////////////////////
function[15:0] shift07;//乘以0.7071
input [15:0] xn;
begin
shift07={xn[15],xn[15:1]}+ {xn[15], xn[15], xn[15],xn[15:3]}
+ {xn[15], xn[15], xn[15], xn[15], xn[15:4]}
+ {xn[15], xn[15], xn[15], xn[15], xn[15], xn[15], xn[15:6]}
+ {xn[15], xn[15], xn[15], xn[15], xn[15], xn[15],
xn[15], xn[15],xn[15:8]}+{xn[15], xn[15], xn[15], xn[15],
xn[15], xn[15], xn[15], xn[15], xn[15], xn[15],
xn[15], xn[15], xn[15], xn[15],xn[15:14]};
end
endfunction
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
count <= 6'b0;
else if ( count==6'd39 )
count <= 6'b0;
else
count <= count + 1'b1;
end
always @ ( posedge clk or negedge rst_n ) begin
if ( !rst_n )
count_in <= 5'b0;
else if ( count_in==5'd31 )
count_in <= 5'b0;
else
count_in <= count_in + 1'b1;
end
always @ ( posedge clk or negedge rst_n ) begin //data_in
if ( !rst_n )
for (k0=0;k0<=7;k0=k0+1) begin
r0_in_reg[k0] <= 16'b0;
i0_in_reg[k0] <= 16'b0;
end
else if(count_in<=7)
begin
r0_in_reg[count_in] <= r_in;
i0_in_reg[count_in] <= i_in;
end
end
always @ ( posedge clk or negedge rst_n ) begin //control
if ( !rst_n ) begin
r_out <= 0;
i_out <= 0;
end
else
case ( count )
/////////////////////////////////////////////////////////DATA_IN
/* 6'd0: begin
r0_in_reg[0] <= r_in;
i0_in_reg[0] <= i_in;
end
6'd1: begin
r0_in_reg[1] <= r_in;
i0_in_reg[1] <= i_in;
end
6'd2: begin
r0_in_reg[2] <= r_in;
i0_in_reg[2] <= i_in;
end
6'd3: begin
r0_in_reg[3] <= r_in;
i0_in_reg[3] <= i_in;
end
6'd4: begin
r0_in_reg[4] <= r_in;
i0_in_reg[4] <= i_in;
end
6'd5: begin
r0_in_reg[5] <= r_in;
i0_in_reg[5] <= i_in;
end
6'd6: begin
r0_in_reg[6] <= r_in;
i0_in_reg[6] <= i_in;
end
6'd7: begin
r0_in_reg[7] <= r_in;
i0_in_reg[7] <= i_in;
end
*/
//////////////////////////////////////////////////////////STATE0
6'd8: begin
r1_in_reg[0] <= r0_out_reg[0];
i1_in_reg[0] <= i0_out_reg[0];
end
6'd9: begin
r1_in_reg[1] <= r0_out_reg[1];
i1_in_reg[1] <= i0_out_reg[1];
end
6'd10: begin
r1_in_reg[2] <= r0_out_reg[2];
i1_in_reg[2] <= i0_out_reg[2];
end
6'd11: begin
r1_in_reg[3] <= r0_out_reg[3];
i1_in_reg[3] <= i0_out_reg[3];
end
6'd12: begin
r1_in_reg[4] <= r0_out_reg[4];
i1_in_reg[4] <= i0_out_reg[4];
end
6'd13: begin
r1_in_reg[5] <= r0_out_reg55;
i1_in_reg[5] <= i0_out_reg55;
end
6'd14: begin
r1_in_reg[6] <= i0_out_reg[6];
i1_in_reg[6] <= {~r0_out_reg[6]+1};
end
6'd15: begin
r1_in_reg[7] <= r0_out_reg77;
i1_in_reg[7] <= ~i0_out_reg77;//////////////
end
//////////////////////////////////////////////////////////////STATE1
6'd16: begin
r2_in_reg[0] <= r1_out_reg[0];
i2_in_reg[0] <= i1_out_reg[0];
end
6'd17: begin
r2_in_reg[1] <= r1_out_reg[1];
i2_in_reg[1] <= i1_out_reg[1];
end
6'd18: begin
r2_in_reg[2] <= r1_out_reg[2];
i2_in_reg[2] <= i1_out_reg[2];
end
6'd19: begin
r2_in_reg[3] <= i1_out_reg[3];
i2_in_reg[3] <= {~r1_out_reg[3]+1};
end
6'd20: begin
r2_in_reg[4] <= r1_out_reg[4];
i2_in_reg[4] <= i1_out_reg[4];
end
6'd21: begin
r2_in_reg[5] <= r1_out_reg[5];
i2_in_reg[5] <= i1_out_reg[5];
end
6'd22: begin
r2_in_reg[6] <= r1_out_reg[6];
i2_in_reg[6] <= i1_out_reg[6];
end
6'd23: begin
r2_in_reg[7] <= i1_out_reg[7];
i2_in_reg[7] <= {~r1_out_reg[7]+1};
end
///////////////////////////////////////////////////////////////////STATE2
6'd24: begin
r_out <= r2_out_reg[0];
i_out <= i2_out_reg[0];
end
6'd25: begin
r_out <= r2_out_reg[4];
i_out <= i2_out_reg[4];
end
6'd26: begin
r_out <= r2_out_reg[2];
i_out <= i2_out_reg[2];
end
6'd27: begin
r_out <= r2_out_reg[6];
i_out <= i2_out_reg[6];
end
6'd28: begin
r_out <= r2_out_reg[1];
i_out <= i2_out_reg[1];
end
6'd29: begin
r_out <= r2_out_reg[5];
i_out <= i2_out_reg[5];
end
6'd30: begin
r_out <= r2_out_reg[3];
i_out <= i2_out_reg[3];
end
6'd31: begin
r_out <= r2_out_reg[7];
i_out <= i2_out_reg[7];
end
default: begin
r_out <= 16'b0;
i_out <= 16'b0;
end
endcase
end
endmodule |
|