用FPGA+DAC输出“心”形波

1.前言

  之前在做信号处理的时候整了一下活,用FPGA+DAC(数模转换器),输出了一个爱心形状的波形,今天整理资料的时候偶然发现了他,现在把他分享出来。当时将DAC的输出接在示波器上显示如下图所示:

2.原理

  爱心波形的函数表达式如下:
f ( x ) = x 2 3 + 1 3 e ( π − x 2 ) 1 2 sin ⁡ ( a π x ) f(x)=x^\frac{2}{3} + \frac{1}{3}e(\pi-x^2)^\frac{1}{2}\sin(a\pi x) f(x)=x32+31e(πx2)21sin(x)
  其中,e为自然对数,a为参数 π \pi π为圆周率。首先在Matlab当中,画出上述函数的波形,不断调整a的值,使其更逼近我们想要的“爱心”形状。经过试验,作者觉得 a = 10 a=10 a=10时比较像,图像如下:


  然后将图像进行采样和量化,存为coe文件,导入到FPGA的ROM中:
  (1)打开IP Catalog:

  (2)IP核选择Block Memory Generator:

  (3)选择Single Port ROM,即单口ROM:

  (4)修改位宽和深度与coe文件保持一致,选择端口始终使能:

  (5)添加coe文件:

  IP配置核配置完成点击确定即可。仿真效果如下:

3.DAC

  当时我使用的是ADI的AD9122进行输出,下面讲一下AD9122的电路设计:

3.1电源

  单板的供电方式是通过一个DC-DC的电源接头输入一个5.0V的直流电压,经过一个大电容滤波后,再分别由相应的电源芯片降压,产生AVDD33(3.3V)、DVDD18((1.8V)、CVDD18(1.8V)、LOVDD(1.8V),这些电源在经过滤波后给相应部件供电。

电源设计原理图

3.2低通滤波器

  为了保证输出波形更平滑,需要在输出端口接一个低通滤波器。这里采用五阶巴特沃斯低通滤波器,其转折频率为300MHz。

低通滤波器原理图

3.3 AD9122

AD9122外围电路原理图

AD9122 PCB布局

AD9122硬件实物图

3.4 通过串行端口SPI配置AD9122功能寄存器

3.4.1 SPI协议简述

  SPI端口由三个引脚组成:串行时钟引脚(SCLK)、串行数据输入/输出引脚(SDIO)和片选引脚(CSB),这被称为三线模式。一些芯片把串行数据输出引脚(SDO)作为可选引脚,如果包含它,它仅用于从设备读取数据,一般地,为了减少引脚数量,大多数芯片都省略了这个引脚。

SPI通信三线模式单设备控制

  (1)串行时钟(SCLK):SCLK用于同步串行接口读取和写入。输入数据记录在该时钟的上升沿,输出数据传输记录在下降沿。

  (2)串行数据输入/输出(SDIO):SDIO引脚是一个双重用途的引脚。这个引脚可作为是输入或输出,具体取决于发送的指令(读或写)在时序帧中的相对位置(指令或数据相位)。在写或读的第一阶段,这个引脚作为输入传递信息到内部状态机。如果确定该命令为读命令,状态机将此引脚(SDIO)更改为输出,然后将数据传回控制器。如果设备包含一个SDO引脚,并且配置寄存器使能,那么SDO将变为串行数据输出端口,而SDIO只作为串行数据输入端口。

  (3)片选信号(CSB):CSB是一个有效的低电平控制,用于控制读写周期。当该线路为低电平时,将选择该设备,并处理SCLK和SDIO线路上的信息。如果此引脚为高电平,器件会忽略SCLK和SDIO线路上的任何信息。通过这种方式,多个设备可以连接到SPI端口。如果只连接了一个器件,可以选择将CSB线拉低,使该器件永久有效。

3.4.2 AD9122串行端口操作

  当CS引脚上的电平由逻辑高电平到逻辑低电平,串行端口时序将复位至指令周期的初始状态。从这个状态开始,接下来的前八个SCLK上升沿代表当前输入输出操作的指令位,后八个SCLK上升沿进行数据的传输。也就是说,控制器与AD9122的通信周期分为两个阶段:阶段1是指令周期(将指令字节写入器件),与前八个SCLK上升沿一致,指令字节定义了即将到来的数据传输是读还是写,以及数据传输第一个字节的起始寄存器地址;通信周期的第2阶段是指令字节向串行端口控制器提供有关数据传输周期的信息,向寄存器写入数据,改变寄存器的值,来配置自己所需要的功能,或者对寄存器的值进行访问,以判断器件此刻的工作状态。

串行端口接口时序

  指令字节的第7位,决定了在指令字节写入后是进行读数据传输还是写数据传输。逻辑1表示读操作,逻辑0表示写操作。A6至A0是指令字节的位6至位0,决定在通信周期的数据传输部分访问的寄存器的地址。

串行端口指令字节

  ADI的数模转换器(DAC)和模数转换器(ADC)使用起来都差别不大,基本都可以使用SPI去读写其寄存器。我这里用的是AD9122,你搞明白了,只要会看datasheet也能很快上手。

代码

获取代码和工程请点此链接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java中的运算

进制 十进制二进制Binary:0b、0B开头;八进制octal: 0开头十六进制: 0x或者0X开头; 二进制表达式 一个字节,最高位是符号位:0标识正数,1表示负数;计算机底层使用补码的…

香港Web3,步履蹒跚

4月30日,6支香港虚拟资产现货ETF在香港交易所敲钟上市,正式迎来市场首秀。 而在前一周,香港证监会(SFC)官网就已列出华夏基金(香港)、博时国际和嘉实国际三家基金公司的比特币和以太坊现货ETF,并陆续披露了…

Python-快速搭建一个管理平台

目录 📜 准备工作 一、项目介绍 ✨ 二、制作数据库表 添加信息 ⚒️ 三、运行client.exe 🚀 1、连接数据库,选择对应表,生成代码 2、把后端代码依次复制到项目中 3、把前端代码依次复制到前端项目中 4、添加路由 四、运行后端项目…

安卓中级控件(图形、选择按钮、文本输入、对话框)

图形定制 图形Drawable Android把所有能够显示的图形都抽象为Drawable类(可绘制的)。这里的图形不止是图片,还包括色块、画板、背景等。 包含图片在内的图形文件放在res目录的各个drawable目录下,其中drawable目录一般保存描述性…

react完整项目搭建的思路

react完整项目搭建的思路 react完整项目搭建的思路1.使用creacte-react-app初始化项目2.安装所需插件:路由、网络、样式、组件库3.reactjs目录结构组织4. 配置路径别名4.配置路由5.网络配置,对axios进行封装》获取当前环境变量 6.配置代理解决跨域7.配置使用iconfont8.状态管理…

暗区突围steam叫什么 暗区突围无限steam上线时间测试申请预约教程

暗区突围steam叫什么 暗区突围无限steam上线时间 测试申请预约教程 最近暗区突围国际服的上线在游戏圈内引起了不小的波澜,这是一款由腾讯游戏开发的大逃杀类型游戏,玩家们需要在暗区内浴血搏杀,使用各种武器和道具活到最后,来取…

Linux系统中搭建Mosquitto MQTT服务并实现远程访问本地消息代理进行通信

文章目录 1. Linux 搭建 Mosquitto2. Linux 安装Cpolar3. 创建MQTT服务公网连接地址4. 客户端远程连接MQTT服务5. 代码调用MQTT服务6. 固定连接TCP公网地址7. 固定地址连接测试 今天和大家分享一下如何在Linux系统中搭建Mosquitto MQTT协议消息服务端,并结合Cpolar内网穿透工具…

Visual Source Safe 安装与使用教程

1.VSS 的工作原理: Microsott的 vss讲所有的项目源文件(包括各种文件类型)以特有的方式存入数据库。用户成员不能对该数据库中的文件进行直接的修改,而是由版本管理器将该项目的远程序或是子项目的程序拷贝到各个用户成员自己的工作目录下进行调试和修改,然后将修改后的项目…

OpenFeign修改HttpClient为Apache HttpClient 5

OpenFeign中http client 如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求, 由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。 总结为两步: 加依赖改yml 具体操作请往…

OpenCV如何为等值线创建边界旋转框和椭圆(63)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 为轮廓创建边界框和圆(62) 下一篇:OpenCV的图像矩(64) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::minAreaRect使用 OpenCV 函数 cv::fitEllipse cv::min…

【C++】学习笔记——string_2

文章目录 六、string类2. 反向迭代器const迭代器 string类对象的容量操作(补)size() 3. string类的元素访问4. string类的修改 未完待续 结合文档食用~ 六、string类 2. 反向迭代器 一般来说,迭代器都是正向的遍历容器,虽然可以…

Cmake的使用

一个c工程可能会涉及到很多的基础库,但是c不像python一样可以直接import,因此引入了Cmake,将多个库链接起来。 参考:CMake系列讲解 - 总目录(由浅入深,实例讲解)_cmake 项目目录-CSDN博客 【C】…

Unity类银河恶魔城学习记录 17-1,2 p166 Aliments fx p167 Blackhole additional vfx

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; …

综合性练习(后端代码练习4)——图书管理系统

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 (1)登录接口 (2)图书列表接口 三、服务器代码 (1)创建一个UserController类,实现登录验证接口 &#xff…

OpenCV Mat对象与CImage对象间的数据传输实例

在用MFC写图像处理程序时,使用OpenCV可以做到事半功倍。但是,如果使用OpenCV4.0或OpenCV4.0以后版本,要显示图像可能会遇到麻烦,因为OpenCV去掉了原有的cvGetWindowHandle()函数,没法再用cvGetWindowHandle()函数来获取…

Linux进程管理与监控

一、相关概念 1、进程的的基本定义 在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。 2、进程的分类 系统进程:可以执行内存资源分配和进程切换等管理工作&am…

C#知识|泛型集合List相关方法

哈喽,你好,我是雷工! 以下为泛型集合List相关方法的学习笔记。 01 集合定义 集合定义的时候,无需规定元素的个数。 02 泛型说明 泛型表示一种程序特性,也就是在定义的时候,无需指定特定的类型&#xff…

C语言嵌入Lua解释器的方法

Lua语言是一个轻量的脚本语言,可以用很少的资源运行其解释器 C语言是一个很常用的语言,广泛用于嵌入式等底层场景 这两个语言结合,可以应用于嵌入式等多个场景。比如,一些硬件公司会允许开发者使用Lua语言操作其硬件 Lua的安装…

搭建Kafka源码环境并测试

文章目录 一、前言二、环境准备三、环境搭建3.1 JDK 环境搭建3.2 Scala 环境搭建3.2.1 配置 Scala 环境变量3.2.2 验证 3.3 Gradle 环境搭建3.3.1 配置 Gradle 环境变量3.3.2 验证 3.4 Zookeeper 环境搭建3.4.1 配置 Zookeeper 环境变量3.4.2 验证 3.5 Kafka 源码搭建3.5.1 导入…

数据可视化宝典:Matplotlib图形实战

在数据分析领域,图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形,并附上相应的代码示例,可以当初matplotl…