前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA零基础学习之Vivado-TLC5620驱动教程

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

原创
作者头像
FPGA技术江湖
发布2023-08-02 18:28:26
2410
发布2023-08-02 18:28:26
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖

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

本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。

系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,TLC5620驱动教程。话不多说,上货。

在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的时间。

首先我们先新建工程。

编辑

编辑

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

编辑

编辑

编辑

驱动代码如下:

代码语言:javascript
复制
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。满足条件。

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

编辑

编辑

代码如下:

代码语言:javascript
复制
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波形全部正常,即说明驱动正确。

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

江湖偌大,继续闯荡,愿大侠一切安好,有缘再见!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FPGA零基础学习之Vivado-TLC5620驱动教程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档