- 实验目的
利用FPGA实现信号发生器的功能,产生一定频率的正弦波信号
掌握DDS原理
学习生成ROM IPCORE
学习仿真ROM IPCORE
- 实验平台
- 小精灵开发板(DA模块与开发板的J4口相接)
- 黑金DA模块(AN108)
- QuartusII 11.0(综合编译软件)
- Modelsim 10.1a(仿真软件)
- Debussy(波形查看软件)
- 波形数据生成软件
- 原理分析
首先我们利用波形数据生成软件生成正弦波的波形数据,FPGA可以将波形数据保存在ROM中,然后按一定的速率从ROM中读出来,送入DA接口,通过DA模块的数模转换,便可以将数字信号转换成模拟信号。然后通过示波器便可观察到正弦波。波形数据的宽度和DA模块的数据位宽有关系,位宽越宽,那么波形越平滑,但是需要的存储空间也相应的加大,我们选用的DA模块位宽是8位,所以波形数据也应该选8位位宽。波形数据的深度我们用512。假如要生成1Khz的正弦波,我们读取ROM的时钟频率应该是512*1Khz,如此,将从ROM中读出的数据送入DA模块,我们便可以在示波器上看到1Khz的正弦波信号。在我们新建的例程中,读ROM的时钟是50M,ROM深度是512,那么最终生成的正弦波信号频率是多少呢?
- 源码展示
`timescale 1ns / 1ps
module dds(
input clk ,//fpga clock
output daclk ,
output [7:0] dadata //DA data
);
reg [8:0] rom_addr=0;
wire [7:0] rom_data ;
assign dadata=rom_data;//DA output the data from ROM
assign daclk=clk;
//DA output sin waveform
always @(negedge clk)
begin
rom_addr <= rom_addr + 1'b1 ;
end
rom Urom (
.clock (clk ),// input clka
.address (rom_addr ),// input [8 : 0] addra
.q (rom_data ) // output [7 : 0] douta
);
endmodule
- 仿真波形
- 实验现象
- 工程结构
- Project (Quartusii工程)
- Source (Verilog源码)
- Sim (仿真工程)
- Doc(相关资料文档)
- 疑问
- 可能会有很多小伙伴会问,为什么我直接仿真这个工程没有波形出来呢?如果源码是用我提供的,仿真测试激励文件也是我提供的,那么理论上是完全可以仿真出波形的,但是就是没有,问题就出在ROM这个IPCORE上。我们如果要用Modelsim仿真带IPCORE的工程,那么首先需要将我们使用的器件库用Modelsim编译一次,生成一个Modelsim可以识别的库文件,这是用Modelsim仿真带IPCORE工程的第一步。如果用Quartusii来仿真IPCORE,则不用再编译(但是QuartusII 9.0之后的版本不再带有仿真功能,都是用的第三方软件仿真),同样如果用的是Xilinx的芯片,那么用ISE或Vivado仿真带IPCORE的工程不需要再编译器件库。针对ROM IPCORE的仿真步骤我会专门写一篇博客详细介绍,大家可以带着这个疑问来看下一篇博客,相信肯定会有所收获
- 结语
通过今天的学习,我们应该掌握DDS的原理以及如何调用ROM IPCORE,由于篇幅限制,具体的工程细节就不在此描述,若有疑问,可联系我索取该课程的视频教程,谢谢!
视频教程链接:https://pan.baidu.com/s/1LRPfsNM0fr9wf48C5yHUBg
提取码:18ua