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

【DE2-115】Verilog实现DDS+Quartus仿真波形

【DE2-115】Verilog实现DDS+Quartus仿真波形

  • 一、任务要求
  • 二、实现步骤
    • 2.1 相位累加器
    • 2.2 波形存储器ROM
      • 2.2.1 方波模块
      • 2.2.2 正弦波形存储器
    • 2.3 3锁相环倍频电路
    • 2.4 顶层电路设计
  • 三、设计实现
  • 四、实验总结

一、任务要求

采用数字频率合成(Direct Digital FrequencySynthesis,简称DDS)设计制作一个波形发生器,仿真后,在DE2-115开发板上实践。

要求:
1)利用DDS技术合成正弦波和方波;
2)输出信号的频率范围为10Hz~5MHz,最小频率分辨率小于1kHz;
3)使用嵌入式逻辑分析仪SignalTap II实时测试输出波形的离散数据。

二、实现步骤

在这里插入图片描述

2.1 相位累加器

Quartus新建工程,新建.v文件取名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) begin
        Address=Address+K;
        ROMaddr=Address[16:7];
    end
endmodule

保存后,右键点击文件Set as Top Level Entity,编译运行成功后再次右键单击,选择Create Symbol Files for Current File
在这里插入图片描述
Quartus打开.bsf文件,生成该模块的符号如下:
在这里插入图片描述

2.2 波形存储器ROM

2.2.1 方波模块

方波模块比较简单,只要输出高低电平就行,具体代码如下:

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 begin
        if(Address<=17'h0FFFF)
            Qsquare=12'hFFF;
        else Qsquare=12'h000;
    end
endmodule

它的模块符号如下所示:
在这里插入图片描述

2.2.2 正弦波形存储器

这个比较复杂,需要用IP核调用ROM存储。但是直接IP核生成ROM并更改存储数据太麻烦了,我们可以编写一个C语言程序,生成存储器的初始化文件Sine1024.mif。
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);
	}
 } 

编译运行该C程序后,可以在文件所在目录下看到一个myMIF.exe文件,双击即可生成Sine1024.mif文件。
在这里插入图片描述
使用Quartus调用LPM_ROM定制正弦波形存储器:点击Tools-》IP Catalog
在这里插入图片描述
在IP Catalog界面搜索栏中输入ROM,双击ROM 1-PORT
在这里插入图片描述
命名为SineROM.v,点击OK
在这里插入图片描述
之后的除下图所示界面需要特别设置以外,其它点击Next跳过即可。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
至此,ROM配置完成了。

2.3 3锁相环倍频电路

在IP Catalog搜索栏输入APTPLL,双击图示蓝框选项。
在这里插入图片描述
除如下所示图片需要更改一些设置外,其余界面next掉就好。
在这里插入图片描述
在这里插入图片描述

2.4 顶层电路设计

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)
    begin
        case(WaveSel)
            2'b01:WaveValue=Qsine;
            2'b10:WaveValue=Qsquare;
            default:WaveValue=Qsine;
        endcase
    end
endmodule

将这个代码设为顶层文件,编译。

三、设计实现

使用DE2-115开发板来验证上述设计。
SW16\SW17用来选择输出波形的种类,LEDG0作为PLL的香味锁定指示。
根据DE2-115引脚配置表配置引脚,如果你由DE2_115_pin_assignments.csv文件即可直接导入,更省时省力。

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

编译通过后,再次点击一次Start Analysis & Systhesis,然后就可以使用SignalTap ll实时测试输出波形的离散数据,选择Tools-》SignalTap ll Logic Analyzer。
在这里插入图片描述
注意,时钟Clock配置要选择GPIO_0[12]
Node添加只需要双击Setup上面的空白处即可添加。
在这里插入图片描述
一开始你可能发现下面是空白的,你就需要更改Flitter,然后点击List就出现了。
在这里插入图片描述
确认无误后,保存SignalTap文件,点击编译,连接DE2-115。
在这里插入图片描述
操作完成后,你可以尝试拨动SW16和SW17,你会发现波形发生了变化。
PS:GPIO_0的波形可能会很奇怪,需要你右键选择格式,这样才会有波形图。
在这里插入图片描述
在这里插入图片描述

四、实验总结

本文参考教材 Verilog_HDL与FPGA数字系统设计【第2版】第8.7节。
实验过程中,发现教材写得十分简洁,每个字都有深意,如果遇到困难了的话,建议回归教材仔细阅读每一个字。

相关文章:

  • 【算法】One-Stage检测器与Two-Stage检测器的原理和区别
  • 开启bitlocker使用windows的加密功能
  • (1)VTK环境配置
  • Unity 基于navMesh的怪物追踪惯性系统
  • CAP理论 与 BASE理论
  • RAG文献阅读——用于知识密集型自然语言处理任务的检索增强生成
  • 数据库删除表数据
  • 在C盘新建文本文档
  • Go环境变量配置
  • Qt报错dependent ‘..\..\..\..\..\..\xxxx\QMainWindow‘ 或者 QtCore\QObject not exist
  • QEMU学习之路(7)— ARM64 启动Linux
  • 每天学一个 Linux 命令(16):mkdir
  • 【寻找Linux的奥秘】第四章:基础开发工具(下)
  • 信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G
  • Ubuntu 各个常见长期支持历史版本与代号
  • 低资源需求的大模型训练项目---3、综合对比与选型建议
  • 计算机基础复习资料整理
  • AI数字消费第一股,重构商业版图的新物种
  • oracle怎么查看是否走了索引
  • 系统设计面试总结:高性能相关:CDN(内容分发网络)、什么是静态资源、负载均衡(Nginx)、canal、主从复制
  • 网站简历导出/批量关键词排名查询工具
  • 邯郸建设局网站/十大seo公司
  • 申请域名后怎么做网站/大连网站建设费用
  • 济南网站建设咨 询小七/电子商务沙盘seo关键词
  • 银川做网站多少钱/全网营销整合营销
  • 现在装宽带要多少钱/搜索引擎优化的英文缩写是什么