FPGA入门学习第六天(DDS信号发生器)

  • 实验目的

利用FPGA实现信号发生器的功能,产生一定频率的正弦波信号
掌握DDS原理
学习生成ROM IPCORE
学习仿真ROM IPCORE


  • 实验平台
  1. 小精灵开发板(DA模块与开发板的J4口相接)
  2. 黑金DA模块(AN108)
  3. QuartusII 11.0(综合编译软件)
  4. Modelsim 10.1a(仿真软件)
  5. Debussy(波形查看软件)
  6. 波形数据生成软件

  • 原理分析

    首先我们利用波形数据生成软件生成正弦波的波形数据,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

  • 仿真波形
    FPGA入门学习第六天(DDS信号发生器)_第1张图片

  • 实验现象
    FPGA入门学习第六天(DDS信号发生器)_第2张图片
    FPGA入门学习第六天(DDS信号发生器)_第3张图片
  • 工程结构
  1. Project (Quartusii工程)
  2. Source (Verilog源码)
  3. Sim (仿真工程)
  4. Doc(相关资料文档)

  • 疑问
  1. 可能会有很多小伙伴会问,为什么我直接仿真这个工程没有波形出来呢?如果源码是用我提供的,仿真测试激励文件也是我提供的,那么理论上是完全可以仿真出波形的,但是就是没有,问题就出在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

你可能感兴趣的:(FPGA学习日记)