名称:基于IP核的FFT设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
基于IP核的FFT设计
调用vivado自带的FFT IP核,计算65536点FFT。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
FIFO IP核设置
FFT IP核设置
3. Testbench
4. 仿真图
Testbench产生的方波频率为1162790Hz,程序计算出绝对值对应的最大位置为10584,根据公式可以计算出对应的频率值,本程序计算的频率为1162789Hz,误差产生的原因有:
1. Testbench生成的7.2MHz是用69.444ns翻转得到的,不是特别准;
2. 本程序计算频率时,频率分辨率取的109863/1000,实际频率分辨率=7.2MHz/65536=109.86328125;
部分代码展示:
module FFT_ctrl( input clk,//时钟 input rst_p,//复位 input [11:0] wr_data,//AD采样的12bit数据 output [36:0] max_data//最大值对应的频率 ); parameter point=65536;//根据实际点数修改 parameter resolve=109863;//7200000000/point=频率分辨率*1000,采样时钟除以点数,根据实际点数修改 //fifo 空满信号 wire empty; wire almost_empty; wire full; reg wr_en=0;//fifo 写使能 reg rd_en=0;//fifo 读使能 wire [11:0] rd_data;//fifo 读数据 wire last;//FFT输入的最后一个数 reg valid=0;//FFT输入数据有效指示 wire [31:0] fft_dout;//FFT输出 wire fft_dout_tvalid;//FFT输出数据有效指示 wire signed [11:0] fft_dout_re;//FFT输出数据实部 wire signed [11:0] fft_dout_im;//FFT输出数据虚部 always@(posedge clk or posedge rst_p) if(rst_p)//复位 wr_en<=0; else if(empty==1)//FIFO空时开始写 wr_en<=1; else if(full==1)//FIFO满时停止写 wr_en<=0; always@(posedge clk or posedge rst_p) if(rst_p)//复位 rd_en<=0; else if(full==1 && fft_dout_tvalid==0)//FIFO存满,且FFT IP核处于空闲状态 rd_en<=1;//读使能 else if(almost_empty==1)//将空时 rd_en<=0;//关闭读使能 always@(posedge clk or posedge rst_p) if(rst_p)//复位 valid<=0; else if(rd_en==1)//读使能 valid<=1;//FFT输入数据有效指示 else valid<=0;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=957
阅读全文
1266