【FPGA学习】Quartus II中NCO与FFT ip核的仿真
FPGA有许多IP核使用起来很方便,本篇博客记录一下NCO以及FFT的IP核使用和学习,实验平台是Altera公司的EP4CE40F23C8N
参考资料:
Altera——NCO IP核详解
ALTERA FFT IP核使用
FPGA基础学习(1) – FFT IP核(Quartus)
FPGA数字信号处理(八)Quartus FFT IP核实现
FFT user guide -QII 的使用注意要点
NCO
NCO原理
NCO是构成DDS的组成模块之一,其由两部分组成:相位累加器和查找表
- 相位累加器由加法器和累加器级联构成,每来一个时间脉冲,加法器将相位增量(频率控制字)与累加器的输出的累加相位数据相加,把相加的结果送至累加器的数据输入端,在下一个时钟周期又会继续与频率控制字相加,相位累加器输出的就是合成信号的相位,相位累加器的溢出频率就是DDS的信号频率
- 查找表使用相位累加器输出的数据作为正余弦查找表的相位取样地址,就可以把存储在波形存储器内的波形抽样值通过查找表查出,完成相位到幅值的转换
正余弦查找表内含2N (N为查找表的寻址位数)量化后正余弦样本值,其计算公式如下所示:
ssin(n)=sin(2πn2N)scos(n)=cos(2πn2N)s_{sin}(n)=sin(\frac{2\pi n}{2^N}) \\ s_{cos}(n)=cos(\frac{2\pi n}{2^N}) ssin(n)=sin(2N2πn)scos(n)=cos(2N2πn)
NCO IP核
IP核参数设置
NCO的参数配置一般只需要配置第一页即可,根据上述的NCO原理,其实这些参数还是很容易配置的
其中,Phase Accumulator Precision就是上面所说的N,其他的比如相位分辨率,幅度精度,输出频率等根据自己的需求进行配置即可
生成模块接口
- clken:高电平有效的时钟使能信号
- out_valid:数据有效信号,在有效数据输出时该信号置位
- phi_inc_i:输入相位增量
NCO仿真
NCO仿真时注意给好相位增量即可
在ModelSim中仿真结果如下:
NCO输出的两路正交结果:
FFT
FFT IP核
IP核参数设置
- Data Input Precision:输入数据的数据宽度
- Twiddle Precision:旋转因子的数据宽度
- Data Output Precision:输出数据的数据宽度
- I/O Data Flow:选择输入数据流的方式,突发(Burst)、缓存突发(BufferedBurst)、流模式(Streaming)、可变长度流模式(Variable Streaming),其中前3种方式运算速度依次增加,消耗的资源也依次增加,第4种方式允许用户改变FFT的变换长度,速度和流模式(Streaming)差不多,但消耗更多资源
- FFT Engine:FFT引擎,可选择运算的结构和引擎数,运算的结构有Single Output(单输出)和Qaud Output(四输出),单输出一个时钟周期只计算一个FFT的蝶形运算,四输出一个周期计算4个基4的蝶形运算;FFT的引擎数越多,计算速度越快,也消耗更多的资源
生成模块接口
- inverse:改变FFT的变换方向,置1时为FFT的逆变换
- sink_valid:输入端口,拉高表示通知FFT将有N个数据输入
- sink_sop:输入端口,输入数据起始标记脉冲(维持一个时钟的高电平),与第一个数据同步
- sink_eop:输入端口,数据结束标记脉冲(维持一个时钟的高电平),与最后一个数据同步
- sink_real:输入端口,数据的实部
- sink_imag:输入端口,数据的虚部
- sink_error:输入端口,指示数据流的错误信息,00表示没有错误,01表示丢失SOP,10表示丢失EOP,11表示多余的EOP
- sink_ready:输出端口,FFT模块准备就绪,可以接收数据
- source_valid:输出端口,拉高表示准备输出结果
- source_sop:输出端口,输出数据起始标记
- source_eop:输出端口,输出数据结束标记
- source_real:输出端口,变换后数据的实部
- source_imag:输出端口,变换后数据的虚部
- source_error:输出端口,表示upstream模块或FFT模块出了问题
- source_ready:输入端口,表明downstream模块可以接收数据
- source_exp:输出端口,结果数据缩放因子,输出的实部和虚部的数值要根据这个缩放因子进行缩放
FFT仿真
FFT IP核时序
FFT ip核的操作时序如下所示:
这一接口实际上是Avalon Streaming(Avalon ST)接口,用于传输大量数据:
当ready信号拉高时,valid信号拉高数据才有效,同时传输是以一帧为单位,一帧数据的长度不定,因此需要信号线标志数据的开始与结束
FFT IP核的数据也是如此,sink接口是输入信号,source接口是输出信号
FFT仿真结果
FFT的仿真就使用NCO输出的正弦波作为输入信号,观察NCO输出信号的频谱
仿真结果如下所示(这里只显示了几个信号):
testbench程序如下所示(由于本人水平有限,这个testbench没有参考价值,权留作记录,不建议阅读,可以自己编写):
`timescale 1 ns/ 1 ps
module NCO_test_vlg_tst();reg clken;
reg fft_eop;
reg fft_sop;
reg fft_valid;
reg [31:0] phi_inc_i;
reg sys_clk;
reg sys_rst;// wires
wire [9:0] fcos_o;
wire [9:0] fft_image;
wire fft_ready;
wire [9:0] fft_real;
wire [9:0] fsin_o;
wire out_valid;
wire source_eop;
wire [1:0] source_error;
wire source_sop;
wire source_valid;// assign statements (if any)
NCO_test i1 (
// port map - connection between master ports and signals/registers .clken(clken),.fcos_o(fcos_o),.fft_eop(fft_eop),.fft_image(fft_image),.fft_ready(fft_ready),.fft_real(fft_real),.fft_sop(fft_sop),.fft_valid(fft_valid),.fsin_o(fsin_o),.out_valid(out_valid),.phi_inc_i(phi_inc_i),.source_eop(source_eop),.source_error(source_error),.source_sop(source_sop),.source_valid(source_valid),.sys_clk(sys_clk),.sys_rst(sys_rst)
);reg [15:0] cnt1; // 输出数据个数计数
reg [7:0] cnt2; // 输出数据
reg [31:0] source_data;
reg [9:0] data_modulus; // 取模以后的值
reg [9:0] data_real;
reg [9:0] data_image;initial
begin
// code that executes only once
// insert code here --> begin sys_clk=0;phi_inc_i=32'd42949673;sys_rst=0;#200 sys_rst=1;clken<=1;fft_valid<=1;
// --> end <
$display("Running testbench");
end always
begin
#5 sys_clk=~sys_clk;
end
/*
always @(posedge sys_clk or negedge sys_rst)
beginif(!sys_rst)begincnt1<=16'd0;cnt2<=8'd0;fft_eop<=0;fft_sop<=0;endelse if(fft_ready==1&&cnt1<1024&&out_valid==1)beginif(cnt2==0)beginif(cnt1==0)beginfft_sop<=1;cnt1<=cnt1+1;endelse if(cnt1==1)beginfft_sop<=0;cnt1<=cnt1+1;endelse if(cnt1==1023)beginfft_eop<=1;cnt1<=cnt1+1;cnt2<=8'd1;endelsebeginfft_sop<=fft_sop;fft_eop<=fft_eop;cnt1<=cnt1+1;endendelsebegincnt1<=cnt1;cnt2<=cnt2;fft_sop<=fft_sop;fft_eop<=fft_eop;endendelsebeginfft_eop<=0;fft_sop<=0;cnt1<=16'd0;endend
*/ always @(posedge sys_clk or negedge sys_rst)
beginif(!sys_rst)begincnt1<=16'd0;fft_eop<=0;fft_sop<=0;endelse if(fft_ready==1&&cnt1<1024&&out_valid==1)beginif(cnt1==0)beginfft_sop<=1;cnt1<=cnt1+1;endelse if(cnt1==1)beginfft_sop<=0;cnt1<=cnt1+1;endelse if(cnt1==1023)beginfft_eop<=1;cnt1<=cnt1+1;endelsebeginfft_sop<=fft_sop;fft_eop<=fft_eop;cnt1<=cnt1+1;endendelsebeginfft_eop<=0;fft_sop<=0;cnt1<=16'd0;endend /*
always @(posedge sys_clk or negedge sys_rst)
beginif(!sys_rst)beginsource_data<=32'd0;endelsebeginif(fft_real[9]==1'b0) // 由补码计算原码data_real<=fft_real;elsedata_real<=~fft_real+1'b1;if(fft_image[9]==1'b0) // 由补码计算原码data_image<=fft_image;elsedata_image<=~fft_image+1'b1;source_data<=(data_real*data_real)+(data_image*data_image); // 计算平方和endend
*/endmodule
【FPGA学习】Quartus II中NCO与FFT ip核的仿真相关推荐
- FPGA数字信号处理(九)Vivado FFT IP核实现
该篇是FPGA数字信号处理的第9篇,选题为DSP系统中极其常用的FFT运算.上篇介绍了Quartus环境下FFT IP核的使用"FPGA数字信号处理(八)Quartus FFT IP核实现h ...
- FPGA学习---Quartus II新建工程
用流水灯来演示一下如何新建 FPGA工程. 首先新建存放项目的文件夹led 在led文件夹中新建3个文件夹par.rtl.sim. par文件夹用于存放工程文件,rtl存放源代码,sim存放仿真文件. ...
- FPGA学习笔记【使用vivado内置IP核】
时钟IP核的使用 Vivado内置了使用FPGA中时钟资源实现的时钟IP核,可以实现分频.倍频.调节相位.控制占空比等功能 可以使用时钟IP核对内/对外输出不同频率的时钟信号 FPGA时钟资源 Xil ...
- Quartus II 18.0 创建 dcfifo IP 核仿真出现问题 Port 'eccstatus' not found 记录和解决方案
Quartus II 版本如下图所示:18.00 Build 614 04/24/2018 SJ Standard Edition 在工程中例化了一个异步 FIFO 配置信息如下: 仿真时 Model ...
- 频谱仪的更改ip_【正点原子FPGA连载】第五十一章 基于FFT IP核的音频频谱仪-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...
本帖最后由 正点原子 于 2020-10-24 15:19 编辑 203429z6c3os33t8albi33.png (66.36 KB) 2019-7-28 15:14 上传 第五十一章 基于FF ...
- FPGA学习及设计中的注意事项
为什么80%的码农都做不了架构师?>>> FPGA学习及设计中的注意事项 1.基础问题 FPGA的基础就是数字电路和HDL语言,想学好FPGA的人,建议床头都有一本数字电路的书 ...
- FPGA数字信号处理(八)Quartus FFT IP核实现
本系列的2-7篇分别介绍了FIR和IIR滤波器的FPGA实现.除了数字滤波器外,快速傅里叶变换(FFT)也是DSP系统常用的运算单元,用于对信号进行频域分析.FFT算法的实现很复杂,但Altera和X ...
- Quartus ii 中ROM ip核的应用
ROM: read only memory: 掉电不丢失数据 RAM可以被配置为ROM 实验内容: 将一组固定数据(三角波)存储在FPGA中使用IP核构建的片上ROM中,开发板上电后,系统开始从ROM ...
- Quartus II 中的SignalTap II 的使用
首先使用Signal Tap II的条件是你的资源空间还有很大,而且使用完后要把他进行手动屏蔽,以避免占用内存. 1.把顶层文件全编译一下(任何的顶层文件都可以,只要有你想要的信号). 2.打开TOO ...
最新文章
- arima模型 p q d 确定_时间序列分析第07讲(ARIMA模型,季节时间序列模型,均值的估计)...
- SparkSQL之关联mysql和hive查询
- [深度学习] 自然语言处理--- 基于Keras Bert使用(下)
- Android Intent 用法总结
- 【软件测试】软件测试分类详述
- Android开发之程序运行时保持屏幕、CPU、键盘灯的状态
- 火狐浏览器的导出和导入
- 从ajax获取的数据无法通过Jquery选择器来调用事件
- c++ 使用gdiplus
- win10禁用全角_win10输入法全角半角怎么切换 快捷键使用教程
- Unity3d编辑器的使用
- macOS Sierra,Xcode 8配置openCV3
- 突破现实的墙 | 众猎创始人Tony Guo和他的猎界风云
- 5分钟从零开始搭建一个独立博客网站
- python构建一个计算列表中位数的函数_python学习之数据科学库
- cadence 通孔焊盘_Allegro带通孔焊盘的制作
- Idea 控制台console中文乱码最终解决方法
- ALBERT: 轻量级的BERT
- 基于Capacitor编写Ionic React二维码扫描应用
- 3星|《三联生活周刊》2017年46期:故事书,才是正常儿童真正想读的书