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

FPGA学习——DE2-115开发板上设计波形发生器

1. 实验目的
  1. 掌握直接数字频率合成(DDS)技术的基本原理和应用。
  2. 使用DE2-115开发板实现正弦波和方波的生成。
  3. 使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。
2. 实验原理
  • DDS技术:通过相位累加器生成相位信息,结合波形存储器(ROM)输出波形数据。
  • 波形存储器:使用ROM存储正弦波和方波的采样数据。
  • 频率控制:通过调整相位累加器的步长实现不同频率的输出。
3. 实验步骤
  1. 生成波形数据:使用C语言或MATLAB生成正弦波和方波的采样数据,并保存为MIF文件。
  2. 调用ROM IP核:在Quartus中生成ROM IP核,并加载生成的MIF文件。
  3. 设计DDS模块:实现相位累加器和波形选择逻辑。
  4. 顶层模块设计:将DDS模块与开发板的时钟、复位、按键等信号连接。

在这里插入图片描述

4. 代码实现
4.1 顶层模块代码
module DE2_115_DDS_top(input CLOCK_50,input [3:0] 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(CLOCK_50),.RSTn(RSTn),.WaveSel(WaveSel),.K(K),.WaveValue(WaveValue),.LEDG(LEDG),.CLOCK_100(CLOCK_100));
endmodule
4.2 DDS核心模块代码
module DDS_top(input CLOCK_50,input RSTn,input [1:0] WaveSel,input [12:0] K,output reg [11:0] WaveValue,output reg [0:0] LEDG,output CLOCK_100
);reg [31:0] PhaseAcc;reg [10:0] ROMAddr;reg [11:0] SineValue, SquareValue;// 时钟分频reg [24:0] ClockDiv;wire Clock_100;always @(posedge CLOCK_50 or negedge RSTn) beginif (!RSTn) beginClockDiv <= 0;end else beginif (ClockDiv == 10000000) beginClockDiv <= 0;Clock_100 <= ~Clock_100;end else beginClockDiv <= ClockDiv + 1;endendend// 相位累加器always @(posedge CLOCK_50 or negedge RSTn) beginif (!RSTn) beginPhaseAcc <= 0;end else beginPhaseAcc <= PhaseAcc + K;endend// ROM地址生成assign ROMAddr = PhaseAcc[31:21];// 波形选择always @(posedge CLOCK_50 or negedge RSTn) beginif (!RSTn) beginSineValue <= 0;SquareValue <= 0;WaveValue <= 0;LEDG <= 0;end else begincase (WaveSel)2'b00: beginWaveValue <= SineValue;LEDG <= 1'b0;end2'b01: beginWaveValue <= SquareValue;LEDG <= 1'b1;enddefault: beginWaveValue <= 0;LEDG <= 0;endendcaseendend// ROM模块rom_sine rom_sine_inst(.address(ROMAddr),.clock(CLOCK_50),.q(SineValue));rom_square rom_square_inst(.address(ROMAddr),.clock(CLOCK_50),.q(SquareValue));
endmodule
4.3 ROM模块代码
// 正弦波ROM
module rom_sine(input [10:0] address,input clock,output reg [11:0] q
);reg [11:0] mem [0:2047];initial begin$readmemb("Sine1024.mif", mem);endalways @(posedge clock) beginq <= mem[address];end
endmodule// 方波ROM
module rom_square(input [10:0] address,input clock,output reg [11:0] q
);reg [11:0] mem [0:2047];initial begin$readmemb("Square1024.mif", mem);endalways @(posedge clock) beginq <= mem[address];end
endmodule
4.4 波形数据生成代码
// 生成正弦波MIF文件
#include <stdio.h>
#include <math.h>#define PI 3.141592
#define DEPTH 1024
#define WIDTH 12int main(void)
{int n, temp;float v;FILE *fp;fp = fopen("Sine1024.mif", "w+");if (NULL == fp) {printf("Can not creat file!\r\n");return -1;} 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);}return 0;
}

在这里插入图片描述

5.定制ROM IP核设置

在这里插入图片描述

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

在这里插入图片描述

6.查看生成RTL

在这里插入图片描述

7.Signal Tap采样分析

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

8.结果

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

相关文章:

  • 软件项目验收报告模板
  • 算法备案的审核标准是什么?
  • 全国青少年信息素养大赛 C++算法创意实践挑战赛初赛 集训模拟试卷《七》及详细答案解析
  • chkconfig指令
  • Windows程序包管理器WinGet实战
  • HarmonyOS 基础语法概述 UI范式
  • cmd查询占用端口并查杀
  • 推荐一款Umi-OCR_文字识别工具
  • 一个好用的高性能日志库——NanoLog
  • 【学习笔记】Py网络爬虫学习记录(更新中)
  • 【深度学习—李宏毅教程笔记】Self-attention
  • Selenium无法定位元素的几种解决方案
  • 柴油机气缸体顶底面粗铣组合机床总体及夹具设计
  • 初始图像学(6)
  • Spring Bean 全方位指南:从作用域、生命周期到自动配置详解
  • vulfocus-empirecms 文件上传 (CVE-2018-18086)漏洞复现详细教程
  • 通过C# 将Excel表格转换为图片(JPG/ PNG)
  • 第T7周:咖啡豆识别
  • day1-小白学习JAVA---JDK安装和环境变量配置(mac版)
  • AIGC-几款本地生活服务智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
  • 魔都眼|上海半马鸣枪:白金标运动员、“箱根之子”齐参赛
  • 数智时代出版专业技能人才培养研讨会在沪举行
  • 诺奖得主等数十位经济学家发表宣言反对美关税政策
  • 老旧高层遭“连环漏水”,如何携手共治解难题?
  • 美国防部宣布整合驻叙美军部队,将减少至不足千人
  • 张小泉:控股股东所持18%股份将被司法拍卖,不会导致控制权变更