从零开始制作一个基于SOPC方法的DDS正弦信号发生器
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控制程序
- Workspace正确选择后,新建 Hello World模板工程,把kernel.sopcinfo导入。
- 配置编译器参数
开发板的外挂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
- 为Signal-Tap添加时钟
添加50MHz的系统时钟作为时钟源。
- 添加需要监视的信号
然后将采样深度设置为1K。主控芯片RAM资源越多可以选的越大。
保存。后面弹出来的对话框直接选Yes。
重新编译一下工程将Signal-Tap资源配置信息缝合进去。
重新下载.sof和.elf
在Signal-Tap中点击等待采样
电脑端串口调试助手发送 0x0D和0x01(表示fword设置为1)。
查看波形。
验证成功。
Step10:固化SOPC工程
总思路:分别将Verilog生成的.sof文件和nios ii生成的.elf文件转换为.flash文件,再转换为.hex文件,最后再一起生成.jic固化文件
1.将.sof文件和.elf文件放到新的文件夹中。
- 在Nios ii中:右键主工程->Nios ii->Nios II Command Shell。
- 按照下图的命令行指令实现转换
- 在Quartus中打开Convert Programming Files。
按照下图进行配置:
注意:hw.hex和sw.hex在添加时要设置为相对地址、大端存储。其中hw.hex添加时要设置起始地址0x0。
- 在Programmer中下载.jic
至此,SOPC的固化操作完成,现在可以随意断电保证程序不丢失了。
从零开始制作一个基于SOPC方法的DDS正弦信号发生器相关推荐
- opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统
教你从零开始做一个基于深度学习的交通标志识别系统 基于Yolo v3的交通标志识别系统及源码 自动驾驶之--交通标志识别 在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法 ...
- 如何制作一个基于Tile的游戏 2 Cocos2d-x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在第一篇 ...
- 电赛练习1《基础版》— 利用Multisim设计并制作一个简易的方波-三角波-正弦波信号发生器,要求输出频率可调,矩形波占空比可调等
首先呢, 感慨一下,我记得去年这个时候,也是放寒假,我在CSDN上写了第一篇原创,使用python画了一个蜡笔小新的头像,并且我在文末说明了自己会陆续更新很多文章,结果- 到了今天放寒假,我的文章还是 ...
- 从零开始制作一个飞机大战类型的射击游戏
射击类游戏是极为经典的游戏系列之一,它往往有着精美绚丽的画面,高度有趣的音效,为玩家呈现不一样射击体验,让人流连忘返. 今天,我们用scratch从零开始制作了的一个射击类型的小游戏,适合学习者进行学 ...
- 从零开始实现一个基于RISC-V的流水线处理器 (1) :RISC-V指令集架构详解
目录 基于RISC-V的流水线处理器 RISC-V指令集 RV32I R-Type I-Type J-Type B-Type Load & Store 总结 后记 基于RISC-V的流水线处理 ...
- 从零开始制作一个linux iso镜像
一.前言 对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核.一个根文件系统和引导.以下是本文制作linux iso镜像所用到的系统和软件: OS ...
- 如何制作一个基于Tile的游戏 Cocos2d-x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- 五子棋java判断平局_2020-10-03 Java初级项目——从零开始制作一个简易五子棋游戏...
一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public class UI { private JFrame frame = new JFrame(); publ ...
- java五子棋_Java初级项目——从零开始制作一个简易五子棋游戏
一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public 使用JPanel和Graphics画出大小为15X15的棋盘 再创建一个新的类--Chessboard, ...
最新文章
- 智慧少年队显示服务器异常,六大智慧少年是什么梗,六大智慧少年其它五个
- CreateToolhelp32Snapshot
- 20个python代码_有用的20个python代码段(4)
- 同花顺2020年净利润17亿元增长近一倍,DAU超1400万
- 【神经网络计算】——神经网络实现鸢尾花分类
- 《软件测试》 第三次博客作业
- 需求管理-需求的结构
- password textbox setup
- 生成器 Generators
- 计算机网络考研辅导谁的好,计算机网络考研辅导哪个好
- pip常用命令、配置pip源
- Mysql JSON对象和JSON数组查询
- web前端基础教程实践DIV+CSS网页布局入门指南
- 引入静态资源出现net:ERR_ABORTED
- 信息系统项目管理师2019年上半年上午试题解析(三)
- ncnn报无法将参数 1 从“std::string”转换为“const ncnn::DataReader
- Web前端之HTML超文本标记语言
- 胖哈勃 web--NewSql Mysql 8 注入
- 被特殊物种序列虚晃一枪的日子
- 如何用Java语言打印出九九乘法表
热门文章
- iis6独立安装供下载(原创)
- Blender 如何添加渲染AO,Bloom~~
- c语言编程代码大全(c语言简单代码大全)
- 在计算机语言中go是什么意思,golang中的断言是什么意思
- x264源码分析与应用示例(一)——视频编码基本流程
- 【20230103】FROM_UNIXTIME和UNIX_TIMESTAMP函数
- Android App Widget中如何调用RemoteView中的函数
- 【MYSQL数据库综合练习】第一部分
- R2决定系数(Coefficient of Determination)
- 艺赛旗(RPA)【服务端】修改服务器访问端口