FPGA系列之DDS信号发生器设计(DE2-115开发板)

news2025/5/13 1:38:24

一、IP核

IP(Intellectual Property)原指知识产权、著作权等,在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能(如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等)并且参数可修改的电路模块,又称为IP核(IP Core)。随着CPLD/FPGA器件的集成度越来越高,设计越来越复杂,使用IP核是EDA设计的发展趋势。根据实现方式的不同,IP核可以分为软核(soft core)、固核(firm core)和硬核(hard core)。

Intel公司以及第三方合作伙伴提供的IP模块可以分为两类:可修改参数的IP核(Library of Parameterized Modules, LPM)和需要授权才能在生产设计中使用的IP核(功能更复杂的模块,也称为MegaCore)​。这些模块专门针对不同的器件结构进行了优化,在设计数字系统时,我们可以充分利用这些IP模块,加快设计进度,同时提高器件资源的利用率。

注:该内容引用自Verilog HDL与FGPGA数字系统设计(第二版)

二、DDS信号发生器设计

1.DDS信号发生器

(1)概念

直接数字频率合成(Direct Digital Frequency Synthesis,简称DDS或DDFS)是一种应用数字技术产生信号波形的方法,它是由美国学者J. Tierncy、C.M. Rader和B. Gold在1971年提出的,他们以数字信号处理理论为基础,从相位概念出发提出了一种新的直接合成所需波形的全数字频率合成方法。

DDS系统通常包含以下模块:
相位累加器(Phase Accumulator)
波形查找表(Waveform ROM/LUT)
数模转换器(DAC)
​​抗混叠滤波器(Anti-Aliasing Filter)

(2)DDS工作流程

2. DDS信号发生器设计

使用Quartus Prime Lite创建工程,顶层文件名为DDS_top,芯片选择EP4CE115F29C7(详细步骤看其余FPGA文章)。

(1)相位累加器的设计

新建Verilog HDL File文件,文件名为addr_cnt.v(如果与VS Code连用代码写好后另存为就好)

//=====相位累加器和数据锁存器=====
module addr_cnt(CPi,K,ROMaddr,Address);
        input CPi;                     //系统基准时钟(100MHz)
        input [12:0] K;                //13位频率控制字
        output reg [9:0] ROMaddr;      //10位ROM地址
        output reg [16:0] Address;     //17位相位累加器地址信号
    always @(posedge CPi)
    begin
        Address = Address + K;
        ROMaddr = Address[16:7];
    end
endmodule

在项目中添加addr_cnt.v文件,选择Files,右键点击Files,点击添加

找到刚才保存的文件添加

选择Set as Top-Level Entity将其设为顶层文件,点击编译

右键点击addr_cnt.v文件,选择CreateSymbol Files for Current File命令,生成该模块的符号

在Quartus中打开生成的addr_cnt.bsf文件,生成的该模块的符号如图

(2)波形存储器ROM的设计
A.方波模块

步骤跟上面的一样,文件名为squwave.v,其代码如下

//=====方波产生模块:squwave.v ======
module squwave(CPi,RSTn,Address,Qsquare);
    input CPi;                          //系统基准时钟(100MHz)
    input RSTn;                         //同步清零
    input [16:0] Address;               //17位地址输入信号
    output reg [11:0] Qsquare;          //输出方波信号,12位宽,送至DAC
    always @(posedge CPi)        
    if(!RSTn) Qsquare=12'h000;          //同步清零
    else begin                   
        if(Address<=17'h0FFFF)  
            Qsquare=12'hFFF;            //输出高电平
        else Qsquare=12'h000;           //输出低电平
    end
endmodule

打开生成的squwave.bsf文件后该模块的符号如图

B.正弦波形存储器模块

Quartus Prime软件接受两种格式的初始化文件MemoryInitialization File(.mif)和Hexadecimal(Intel-Format)File(.hex)。使用时,将初始化文件放在当前工程项目子目录中,在配置LPM_ROM时会对其进行初始化。而建立.mif格式文件有两种方法,一种是直接编辑法,另一种是用C语言等软件生成初始化文件(初始化储存单元较多时更加实用)

打开c语言编译器,建立sinewave.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;
/*建立文件名为Sine1024.mif的新文件,允许写入数据,对文件名没有特殊要求,但扩展名必须为.mif*/
    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++)
            {/*周期为1024个点的正弦波*/
             v=sin(2*PI*n/DEPTH);
             /*将-1~1之间的正弦波的值扩展到0~4095之间*/
             temp=(int)((v+1)*4095/2); //v+1将数值平移到0~2之间
             /*以十六进制输出地址和数据*/
             fprintf(fp,"%x\t:\t%x;\n",n,temp);
        }
        fprintf(fp,"END;\n");
        fclose(fp);    //关闭文件
    }
}

运行此文件后会生成sinewave.exe文件,双击运行就会生成Sine1024.mif文件

接着,验证生成的数据是否正确。用记事本打开生成的mif文件,同时用Quartus Prime软件打开mif文件,若能成功导入数据且数据一致,则说明生成文件正确,将其添加到工程文件中。

在Quartus Prime主界面选择Tool→IP Catalog

在查找框内输入ROM, IP核目录(IP Catalog)栏中会列出相关的IP核,选择ROM:1-PORT并双击

弹出如图所示的保存IP设置界面,输入文件名SineROM.v,并选中Verilog,单击OK按钮

设置ROM的数据位宽为12,存储容量(字数)为1024,单击Next按钮

点击Next,配置如下

点击Browse...选择生成的Sine1024.mif文件,这是指明初始化ROM所使用的数据文件名

然后Next直到最后一页,弹出如图所示的选择输出文件的对话框(最重要的是.v文件,其余文件按需要勾选,.bsf文件也可以选上),选择好后点击Finish

SineROM.v等相关文件就生成好了

该模块的符号如下图所示:

3.锁相环倍频电路设计

定制一个名称为PLL100M_CP的时钟模块,该模块的输入inclk0为50MHz时钟信号,输出c0为100MHz的脉冲信号,占空比为50%,带有相位锁定指示输出端locked。

在右侧查找框内输入ALTPLL(嵌入式锁相环)​

双击打开,输入文件名PLL100M_CP.v,并选中Verilog,单击OK按钮

设置输入时钟(inclk0)频率为50MHz

其余的按如下图片设置 

最后选择需要生成的文件

4.顶层电路设计

代码如下

//========DDS的顶层模块:DDS_top.v ======
module DDS_top(CLOCK_50, RSTn, WaveSel, K,
WaveValue, LEDG, CLOCK_100);
    input CLOCK_50;                           //50MHz时钟
    input RSTn;                               //控制方波清零,低电平有效
    input [1:0] WaveSel;                      //波形选择:SW[17:16]=10时为方波;SW
                                                     //[17:16]=01时为正弦波
    input [12:0] K;                           //频率控制字SW12..SW0
    output reg [11:0] WaveValue;              //输出波形数据
    wire [9:0] ROMaddr;                       //波形存储器地址
    wire [16:0] Address;                      //17位相位累加器地址
    wire [11:0] Qsine, Qsquare;               //正弦、方波数据输出
    output [0:0]LEDG;                         //锁相环相位锁定指示灯,亮表示锁定
    output CLOCK_100;                         //锁相环输出时钟,频率为100MHz
    wire CPi =CLOCK_100;
    PLL100M_CP PLL100M_CP_inst (              //实例引用锁相环子模块
    .inclk0 ( CLOCK_50 ),                     //50MHz时钟输入
    .c0 ( CLOCK_100 ),                        //100MHz时钟输出
    .locked ( LEDG[0] )                       //相位锁定指示
);
    addr_cnt U0_instance(CPi,K,ROMaddr,Address);
                                              //实例引用地址累加器
    SineROM ROM_inst (                        //实例引用正弦LPM_ROM子模块
    .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开发板来验证上述设计。用板上的50MHz晶振作为时钟输入,用KEY3控制方波清零,用SW12~SW0设置频率控制字,SW17、SW16用来选择输出波形的种类,用LEDG0作为PLL的相位锁定指示。

有DE2_115_pin_assignments.csv文件可以直接导入不用手动配置引脚,没有的话参考DE2-115文档配置。为了方便导入文件DE2_115_pin_assignments.csv进行引脚分配,将使用该文件中的端口名称代替上述DDS_top.v(代码如下)中的信号名称。为此再编写一个顶层文件DE2_DDS_top.v代码如下:

//=====在开发板上运行的DDS的顶层模块:DE2_115_DDS_top.v ======
module DE2_115_DDS_top(CLOCK_50, KEY, SW, GPIO_0, LEDG);
    input CLOCK_50;                          //50MHz时钟
    input[3:3] KEY;                          //按键KEY3,控制方波清零
    input[17:0] SW;                          //拨动开关
    output [12:0] GPIO_0;                    //扩展接口,送出波形数据给DAC
    output [0:0]LEDG;                        //绿色LED指示相位是否锁定
    wire CLOCK_100;                          //100MHz时钟
    assign GPIO_0[12]=CLOCK_100;             //送给DAC的时钟
    wire RSTn = KEY[3];                      //控制方波清零,低电平有效
    wire [1:0] WaveSel = SW[17:16];          //选择输出波形
    wire [12:0] K = SW[12:0];                //设置频率控制字,最小值必须为1
    wire [11:0] WaveValue;
    assign GPIO_0[11:0] = WaveValue;         //输出波形数据
    DDS_top DE2(CLOCK_50, RSTn, WaveSel, K, WaveValue, LEDG, CLOCK_100);
endmodule

对其进行全编译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Dv3Admin】从零搭建Git项目安装·配置·初始化

项目采用 Django 与 Vue3 技术栈构建&#xff0c;具备强大的后端扩展能力与现代前端交互体验。完整实现了权限管理、任务队列、WebSocket 通信、系统配置等功能&#xff0c;适用于构建中后台管理系统与多租户平台。 本文章内容涵盖环境搭建、虚拟环境配置、前后端部署、项目结…

P3416-图论-法1.BFS / 法2.Floyd

这道题虽然标签有floyd但是直接bfs也能过 其实事实证明还是bfs快&#xff0c;因为bfs只需要遍历特定的点&#xff0c;但是floyd需要考虑遍历所有可能的中介点 法1.BFS 用字典存储每个点所能普及的范围&#xff0c;然后用对每个点bfs进行拓展 nint(input())temp[]#xmax0;yma…

极狐GitLab 议题和史诗创建的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 议题和史诗创建的速率限制 (BASIC SELF) 速率限制是为了控制新史诗和议题的创建速度。例如&#xff0c;如果您将限制设置为 …

提交到Gitee仓库

文章目录 注册配置公钥创建空白的码云仓库把本地项目上传到码云对应的空白仓库中 注册 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盘/用户/用户名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注册时搞过&…

oracle中错误总结

oracle中给表起别名不能用as&#xff0c;用as报错 在 Oracle 数据库中&#xff0c;​​WITH 子句&#xff08;即 CTE&#xff0c;公共表表达式&#xff09;允许后续定义的子查询引用前面已经定义的 CTE​​&#xff0c;但 ​​前面的 CTE 无法引用后面的 CTE​​。这种设计类似…

纽约大学具身智能体在城市空间中的视觉导航之旅!CityWalker:从海量网络视频中学习城市导航

作者&#xff1a;Xinhao Liu, Jintong Li, Yicheng Jiang, Niranjan Sujay, Zhicheng Yang, Juexiao Zhang, John Abanes, Jing Zhang, Chen Feng单位&#xff1a;纽约大学论文标题&#xff1a;CityWalker: Learning Embodied Urban Navigation from Web-Scale Videos论文链接&…

OpenCV颜色变换cvtColor

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的&#xff0c;但是在进行图像处理时需要用到灰度图、二值图、HSV&#xff08;六角锥体模型&#xff0c;这个模型中颜色的…

Manus技术架构、实现内幕及分布式智能体项目实战

Manus技术架构、实现内幕及分布式智能体项目实战 模块一&#xff1a; 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议&#xff0c;构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二&#xff1a; 解析Manus大模型Agent操作电脑的原理与关键API&#xf…

下载油管视频 - yt-dlp

文章目录 1. yt-dlp与you-get介绍1.1 主要功能对比1.2 使用场景1.3 安装 2. 基本命令介绍2.1 默认下载视频2.2 指定画质和格式规则2.3 下载播放列表2.4 备注 3. 参考资料 之前只使用you-get下载b站视频&#xff0c;当时了解you-get也可下载油管视频&#xff0c;但之前无此需求&…

济南通过首个备案生活服务大模型,打造行业新标杆

近日&#xff0c;一则振奋人心的消息在人工智能领域传开&#xff1a;济南本土企业丽阳神州智能科技有限公司自主研发的 “丽阳雨露” 大模型成功通过国家网信办的备案。这一成果不仅是济南企业在科技创新道路上的重大突破&#xff0c;更标志着我国在生活服务领域的人工智能应用…

第6次课 贪心算法 A

向日葵朝着太阳转动&#xff0c;时刻追求自身成长的最大可能。 贪心策略在一轮轮的简单选择中&#xff0c;逐步导向最佳答案。 课堂学习 引入 贪心算法&#xff08;英语&#xff1a;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程…

Hexo+Github+gitee图床零成本搭建自己的专属博客

一个详细、完善的 Hexo 博客部署教程&#xff0c;不仅涵盖了基本的安装、配置、生成与部署步骤&#xff0c;还增加了常见问题的解决、主题设置、图片上传等 在开始之前可以看看我最终搭建出来的成果&#xff1a;https://liangjh.blog 1.安装git和nodejs 在Windows上使用Git&a…

数字信号处理技术架构与功能演进

数字信号处理&#xff08;DSP&#xff09;是通过数字运算实现信号分析、变换、滤波及调制解调的技术领域&#xff0c;其发展过程与技术应用如下&#xff1a; 一、定义与核心功能 技术定义&#xff1a;通过算法将模拟信号转换为数字形式进行处理&#xff0c;具有高精度、可编程…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;几乎维系着整个安卓程序运行的生命周期&#xff0c;但是这么重要的一个东西&#xff0c;我们真的了解它吗&#xff1f;下面跟随着我的脚步&#xff0c;慢慢揭开Hanler的神秘面纱吧&#xff01; 本文将介绍Handler 的运…

C++ 什么是隐式类型转换,什么是显式类型转换

在 C 中&#xff0c;​​类型转换​​是将一种数据类型的值转换为另一种数据类型的过程&#xff0c;分为 ​​隐式类型转换​​&#xff08;由编译器自动完成&#xff09;和 ​​显式类型转换​​&#xff08;由程序员手动指定&#xff09;。以下是它们的区别和示例&#xff1a…

NVIDIA 自动驾驶技术见解

前言 参与 NVIDIA自动驾驶开发者实验室 活动&#xff0c;以及解读了 NVIDIA 安全报告 自动驾驶 白皮书&#xff0c;本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞&#xff0c;重塑更安全、高效、包容的交通生态。在这一领域&#xff0c;NVI…

【Flask】Explore-Flask:早期 Flask 生态的实用指南

开源项目&#xff1a;explore-flask/README.rst at master rpicard/explore-flask (github.com) 一、Coding conventions Summary Try to follow the coding style conventions laid out in PEP 8. Try to document your app with docstrings as defined in PEP 257. def…

【论文阅读21】-PSOSVM-CNN-GRU-Attention-滑坡预测(2024-12)

这篇论文主要提出并验证了一种新型的混合智能模型&#xff08;PSOSVM-CNN-GRU-Attention&#xff09;&#xff0c;用于准确预测滑坡的点位移&#xff0c;并构建可靠的位移预测区间。通过对Baishuihe滑坡和Shuping滑坡的案例分析&#xff0c;展示了该模型的出色性能。 [1] Zai D…

蓝牙 6.0 发布,解锁无线科技新可能

在5G和Wi-Fi 7高速发展的时代&#xff0c;蓝牙技术始终以独特优势深度融入日常生活。从无线耳机到智能家居&#xff0c;它凭借低功耗、高兼容的特性&#xff0c;悄然连接各类智能设备&#xff0c;打造无缝的数字生活体验。无论是聆听音乐、智能门禁还是健康监测&#xff0c;蓝牙…

EasyCVR视频智能分析平台助力智慧园区:全场景视频监控摄像头融合解决方案

一、方案背景 在智慧园区建设的浪潮下&#xff0c;设备融合、数据整合与智能联动已成为核心诉求。视频监控作为智慧园区的“视觉中枢”&#xff0c;其高效整合直接影响园区的管理效能与安全水平。然而&#xff0c;园区内繁杂的视频监控设备生态——不同品牌、型号、制式的摄像…