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

被折叠的 条评论
为什么被折叠?



