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為轉換為十進制的值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/203850.html
標籤:其他
