FPGA初级项目10——基于SPI的DAC芯片进行数模转换

FPGA初级项目10——基于SPI的DAC芯片进行数模转换

DAC芯片介绍


DAC 芯片(数字模拟转换器)是一种将数字信号转换为连续模拟信号(如电压或电流)的集成电路,广泛应用于电子系统中,连接数字世界与模拟世界。
 

核心功能


数字到模拟转换:将离散的二进制数字信号(如 0 和 1 的组合)转换为连续的模拟信号,使计算机、微控制器等数字设备能够驱动扬声器、显示器、传感器等模拟设备。
应用领域:音频处理(音乐播放器、手机)、视频显示(CRT 显示器)、通信系统(无线信号调制)、工业控制(执行器驱动)等。

关键性能指标


需要明确:输出电压由参考电压决定,输入的数字量起到一个分压作用。
分辨率:表示 DAC 能区分的最小电压变化,通常以位数衡量(如 16 位、24 位)。位数越高,输出越精细。
精度:包括微分非线性(DNL)和积分非线性(INL),反映输出与理想值的偏差,精度越高,信号失真越小。
建立时间:从输入变化到输出稳定所需的时间,高速应用(如通信)需短建立时间。
动态范围:最大信号与噪声的比值,决定 DAC 处理强弱信号的能力(单位:dB)。

典型应用场景


音频设备:如手机、耳机、Hi-Fi 播放器中的 DAC 芯片(如 AK4490、CS43131),直接影响音质。
工业控制:将数字指令转换为模拟信号控制电机、阀门等执行器(如 DAC0832)。
通信系统:生成调制信号用于无线传输。
医疗设备:控制成像设备或监测仪器的模拟输出。


选用芯片

这次使用的DAC芯片为TLV5618,其具体参数为:12位的分辨率;1Msps转换速率;双通道模拟输出(可使用两个通道A,B输出电压);最高可达到20M赫兹时钟输出
且经过换算关系有:输出电压U = 输入数字量code;



问题分析


1. 该模块书写思路与上一篇文章ADC转换大体上一致,同样我们写的是DAC芯片的驱动电路。我们所需明确的学习目标有:学会读芯片手册了解相关信息;学习线性序列机LSM的思想;


2. 根据芯片的时序要求,DAC芯片在SCLK的下降沿采样DIN上的数值(已经稳定),DIN数值在SCLK上升沿变化;值得注意的是:DIN的D15-D12为配置位(配置转换速率与功率;已经相应的通道选择);D11-D0才是正常数据位的传输。

3. 因为TLV5618芯片为双通道。那么如果我想要两个通道同时输出不同的电压值该怎么办呢?例如通道A输出1V,通道B输出2V。解决思路就是利用TLV5618芯片内部结构自带的buffer缓冲器!通过相应的通道选择模式,第一步先将2V输入buffer;第二步再将1V输入通道A,同时buffer输入给通道B。


4. 再有的就是要严格按照芯片的时序要求来设置驱动电路。考虑相关的建立时间与保持时间,例如在开始阶段,将CS电平拉低,DIN,SCLK电平拉高,这样可满足时序要求;同样的在结束阶段,在SCLK最后一个上升沿来临时,要保证CS为低电平,否则很有可能采样不到最后一个数据(芯片手册要求)。

5. 同时还有一些辅助信号的撰写(模仿上篇文章的思路),例如使能信号,采样开始与采样停止信号的触发条件等。(详情看代码)

好的,解决完上述问题,我们来代码


代码展示

//定义端口输入输出
module DAC_driver(Clk,Rst_n,DAC_DATA,Set_Go,Set_Done,DAC_CS_N,DAC_SCLK,DAC_DIN
);input Clk;input Rst_n;input [15:0]DAC_DATA;input Set_Go;output reg Set_Done;output reg DAC_CS_N;output reg DAC_SCLK;output reg DAC_DIN;parameter CLOCK_FREQ = 50_000_000;parameter SCLK_EREQ = 12_500_000;parameter MCNT_DIV_CNT = CLOCK_FREQ / (SCLK_EREQ * 2) - 1;reg [7:0]DIV_CNT;reg [5:0]LSM_CNT;reg [15:0]r_DAC_DATA;//一个暂存器,将用户输入的数据暂时存储     
always@(posedge Clk)
if(Set_Go)r_DAC_DATA <= DAC_DATA;
elser_DAC_DATA <= r_DAC_DATA;//使能信号的确立  reg Set_En;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)Set_En <= 1'd0;
else if(Set_Go)Set_En <= 1'd1;
else if((LSM_CNT == 6'd33) && (DIV_CNT == MCNT_DIV_CNT))Set_En <= 1'd0;
elseSet_En <= Set_En;//最小时间单元
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)DIV_CNT <= 0;
else if(Set_En)beginif(DIV_CNT == MCNT_DIV_CNT) DIV_CNT <= 0;else DIV_CNT <= DIV_CNT + 1'd1;end
elseDIV_CNT <= 0;//序列计数器
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)LSM_CNT <= 6'd0;
else if(DIV_CNT == MCNT_DIV_CNT)beginif(LSM_CNT <= 6'd33)LSM_CNT <= 6'd0;elseLSM_CNT <= LSM_CNT + 1'd1;end
elseLSM_CNT <= LSM_CNT;//线性序列机的驱动输出
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)beginDAC_SCLK <= 1'd1;DAC_DIN <= 1'd1;DAC_CS_N <= 1'd1; end
else if(DIV_CNT == MCNT_DIV_CNT)begincase(LSM_CNT)0 : begin  DAC_CS_N <= 1'd0; DAC_DIN <= r_DAC_DATA[15]; DAC_SCLK <= 1'd1; end1 : begin  DAC_SCLK <= 1'd0; end2 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[14]; end3 : begin  DAC_SCLK <= 1'd0; end4 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[13]; end5 : begin  DAC_SCLK <= 1'd0; end6 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[12]; end7 : begin  DAC_SCLK <= 1'd0; end8 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[11]; end9 : begin  DAC_SCLK <= 1'd0; end10 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[10]; end11 : begin  DAC_SCLK <= 1'd0; end12 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[9]; end13 : begin  DAC_SCLK <= 1'd0; end14 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[8]; end15 : begin  DAC_SCLK <= 1'd0; end16 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[7]; end17 : begin  DAC_SCLK <= 1'd0; end18 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[6]; end19 : begin  DAC_SCLK <= 1'd0; end20 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[5]; end21 : begin  DAC_SCLK <= 1'd0; end22 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[4]; end23 : begin  DAC_SCLK <= 1'd0; end24 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[3]; end25 : begin  DAC_SCLK <= 1'd0; end26 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[2]; end27 : begin  DAC_SCLK <= 1'd0; end28 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[1]; end29 : begin  DAC_SCLK <= 1'd0; end30 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[0]; end31 : begin  DAC_SCLK <= 1'd0; end32 : begin  DAC_SCLK <= 1'd1; end33 : begin  DAC_CS_N <= 1'd1; enddefault: DAC_CS_N <= 1'd1;endcaseend//产生结束信号 
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)Set_Done <= 0;
else if((LSM_CNT == 6'd33) && (DIV_CNT == MCNT_DIV_CNT))Set_Done <= 1'd1;
elseSet_Done <= 1'd0;endmodule


综合出来的底层系统逻辑图schematic如下:


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

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

相关文章

如何在 Windows上安装 Python 3.6.5?

Windows 系统安装步骤 下载安装包 安装包下载链接&#xff1a;https://pan.quark.cn/s/9294ca0fd46a 运行安装程序 双击下载的 .exe 文件&#xff08;如 python-3.6.5.exe&#xff09;。 勾选 Add Python 3.6 to PATH&#xff08;重要&#xff01;这将自动配置环境变量&…

Cephalon端脑云:神经形态计算+边缘AI·重定义云端算力

前引&#xff1a;当算力不再是“奢侈品” &#xff0c;在人工智能、3D渲染、科学计算等领域&#xff0c;算力一直是横亘在个人与企业面前的“高墙”。高性能服务器价格动辄数十万元&#xff0c;专业设备维护成本高&#xff0c;普通人大多是望而却步。然而&#xff0c;Cephalon算…

【信息系统项目管理师】高分论文:论进度管理和成本管理(智慧城管平台项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划进度管理2、定义活动3、排列活动顺序4、估算活动资源5、估算活动持续时间6、制定进度计划7、控制进度论文 2018年8月,我作为项目经理参与了 XX市智慧城管平台项目的建设,该项目投资500万元人民币…

WebAssembly:开启高性能Web应用新时代

一、引言 随着互联网技术的飞速发展&#xff0c;Web应用的复杂度和性能要求越来越高。传统的Web开发技术&#xff0c;如JavaScript&#xff0c;虽然功能强大&#xff0c;但在处理复杂计算和高性能需求时仍存在一些局限性。WebAssembly&#xff08;简称Wasm&#xff09;作为一种…

操作系统进程管理笔记

1. 进程的基本概念 1.1 进程的定义 进程就是运行中的程序。程序本身是没有生命周期的&#xff0c;它只是存在磁盘上面的一些指令&#xff08;也可能是一些静态数据&#xff09;。是操作系统让这些字节运行起来&#xff0c;让程序发挥作用。 1.2 CPU的时分共享 操作系统通过…

Python中random库的应用

文章目录 一、random 库常用函数二、条件语句 随机数示例1&#xff1a;随机决定程序分支示例2&#xff1a;模拟概率事件 三、循环语句 随机数示例1&#xff1a;循环直到满足随机条件示例2&#xff1a;随机次数循环 四、随机操作数据结构示例1&#xff1a;随机打乱列表顺序示例…

密码学货币混币器详解及python实现

目录 一、前言二、混币器概述2.1 混币器的工作原理2.2 关键特性三、数据生成与预处理四、系统架构与流程五、核心数学公式六、异步任务调度与 GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望摘要 本博客聚焦 “密码学货币混币器实现”,以 Python + P…

各种各样的bug合集

一、连不上数据库db 1.可能是密码一大包东西不对&#xff1b; 2.可能是里面某个port和数据库不一样&#xff08;针对于修改了数据库但是连不上的情况&#xff09;&#xff1b; 3.可能是git代码没拉对&#xff0c;再拉一下代码。❤ 二、没有这个包 可能是可以#注释掉。❤ …

面阵相机中M12镜头和远心镜头的区别及性能优势

以下是关于面阵相机中M12镜头和远心镜头的区别及性能优势的详细分析&#xff0c;结合知识库内容整理如下&#xff1a; 一、M12镜头与远心镜头的核心区别 1. 设计原理与光学特性 特性M12镜头远心镜头光学设计标准镜头设计&#xff0c;无特殊光学校正&#xff0c;依赖传统光路。…

从内核到应用层:深度剖析信号捕捉技术栈(含sigaction系统调用/SIGCHLD回收/volatile内存屏障)

Linux系列 文章目录 Linux系列前言一、进程对信号的捕捉1.1 内核对信号的捕捉1.2 sigaction()函数1.3 信号集的修改时机 二、可重入函数三、volatile关键字四、SIGCHLD信号 前言 Linux系统中&#xff0c;信号捕捉是指进程可以通过设置信号处理函数来响应特定信号。通过信号捕捉…

DDD领域驱动与传统CRUD

DDD 是一套 应对复杂业务系统 的设计方法论&#xff0c;核心是 让代码直接映射业务逻辑&#xff0c;避免技术实现与业务需求脱节。 关键区别&#xff1a; 传统开发&#xff1a;根据数据库表写 CRUD&#xff08;技术驱动&#xff09;。DDD&#xff1a;根据业务行为建模&#xf…

20. git diff

基本概述 git diff的作用是&#xff1a;比较代码差异 基本用法 1.工作区 VS 暂存区 git diff [file]2.暂存区 VS 最新提交 git diff --staged [file] # 或 git diff --cached [file]3.工作区 VS 最新提交 git diff HEAD [file]高级用法 1.比较两个提交间的差异 git dif…

大模型面经 | 春招、秋招算法面试常考八股文附答案(五)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…

Sql刷题日志(day5)

面试&#xff1a; 1、从数据分析角度&#xff0c;推荐模块怎么用指标衡量&#xff1f; 推荐模块主要目的是将用户进行转化&#xff0c;所以其主指标是推荐的转化率推荐模块的指标一般都通过埋点去收集用户的行为并完成相应的计算而形成相应的指标数据&#xff0c;而这里的驱动…

封装 element-ui 二次弹框

author 封装 element-ui 弹框 param text 文本内容 &#xff08;不传默认显示 确定执行此操作吗&#xff1f; &#xff09; param type 弹框类型&#xff08;不传默认warning类型&#xff09; param title 弹框标题&#xff08;不传默认显示 提示 &#xff09; export fun…

【Rust 精进之路之第12篇-生命周期·入门】为何需要与显式标注 (`‘a`):让编译器读懂引用的“有效期”

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:悬垂引用的“幽灵”与编译器的“侦探” 在前面的章节中,我们深入学习了 Rust 的所有权系统,以及如何通过引用 (& 和 &mut) 进行借用,从而在不转移所有权的情况下安…

[密码学实战]CTF竞赛高频加密与解密技术详解

CTF竞赛高频加密与解密技术详解 一、CTF加密体系全景图 在CTF密码学挑战中&#xff0c;加解密技术主要分为四大战域&#xff1a; #mermaid-svg-lmm07BXqYAGYjymI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lm…

docker.desktop下安装普罗米修斯prometheus、grafana并看服务器信息

目标 在docker.desktop下先安装这三种组件,然后显示当前服务的CPU等指标。各种坑已踩,用的是当前时间最新的镜像 核心关系概述 组件角色依赖关系Prometheus开源监控系统,负责 数据采集、存储、查询及告警。依赖 Node-Exporter 提供的指标数据。Node-Exporter专用的 数据采集…

《MySQL:MySQL表的内外连接》

表的连接分为内连接和外连接。 内连接 内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选&#xff0c;之前的文章中所用的查询都是内连接&#xff0c;也是开发中使用的最多的连接查询。 select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1…

实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】

下载地址&#xff1a; https://download.csdn.net/download/2401_83418369/90675207 一、搭建环境 创建新项目 在pom.xml文件中导入依赖 &#xff08;一定要刷新Maven&#xff09;排除内嵌的Tomcat&#xff0c;引入自己指定的Tomcat <?xml version"1.0" enco…