芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 23744|回复: 3

【07.17已解决】DAC实验测试电压异常

[复制链接]
  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
    发表于 2018-7-17 10:06:41 | 显示全部楼层 |阅读模式
    本帖最后由 Deer-菜籽 于 2018-7-17 15:19 编辑

    在DAC实验里
    modelsim仿真波形正常
    捕获.JPG
    但实际电压表测试电压均为0V
    期间怀疑过DAC芯片 但出产固件测试DB引脚 电压正常增长
    故可以排除DAC芯片问题 应该是驱动当中出了什么问题

    ISSP设置如下
    捕获2.JPG

    捕获1.JPG

    实在找不出来问题出在哪里
    后附上各文件代码

    DAC_top
    1. module DAC_top(
    2.         clk,
    3.         rst_n,
    4.         key,
    5.         
    6.         DIN,
    7.         CS_N,
    8.         SCLK
    9. );

    10.         input clk,rst_n;
    11.         input key;
    12.         
    13.         output wire DIN;
    14.         output wire CS_N;
    15.         output wire SCLK;
    16.         
    17.         
    18.         wire [15:0] DAC_DATA;
    19.         wire DAC_STATE;

    20.         reg START;
    21.         
    22.         DAC_driver DAC_driver(
    23.                 .clk                (clk),
    24.                 .rst_n                (rst_n),
    25.                 .START                (START),
    26.                 .DAC_DATA        (DAC_DATA),
    27.         
    28.                 .CS_N                (CS_N),
    29.                 .SCLK                (SCLK),
    30.                 .DIN                (DIN),
    31.                 .DAC_STATE        (DAC_STATE)
    32. );



    33.         DAC DAC_test (
    34.                 .probe                (DAC_DATA[11:0]),  //  probes.probe
    35.                 .source                (DAC_DATA)  // sources.source
    36. );

    37.         
    38.         
    39.         reg [15:0] DAC_DATA_r;
    40.         always@ (posedge clk or negedge rst_n)
    41.                 if(!rst_n)
    42.                         DAC_DATA_r <= 16'd0;
    43.                 else if (DAC_STATE)
    44.                                 DAC_DATA_r <= DAC_DATA;
    45.                         else
    46.                                 DAC_DATA_r <= DAC_DATA_r;
    47.         
    48.         
    49.         always@ (posedge clk or negedge rst_n)
    50.                 if(!rst_n)
    51.                         START <= 1'b0;
    52.                 else if (DAC_DATA_r != DAC_DATA)
    53.                                 START <= 1'b1;
    54.                         else
    55.                                 START <= 1'b0;
    56.                                 
    57.                                 
    58.                                 
    59. endmodule                 
    复制代码

    DAC_driver
    1. `define DIV_PARAM 2

    2. module DAC_driver(
    3.         clk,
    4.         rst_n,
    5.         START,
    6.         DAC_DATA,
    7.         
    8.         CS_N,
    9.         SCLK,
    10.         DIN,
    11.         DAC_STATE
    12. );

    13.         input clk,rst_n;
    14.         input START;
    15.         input [15:0] DAC_DATA;
    16.         
    17.         output reg CS_N;
    18.         output reg SCLK;
    19.         output reg DIN;
    20.         output DAC_STATE;
    21.                
    22.         
    23.         
    24. /* 处理 START 信号 */
    25. /* 当出现 START 信号时,work = 1 表示正在工作不接受触发
    26. 当出现 conv_finish 信号时,work = 0 表示不在工作可以被触发 */
    27.         reg work;
    28.         reg conv_finish;
    29.         always@ (posedge clk or negedge rst_n) begin
    30.                 if(!rst_n)        
    31.                         work <= 1'b0;
    32.                 else if ( conv_finish )
    33.                                 work <= 1'b0;
    34.                         else if (START)
    35.                                         work <= 1'b1;
    36.                                 else
    37.                                         work <= work;
    38.         end
    39.         
    40.         

    41. /* SCLK2X 时钟产生 */
    42. /* 数据手册显示 TLV5618 最大时钟频率20MHz
    43.    所以取SCLK2X 频率为25MHz 即进行2分频
    44.    如此 SCLK 即为 12.5 MHz 符合器件要求 */

    45.         reg [7:0] cnt_SCLK2X;
    46.         always@ (posedge clk or negedge rst_n) begin
    47.                 if(!rst_n)
    48.                         cnt_SCLK2X <= 8'd0;
    49.                 else if (work) begin
    50.                                 if (cnt_SCLK2X == ( (`DIV_PARAM) - 1'b1 ) )
    51.                                         cnt_SCLK2X <= 8'd0;
    52.                                 else
    53.                                         cnt_SCLK2X <= cnt_SCLK2X + 1'b1;
    54.                                 end
    55.                         else
    56.                                 cnt_SCLK2X <= 8'd0;
    57.         end
    58.         
    59.         reg SCLK2X;
    60.         always@ (posedge clk or negedge rst_n) begin
    61.                 if(!rst_n)
    62.                         SCLK2X <= 1'b0;
    63.                 else if ( work && ( cnt_SCLK2X == ( (`DIV_PARAM) - 1'b1 ) ) )
    64.                                 SCLK2X <= 1'b1;
    65.                         else
    66.                                 SCLK2X <= 1'b0;
    67.         end
    68.         
    69.         
    70.         
    71. /* 线性序列计数器 */
    72.         reg [5:0]cnt_LSM;
    73.         always@ (posedge clk or negedge rst_n) begin
    74.                 if(!rst_n)
    75.                         cnt_LSM <= 6'd0;
    76.                 else if ( work && SCLK2X ) begin
    77.                         if ( cnt_LSM == 6'd33 )
    78.                                 cnt_LSM <= 6'd0;
    79.                         else if (SCLK2X)
    80.                                         cnt_LSM <= cnt_LSM + 1'b1;
    81.                         end
    82.                                 else
    83.                                         cnt_LSM <= cnt_LSM ;
    84.         end

    85.         
    86.         
    87. /* 线性序列机 */
    88.         reg [15:0] DAC_DATA_r;
    89.         
    90.         always@ (posedge clk or negedge rst_n) begin
    91.                 if(!rst_n)
    92.                         DAC_DATA_r <= 16'd0;
    93.                 else if (work)
    94.                                 DAC_DATA_r <= DAC_DATA;
    95.                         else
    96.                                 DAC_DATA_r <= DAC_DATA;
    97.         end
    98.         
    99.         
    100.         always@ (posedge clk or negedge rst_n) begin
    101.                 if(!rst_n) begin
    102.                         CS_N <= 1'b1;
    103.                         DIN  <= 1'b1;
    104.                         SCLK <= 1'b1;
    105.                 end
    106.                 else if (work) begin
    107.                                 if (SCLK2X) begin
    108.                                         case (cnt_LSM)
    109.                                                  0: begin SCLK <= 1'b0; CS_N <= 1'b0; end
    110.                                                  1: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[15]; end
    111.                                                   3: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[14]; end
    112.                                                  5: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[13]; end
    113.                                                  7: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[12]; end
    114.                                                  9: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[11]; end
    115.                                                 11: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[10]; end
    116.                                                 13: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 9]; end
    117.                                                 15: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 8]; end
    118.                                                 17: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 7]; end
    119.                                                 19: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 6]; end
    120.                                                 21: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 5]; end
    121.                                                 23: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 4]; end
    122.                                                 25: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 3]; end
    123.                                                 27: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 2]; end
    124.                                                 29: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 1]; end
    125.                                                 31: begin SCLK <= 1'b1; DIN <= DAC_DATA_r[ 0]; end
    126.                                                 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30:
    127.                                                         begin SCLK <= 1'b0; end         
    128.                                                         
    129.                                                 32: begin SCLK <= 1'b1; end
    130.                                                 33: begin CS_N <= 1'b1; end
    131.                                                 default : begin CS_N <= 1'b1; DIN <= 1'b1; SCLK <= 1'b1; end
    132.                                         endcase
    133.                                         end
    134.                                 else ;
    135.                         end
    136.                         else CS_N <= 1'b1;
    137.         end
    138.         
    139.         
    140.         
    141. /* 当数据转换完成时候输出一个 conv_finish 信号脉冲 */
    142.         always@ (posedge clk or negedge rst_n) begin
    143.                 if(!rst_n)
    144.                         conv_finish <= 1'b0;
    145.                 else if ( work && SCLK2X && (cnt_LSM == 6'd33) )
    146.                         conv_finish <= 1'd1;
    147.                         else
    148.                         conv_finish <= 1'b0;
    149.         end
    150.         
    151. assign DAC_STATE = work;


    152. endmodule
    复制代码

    DAC_tb
    1. `timescale 1ns/1ns
    2. `define timeperiod 20

    3. module DAC_tb();
    4.         
    5.         reg clk,rst_n;
    6.         reg START;
    7.         reg [15:0] DAC_DATA;
    8.         
    9.         wire CS_N;
    10.         wire SCLK;
    11.         wire DIN;
    12.         wire DAC_STATE;
    13.         
    14.         
    15.         DAC_driver DAC_driver(
    16.         .clk                (clk),
    17.         .rst_n                (rst_n),
    18.         .START                (START),
    19.         .DAC_DATA        (DAC_DATA),
    20.                  
    21.         .CS_N                (CS_N),
    22.         .SCLK                (SCLK),
    23.         .DIN                (DIN),
    24.         .DAC_STATE        (DAC_STATE)
    25. );

    26.         initial clk = 1'b0;
    27.         always #(`timeperiod / 2) clk = ~clk;
    28.         
    29.         initial begin
    30.                 rst_n = 1'b0;
    31.                 #(`timeperiod * 10);
    32.                 rst_n = 1'b1;
    33.                 #(`timeperiod * 20);
    34.                
    35.                 DAC_DATA = 16'hC_AAA;
    36.                 START = 1;
    37.                 #20;
    38.                 START = 0;
    39.                 #200;
    40.                 wait(!DAC_STATE);
    41.                
    42.                 #2000;
    43.                
    44.                 DAC_DATA = 16'h4_555;
    45.                 START = 1;
    46.                 #20;
    47.                 START = 0;
    48.                 #200;
    49.                 wait(!DAC_STATE);
    50.         
    51.                 #2000;
    52.                
    53.                 #2000;
    54.                 $stop;
    55.         
    56.         end
    57. endmodule
    复制代码

    DAC_TLV5618.zip (3.98 KB, 下载次数: 346)

    回复

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-7-17 15:17:14 | 显示全部楼层
    找到了找到了
    加上昨天几乎是整整一天...
    线性序列机里面写错了
    之前改着改着改懵了
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-7-17 11:05:41 | 显示全部楼层
    另外还有一个问题 ISSP在Source 端输入数据的时候可以自定义数据类型吗
    应该在哪里设置呢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-7-17 12:40:24 | 显示全部楼层
    本帖最后由 fzwwj95 于 2018-7-17 21:09 编辑
    Deer-菜籽 发表于 2018-7-17 11:05
    另外还有一个问题 ISSP在Source 端输入数据的时候可以自定义数据类型吗
    应该在哪里设置呢 ...

    谢谢袁玉卓
    ISSP的数据定义部分找到了
    不过驱动部分的问题还没找到 下午再继续啦
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-3-29 18:14 , Processed in 0.116770 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表