FPGA入门线性序列机与串行接口DAC驱动设计

本文围绕FPGA入门线性序列机与串行接口DAC驱动设计展开,介绍了TLC5620型DAC芯片内部结构,包括数据移入、锁存过程及控制信号作用。还阐述了TLC5620模块设计,如控制字组成、更新信号等,提及模块仿真方法,最后涉及顶层文件。

FPGA入门线性序列机与串行接口DAC驱动设计

电压跟随器:输入阻抗高输出阻抗低。

TLC5620型DAC芯片内部结构

在这里插入图片描述
当LOAD为高电平时,在每个CLK的下降沿,数据被移入DAC的移位寄存器中。当所有的数据位被移入完成后,LOAD被拉低,数据传输到第一级锁存器,由于LOAC一直为低电平不变,数据直接从第一级锁存器传输到第二级锁存器,第二级锁存器转入选中的DAC中。
LOAD控制第一级锁存器,低电平时第一级锁存器打开,LDAC信号同理。
数据由地址位和数据位组成。
A0,A1,RNG为地址位。在这里插入图片描述
DAC电路当Tlc_clk为下降沿时Tlc_data数据移入到锁存器中。

TLC5620模块设计

在这里插入图片描述
Contorl_word包含8位数据位,2位通道选择,1位电压倍增模式选择。
Update_reg信号为更新DAC输出请求信号,Update_done为更新DAC完成标志。

TLC5620模块

module TLC5620_control(
   Clk,
	Rst_n,
	Ctrlword,
	Update_reg,
	
	Update_done,
	Tlc_clk,
	Tlc_data,
	Tlc_load,
	Tlc_ldac
  );

input Clk;
input	Rst_n;
input	[10:0]Ctrlword;
input Update_reg;
	
output reg	Update_done;
output reg	Tlc_clk;
output reg	Tlc_data;
output reg	Tlc_load;
output reg	Tlc_ldac;
 
reg [9:0]count;
 
always @(posedge Clk or negedge Rst_n)
if(!Rst_n)
count <= 10'b0;
else if(Update_reg == 1 | (count != 10'b0)) begin
     if(count == 10'd650)
	  count <= 10'b0;
	  else 
	  count <= count + 10'b1;
end   else  
     count <= 10'b0;   
   
always @(posedge Clk or negedge Rst_n)
if(!Rst_n) begin 
   Tlc_clk <= 1'b0; 
	Tlc_data <= 1'b0;
	Tlc_load <= 1'b0;
	Tlc_ldac <= 1'b0;
	Update_done <= 1'b0;
end   else   begin
     case(count)
	  0: begin         
	      Tlc_clk <= 1'b0; 
	      Tlc_data <= 1'b0;
	      Tlc_load <= 1'b1;
	 		Tlc_ldac <= 1'b0;
	      Update_done <= 1'b0;
	      end
	  10: begin 
	      Tlc_data <= Ctrlword[10];
	      Tlc_clk  <= 1'b1;
	      end
	  40: Tlc_clk  <= 1'b0;
	  70: begin 
	      Tlc_data <= Ctrlword[9];
	      Tlc_clk  <= 1'b1;
	      end
	  100: Tlc_clk  <= 1'b0;
	  130:begin 
	      Tlc_data <= Ctrlword[8];
	      Tlc_clk  <= 1'b1;
	      end
	  160:Tlc_clk  <= 1'b0;
	  190:begin 
	      Tlc_data <= Ctrlword[7];
	      Tlc_clk  <= 1'b1;
	      end
	  220:Tlc_clk  <= 1'b0;
	  250:begin 
	      Tlc_data <= Ctrlword[6];
	      Tlc_clk  <= 1'b1;
	      end
	  280:Tlc_clk  <= 1'b0;
	  310:begin 
	      Tlc_data <= Ctrlword[5];
	      Tlc_clk  <= 1'b1;
	      end
	  340:Tlc_clk  <= 1'b0;
	  370:begin 
	      Tlc_data <= Ctrlword[4];
	      Tlc_clk  <= 1'b1;
	      end
	  400:Tlc_clk  <= 1'b0;
	  430:begin 
	      Tlc_data <= Ctrlword[3];
	      Tlc_clk  <= 1'b1;
	      end
	  460:Tlc_clk  <= 1'b0;
	  490:begin 
	      Tlc_data <= Ctrlword[2];
	      Tlc_clk  <= 1'b1;
	      end
	  520:Tlc_clk  <= 1'b0;
	  550:begin 
	      Tlc_data <= Ctrlword[1];
	      Tlc_clk  <= 1'b1;
	      end
	  580:Tlc_clk  <= 1'b0;
	  610:begin 
	      Tlc_data <= Ctrlword[0];
	      Tlc_clk  <= 1'b1;
	      end
	  640:Tlc_clk  <= 1'b0;
	  643:Tlc_load <= 1'b0;
	  646:Tlc_load <= 1'b1;
	  650:Update_done <= 1'b1;
	  default:;
	  
     endcase
end
endmodule 

TLC5620模块仿真

`define Clk_period 20
`timescale 1ns/1ns
module Tlc_laod_tb;

reg   Clk;
reg	Rst_n;
reg	[10:0]Ctrlword;
reg Update_reg;
	
wire	Update_done;
wire	Tlc_clk;
wire	Tlc_data;
wire	Tlc_load;
wire	Tlc_ldac;

TLC5620_control TLC5620_control0(
   .Clk(Clk),
	.Rst_n(Rst_n),
	.Ctrlword(Ctrlword),
	.Update_reg(Update_reg),
	
	.Update_done(Update_done),
	.Tlc_clk(Tlc_clk),
	.Tlc_data(Tlc_data),
	.Tlc_load(Tlc_load),
	.Tlc_ldac(Tlc_ldac)
  );
initial Clk = 1;
always #(`Clk_period/2) Clk = ~Clk;

initial  begin  
Rst_n = 0;
Ctrlword = 0;
Update_reg = 0;
#(`Clk_period*1+1);
Rst_n = 1;
#(`Clk_period*10+1);
Update_reg = 1;
Ctrlword = {2'b0,1'b0,8'haf};
#`Clk_period;
Update_reg = 0;
 @(posedge Update_done);
#(`Clk_period*100);

Update_reg = 1;
Ctrlword = {2'b0,1'b0,8'hfe};
#`Clk_period;
Update_reg = 0;
 @(posedge Update_done);
 #(`Clk_period*100);
$stop;

end
endmodule 

在这里插入图片描述
使用In system sources and probes 生成IP核用来产生数据,使用In system sources and probes editor工具,输入希望输出的电压值。

TLC5620顶层文件

module Tlc5620_top(

   Clk,
	Rst_n,
	
	Tlc_clk,
	Tlc_data,
	Tlc_load,
	Tlc_ldac
	 );

input Clk;
input	Rst_n;

	
output 	Tlc_clk;
output 	Tlc_data;
output 	Tlc_load;
output 	Tlc_ldac;

wire [10:0]Ctrlword;

controlword  controlword0(  //发送数据
	.probe(),
	.source(Ctrlword)
	);


TLC5620_control TLC5620_control1(
   .Clk(Clk),
	.Rst_n(Rst_n),
	.Ctrlword(Ctrlword),
	.Update_reg(1'b1),
	
	.Update_done(),
	.Tlc_clk(Tlc_clk),
	.Tlc_data(Tlc_data),
	.Tlc_load(Tlc_load),
	.Tlc_ldac(Tlc_ldac)
  );

endmodule 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值