基于FPGA驱动TLC5615模块

基于TLC5615芯片的DDS信号发生器(FPGA) 基于TLC5615芯片的DDS波形发生器(FPGA) 1. 前言          前面在我的博客中已经写过关于TLC5615的FPGA程序驱动以及DDS的原理和代码实现,这里便不多做介绍,这一次主要是把这两部分合并起来利用DA芯片实现正弦波输出,并且用示波器观察信号的频率。 2. 模块示意图          TLC5615是 阅读详情

TLC5615模块之FPGA驱动

1、芯片介绍
      TLC5615 为美国德州仪器公司 1999 年推出的产品,是具有串行接口的数模转换器,其输出为电压型,最大输出电压是基准电压值的两倍。带有上电复位功能,即把 DAC 寄存器复位至全零。性能比早期电流型输出的 DAC 要好。只需要通过 3 根串行总线就可以完成 10 位数据的串行输入, 易于和工业标准的微处理器或微控制器(单片机) 接口, 适用于电池供电的测试仪表、移动电话,也适用于数字失调与增益调整以及工业控制场合。

DIN: 串行数据输入端;
TLC5615引脚图
TLC5615引脚图
SCLK: 串行时钟输入端;
/CS: 芯片选用通端,低电平有效;
DOUT: 用于级联时的串行数据输出端;
AGND: 模拟地;
REFIN:基准电压输入端, 2V~ (VDD - 2);
OUT: DAC 模拟电压输出端;
VDD: 正电源端,4.5~5.5V ,通常取 5V。
在这里插入图片描述
      TLC5615 工作时序如上图所示。 可以看出,只有当片选 CS 为低电平时, 串行输入数据才能被移入16位移位寄存器。当 CS 为低电平时,在每一个 SCLK 时钟的上升沿将 DIN 的一位数据移入 16 位移寄存器。注意, 二进制最高有效位被导前移入。接着,CS 的上升沿将 16 位移位寄存器的 10 位有效数据锁存于 10 位 DAC 寄存器, 供 DAC 电路进行转换; 当片选 CS 为高电平时,串行输入数据不能被移入 16 位移位寄存器。注意, CS 的上升和下降都必须发生在 SCL K 为低电平期间。
2、时钟确定
      根据下面时序图和芯片资料算出最大串行时钟速率近似为14M,因为核心板时钟为50M,故采用sclk串行时钟为12.5M,即采用四分频方式。
时序图
但是在芯片手册中说:为了使时钟馈通最小。CS在高电平时,sclk应该保持低电平。因此为了方便时钟的控制,不采用PLL生成的方式。采用线性序列机的方法生成可控的sclk。

3、注意
      因为DAC的寄存器为12位,但是数据位只有10位,因此要将数据位低位添加两个0,或者左移两位。

4、代码

module TLC5615_CTRL(
  input sys_clk,
  input rst,
  input conv_en,   //DA转换使能信号
  input [11:0] conv_data, //DA转换输入数据

  
  
  output reg cs,
  output reg conv_end, //DA转换完成信号
  output reg tlc5615_clk,
  output reg tlc5615_data
  
);

  reg [6:0] cnt;
 
//计数器 
  always @(posedge sys_clk or negedge rst)
    if(!rst)
	   cnt <= 7'd0;
	 else if(conv_en == 1 | (cnt != 7'd0)) begin
	      if(cnt == 7'd64)
			   cnt <= 7'd0;
			else
			   cnt <= cnt + 7'd1;
	   end
	 else
	   cnt <= 7'd0;
 
  
  always @(posedge sys_clk or negedge rst)
    if(!rst) begin 
	   conv_end <= 1'b0;
	   tlc5615_clk <= 1'b0;
      tlc5615_data <= 1'b0;
		cs <= 1'b1;
		end
	 else begin
	  case(cnt)
	     0:
		     begin 
			  conv_end <= 1'b0;
	        tlc5615_clk <= 1'b0;
           tlc5615_data <= 1'b0;
			  cs <= 1'b1;
			  end
		  1:  
		     begin
		     tlc5615_data <= conv_data[11];
			  cs <= 1'b0;
			  end
		  2: tlc5615_clk <= 1'b1;
		  
		  4: tlc5615_clk <= 1'b0;
		  5: tlc5615_data <= conv_data[10];
		  6: tlc5615_clk <= 1'b1;
		  
		  8: tlc5615_clk <= 1'b0;
		  9: tlc5615_data <= conv_data[9];
		  10:tlc5615_clk <= 1'b1;
		  
		  12:tlc5615_clk <= 1'b0;
		  13:tlc5615_data <= conv_data[8];
		  14:tlc5615_clk <= 1'b1;
		  
		  16:tlc5615_clk <= 1'b0;
		  17:tlc5615_data <= conv_data[7];
		  18:tlc5615_clk <= 1'b1;
		  
		  20:tlc5615_clk <= 1'b0;
		  21:tlc5615_data <= conv_data[6];
		  22:tlc5615_clk <= 1'b1;
		  
		  24:tlc5615_clk <= 1'b0;
		  25:tlc5615_data <= conv_data[5];
		  26:tlc5615_clk <= 1'b1;
		  
		  28:tlc5615_clk <= 1'b0;
		  29:tlc5615_data <= conv_data[4];
		  30:tlc5615_clk <= 1'b1;
		  
		  32:tlc5615_clk <= 1'b0;
		  33:tlc5615_data <= conv_data[3];
		  34:tlc5615_clk <= 1'b1;
		  
		  36:tlc5615_clk <= 1'b0;
		  37:tlc5615_data <= conv_data[2];
		  38:tlc5615_clk <= 1'b1;
		  
		  40:tlc5615_clk <= 1'b0;
		  41:tlc5615_data <= conv_data[1];
		  42:tlc5615_clk <= 1'b1;
		  
		  44:tlc5615_clk <= 1'b0;
		  45:tlc5615_data <= conv_data[0];
		  46:tlc5615_clk <= 1'b1;
		  
		  
		  64:
		     begin
		     tlc5615_clk <= 1'b0;
			  cs <= 1'b1;
			  conv_end <= 1'b1;
			  end
		  
		
		 endcase
		  
	  
	  end


endmodule 代码片

5、测试模块

`timescale 1ns/1ns


module TLC5615_CTRL_tb;

  reg sys_clk;
  reg rst;
  reg conv_en;  
  reg [11:0] conv_data;

  
  
  wire cs;
  wire conv_end; 
  wire tlc5615_clk;
  wire tlc5615_data;





TLC5615_CTRL TLC5615_CTRL(
  .sys_clk(sys_clk),
  .rst(rst),
  .conv_en(conv_en),   
  .conv_data(conv_data), 
  .cs(cs),
  .conv_end(conv_end), 
  .tlc5615_clk(tlc5615_clk),
  .tlc5615_data(tlc5615_data)
);


 initial sys_clk =1;
 always #10 sys_clk = ~sys_clk;
 initial begin
    rst = 1'b0;
	 conv_en = 1'b0;
	 conv_data = 0;
	 
	 #201;
	 rst = 1'b1;
	 
	 #100;
	 conv_data = {10'h2aa,2'b00};
	 conv_en = 1'b1;
	 #100;
	 conv_en = 1'b0;
	 
	 @(posedge conv_end);
	 #400;
	 conv_data = {10'h3e8,2'b00};
	 conv_en = 1'b1;
    @(posedge conv_end);
	 #400;
	 $stop;
	 
	 end
	 
endmodule 

6、仿真图
在这里插入图片描述
7、验证
      将程序下载至开发板后,将对应的引脚连接至TLC5615模块上,利用万用表测出电压值与实际相符合。
PS:在这里插入图片描述
V为转换后的电压值,Vref为参考电压,data为转换为十进制的值。

FPGA驱动TLC5615 DAC:从SPI时序到波形生成的完整工程实践 数模转换器(DAC)作为连接数字世界与模拟世界的关键桥梁,其核心原理是将数字编码转换为连续的模拟电压或电流信号。通过SPI、I2C等串行接口,FPGA等数字控制器可以高效地配置DAC芯片,实现精准的电压输出。这项技术的工程价值在于,它使得纯数字的逻辑系统能够生成和控制模拟信号,极大地扩展了其在测量、控制与信号处理领域的应用。在嵌入式系统、测试测量和工业控制等场景中,DAC常用于生成参考电压、可编程波形或作为闭环控制的设定点。本文聚焦于**TLC5615**这款经典的10位DAC芯片,深入剖析其**SPI通信 阅读详情

相关推荐

FPGA驱动ADC芯片TLC549:Verilog状态机实现与300+源码实例分享

模数转换(ADC)与数模转换(DAC)是连接模拟世界与数字系统的关键接口技术,其核心在于将连续的物理信号转换为离散的数字量,反之亦然。其工作原理通常基于采样、保持、量化与编码,技术价值在于为微控制器(MCU)、现场可编程门阵列(FPGA)等数字处理器提供了感知和控制现实世界的能力,广泛应用于传感器数据采集、音频处理、电机控制等场景。本文以经典的8位逐次逼近型(SAR)ADC芯片TLC549为例,深入解析其时序逻辑,并展示如何通过有限状态机(FSM)设计稳健的Verilog驱动代码,同时分享了涵盖基础通信协议

weixin_30650039的博客 367

DA-TLC5615

TLC5615

HopesunIce的博客 1万+

使用TLC5615输出256点正弦波

我们编写了一个Python脚本来生成256点正弦表,并提供了完整的STM32代码来更新TLC5615的输出。在这个脚本中,我们使用math库计算每个角度的正弦值,并将其转换为12位的整数。在这个函数中,我们首先选择TLC5615(将NSS信号拉低),然后向TLC5615发送正弦表中的数据。在本例中,我们将使用STM32F103C8T6开发板的SPI1接口。在这个代码中,我们首先调用SPI1_Init()函数初始化SPI1,并在主循环中调用TLC5615_Update()函数来更新TLC5615的输出。

LrfScript的博客 1074

基于FPGA的dds发生器与lcd显示参数

配套FPGA开发板(含该设计的工程代码):https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-4676525296.4.6e8950ed57YPhv&id=17848039135 功能 采用FPGA实现正弦波、三角波、矩形波,锯齿波生成, 频率分别为100Hz~10k,实现频率步进调节; 输出信号幅度为0V~3.3V,并能步进调...

weixin_34082789的博客 773

Quartus平台下FPGA控制TLC5615 DAC输出的Verilog工程,含呼吸灯动态调光演示

一套开箱即用的FPGA数字模拟转换开发资源,专为TI TLC5615 10位串行DAC芯片设计,基于Verilog语言,在Quartus环境中完成全流程验证。工程实现标准三线SPI通信协议(SCLK、DIN、CS),内置分频模块生成稳定时钟,支持10位数据逐位移出,逻辑包含复位初始化、状态机控制和寄存器缓存机制。所有源文件结构清晰,已通过综合、适配与布局布线,提供.sof/.pof配置文件、引脚约束文件(.pin)、完整编译报告(.fit.rpt、.map.rpt、.tan.rpt等)及详细README说明

d6e7f8g9h的博客 207

FPGA DDS任意波形发生器完整工程:VHDL/Verilog双实现 + TLC5615 DAC硬件方案

这个FPGA波形发生器工程包直接支持正弦波、方波、三角波、锯齿波和用户自定义波形输出,基于标准DDS架构实现。逻辑代码同时提供VHDL和Verilog两个版本,兼容主流FPGA芯片和开发环境;内置ModelSim仿真文件与截图,覆盖相位累加器、波形ROM查表、地址生成和DAC控制时序全流程验证;数模转换采用TLC5615 10位串行DAC,配套中英文数据手册;包含完整原理图PDF、开发板接线说明、50MHz系统时钟下的频率计算Excel工具,以及Quartus II综合报告和仿真结果图;所有模块分层清晰,信

ggg99的专栏 351

FPGA控制——基于FSM的TLC5615之SPI建模

真的是好久不见! 此篇博客介绍TLC5615的控制之SPI建模。 PART1:TLC5615及其时序控制原理介绍 TLC5615是TI公司的一款10位DAC芯片,控制兼容SPI接口。其引脚图如下: 从引脚图看到,通信接口为:DIN、SCLK、CS_N和DOUT,其中DOUT用于级联方式,本次设计采用的是非级联方式,故不用到DOUT;模拟接口:OUT(模拟电压输出)、REF(基准电压输入...

隔壁old余的博客 1710

Cyclone IV E FPGA上跑的正弦波信号源:Verilog实现DDS+TLC5615 10位DA输出

用EP4CE6E22C8(Cyclone IV E)FPGA搭建一个可直接下载运行的正弦波信号发生器,核心是Verilog写的DDS模块——通过32位相位累加器和1024点正弦ROM查表,生成10位数字波形;再由专用TLC5615驱动模块按芯片时序输出串行数据,配合SCLK、CS和DIN三线控制,适配5V供电与3.3V参考电压,理论输出范围0~3.3V(步进约3.22mV)。包里含完整Quartus工程(.qpf/.qsf)、所有Verilog源码(DDS.v、sin_rom.v、TLC615.v等)、生成

read5的博客 208

FPGA驱动TLC5615 DAC:从时序解析到多通道同步的硬件设计实践

数模转换器(DAC)是将数字信号转换为模拟电压的核心器件,广泛应用于信号生成、音频处理和精密测量等领域。其工作原理基于数字编码与参考电压的比例关系,通过串行或并行接口接收数字量并输出对应电压。在高速、高精度或多通道同步的应用场景中,软件模拟的通信时序往往难以满足严格的时序要求,这时FPGA的硬件并行性和精确时序控制能力便展现出独特价值。FPGA通过硬件描述语言构建状态机,能够实现纳秒级精度的接口驱动,确保数据建立和保持时间满足芯片手册规范。本文以TI的TLC5615 DAC芯片为例,详细解析如何基于状态机设

weixin_34082789的博客 424

TLC5615 中文资料 很全面

TLC5615 中文资料 很全面TLC5615 中文资料 很全面TLC5615 中文资料 很全面TLC5615 中文资料 很全面

TLC5615的FPGA的DA程序

DA程序!关于FPGA的DA程序!

cyclone4 FPGA读写DAC芯片TLC5615实验Verilog逻辑源码Quartus11.0工程文件.zip

cyclone4 FPGA读写DAC芯片TLC5615实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为EP4CE6E22C8,可以做为你的学习设计参考。 module TLC5615_display (clk, //�ڲ�ʱ�� sclk, //TLC5615 sclkʱ�ӽ� din, //TLC5615 din���ݽ� cs); //TLC5615 csƬѡ input clk; output din; output cs; output sclk; reg din; reg cs; reg sclk; reg[3:0] count1,count2,count3; reg[9:0] din_reg; //10λ���ݼĴ��� initial //��ʼ�� begin cs=1; din=0; count1=0; count2=0; count3=0; din_reg=10'd250; //ʵ���߿��Ը�����Ҫ�޸�10Ϊ�������� end /*** sclk��Ƶ������Ϊ2.5MHz ***/ always@(posedge clk) begin if(count3==4'd9) begin sclk<=~sclk; count3<=0; end else count3<=count3+1; end /*** TLC5615 csƬѡ ***/ always@(negedge sclk) begin if(count1>=4'd12&&count1<4'd15) begin cs<=1; //���Ƭѡ count1<=count1+4'd1; end else if(count1==4'd15) begin count1<=0; end else begin cs<=0;

DA-TLC5615-呼吸灯 FPGA 设计VERILOG例程源码quartus工程文件.zip

DA_TLC5615_呼吸灯 FPGA 设计VERILOG例程源码quartus工程,可供学习设计参考。

FPGA 20个例程篇:4.串行DAC输出模拟电压控制LED亮度

二、常用通信协议,摸索探究: 4.串行DAC输出模拟电压控制LED亮度 首先在此表示抱歉,笔者因为最近杂七杂八的事情比较多,搞得整个人莫名其妙地忙起来,所以博客更新的相对缓慢些,期间也有朋友私信我催更,表示在等着新例程学习呢,打开优快云 APP看到这些留言心里有一丝欣慰。 之前的承诺20个FPGA例程精讲精析,笔者会尽最大可能保持每周一个的速度持续更新,因为编写和整理代码会消耗不少的时间,后续例程的代码也会慢慢复杂起来,下班回来要做饭和陪女友,另外还要持续地学习工作方面.........

wandou0511的博客 1万+

51单片机+TLC5615组成的正弦信号发生器电路原理图+源代码+proteus仿真电路

51单片机+TLC5615组成的正弦信号发生器电路原理图+源代码+proteus仿真电路

FPGA控制10位串行DA芯片TLC5615实现 DDS-sin-out实现Verilog逻辑源码Quartus工程文件.zip

FPGA控制10位串行DA芯片TLC5615实现 DDS_sin_out实现Verilog逻辑源码Quartus工程文件, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 使用10位串行DA芯片TLC5615将数字信号转换为模拟信号,开发板DA芯片VDD=5V,VREF=3.3V 计算公式:Vout=VREF*(N/1024) N为10位二进制码 module DDS_sin(clk, //内部时钟 sclk, //TLC5615 sclk时钟脚 din, //TLC5615 din数据脚 cs //TLC5615 cs片选 ); input clk; output din; output cs; output sclk; wire clk; wire [9:0] data_line; DDS u4(.clk(clk),.dds_data_out(data_line)); TLC5615 U5(.clk(clk),.sclk(sclk),.din(din),.cs(cs),.din_in(data_line)); endmodule

参考TLC5615基于verilog HDL实现SPI时序

参考TLC5615基于verilog HDL实现SPI时序 下面参考TLC5615 DAC芯片,用verilog HDL实现了SPI时序,便于大家参考,下面将代码整理如下,具体请参考注释。 module spi_test( input wire sclk,//系统时钟,50MHz input wire rstn,//系统复位 output reg spi_cs,//SPI片选,低电平有效 output reg spi_clk,//1MHz//SPI时钟 output reg spi

weixin_39789553的博客 715

高速串行信号仿真避坑指南:为什么你的SIwave Xnet设置了却不出结果?

本文深入解析SIwave中Xnet功能在高速串行信号仿真中的常见问题,包括模型缺失、网络不完整和端口设置错误等关键误区。通过详细的电路元件模型验证、网络完整性检查及端口配置指南,帮助工程师有效解决仿真不出结果的问题,提升信号完整性分析效率。

weixin_29218963的博客 252
上一篇: 关于NIOS中断服务函数中的变量在main函数中没有变化的问题
下一篇: 基于FPGA的MCP4725驱动程序
落花生zz
博客等级 码龄7年 47粉丝 7原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值