AD7352的关于verilog代码

来源:互联网 发布:mysql常用命令总结 编辑:程序博客网 时间:2024/06/15 16:20



思路:计算一个完整的采样及转化周期,fsample=3MHZ大约是333ns,选取的基础时钟tick为5ns

nCS拉低之后需要延时5ns,tsclk的最短时间是1/48MHZ大约为20.8ns ,为了方便计算选取30ns为其周期时间,之后拉高基本上也是5ns

考虑到计算方便把fsample=2MHZ-----500ns      一个周期时间分布:50ns+30ns*13+60ns=500ns 

tick上升沿计数,范围[0,100]

tick=0, nCS=1;    tick=1,nCS=0;

tick=10+6*n,   n--[0,11];  SCLK=0;

tick=13+6*n,  n--[0,11];  SCLK=1;

tick=[88,100]; nCS=1;

代码如下:module AD7352_driver(    input CLOCK,    input RST_N,    //    input ad_enable,    output reg [11:0] segdataA,    output reg [11:0] segdataB, // output reg nCS, output reg SCK, input sdataA;    input sdataB); function integer log2(input integer n);    integer i;    for(i=0; 2**i <=n; i=i+1) log2=i+1;endfunction /*************************************** 生成5ns的tick时钟**************************************/reg cnt_5ns;always@(posedge CLOCK) cnt_5ns <= cnt_5ns + 1'b1;wire tick_5ns = (cnt_5ns == 1'b1) ? 1 : 0; /*************************************** 根据tick时钟生成ad基准计数器**************************************/reg [log2(100):1] ad_ref_cnt; // [0,100]always@(posedge CLOCK, negedge RST_N)    if(!RST_N) ad_ref_cnt <= 0;    else begin        if(!ad_enable) ad_ref_cnt <= 0;        else begin            if(tick_5ns) begin                if(ad_ref_cnt < 100)                     ad_ref_cnt <= ad_ref_cnt + 1'b1;                else ad_ref_cnt <= 0;            end        end    end     /*************************************** 根据基准计数器生成串行信号**************************************/reg samping_flag; // 采样标志always@(posedge CLOCK, negedge RST_N)    if(!RST_N) begin        nCS <= 1;        SCK <= 0;        samping_flag <= 0;    end    else begin        if(tick_5ns) begin            case(ad_ref_cnt)                // 采样期                10,16,22,28,34,40,46,52,58,64,70,76,82 : SCK <= 0;                13,19,25,31,37,43,49,55,61,67,73,79,85 : SCK <= 1;                          default : ; // 缺省不操作            endcase            case(ad_ref_cnt)                0 : nCS <= 1;                1 : nCS <= 0;                // 转换期                88: nCS <= 1;                            default : ; // 缺省不操作            endcase            case(ad_ref_cnt)                0 : samping_flag <= 0;                // 采样期                10 : samping_flag <= 1;                // 转换期                88: samping_flag <= 0;                default : ; // 缺省不操作            endcase        end    endwire samping_end = (ad_ref_cnt == 88) ? 1 : 0; // 采样结束标志 /*************************************** 根据串行信号读取串行样本数据**************************************/reg [11:0] sample_dataA;reg [11:0] asmple_dataB;always@(posedge SCK, negedge RST_N)    if(!RST_N) begin              sample_dataA <= {11{1'b0}};              sample_dataB <= {11{1'b0}};          end    else begin        if(SCK) begin            if (samping_flag != 0) begin                sample_dataA[11:1] <={sample_dataA[10:0],sdataA};sample_dataB[11:1] <={sample_dataB[10:0],sdataA}; end end end always@(posedge CLOCK, negedge RST_N) if(!RST_N) beginsdataA <= {12{1'b0}};sdataB <= {12{1'b0}}; end else begin if (samping_end) begin sdataA <= sample_dataA;    sdataB <= sample_dataB; end else beginsdataA <= sdataA;sdataB <= sdataB;    end endendmodule

                                             
0 0