小梅哥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驱动设计相关推荐

  1. 线性序列机与串口接口DAC驱动设计与验证

    线性序列机与串口接口DAC驱动设计与验证 TLV5618 型 DAC 内部工作原理 TLV5618 是一个基于电压输出型的双通道 12 位单电源数模转换器,其由串行接口.一个速度和电源控制器. 电阻网 ...

  2. 基于线性序列机的SPI协议读写winbond公司flash芯片25Q16

    基于小梅哥所提的线性序列机思想设计读写该芯片的SPI协议,线性序列机简单来说就是用一个计数器对时钟计数,对于每一个计数值,按照时序要求对信号做出相应操作.简单写了一下 Read Manufacture ...

  3. 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器

    九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...

  4. 关于FPGA设计中的线性序列机和状态机

    在FPGA设计中,线性序列机和状态机思想是十分重要的思想方法,用于实现各种时序要求.这次的内容是实现用FPGA,时钟周期为20ns,每间隔5000ns发送一个字节的数据,数据不从外部接入,而是内部给定 ...

  5. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

  6. 线性序列机与串行接口ADC驱动设计与验证

    线性序列机与串行接口ADC驱动设计与验证 ADC128S022 型 ADC 内部工作原理 在 AC620 开发板上使用的模数转换器为逐次逼近型的低功耗芯片 ADC128S022,其具有 8 通道以及 ...

  7. 小梅哥FPGA时序分析和约束实例演练课程

    看过了他的nios课程,对他的能力很认同 只有前5讲是开源的,后面需要在淘宝上购买,暂时用不到,我就没有买课程,只看了前5讲感觉还挺有用,需要的时候再说吧. 小梅哥 FPGA时序分析 FPGA时序约束 ...

  8. 小梅哥FPGA视频教程学习总结(持续学习中……)

    首先附上小梅哥FPGA视频教程链接:https://www.bilibili.com/video/BV1va411c7Dz?p=2&spm_id_from=pageDriver 小梅哥yyds ...

  9. 小梅哥FPGA:嵌入式块RAM使用之FIFO

    小梅哥FPGA:嵌入式块RAM使用之FIFO 课程目标:学会调用QuartusⅡ软件中提供的FIFO核并通过仿真,了解其接口时序 实现现象:通过QuartusⅡ软件中调用FIFO核,通过仿真来验证其接 ...

最新文章

  1. 刚搭建的linux环境的基本优化以及优化脚本---菜鸟初写
  2. 各大航空公司将加大海南春运期间运力投入
  3. iphone数据存储之-- Core Data的使用(一)
  4. 想不想在手机上敲 Python 代码?!这里有一款推荐方案
  5. 栈应用:中缀表达式转后缀表达式
  6. Ibatis - Open quote is expected for attribute {1} associated with an element type '
  7. redis 缓存目标
  8. AWS re:Invent大会回顾
  9. 前段时间是Flash大战HTML5,现在是SliverLight“被遗弃”,我啊羡慕你们的热闹。...
  10. Python网络编程 —— 线程
  11. VsCode中文输出为乱码的原因及解决方法
  12. Web全栈~02.表单样式设计
  13. v6使用手册 天正电气t20_天正电气T20手册
  14. 1223_MISRA_C规范学习_指针与数组的规则要求
  15. 卸载精灵(bue directx) r4.0 完美版 是什么
  16. PriorityQueue 改变排序方式,倒叙
  17. 京东首页之nav导航栏、banner广告部分、footer备案号
  18. 历史在重演:从KHTML到WebKit,再到Blink
  19. python对mysql增删改查+计算器+九九乘法表
  20. SonarLint插件

热门文章

  1. 打印机form2尺寸_打印机纸张规格
  2. Oxygen XML Editor 25.0.X Crack
  3. 0和5 (51Nod)
  4. 2018.8.25T2(随机化)
  5. 苦涩又难理解的IO<2>
  6. 全球变暖,人类何去何从?
  7. 中职生计算机基础知识总结,浅谈中职学生的计算机基础教育
  8. 自由地思考——保护思想环境
  9. 基于控制台的购书系统
  10. C语言中的switch语句基本用法