TLC5620 DAC芯片驅動設計

本文档描述了TLC5620 DAC芯片的驱动设计,通过Verilog代码展示了如何使用串行接口时钟CLK、数据输入DATA、加载控制LOAD和加载DAC信号。代码中包含了一个计数器模块和线性序列机模块,用于根据控制字ctrlword逐位传输数据到DAC,并在传输结束后设置done标志。

                                                              

                                                                           

 

                                                             

                                                              

  1. // {A1,A0}為A,B,C,D四個通道選擇
  2. // RNG為0或1
  3.  
  4. module TLC5620_DAC(clk,rst,ctrlword,CLK,DATA,LOAD,LDAC,done);
  5. input clk;   // 50M Hz
  6. input rst;
  7. input [10:0] ctrlword;  // {A1,A0,RNG,DATA[7:0]}
  8. output CLK;     // 串行接口時鐘
  9. output DATA;   // 串行接口數據輸入
  10. output LOAD;  // 串行數據加載控制
  11. output LDAC;  // 加載DAC
  12. output done;   // 傳輸結束標誌
  13.  
  14. reg CLK;
  15. reg DATA;
  16. reg LOAD;
  17. reg LDAC;
  18. reg en;
  19. reg done;
  20. reg [9:0] cnt;
  21.  
  22. //========================================================
  23. // 計數器
  24. //========================================================
  25.  
  26. always@(posedge clk or negedge rst)   
  27. begin
  28.     if(!rst)                         cnt <= 10'd0;
  29.     else if(en)
  30.     begin
  31.         if(cnt == 10'd820)   cnt <= 10'd0;
  32.         else                         cnt <= cnt + 10'd1;
  33.     end 
  34.     else                             cnt <= cnt;
  35. end
  36.  
  37. //========================================================
  38. // 線性序列機
  39. //========================================================
  40.  
  41. always@(posedge clk or negedge rst)   
  42. begin 
  43.     if(!rst)
  44.     begin                          
  45.          CLK    <= 1'b0;
  46.          DATA  <= 1'b0;
  47.          LOAD <= 1'b0;
  48.          LDAC <= 1'b0;
  49.          en       <= 1'b0;
  50.          done   <= 1'b0;    
  51.     end
  52.     else
  53.     begin
  54.         case(cnt)
  55.         0:begin
  56.                CLK    <= 1'b0;
  57.                DATA  <= 1'b0;
  58.                LOAD <= 1'b1;
  59.                LDAC <= 1'b0;
  60.                en       <= 1'b1;
  61.                done   <= 1'b0;
  62.            end
  63.         10:begin
  64.                  CLK   <= 1'b1;
  65.                  DATA <= ctrlword[10];
  66.              end
  67.         40:begin
  68.                  CLK  <= 1'b0;
  69.              end
  70.         70:begin
  71.                  CLK   <= 1'b1;
  72.                  DATA <= ctrlword[9];
  73.              end
  74.         100:begin
  75.                    CLK  <= 1'b0;
  76.                end
  77.         130:begin
  78.                    CLK   <= 1'b1;
  79.                    DATA <= ctrlword[8];
  80.                end
  81.         160:begin
  82.                    CLK  <= 1'b0;
  83.                end
  84.         190:begin
  85.                    CLK   <= 1'b1;
  86.                    DATA <= ctrlword[7];
  87.                end
  88.         220:begin
  89.                    CLK  <= 1'b0;
  90.                end
  91.         250:begin
  92.                    CLK   <= 1'b1;
  93.                    DATA <= ctrlword[6];
  94.                end
  95.         280:begin
  96.                    CLK  <= 1'b0;
  97.                end
  98.         310:begin
  99.                    CLK   <= 1'b1;
  100.                    DATA <= ctrlword[5];
  101.                end
  102.         340:begin
  103.                    CLK  <= 1'b0;
  104.                end
  105.         370:begin
  106.                    CLK   <= 1'b1;
  107.                    DATA <= ctrlword[4];
  108.                end
  109.         400:begin
  110.                    CLK  <= 1'b0;
  111.                end
  112.         430:begin
  113.                    CLK   <= 1'b1;
  114.                    DATA <= ctrlword[3];
  115.                end
  116.         460:begin
  117.                    CLK  <= 1'b0;
  118.                end
  119.         490:begin
  120.                    CLK   <= 1'b1;
  121.                    DATA <= ctrlword[2];
  122.                end
  123.         520:begin
  124.                    CLK  <= 1'b0;
  125.                end
  126.         550:begin
  127.                    CLK   <= 1'b1;
  128.                    DATA <= ctrlword[1];
  129.                end
  130.         580:begin
  131.                    CLK  <= 1'b0;
  132.                end
  133.         610:begin
  134.                    CLK  <= 1'b1;
  135.                    DATA <= ctrlword[0];
  136.                end
  137.         640:begin
  138.                    CLK  <= 1'b0;
  139.                end
  140.         670:begin
  141.                    LOAD <= 1'b0;
  142.                end
  143.         800:begin
  144.                    LOAD <= 1'b1;
  145.                end
  146.         819:begin
  147.                    en <= 1'b0;
  148.                end   
  149.         820:begin
  150.                    en    <= 1'b0;
  151.                    done <= 1'b1;
  152.                end
  153.         default:;
  154.         endcase
  155.     end
  156. end
  157.  
  158. //====================================================
  159.  
  160. endmodule
     


  1. `timescale 1ns/100ps
  2.  
  3. module TLC5620_DAC_test1;
  4. reg  clk,rst;
  5. reg  [10:0] ctrlword;
  6. wire CLK,DATA,LOAD,LDAC,done;
  7.  
  8. TLC5620_DAC  TLC5620_DAC(
  9.      .clk(clk),
  10.      .rst(rst),
  11.      .ctrlword(ctrlword),
  12.      .CLK(CLK),
  13.      .DATA(DATA),
  14.      .LOAD(LOAD),
  15.      .LDAC(LDAC),
  16.      .done(done)
  17. );
  18.  
  19. initial
  20. begin
  21.      clk=1'b1;
  22.      forever #20 clk = ~clk;
  23. end
  24.  
  25. initial
  26. begin
  27.     #0  
  28.     rst = 1'b0;
  29.     #1  
  30.     rst = 1'b1; ctrlword = {2'b00,1'b0,8'd55};
  31.     #50000
  32.     $stop;
  33.     #10 
  34.     $finish;
  35. end
  36.  
  37. endmodule
     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值