Step1:理论分析

上图是一种常用的DDS系统的原理图。

系统的核心是相位累加器,其内容会在每个时钟周期更新。相位累加器每次更新时,存储在 Δ 相位寄存器中的数字字 M 就会累加至相位寄存器中的数字。假设 Δ 相位寄存器 中的数字为 00…01,相位累加器中的初始内容为 00…00。相位累加器每个时钟周期都 会按 00…01 更新。如果累加器为 32 位宽,则在相位累加器返回至 00…00 前需要 232 (超过 40 亿)个时钟周期,周期会不断重复。 相位累加器的截断输出用作正弦(或余弦)查找表的地址。查找表中的每个地址均对应正弦波的从 0°到 360°的一个相位点。查找表包括一个完整正弦波周期的相应数字幅度 信息。(实际上,只需要 90°的数据,因为两个 MSB 中包含了正交数据)。因此,查找 表可将相位累加器的相位信息映射至数字幅度字,进而驱动 DAC。

简单来说,设DDS系统工作频率在 fclkf_{clk}fclk​ ,频率控制字为 fwordfwordfword,则输出信号的频率 fof_ofo​ 可以表示为:
fo=fclk2N×fwordf_o=\frac{f_{clk}}{2^N}\times fword fo​=2Nfclk​​×fword
这个公式说明DDS系统输出的最低频率是 fclk2N\frac{f_{clk}}{2^N}2Nfclk​​ ,这也是DDS系统的最低频率分辨率。想要提高输出频带范围和频率分辨率就需要同时扩大 fclkf_{clk}fclk​ 和存储单周期信号的点数 2N2^N2N,根据实际需求来定。改变输出频率的方法就是改变频率控制字 fwordfwordfword 。

DDS不止能输出正弦信号,只要是周期信号,其实都可以输出。比如方波和三角波就可以用级数展开的方法,用正弦信号叠加生成,这个操作可以靠纯软件算法实现。

Step2:新建一个工程


Step3:启动Platform Designer(老版本Quartus里叫Qsys)

kernel.qsys中各IP核配置参数:

  • Clock Source:100MHz。

  • Nios II Processor(建议其他模块搭完后再来Edit): Vectors->Reset Vector:选择epcs_flash(固化的程序存在外挂Flash芯片中),Exception Vector:On chip RAM。

  • On-Chip RAM:Data width:32bit, 总大小10240Byte。

  • Legacy EPCS/EPCQx1 Flash烧写模块(固化程序会用到,不想固化可以不加这个IP核):直接Finish。

  • Jtag-uart:直接Finish。

  • System ID Peripheral:直接Finish。

  • PIO0:仅将Basic Settings中设置为6bit output, Finish。

  • PIO1:仅将Basic Settings中设置为6bit output, Finish。

  • UART0(注意不是University Program中的RS232-UART):Parity:NONE; Data bits:8; Stop bits:1; Synchronizer stages:2; Baud Rate:115200。

按照下图的方法连接好系统:

Step4:将kernel.qip include到工程中

Assignments->Settings->File

Step5:编写系统的Verilog逻辑外设模块

1.加入pll IP核(为了产生kernel.qsys所工作的100MHz时钟信号)

一路狂next…

点击Finish。

2.创建MIF文件

编写Matlab程序生成一个周期信号采样值:这里是单频正弦信号,按 2π2\pi2π 相位采样并量化。

最后将 xxx 序列中的值复制到MIF文件中

3.加入单端口rom核

将事先制作好的MIF文件include进来

rom核配置完成。

4.编写顶层模块Verilog程序

Step6:编写Nios ii C控制程序

  1. Workspace正确选择后,新建 Hello World模板工程,把kernel.sopcinfo导入。

  1. 配置编译器参数

开发板的外挂Flash芯片空间较小,所以对代码量要进行优化,在Nios ii的BSP Editor中:

  • 使能精简C标准库

  • 取消对C++的支持

3.Build一下工程。

4.编写C核心控制程序。

Step7:分配引脚

注意:EPCS的引脚要看原理图上FLASH芯片上的位置,不同的开发板可能有所不同。

EP4CE6的nCEO引脚必须改成Regular IO。

编译工程。

Step8:下载.sof文件并在Nios II中开启Debug

注:一定要先下载.sof再去Nios ii中Debug,顺序不可以倒过来

至此实机系统就完成了,只要在y_out端接上一个并口DA,示波器上就能看到实验现象。在没有DA和示波器时,可以使用Signal-Tap进行信号监视。Signal-Tap是片内逻辑分析仪,其数据均是FPGA实际下载后采样得到的,比传统的ModelSim仿真要可靠。

Step9:打开Signal-Tap

在Quartus中打开Signal-Tap

  1. 为Signal-Tap添加时钟

​ 添加50MHz的系统时钟作为时钟源。

  1. 添加需要监视的信号

然后将采样深度设置为1K。主控芯片RAM资源越多可以选的越大。

保存。后面弹出来的对话框直接选Yes。

  1. 重新编译一下工程将Signal-Tap资源配置信息缝合进去。

  2. 重新下载.sof和.elf

  3. 在Signal-Tap中点击等待采样

  1. 电脑端串口调试助手发送 0x0D和0x01(表示fword设置为1)。

  2. 查看波形。

验证成功。

Step10:固化SOPC工程

总思路:分别将Verilog生成的.sof文件和nios ii生成的.elf文件转换为.flash文件,再转换为.hex文件,最后再一起生成.jic固化文件

1.将.sof文件和.elf文件放到新的文件夹中。

  1. 在Nios ii中:右键主工程->Nios ii->Nios II Command Shell。
  2. 按照下图的命令行指令实现转换

  1. 在Quartus中打开Convert Programming Files。

按照下图进行配置:

注意:hw.hex和sw.hex在添加时要设置为相对地址、大端存储。其中hw.hex添加时要设置起始地址0x0。

  1. 在Programmer中下载.jic

至此,SOPC的固化操作完成,现在可以随意断电保证程序不丢失了。

从零开始制作一个基于SOPC方法的DDS正弦信号发生器相关推荐

  1. opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统

    教你从零开始做一个基于深度学习的交通标志识别系统 基于Yolo v3的交通标志识别系统及源码 自动驾驶之--交通标志识别 在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法 ...

  2. 如何制作一个基于Tile的游戏 2 Cocos2d-x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在第一篇 ...

  3. 电赛练习1《基础版》— 利用Multisim设计并制作一个简易的方波-三角波-正弦波信号发生器,要求输出频率可调,矩形波占空比可调等

    首先呢, 感慨一下,我记得去年这个时候,也是放寒假,我在CSDN上写了第一篇原创,使用python画了一个蜡笔小新的头像,并且我在文末说明了自己会陆续更新很多文章,结果- 到了今天放寒假,我的文章还是 ...

  4. 从零开始制作一个飞机大战类型的射击游戏

    射击类游戏是极为经典的游戏系列之一,它往往有着精美绚丽的画面,高度有趣的音效,为玩家呈现不一样射击体验,让人流连忘返. 今天,我们用scratch从零开始制作了的一个射击类型的小游戏,适合学习者进行学 ...

  5. 从零开始实现一个基于RISC-V的流水线处理器 (1) :RISC-V指令集架构详解

    目录 基于RISC-V的流水线处理器 RISC-V指令集 RV32I R-Type I-Type J-Type B-Type Load & Store 总结 后记 基于RISC-V的流水线处理 ...

  6. 从零开始制作一个linux iso镜像

    一.前言     对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核.一个根文件系统和引导.以下是本文制作linux iso镜像所用到的系统和软件:     OS ...

  7. 如何制作一个基于Tile的游戏 Cocos2d-x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  8. 五子棋java判断平局_2020-10-03 Java初级项目——从零开始制作一个简易五子棋游戏...

    一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public class UI { private JFrame frame = new JFrame(); publ ...

  9. java五子棋_Java初级项目——从零开始制作一个简易五子棋游戏

    一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public 使用JPanel和Graphics画出大小为15X15的棋盘 再创建一个新的类--Chessboard, ...

最新文章

  1. 智慧少年队显示服务器异常,六大智慧少年是什么梗,六大智慧少年其它五个
  2. CreateToolhelp32Snapshot
  3. 20个python代码_有用的20个python代码段(4)
  4. 同花顺2020年净利润17亿元增长近一倍,DAU超1400万
  5. 【神经网络计算】——神经网络实现鸢尾花分类
  6. 《软件测试》 第三次博客作业
  7. 需求管理-需求的结构
  8. password textbox setup
  9. 生成器 Generators
  10. 计算机网络考研辅导谁的好,计算机网络考研辅导哪个好
  11. pip常用命令、配置pip源
  12. Mysql JSON对象和JSON数组查询
  13. web前端基础教程实践DIV+CSS网页布局入门指南
  14. 引入静态资源出现net:ERR_ABORTED
  15. 信息系统项目管理师2019年上半年上午试题解析(三)
  16. ncnn报无法将参数 1 从“std::string”转换为“const ncnn::DataReader
  17. Web前端之HTML超文本标记语言
  18. 胖哈勃 web--NewSql Mysql 8 注入
  19. 被特殊物种序列虚晃一枪的日子
  20. 如何用Java语言打印出九九乘法表

热门文章

  1. iis6独立安装供下载(原创)
  2. Blender 如何添加渲染AO,Bloom~~
  3. c语言编程代码大全(c语言简单代码大全)
  4. 在计算机语言中go是什么意思,golang中的断言是什么意思
  5. x264源码分析与应用示例(一)——视频编码基本流程
  6. 【20230103】FROM_UNIXTIME和UNIX_TIMESTAMP函数
  7. Android App Widget中如何调用RemoteView中的函数
  8. 【MYSQL数据库综合练习】第一部分
  9. R2决定系数(Coefficient of Determination)
  10. 艺赛旗(RPA)【服务端】修改服务器访问端口