[FPGA] TLV5620的FPGA控制器源码公布

[复制链接]
565|1
 楼主| feihufuture 发表于 2020-8-21 14:18 | 显示全部楼层 |阅读模式
本帖最后由 feihufuture 于 2020-8-21 15:41 编辑
[payamount]1.00[/payamount]
[pay]
  1.         `timescale 1ns / 1ps
  2.         //**********************************************************
  3.         //**********************************************************
  4.         //(1)VO = (NUM/256)*REF*(1+RNG).
  5.         //(2)data format : A1 A0 RNG D7 D6 D5 D4 D3 D2 D1 D0.
  6.         //(3)With LOAD high, data is clocked into the DATA terminal
  7.         //on each falling edge of CLK.
  8.         //(4)Once all data bits have been clocked in, LOAD is pulsed
  9.         //low to transfer the data from the serial-input register
  10.         //to the selected DAC.
  11.         //**********************************************************
  12.         //**********************************************************
  13.         module DA4_TLV5620(
  14.         input                                        CLK50M,
  15.         input                                 RST_N,
  16.         //
  17.         output                                 DAC_CLK,
  18.         output                                 DAC_DATA,
  19.         output                                 DAC_LOAD_N,
  20.         output                                 DAC_LDAC_N,
  21.         //
  22.         input                                        DAC_VALID,
  23.         input                [31 : 0]        PC_DATA_DAC,
  24.         output                                DAC_DONE  
  25.         );
  26.         reg [5:0] div_cnt_50 = 6'b0;
  27.         reg clk1m = 1'b0;
  28.         reg dac_done_o = 1'b0;
  29.         reg send_state = 1'b0;
  30.         reg [5:0] send_cnt = 6'b0;
  31.         reg [31:0] dac_data_reg = 32'b0;
  32.         reg dac_load_n_o = 1'b1;
  33.         reg dac_ldac_n_o = 1'b1;
  34.         reg dac_clk_sel = 1'b0;
  35.         reg dac_data_o = 1'b0;
  36.         //**********************************************************
  37.         //generate 1M clock
  38.         //**********************************************************
  39.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge CLK50M)
  40.                 begin
  41.                         if(~RST_N) div_cnt_50 <= 6'b0;
  42.                         else if(div_cnt_50 == 6'd49) div_cnt_50 <= 6'b0;
  43.                         else div_cnt_50 <= div_cnt_50 + 1;
  44.                 end
  45.         //
  46.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge CLK50M)
  47.                 begin
  48.                         if(~RST_N) clk1m <= 1'b0;
  49.                         else if(div_cnt_50 == 6'd24) clk1m <= ~clk1m;
  50.                         else if(div_cnt_50 == 6'd49) clk1m <= ~clk1m;
  51.                         else clk1m <= clk1m;
  52.                 end
  53.         //**********************************************************
  54.         //generate DAC_DONE
  55.         //**********************************************************
  56.         assign DAC_DONE = dac_done_o;
  57.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
  58.                 begin
  59.                         if(~RST_N) dac_done_o <= 1'b0;
  60.                         else if(dac_done_o) dac_done_o <= 1'b0;
  61.                         else if(~send_state)
  62.                                 begin
  63.                                         if(DAC_VALID) dac_done_o <= 1'b1;
  64.                                         else dac_done_o <= 1'b0;
  65.                                 end
  66.                         else dac_done_o <= 1'b0;
  67.                 end        
  68.         //**********************************************************
  69.         //generate send_state
  70.         //**********************************************************        
  71.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
  72.                 begin
  73.                         if(~RST_N) send_state <= 1'b0;
  74.                         else if(send_cnt == 6'd50) send_state <= 1'b0;
  75.                         else if(~send_state)
  76.                                 begin
  77.                                         if(DAC_VALID) send_state <= 1'b1;
  78.                                         else send_state <= send_state;
  79.                                 end
  80.                         else send_state <= send_state;
  81.                 end
  82.         //**********************************************************
  83.         //generate send_cnt
  84.         //**********************************************************
  85.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
  86.                 begin
  87.                         if(~RST_N) send_cnt <= 6'b0;
  88.                         else if(send_cnt == 6'd50) send_cnt <= 6'b0;
  89.                         else if(send_state) send_cnt <= send_cnt + 1;
  90.                 end
  91.         //**********************************************************
  92.         //DAC data register
  93.         //**********************************************************      
  94.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
  95.                 begin
  96.                         if(~RST_N) dac_data_reg <= 32'b0;
  97.                         else if(~send_state)
  98.                                 begin
  99.                                         if(DAC_VALID) dac_data_reg <= PC_DATA_DAC;
  100.                                         else dac_data_reg <= dac_data_reg;
  101.                                 end
  102.                         else dac_data_reg <= dac_data_reg;
  103.                 end
  104.         //**********************************************************
  105.         //DAC_LOAD_N
  106.         //**********************************************************               
  107.         assign DAC_LOAD_N = dac_load_n_o;
  108.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
  109.                 begin
  110.                         if(~RST_N) dac_load_n_o <= 1'b1;
  111.                         else
  112.                                 case(send_cnt)
  113.                                 6'd12: dac_load_n_o <= 1'b0;
  114.                                 6'd24: dac_load_n_o <= 1'b0;
  115.                                 6'd36: dac_load_n_o <= 1'b0;
  116.                                 6'd48: dac_load_n_o <= 1'b0;
  117.                                 default: dac_load_n_o <= 1'b1;
  118.                                 endcase
  119.                 end
  120.         //**********************************************************
  121.         //DAC_LDAC_N
  122.         //**********************************************************                        
  123.         assign DAC_LDAC_N = dac_ldac_n_o;
  124.         always @ (posedge clk1m)
  125.                 begin
  126.                         if(~RST_N) dac_ldac_n_o <= 1'b1;
  127.                         else
  128.                                 case(send_cnt)
  129.                                 6'd50: dac_ldac_n_o <= 1'b0;
  130.                                 default: dac_ldac_n_o <= 1'b1;
  131.                                 endcase
  132.                 end               
  133.         //**********************************************************
  134.         //DAC_CLK
  135.         //**********************************************************
  136.         assign DAC_CLK =         clk1m & dac_clk_sel;
  137.         always @ (posedge clk1m)
  138.                 begin
  139.                         if(~RST_N) dac_clk_sel <= 1'b0;
  140.                         else
  141.                                 case(send_cnt)
  142.                                 //DAC1
  143.                                 6'd1:                dac_clk_sel <= 1'b1;
  144.                                 6'd12:        dac_clk_sel <= 1'b0;
  145.                                 //DAC2
  146.                                 6'd13:        dac_clk_sel <= 1'b1;
  147.                                 6'd24:        dac_clk_sel <= 1'b0;
  148.                                 //DAC3                                
  149.                                 6'd25:        dac_clk_sel <= 1'b1;
  150.                                 6'd36:        dac_clk_sel <= 1'b0;
  151.                                 //DAC4                                
  152.                                 6'd37:        dac_clk_sel <= 1'b1;
  153.                                 6'd48:        dac_clk_sel <= 1'b0;
  154.                                 //
  155.                                 default: dac_clk_sel <= dac_clk_sel;
  156.                                 endcase
  157.                 end               
  158.         //**********************************************************
  159.         //DAC data send
  160.         //RNG is selected '1'
  161.         //**********************************************************               
  162.         assign DAC_DATA = dac_data_o;
  163.         always @ (posedge clk1m)
  164.                 begin
  165.                         if(~RST_N) dac_data_o <= 1'b0;
  166.                         else
  167.                                 case(send_cnt)
  168.                                 //DAC1
  169.                                 6'd1:dac_data_o <= 1'b0;
  170.                                 6'd2:dac_data_o <= 1'b0;
  171.                                 6'd3:dac_data_o <= 1'b1;
  172.                                 6'd4:dac_data_o <= dac_data_reg[7];
  173.                                 6'd5:dac_data_o <= dac_data_reg[6];
  174.                                 6'd6:dac_data_o <= dac_data_reg[5];
  175.                                 6'd7:dac_data_o <= dac_data_reg[4];
  176.                                 6'd8:dac_data_o <= dac_data_reg[3];
  177.                                 6'd9:dac_data_o <= dac_data_reg[2];
  178.                                 6'd10:dac_data_o <= dac_data_reg[1];
  179.                                 6'd11:dac_data_o <= dac_data_reg[0];
  180.                                 //DAC2
  181.                                 6'd13:dac_data_o <= 1'b0;
  182.                                 6'd14:dac_data_o <= 1'b1;
  183.                                 6'd15:dac_data_o <= 1'b1;
  184.                                 6'd16:dac_data_o <= dac_data_reg[15];
  185.                                 6'd17:dac_data_o <= dac_data_reg[14];
  186.                                 6'd18:dac_data_o <= dac_data_reg[13];
  187.                                 6'd19:dac_data_o <= dac_data_reg[12];
  188.                                 6'd20:dac_data_o <= dac_data_reg[11];
  189.                                 6'd21:dac_data_o <= dac_data_reg[10];
  190.                                 6'd22:dac_data_o <= dac_data_reg[9];
  191.                                 6'd23:dac_data_o <= dac_data_reg[8];
  192.                                 //DAC3                                
  193.                                 6'd25:dac_data_o <= 1'b1;
  194.                                 6'd26:dac_data_o <= 1'b0;
  195.                                 6'd27:dac_data_o <= 1'b1;
  196.                                 6'd28:dac_data_o <= dac_data_reg[23];
  197.                                 6'd29:dac_data_o <= dac_data_reg[22];
  198.                                 6'd30:dac_data_o <= dac_data_reg[21];
  199.                                 6'd31:dac_data_o <= dac_data_reg[20];
  200.                                 6'd32:dac_data_o <= dac_data_reg[19];
  201.                                 6'd33:dac_data_o <= dac_data_reg[18];
  202.                                 6'd34:dac_data_o <= dac_data_reg[17];
  203.                                 6'd35:dac_data_o <= dac_data_reg[16];
  204.                                 //DAC4                                
  205.                                 6'd37:dac_data_o <= 1'b1;
  206.                                 6'd38:dac_data_o <= 1'b1;
  207.                                 6'd39:dac_data_o <= 1'b1;
  208.                                 6'd40:dac_data_o <= dac_data_reg[31];
  209.                                 6'd41:dac_data_o <= dac_data_reg[30];
  210.                                 6'd42:dac_data_o <= dac_data_reg[29];
  211.                                 6'd43:dac_data_o <= dac_data_reg[28];
  212.                                 6'd44:dac_data_o <= dac_data_reg[27];
  213.                                 6'd45:dac_data_o <= dac_data_reg[26];
  214.                                 6'd46:dac_data_o <= dac_data_reg[25];
  215.                                 6'd47:dac_data_o <= dac_data_reg[24];
  216.                                 //
  217.                                 default: dac_data_o <= 1'b0;
  218.                                 endcase
  219.                 end
  220.                         
  221.         
  222.         endmodule
  223.         
  224.         
  225.         
  226.         
  227.         
  228.         


[/pay]      
雷北城 发表于 2020-8-22 16:43 | 显示全部楼层
谢谢分享,学习一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:WX:feihu612 免费合作开发ECAT主从站

171

主题

1029

帖子

101

粉丝
快速回复 在线客服 返回列表 返回顶部