你好,我是先使用一个512点的单端口ROM存储了512点的数据,然后将数据读出送给FFT核做8192点的快速傅里叶变换,但是最后我用modelsim仿真的结果中,只有第一个结果是正确的,后面的都和matlab结果不一样。而且输入数据也是正确的,但就是不知道错哪里了?求求各位帮帮忙吧!
源程序如下:
module coeff(
clk,
rst,
dina,
dv_coe,
douta,
xn_re,
xn_im,
rfd,
xn_index,
xk_index,
xk_re_coeff,
xk_im_coeff
);
input clk;
input rst;
input [15 :0] dina; // 使能每次和数据一起做fft
output dv_coe;
output [31 :0] douta;
output [7 : 0] xn_re;
output [7 : 0] xn_im;
output rfd;
output [12 : 0] xn_index;
output [12 : 0] xk_index;
output [21 : 0] xk_re_coeff;
output [21 : 0] xk_im_coeff;
reg rsta;
reg start;
reg en;
reg [7 : 0] xn_re;
reg [7 : 0] xn_im;
reg [8 : 0] addra;
//------- 由xn_index控制从rom读数
always @(posedge clk)
begin
addra <= xn_index[8:0];
end
always @(posedge clk)
begin
xn_re <= douta [15 : 8];
xn_im <= douta [7 : 0];
end
//-------系数只有512个。不够的后面补零
always @(posedge clk)
begin
if(xn_index>511)
rsta <= 1'b1;
else
rsta <= 1'b0;
end
core_coeff_rom coeff_core (
.clka(clk), // input clka
.rsta(rsta), // input rsta
.ena(en), // input ena 控制每次做系数的fft
.addra(addra), // input [8 : 0] addra 读数的地址控制
.douta(douta) // output [15 : 0] douta 系数 实部在高位,虚部在低位
);
//---------start使能-----------
always @(posedge clk)
begin
if(rst)
start <= 1'b1;
else
start <= 1'b0;
end
always @(posedge clk)
begin
if(rfd)
en <= 1'b1;
else
en <= 1'b0;
end
core_coeff_fft coeff_FFT (
.clk(clk), // input clk
.start(start), // input start
.xn_re(xn_re), // input [7 : 0] xn_re
.xn_im(xn_im), // input [7 : 0] xn_im
.fwd_inv(1), // input fwd_inv
.fwd_inv_we(1), // input fwd_inv_we
.rfd(rfd), // output rfd 输入数据有效
.xn_index(xn_index), // output [12 : 0] xn_index
.busy(busy), // output busy
.edone(edone), // output edone
.done(done), // output done
.dv(dv_coe), // output dv 输出数据有效
.xk_index(xk_index), // output [12 : 0] xk_index
.xk_re(xk_re_coeff), // output [21 : 0] xk_re
.xk_im(xk_im_coeff) // output [21 : 0] xk_im
);
endmodule
|