小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计
小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计
目标:学会使用线性序列机的思想设计常见的有串行执行特征的时序逻辑
实验现象:在QuartusⅡ软件中,使用ISSP工具,输入希望输出的电压值,则AC620开发板上,FPGA控制的TLC5620芯片输出对应的电压值
TLC5620型DAC芯片概述:
- TLC5620C是一个具有4个独立8位电压输出型DAC的数模转换器
- 单电源5V供电
- 采用串行接口时序
- 具备4个高阻抗参考电压输入端口(对应四个DAC输出通道)
- 可编程的电压倍增模式
每个DAC可以输出一倍或者两倍的参考电压与GND之间的电压值。
下图为TCL5620内部框图:(一定要理解!!!)
TLC5620型DAC芯片引脚说明:
TLC5620的输出电压公式:
Vo(DAC A|B|C|D) = REF * CODE/256 *(1 + RNG bit value)
其中,Vo为输出电压值,REF为DAC的输出参考电压,CODE为输出电压值的数字量化量,如255表示按照参考电压的满幅输出(关闭电压倍增模式),0则0V输出,RNG bit value表示电压倍增模式,为0则关闭输出电压倍增模式,为1则打开输出电压倍增模式。
其中我们输入的Data是11位的数据,其中前两位{D10,D9}为DAC选择位,第三位D8为电压放大位,若为1则放大,若为0则不放大
TLC 5620型DAC接口时序:
控制器对TLC5620的单个DAC设置包括两个主要操作
- 将数字量化值以及控制位发送到TLC5620中对应的寄存器中
- 控制DAC将寄存器中接收到的数据值更新到DAC输出上 数据的更新,使用LOAD和LDAC配合以实现。
当LOAD为高电平时,在每个CLK的下降沿,数据被移入DAC的移位寄存器中。当所有的数据位被移入完成后,LOAD被拉低,以将数据从串行输入移位寄存器中转入选中的DAC中,如下图所示:
TLC5620串行数字接口的关键时序参数:
- tsu(DATA-CLK):clk的高脉冲最小为50ns
- tv:clk的低脉冲最小是50ns
- tsu(clk - LOAD):从D0发送完成到LOAD拉低最少需要50ns
- tsu(LOAD - clk):从LOAD升高到下一次发送最少需要50ns
- tw(LOAD):LOAD从低到高最少需要250ns
- Clk最大频率为1MHZ,意味着时钟周期最小为1000ns
我将CLK的时钟周期定为1200ns,此时tsu(DATA-CLK),tv已经满足,将其余的50ns改为60ns,250ns改为260ns
我定义一个计数器cnt来对时间进行计数(线性序列机思想)
在CLK上升沿的时候将DATA写入
注意注意:我们本章做的是产生输送给TCL5620的信号!!!!!!!所以是在上升沿将数据写入
TCL5620接口逻辑的编写(代码)
我们接下来进行TCL5620接口逻辑的编写:
UpdateReq是开关:当按下的时候开始产生信号,当传输结束UpdateDone出现一个时钟的高电平
以下是我编写的代码:
module DAC_ctrl(clk,Rst_n,CtrlWord,UpdateReq,UpdateDone,TCL5620_DATA,TCL5620_clk,TCL5620_LOAD,TCL5620_LDAC
);input clk;input Rst_n;input[10:0]CtrlWord;input UpdateReq;output reg UpdateDone;output reg TCL5620_DATA;output reg TCL5620_clk;output reg TCL5620_LOAD;output reg TCL5620_LDAC;reg[9:0]cnt;
//计时器逻辑always@(posedge clk or negedge Rst_n)if(!Rst_n)cnt <= 10'd0;else if(UpdateReq || cnt != 10'd0)beginif(cnt == 10'd660)cnt <= 10'd0;else cnt <= cnt +1'b1;endelse cnt <= 10'd0;//always@(posedge clk or negedge Rst_n)if(!Rst_n)beginUpdateDone <= 1'b0;TCL5620_DATA <=1'b0;TCL5620_clk <=1'b0;TCL5620_LOAD <=1'b0;TCL5620_LDAC <= 1'b0;endelse begincase(cnt)0:beginTCL5620_DATA <=1'b0;TCL5620_clk <=1'b0;TCL5620_LOAD <=1'b1;TCL5620_LDAC <= 1'b0;//一直为低电平end10:beginTCL5620_DATA <=CtrlWord[10];TCL5620_clk <=1'b1;end40: TCL5620_clk <=1'b0;70:beginTCL5620_DATA <=CtrlWord[9];TCL5620_clk <=1'b1;end100:TCL5620_clk <=1'b0;130:beginTCL5620_DATA <=CtrlWord[8];TCL5620_clk <=1'b1;end160:TCL5620_clk <=1'b0;190:beginTCL5620_DATA <=CtrlWord[7];TCL5620_clk <=1'b1;end220:TCL5620_clk <=1'b0;250:beginTCL5620_DATA <=CtrlWord[6];TCL5620_clk <=1'b1;end280:TCL5620_clk <=1'b0;310:beginTCL5620_DATA <=CtrlWord[5];TCL5620_clk <=1'b1;end340:TCL5620_clk <=1'b0;370:beginTCL5620_DATA <=CtrlWord[4];TCL5620_clk <=1'b1;end400:TCL5620_clk <=1'b0;430:beginTCL5620_DATA <=CtrlWord[3];TCL5620_clk <=1'b1;end460:TCL5620_clk <=1'b0;490:beginTCL5620_DATA <=CtrlWord[2];TCL5620_clk <=1'b1;end520:TCL5620_clk <=1'b0;550:beginTCL5620_DATA <=CtrlWord[1];TCL5620_clk <=1'b1;end580:TCL5620_clk <=1'b0;610:beginTCL5620_DATA <=CtrlWord[0];TCL5620_clk <=1'b1;end640:TCL5620_clk <=1'b0;643:TCL5620_LOAD <=1'b0;656:TCL5620_LOAD <=1'b1;660:UpdateDone <= 1'b1;default:;endcaseend
endmodule
testbench的编写
`timescale 1ns/1ns
`define clk_period 20module DAC_ctrl_tb;reg clk;reg Rst_n;reg [10:0]CtrlWord;reg UpdateReq;wire UpdateDone;wire TCL5620_DATA;wire TCL5620_clk;wire TCL5620_LOAD;wire TCL5620_LDAC;DAC_ctrl DAC_ctrl(.clk(clk),.Rst_n( Rst_n),.CtrlWord(CtrlWord),.UpdateReq(UpdateReq),.UpdateDone(UpdateDone),.TCL5620_DATA(TCL5620_DATA),.TCL5620_clk(TCL5620_clk),.TCL5620_LOAD(TCL5620_LOAD),.TCL5620_LDAC(TCL5620_LDAC)
);initial clk =1;always#(`clk_period/2)clk = ~clk;initial beginRst_n = 1'b0;CtrlWord = 0;UpdateReq = 1'b0;#(`clk_period*100+1);Rst_n =1'b1;#(`clk_period*20);CtrlWord = {2'd0,1'b0,8'haa};UpdateReq = 1'b1;#(`clk_period);UpdateReq = 1'b0;@(posedge UpdateDone);#(`clk_period*20);CtrlWord = {2'd0,1'b0,8'haa};UpdateReq = 1'b1;#(`clk_period);UpdateReq = 1'b0;@(posedge UpdateDone);#(`clk_period*20);$stop;end
endmodule
仿真结果
顶层文件编写
需要建立一个ISSP的ip核来给CtrlWord提供数据
module DAC_ctrl_top(clk,Rst_n,TCL5620_DATA,TCL5620_clk,TCL5620_LOAD,TCL5620_LDAC
);input clk;input Rst_n;output TCL5620_DATA;output TCL5620_clk;output TCL5620_LOAD;output TCL5620_LDAC;wire[10:0]CtrlWord;ISSP ISSP(.probe(),.source(CtrlWord));DAC_ctrl DAC_ctrl(.clk(clk),.Rst_n( Rst_n),.CtrlWord(CtrlWord),.UpdateReq(1'b1),.UpdateDone(),.TCL5620_DATA(TCL5620_DATA),.TCL5620_clk(TCL5620_clk),.TCL5620_LOAD(TCL5620_LOAD),.TCL5620_LDAC(TCL5620_LDAC)
);
endmodule
因为没有电压表所以板机验证就不上传了,以下给出分配引脚的图片:
小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计相关推荐
- 线性序列机与串口接口DAC驱动设计与验证
线性序列机与串口接口DAC驱动设计与验证 TLV5618 型 DAC 内部工作原理 TLV5618 是一个基于电压输出型的双通道 12 位单电源数模转换器,其由串行接口.一个速度和电源控制器. 电阻网 ...
- 基于线性序列机的SPI协议读写winbond公司flash芯片25Q16
基于小梅哥所提的线性序列机思想设计读写该芯片的SPI协议,线性序列机简单来说就是用一个计数器对时钟计数,对于每一个计数值,按照时序要求对信号做出相应操作.简单写了一下 Read Manufacture ...
- 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器
九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...
- 关于FPGA设计中的线性序列机和状态机
在FPGA设计中,线性序列机和状态机思想是十分重要的思想方法,用于实现各种时序要求.这次的内容是实现用FPGA,时钟周期为20ns,每间隔5000ns发送一个字节的数据,数据不从外部接入,而是内部给定 ...
- 小梅哥FPGA学习笔记
小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...
- 线性序列机与串行接口ADC驱动设计与验证
线性序列机与串行接口ADC驱动设计与验证 ADC128S022 型 ADC 内部工作原理 在 AC620 开发板上使用的模数转换器为逐次逼近型的低功耗芯片 ADC128S022,其具有 8 通道以及 ...
- 小梅哥FPGA时序分析和约束实例演练课程
看过了他的nios课程,对他的能力很认同 只有前5讲是开源的,后面需要在淘宝上购买,暂时用不到,我就没有买课程,只看了前5讲感觉还挺有用,需要的时候再说吧. 小梅哥 FPGA时序分析 FPGA时序约束 ...
- 小梅哥FPGA视频教程学习总结(持续学习中……)
首先附上小梅哥FPGA视频教程链接:https://www.bilibili.com/video/BV1va411c7Dz?p=2&spm_id_from=pageDriver 小梅哥yyds ...
- 小梅哥FPGA:嵌入式块RAM使用之FIFO
小梅哥FPGA:嵌入式块RAM使用之FIFO 课程目标:学会调用QuartusⅡ软件中提供的FIFO核并通过仿真,了解其接口时序 实现现象:通过QuartusⅡ软件中调用FIFO核,通过仿真来验证其接 ...
最新文章
- 刚搭建的linux环境的基本优化以及优化脚本---菜鸟初写
- 各大航空公司将加大海南春运期间运力投入
- iphone数据存储之-- Core Data的使用(一)
- 想不想在手机上敲 Python 代码?!这里有一款推荐方案
- 栈应用:中缀表达式转后缀表达式
- Ibatis - Open quote is expected for attribute {1} associated with an element type '
- redis 缓存目标
- AWS re:Invent大会回顾
- 前段时间是Flash大战HTML5,现在是SliverLight“被遗弃”,我啊羡慕你们的热闹。...
- Python网络编程 —— 线程
- VsCode中文输出为乱码的原因及解决方法
- Web全栈~02.表单样式设计
- v6使用手册 天正电气t20_天正电气T20手册
- 1223_MISRA_C规范学习_指针与数组的规则要求
- 卸载精灵(bue directx) r4.0 完美版 是什么
- PriorityQueue 改变排序方式,倒叙
- 京东首页之nav导航栏、banner广告部分、footer备案号
- 历史在重演:从KHTML到WebKit,再到Blink
- python对mysql增删改查+计算器+九九乘法表
- SonarLint插件