找回密码
 注册
关于网站域名变更的通知
查看: 318|回复: 1
打印 上一主题 下一主题

 转——【FPGA开源教程连载】第十七章 线性序列机与串行接口DAC驱动设计 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-1 07:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
FPGA开源教程连载】第十七章 线性序列机与串行接口DAC驱动设计

7 h% `- J) G% O6 o; X0 s  o
实验目标: 1.学会使用线性序列机的思想
2.以此为基础设计仿真DAC芯片的时序逻辑并通过ISSP验证
实验平台:芯航线FPGA学习套件主板,芯航线串行AD/DA模块

/ U- X- U6 F3 O2 G( ]

$ C. O7 z  |- p& S8 E" E5 I1 I
实验现象:
在QuartusII软件中,使用In system sources andprobes editor工具,输入希望输出的电压值,则芯航线开发板上,FPGA控制TLC5620芯片输出对应的电压值。然后结合第16课讲ROM的内容,将ROM的输出挂接到TLC5620的数据输入端,以输出正弦波,并使用示波器观察输出波形
实验原理:
1.TLC5620型DAC芯片概述
本实验使用的芯航线串行AD/DA模块上的DAC芯片为TLC5620,其芯片概述如下:
  •   TLC5620C是一个具有4个独立8位电压输出型DAC的数模转换器
  •   单电源5V供电
  •   采用串行接口时序
  •   具备4个高阻抗参考电压输入端口(对应四个DAC输出通道)
  •   可编程的电压倍增模式
    4 h6 F; e" v8 ?& B: O" W5 [
TLC5620是一个内部具备4个独立8位电压输出型数字——模拟转换器,每个DAC转换器都拥有一个带缓冲(高输入阻抗)的参考电压输入端口。每个DAC可以输出一倍或者两倍的参考电压与GND之间的电压值。
TLC5620使用CMOS电平兼容的三线制串行总线与各种流行的处理器进行连接,TLC5620接收控制器发送过来的11位的命令字,这11位的控制字被分为3个部分,包括8位的数据位,2位的DAC选择位,1位的电压倍增控制位。每个DAC的寄存器都采用双缓冲结构,这样,可以实现首先通过数据总线给所有的DAC传输需要更新的数据,然后通过控制信号LDAC将所有DAC的电压同步更新到输出上。

) Q) x7 K" y; B( l
17-1TLC5620芯片内部框图
2. DAC芯片引脚说明
       TLC5620芯片引脚及功能描述如表17-1所示。
: o. ~( N. t3 k" p, @, [  g0 l' q
4 ^3 V# ^! V  U4 A2 ?; H
17-1芯片引脚功能描述
3.TLC5620型DAC芯片详细介绍
TLC5620是由四个电阻串式DAC组成的,每个DAC的核心是一个拥有256个节点(抽头)的电阻,对应了256中不同的组合,如下表所示,每个电阻串的一段连接到GND,另一端来自参考输入缓存的输出。
每个DAC的输出都接有一个可配置增益的输出放大器,该放大器的增益可以配置为1或者2。当芯片上电时,DAC的值全部被复位到0,。每个DAC通道的输出可由下列公式计算得出:

. v- v! L" |% K: t
当串行控制字中的数据部分为0~255,RNG bit为0或者1时,与输出电压对应关系如表17-2所示。

& ?+ `, M" A/ b. V! w7 C% [& w
17-2输出电压与控制字对应关系
4.TLC 5620型DAC接口时序
控制器对TLC5620的单个DAC设置包括两个主要操作
  • 发送控制和数字
  • 控制DAC将接收到的数据值更新到DAC输出上. B/ x  X3 V" U% a* e6 e7 R. r. U
对于数据的传输,有连续传输(11个连续的时钟周期传输11位的控制字)和2个8时钟周期传输方式(使用两次8时钟周期的传输来实现11位数据的传输)。
对于数据的更新,则使用LOAD和LDAC配合以实现。
当LOAD为高电平时,在每个CLK的下降沿,数据被移入DAC的移位寄存器中。当所有的数据位被移入完成后,LOAD被拉低,以将数据从串行输入移位寄存器中转入选中的DAC中,如图17-2所示。当LDAC为低电平时,选中的DAC通道的输出电压在LOAD变为低电平时更新。
/ S  Z! d7 y2 W" ?( j
17-2LOAD模式数据传输时序图
当LDAC在串行数据传输过程中为高电平时,新的数据值被存在器件中,该值可以在稍后将LDAC拉低时传入DAC的输出,如下图17-3所示。串行总线上传输数据时,高位在前,低位在后。
# p2 y. O+ _8 U! u: C4 r
17-3LOADLDAC模式数据传输时序图
使用两个8时钟周期的传输数据(主要针对8位定长的SPI控制器)的时序图如图17-4所示。
4 A% k# {, c; |% O  r' q) L0 ~) s4 Y
17-4两个8时钟周期传输时序图
在传输时序中,标为A0和A1的两位指定了需要设置输出的DAC,具体A0和A1值与对应被选择更新的DAC如下表所示:
- ^# U7 m6 N; z7 H0 E) R% d

! O0 _; u( P/ G
17-3A0A1DAC端口对应关系
4.TLC5620串行数字接口的关键时序参数
针对TLC5620的数字接口,其操作时序如表17-4所示。

1 _2 m" Z* e  `4 A3 y  y+ K
17-4TLC5620时序参数
在设计接口时序时,要保证时序严格满足表中各个时序参数,否则会导致数据传输或转换失败。
5.芯航线ADDA模块TLC5620电路介绍
芯航线FPGA学习套件中,提供了一个多通道串行AD/DA模块。其中,DA部分所使用的芯片就是上文介绍的TLC5620,TLC5620部分电路图如图17-5所示:
+ S# w: c9 Z# F7 P+ c: Z2 w6 Y- ]
17-5TLC5620部分电路图
为了给DAC的参考输入提供稳定的参考电压,这里使用专用精密参考源搭建了一个参考源电路,该电路如图17-6所示.

2 G. J7 [) i: }
17-6精密参考源电路
根据5V的输入电压和输出电压/电流设计电路,按照上图设置电路即可,其中R2:R3=1:2.7得到的输出最接近3.3V(例如R1取值为1k,R2取值为2.7k)

, K5 q. V% w- c& ], G1 C" t
Vout = (R2+R3)*2.5/R3 = 3.7*2.5/2.7= 3.42V
为了保证TL4311mA的工作电流,R1需要满足
1mA< (Vcc-Vout)/R1< 500mA
这里设置R1为150欧姆,则(Vcc-Vout)/R1= 10.5mA,满足TL431工作要求。
因此,当确定一个输出电压时,就可以得到对应的RNG和CODE了,如下式所示:

4 q5 t' D( U- k3 f
然后,在我们控制DAC的输出时,只需根据所需输出的电压计算得到CODE和RNG,然后将该值通过串行接口传入TLC5620,再发出一个更新控制信号(LOAD + LDAC),就能实现控制TLC5620输出想要的电压了。
6.线性序列机设计思想与TLC5620接口时序设计
       这里以使用LOAD信号控制DAC更新的时序图(17-2)来分析TLC5620的数字接口时序。

1 K. z1 Z" P5 c( c0 m
17-2LOAD模式数据传输时序图
从图中我们可以看到,该接口的时序是一个很有规律的序列,CLK信号什么时候该由低变高,什么时候由高变低。DATA信号什么时候该传输哪一位数据,LOAD信号什么时候拉低,什么时候拉高,都是可以根据时序参数唯一确定下来的。
因此我们可以将该数据波形放到以时间为横轴的一个二维坐标系中,纵轴就是每个信号对应的状态:
+ L; q6 x. w! h
17-7时序图数字化
因此我们只需要在逻辑中使用一个计数器来计数,然后每个计数值时就相当于在t轴上对应了一个相应的时间点,那么在这个时间点上,各个信号需要进行什么操作,直接赋值即可。
针对TLC5620的接口时序,在FPGA中,我们以时钟周期为20ns进行设计,既时间最小增量为20ns,由于所有时序参数中最小单位为50ns,而20ns的时钟周期无法通过计数得到50ns,因此这里都使用60ns来代替50ns,使用260ns来代替250ns。从而可以通过每个信号变化时的时间得到对应计数器的值,这里CLK周期最小为1000ns,这里定为1200ns。
这样根据图17-3即可得出每个时间点对应信号操作详表。
7 J  \6 i8 X' b9 N1 q% Y# S6 _
17-5时间点对应信号操作表
线性序列机计数器的控制逻辑判断依据,如表17-6所示。

7 q2 E, n- l/ o4 {+ l. P3 m- T3 i
表17-6计数器功能判断条件
以上就是通过线性序列机设计接口时序的一个典型案例,可以看到,线性序列机可以大大简化我们的设计思路。线性序列机的设计思想就是使用一个计数器不断计数,由于每个计数值都会对应一个时间,那么当该时间符合我们需要操作信号的时刻时,就对该信号进行操作。这样,就能够轻松的设计出各种时序接口了。
6.AD/DA模块与FPGA开发板连接

+ S$ i5 t5 n7 ~
! K  ?& ~( o2 H5 B! \# b
) U5 `, Z# \! A  w* K3 g& V  T
实验步骤
得到了表17-5与17-6,我们就可以进行TLC5620的接口逻辑的编写了。设计TLC5620接口逻辑的模块如图17-8所示:
6 U! z" W, r3 m' M: K0 s) @' y
17-8模块接口示意图
其中,每个端口的功能描述如表17-7所示。

/ b# y, `7 d4 s7 R
; \$ o) t3 u) ]; G, O
17-7端口功能描述
  新建一个以名为TLC5620_CTRL的工程保存在prj下,并新建TLC5620_CTRL.v保存至rtl文件夹下。从图17-8以及表17-7就得到了端口列表:

, y) F) j6 O( x0 T$ N; F/ O
      从实验原理分析得出线性序列机最主要的即为计数器,并且此设计计数器最大值为820,因此定义一个位宽为10的计数器即可,且由表17-6可以得出:
8 R  Z' _2 j8 ~% N
      
这样只需根据表17-5分别描述出每个计数值需要操作的端口即可。在复位时需要将所有被操作信号置0,否则会出现不定态。

6 p* h/ Y* _) `1 A, y' Z$ a+ z8 d' M0 J9 L" q. v3 Q& j
       将此文件设置为顶层,新建TLC5620_CTRL_tb.v文件并输入以下内容再次进行分析和综合直至没有错误以及警告,保存到testbench文件夹下。这里除了实现例化需要仿真的文件以及时钟创建,还实现了控制输入8’haa至通道A,等待传输结束后再次才输入8’h55至通道A,等待这次传输结束后等待20个时钟周期停止仿真。
* ^3 j2 ~. z  M% O" m
9 j* I. H2 a  i1 Y7 C; w- v' D
编译无误后设置好仿真脚本后进行功能仿真,可以看到如图17-9所示的波形文件。生成的TLC5620_CLK周期为1200ns,在使能第一次控制字输入{2'd0,1'b0,8'haa}TLC5620_DATA上数据为00_0_10101010,符合预期。在一个控制字传输结束后,TLC5620_LOAD维持2600ns的低电平然后经过400nsUpdatadone输出一个系统时钟周期的高电平,符合预期设计。这样可自行分析第二次数据传输过程。
) V( e. B" o8 e
图17-9TLC5620功能仿真波形
为了使用ISSP在线调试再次验证TLC5620模块设计的正确性,创建一个ISSPIP核,主要配置如图17-10所示,详细步骤可参考第十讲相关内容。
3 v" @) K3 V) r7 p! g
图17-10ISSP主要参数
        加入工程后新建顶层文件TCL5620_TOP.v,并对ISSP以及设计好的TLC5620_CTRL进行例化。这里为了方便操作,将UpdateReq一直置高。

2 w5 V1 J3 D, C7 p: V' N
- _% `1 {$ p3 O( `1 v: z) j  w8 A+ V
         分配引脚后全编译无误后下载工程到开发板中,并启动ISSP。可先把数据格式切换为hex,先分别输入080、0ff查看DACA通道电压是否正常。其他通道及控制字可自行测试。
       补图:
电压表
" Z+ p. [+ v4 u+ ]
       这样就完成了一个DAC模块的设计与仿真验证,基于本讲以及14讲即可实现信号发生器,详细内容可以参考芯航线FPGA进阶课程值DDS4。
. Q, f! `+ y. ]9 T! x' u( u3 @
小梅哥
芯航线电子工作室
. ]# H' v: [# y% V" L" E* T0 P
游客,如果您要查看本帖隐藏内容请回复
6 e5 B) n; G; N  D5 w, M

该用户从未签到

2#
发表于 2019-4-1 16:45 | 只看该作者
看着真过瘾啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 18:28 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表