当前位置: 首页 > news >正文

FPGA——基于DE2_115实现DDS信号发生器

FPGA——基于DE2_115实现DDS信号发生器

文章目录

  • FPGA——基于DE2_115实现DDS信号发生器
    • 一、实验要求
    • 二、实现过程
      • (1)新建工程
    • 二、波形存储器ROM
      • (1)方波模块
      • (2)正弦波形存储器
      • (3)锁相环倍频电路
      • (4)顶层模块
    • 三、DE2_115验证
      • (1)顶层模块
      • (2)设置引脚
      • (3)烧录
      • (4)波形仿真
      • (5)实现效果
    • 四、参考文献
    • 五、总结

一、实验要求

采用直接数字频率合成(Direct Digital FrequencySynthesis,简称DDS)设计制作一个波形发生器,仿真后,在DE2-115开发板上实践。
要求:(1)利用DDS技术合成正弦波和方波;
(2)输出信号的频率范围为10Hz~5MHz,最小频率分辨率小于1kHz;
( 3)使用嵌入式逻辑分析仪SignalTap II实时测试输出波形的离散数据。

二、实现过程

(1)新建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完成工程创建后添加模块代码实现各模块
(2)相位累加器
在这里插入图片描述
在这里插入图片描述
新建代码后跳转到VScode时会默认起一个名字最好另存为对应文件名否则在后面运行会报错。
新建保存完代码后将代码文件添加到工程中并将addr_cnt.v设置为顶层模块
点击project然后点击Add/Remove Files in Project选项后点击上图箭头处将前面已经保存的文件添加进来然后点击Apply点击ok。
选中顶层文件右键选择Set as Top…编译运行成功后再次右键选择Create Symbol Files for Current File再打开.bsf文件,就可以看到生成该模块的符号。
相关代码:
addr_cnt.v

module addr_cnt(CPi,K,ROMaddr,Address);input CPi;input [12:0] K;output reg [9:0] ROMaddr;output reg [16:0] Address;always @(posedge CPi) beginAddress=Address+K;ROMaddr=Address[16:7];end
endmodule

符号:
在这里插入图片描述

二、波形存储器ROM

(1)方波模块

首先实现 方波模块这一部分的操作和前面的相位累加器的过程是一样的步骤添加代码然后设置为顶层模块然后生成模块符号查看。在这里插入图片描述
在这里插入图片描述
新建代码后跳转到VScode时会默认起一个名字最好另存为对应文件名否则在后面运行会报错。
新建保存完代码后将代码文件添加到工程中并将squwave.v设置为顶层模块
点击project然后点击Add/Remove Files in Project选项后点击上图箭头处将前面已经保存的文件添加进来然后点击Apply点击ok。
选中squwave.v文件右键选择Set as Top…编译运行成功后再次右键选择Create Symbol Files for Current File再打开.bsf文件,就可以看到生成该模块的符号。
相关代码:
squwave.v

module squwave(CPi,RSTn,Address,Qsquare);input CPi;input RSTn;input [16:0] Address;output reg [11:0] Qsquare;always @(posedge CPi)if (!RSTn)Qsquare=12'h000; else beginif(Address<=17'h0FFFF)Qsquare=12'hFFF;else Qsquare=12'h000;end
endmodule

符号:
在这里插入图片描述
接着是正弦波形存储器

(2)正弦波形存储器

这里编写C语言程序,生成存储器的初始化文件Sine1024.mif。
相关代码如下:
myMIF.c

/*myMIF.c*/
#include <stdio.h>
#include <math.h>
#define PI 3.141592
#define DEPTH 1024
#define WIDTH 12
int main(void)
{int n,temp;float v;FILE *fp;fp=fopen("Sine1024.mif","w+");if(NULL==fp)printf("Can not creat file!\r\n");else{printf("File created successfully!\n");fprintf(fp,"DEPTH=%d;\n",DEPTH);fprintf(fp,"WIDTH=%d;\n",WIDTH);fprintf(fp,"ADDRESS_RADIX=HEX;\n");fprintf(fp,"DATA_RADIX=HEX;\n");fprintf(fp,"CONTENT\n");fprintf(fp,"BEGIN\n");for(n=0;n<DEPTH;n++){v=sin(2*PI*n/DEPTH);temp=(int)((v+1)*4095/2);fprintf(fp,"%04x : %03x;\n",n,temp);}fprintf(fp,"END;\n");fclose(fp);}} 

编译运行后生成.exe再运行.exe会生成Sine1024.mif

在这里插入图片描述
在这里插入图片描述
接下来调用LPM_ROM定制正弦波形存储器:点击Tools然后选择IP Catalog
过程如下:
(没有截图的部分直接点击next即可)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
完成ROM配置之后接下来实现锁相环倍频电路

(3)锁相环倍频电路

过程如下:
(没有截图的部分直接点击next即可)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完成之后接下来是顶层模块

(4)顶层模块

相关代码:
DDS_top.v

module DDS_top (CLOCK_50,RSTn,WaveSel,K,
WaveValue,LEDG,CLOCK_100);input CLOCK_50;input RSTn;input [1:0] WaveSel;input [12:0] K;output reg [11:0] WaveValue;wire [9:0] ROMaddr/* synthesis keep */;wire [16:0] Address;wire [11:0] Qsine,Qsquare;output [0:0] LEDG;output CLOCK_100;wire CPi=CLOCK_100;PLL100M_CP PLL100M_CP_inst(.inclk0(CLOCK_50),.c0(CLOCK_100),.locked(LEDG[0]));addr_cnt U0_instance(CPi,K,ROMaddr,Address);SineROM ROM_inst(.address(ROMaddr),.clock(CPi),.q(Qsine));squwave U1(CPi,RSTn,Address,Qsquare);always @(posedge CPi)begincase(WaveSel)2'b01:WaveValue=Qsine;2'b10:WaveValue=Qsquare;default:WaveValue=Qsine;endcaseend
endmodule

在这里插入图片描述
在这里插入图片描述
新建代码后跳转到VScode时会默认起一个名字最好另存为对应文件名否则在后面运行会报错。
新建保存完代码后将代码文件添加到工程中并将DDS_top .v设置为顶层模块
点击project然后点击Add/Remove Files in Project选项后点击上图箭头处将前面已经保存的文件添加进来然后点击Apply点击ok。
选中DDS_top 文件右键选择Set as Top…编译运行。

三、DE2_115验证

完成上面的全部过程后接下来进行上板验证:

(1)顶层模块

相关代码:
DE2_115_DDS_top.v

module DE2_115_DDS_top(CLOCK_50,KEY,SW,GPIO_0,LEDG);input CLOCK_50;input [3:3] KEY;input [17:0] SW;output [12:0] GPIO_0;output [0:0] LEDG;wire CLOCK_100;assign GPIO_0[12]=CLOCK_100;wire RSTn=KEY[3];wire [1:0] WaveSel=SW[17:16];wire [12:0] K=SW[12:0];wire [11:0] WaveValue;assign GPIO_0[11:0]=WaveValue;DDS_top DE2(CLOCK_50,RSTn,WaveSel,K,WaveValue,LEDG,CLOCK_100);
endmodule

重新添加这个为新的顶层模块
在这里插入图片描述
在这里插入图片描述
新建代码后跳转到VScode时会默认起一个名字最好另存为对应文件名否则在后面运行会报错。
新建保存完代码后将代码文件添加到工程中并将DDS_top .v设置为顶层模块
点击project然后点击Add/Remove Files in Project选项后点击上图箭头处将前面已经保存的文件添加进来然后点击Apply点击ok。
选中DDS_top 文件右键选择Set as Top…编译运行。

(2)设置引脚

这里图片里面选择引脚的时候没注意选择的是sw1、sw0的。
可以根据DE2 _115说明书查看对应要使用的引脚。
在这里插入图片描述

(3)烧录

在这里插入图片描述
在这里插入图片描述

(4)波形仿真

按照图片里面的文字说明设置就可以了
在这里插入图片描述

(5)实现效果

拨动自己设置的对应引脚的开关就可以发现波形图有变化:
在这里插入图片描述

四、参考文献

【DE2-115】Verilog实现DDS+Quartus仿真波形
DDS信号发生器设计(Quartus)
Verilog_HDL与FPGA数字系统设计【第2版】第8.7节

五、总结

本次实验的完成加强了对Quartus软件的操作熟练度同时学习到了关于波形存储器ROM的方波模块、正弦波形存储器、锁相环倍频电路的相关知识此外也让我知道了如何实现一个DDS信号发生器。

相关文章:

  • 2024期刊综述论文 Knowledge Graphs and Semantic Web Tools in Cyber Threat Intelligence
  • 2025.04.19【Spider】| 蜘蛛图绘制技巧精解
  • TDOA解算——牛顿迭代法|以4个基站的三维空间下TDOA定位为背景,使用牛顿迭代法解算。附完整代码,订阅专栏后可复制粘贴
  • XSS跨站脚本攻击漏洞
  • 哈希表简介
  • 1. 认识DartGoogle为Flutter选择了Dart语言已经是既
  • 行为审计软件:企业合规与内部监控的数字守门人
  • Spring AI 开发 - 快速入门
  • music21:伍佰 泪桥 MIDI 音乐分析
  • 计算机网络——常见的网络攻击手段
  • 【JDBC-54.5】JDBC批处理插入数据:大幅提升数据库操作性能
  • linux socket编程之udp(实现客户端和服务端消息的发送和接收)
  • Android 下拉栏中的禁用摄像头和麦克风隐藏
  • JavaWeb 课堂笔记 —— 14 Mybatis
  • 中国AIOps行业分析
  • Qt项目——Tcp网络调试助手服务端与客户端
  • python基础知识点(2)
  • Spring Boot常用注解全解析:从入门到实战
  • 17.RSS体系建设打造信息百川入海
  • accelerate并行计算:训练环境和训练参数的配置字典
  • 观察|中日航线加速扩容,航空公司如何抓住机会?
  • 科普|一名肿瘤医生眼中的肺癌诊疗变化:从谈癌色变到与癌共存
  • 一镇一链、一园一策,上海闵行发布重点产业区镇协同产业地图
  • 14岁男孩膀胱内现52颗磁力珠,专家呼吁关注青春期少年心理健康
  • 日本多地发生无差别杀人事件,中使馆提醒中国公民加强安全防范
  • 多家期刊就AI辅助写作表态:不想让放弃思考毁了一代人