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

可编程逻辑

1366人已加入

描述

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

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

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

锁存器

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

锁存器

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

锁存器

端口介绍:

锁存器

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

锁存器

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

锁存器

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

锁存器

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

锁存器

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

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

首先我们先新建工程。

锁存器

锁存器

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

锁存器

锁存器

锁存器

驱动代码如下:

 

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信号的建立时间与保持时间。时间要求如下图:

锁存器

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

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

锁存器

锁存器

代码如下:

 

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

 

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

锁存器

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






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分