全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 测量仪表 >

FPGA零基础学习之TLC5620驱动教程

时间:2023-08-04 09:19

人气:

作者:admin

标签: DAC芯片 

导读:FPGA零基础学习之TLC5620驱动教程-在FPGA处理完数字信号之后,我们有些情况下是需要将数字信号转变为模拟信号再输出的。比如音频信号在滤波后,需要转换为声音信号进行输出。...

FPGA处理完数字信号之后,我们有些情况下是需要将数字信号转变为模拟信号再输出的。比如音频信号在滤波后,需要转换为声音信号进行输出。此次,我们要讲数字信号转换为电压信号进行输出,以便我们后续可以用示波器之类的器械观察信号。

我们采用的芯片为TLC5620,是一款8bit四通道的数模转换器

在四路通道中,我们可以设置4种不同的参考电压进行转换使用。但是在此次实验中,我们采用的四路参考电压一样,如下图:

62fb070e-3256-11ee-9e74-dac502259ad0.png

接下来我们介绍一下此芯片的一些特征以及手册对芯片的描述。下图为官方手册对芯片的一段描述:

63361416-3256-11ee-9e74-dac502259ad0.png

TLC5620是一款使用3线串行总线控制的芯片。11bit的命令中包含8bit数据、2bit通道选择、1bit输出范围选择bit。输出范围选择,可以输出一倍或者两倍的参考电压差值范围。当两级锁存器都打开时,新的数据可以进入到芯片。下图为芯片的框图:

6378c806-3256-11ee-9e74-dac502259ad0.png

端口介绍:

63d05c4c-3256-11ee-9e74-dac502259ad0.png

我们的数据为8bit,那也就是将电压范围划分为256份,我们的数字信号会对应成电压进行输出,所以我们的输出电压的计算公式为:

63fc9e10-3256-11ee-9e74-dac502259ad0.png

接下来我们看一下时序图:

6420ed42-3256-11ee-9e74-dac502259ad0.png

当LOAD为高电平时,数据被锁存进DATA在每一个时钟下降沿,一旦数据所有的bit被采集到,LOAD被拉低,将寄存器中的数据传输到被选择的DAC中。如图一所示,当LDAC为低电平时,LOAD信号拉低,被选择的DAC芯片输出电压会更新。如果LDAC为高电平,电压更新将会被禁止,直到我们将LDAC拉低,如图二:

6449bdc6-3256-11ee-9e74-dac502259ad0.png

对于我们的通道选择,如下图:

6470c696-3256-11ee-9e74-dac502259ad0.png

当RNG=0时,输出电压为一倍范围,当RNG=1时,输出电压为两倍范围。

接下来,我们来做一下芯片的驱动,同样可以使用线性序列机。转换总周期为11us的时间。

首先我们先新建工程。

6499f4d0-3256-11ee-9e74-dac502259ad0.png

64bea0b4-3256-11ee-9e74-dac502259ad0.png

新建代码文件,写入代码:

64ede400-3256-11ee-9e74-dac502259ad0.png

650dcdc4-3256-11ee-9e74-dac502259ad0.png

65331110-3256-11ee-9e74-dac502259ad0.png

驱动代码如下:

 

1   module tlc5620_driver(
2     
3     input   wire          clk,
4     input   wire          rst_n,
5     input   wire    [7:0] data,
6     
7     output  reg           da_clk,
8     output  reg           da_data,
9     output  wire          da_ldac,
10    output  reg           da_load
11  );
12
13    parameter   t = 550;
14    parameter   select_bit  = 2'b00;
15    parameter   RNG   = 1'b1;     //0代表输出1倍,1代表输出两�??
16    
17    reg     [9:0]     cnt;
18    
19    assign da_ldac = 1'b0;
20
21    always @ (posedge clk, negedge rst_n)
22    begin
23    if(rst_n == 1'b0)
24      cnt <= 10'd0;
25    else if(cnt == t - 1)
26      cnt <= 10'd0;
27    else
28      cnt <= cnt + 1'b1;
29    end
30    
31    always @ (posedge clk, negedge rst_n)
32    begin
33    if(rst_n == 1'b0)
34      begin
35      da_clk <= 1'b0;
36      da_data <= 1'b0;
37      da_load <= 1'b1;
38      end
39    else
40      case(cnt)
41      0     : begin da_clk <= 1'b1; da_data <= select_bit[1]; da_load <= 1'b1; end
42      24    : begin da_clk <= 1'b0; end
43      49    : begin da_clk <= 1'b1; da_data <= select_bit[0]; end
44      74    : begin da_clk <= 1'b0; end
45      99    : begin da_clk <= 1'b1; da_data <= RNG; end
46      124   : begin da_clk <= 1'b0; end
47      149   : begin da_clk <= 1'b1; da_data <= data[7]; end
48      174   : begin da_clk <= 1'b0; end
49      199   : begin da_clk <= 1'b1; da_data <= data[6]; end
50      224   : begin da_clk <= 1'b0; end
51      249   : begin da_clk <= 1'b1; da_data <= data[5]; end
52      274   : begin da_clk <= 1'b0; end
53      299   : begin da_clk <= 1'b1; da_data <= data[4]; end
54      324   : begin da_clk <= 1'b0; end
55      349   : begin da_clk <= 1'b1; da_data <= data[3]; end
56      374   : begin da_clk <= 1'b0; end
57      399   : begin da_clk <= 1'b1; da_data <= data[2]; end
58      424   : begin da_clk <= 1'b0; end
59      449   : begin da_clk <= 1'b1; da_data <= data[1]; end
60      474   : begin da_clk <= 1'b0; end
61      499   : begin da_clk <= 1'b1; da_data <= data[0]; end
62      524   : begin da_clk <= 1'b0; end
63      529   : begin da_load <= 1'b0; end
64      default : ;
65      endcase
66    end
67   
68  endmodule

 

在写驱动代码时,我们需要注意时序图中的一些时间要求,比如,数字信号的建立时间和保持时间,以及load信号的建立时间与保持时间。时间要求如下图:

6550ef64-3256-11ee-9e74-dac502259ad0.png

由上图可以得出结论,芯片的驱动时钟最大为1MHz。数据的建立时间与保持时间最小值都为50ns。如果我们在时钟上升沿发送数据,那么我们发送的数据,建立时间与保持时间最小值为500ns。满足条件。

接下来我们写一下仿真看一下波形。

65b81414-3256-11ee-9e74-dac502259ad0.png

65d51712-3256-11ee-9e74-dac502259ad0.png

代码如下:

 

1   `timescale 1ns / 1ps
2 
3   module tlc5620_driver_tb;
4 
5     reg           clk;
6     reg           rst_n;
7     reg     [7:0] data;
8     
9     wire       da_clk;
10    wire       da_data;
11    wire       da_ldac;
12    wire       da_load;
13
14    initial begin
15      clk = 1'b0;
16      rst_n = 1'b0;
17      data = {$random}%256;
18      #105;
19      rst_n = 1'b1;
20      #11000;
21      repeat(10) begin
22        data = {$random}%256;
23        #11000;
24      end
25      #1000;
26      $stop;
27    end
28
29    always #10 clk = ~clk;
30    
31    tlc5620_driver tlc5620_driver_inst(
32    
33      .clk      (clk  ),
34      .rst_n    (rst_n  ),
35      .data      (data  ),
36      
37      .da_clk    (da_clk),
38      .da_data    (da_data),
39      .da_ldac    (da_ldac),
40      .da_load    (da_load)
41  );
42
43  endmodule

 

运行波形,观察仿真波形:

66062438-3256-11ee-9e74-dac502259ad0.png

观察da_clk、da_data、da_load、da_ldac波形全部正常,即说明驱动正确。






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信