锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

FPGA项目开发:204B实战应用-LMK04821代码详解(二)

时间:2022-10-31 18:30:00 lmk307液位传感器

53226dec3444f6524f47af925ae034a8.gif

大侠好,欢迎来到FPGA江湖技术巨大,相见是缘分。大侠可以关注。FPGA技术江湖,在闯荡江湖,"行侠仗义"在栏中获取其他感兴趣的资源,或者一起煮酒言欢。煮酒言欢进入IC这里有近50个技术圈IC技术微信官方账号。

大侠好,阿Q来了。今天是我第二次见到你。请多照顾你。今天给大家带来一项目开发经验分享基于JESD204B的LMK04821芯片项目开发第二篇文章是我在项目开发方面的实践经验,希望能为有需要的英雄提供一些参考和学习效果。

在这里放一个超链接:

FPGA项目开发:基础JESD204B的LMK分享04821芯片项目开发经验

未来会有更多的机会。慢慢分享一些项目开发和学习内容。欢迎大一起学习交流。也欢迎进群交流。文末有进群的方式。话不多说,送货。

204B实战应用-LMK04821代码详解(二)

一、SPI协议

通过阅读LMK我们可以从04821数据手册中知道,可以通过SPI协议对LMK04821配置寄存器,实现我们设计所需的功能。

SPI在协议部分,我们可以在本设计中使用3线或4线。SPI这里就不赘述了,手册里有详细的描述。

图1


二、SPI模块设计的寄存器配置

图2

如图2所示,就是配置LMK信号定义如下:

1、cfg_clk:系统时钟;

2、cfg_rst:系统复位;

3、通过VIO这组信号的目的是方便检测配置寄存器的正确性。

vio_cfg_en:配置寄存器使能信号;

vio_cfg_wr:配置寄存器读写使能,0写1读;

vio_cfg_addr:配置的寄存器地址;

vio_cfg_wdata:配置在寄存器中的值;

addr_118_data:模块中没有预留信号;

我们在配置LMK04821寄存器时,要验证寄存器的配置是否正确,需要写读,在相应的寄存器中写入相应的值,然后读读操作,观察正确性。这个设计是在vivado通过添加环境进行设计VIO的IP核,控制读写操作。同时添加ILA配合VIO来进行读写数据操作的观测。别的开发环境下思路一样。

该组信号仅用于验证寄存器读写的正确性。

图3

4、lmk_rst:LMK04821复位信号用于复位LMK04821,直接和LMK04821芯片相连;

5、3线制SPI信号:

lmk_spi_csn:片选;

lmk_spi_sdio:数据;

lmk_spi_clk:时钟;

6.可编程管教:主要和LMK04821内部的PLL本设计默认为0;

lmk_clk_sel0 :sel0;

lmk_clk_sel1 :sel1;

三、SPI数据buffer定义

本设计,SPI配置数据buffer,data_reg为24bit,r_w占1bit,箭头1包含W1、W地址占13bit,具体见SPI时序图;箭头2指数据位8bit。

图4

根据图5,我们可以知道配置LMK我们需要配置126个寄存器,这126个寄存器来源见第一章实战记录。

其中,126个寄存器包括必要的寄存器、一些不重要的寄存器和功能所需的寄存器,有些寄存器需要多次配置。

图5

四、SPI时序实现

在设计中,我们需要按顺序配置126个寄存器,即SPI要执行126次。因此,在实现代码的过程中,注意寄存器配置的顺序,并确保每个寄存器的准确配置,以便配置下一个寄存器。若设计中有要求LMK当配置的寄存器数量不一致时,可以在v文件中更改图6所示的参数。

图6

如下:是LMK读者可以参考04821配置的模块。

代码区(参考代码):

######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################## // Copyright (C) 2017, JSZX, Co. Ltd. All Rights Reserved. ######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################## //-- Project Name : //-- File Name    :  lmk04821_spi //-- Description  : ######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################## //---------------------------Modification History----------------------------// //-- Date        By            Ver   Comment //-- 12/04/2017  hhh           1.0   Create new //=================================================================== //-- End Revision //=================================================================== `timescale 1ns / 1ps   module lmk04821_spi(     input            cfg_clk               , //<=10MHz     input            cfg_rst               ,     input            vio_cfg_en            ,     input            vio_cfg_wr            ,//0,write;1,read;     input [12:0]     vio_cfg_addr          ,     input [07:0]     vio_cfg_wdata         ,     input [07:0]     addr_118_data         ,       input            r_w                   ,     input            lmk_cfgen             ,     output           lmk_rst               ,     output           lmk_spi_csn           ,     inout  tri       lmk_spi_sdio          ,     output           lmk_spi_clk           ,     output           lmk_clk_sel0          ,     output           lmk_clk_sel1          ,     output reg       regdatareadvalid      ,     output reg [7:0] regdataread           ,     output reg       lmk_cfgdone = 1'b0     );     //parameter defination     parameter   NUM_REG      = 8'd126      ;///需要配置的寄存器数量     parameter   CFG_DONE_DLY = 32'hF4240   ;//100ms@10Mhz;     //===================================================================//
    //----------------------internal signals------------------------------//
    //====================================================================//
    reg [00:0]  lmk_cfgen_d0               ;
    reg [00:0]  lmk_cfgen_d1               ;
    reg [00:0]  lmk_cfgen_d2               ;
    reg [00:0]  vio_cfg_en_d0              ;
    reg [00:0]  vio_cfg_en_d1              ;
    reg [00:0]  vio_cfg_en_d2              ;
    reg [07:0]  cnt_clk                    ;// 每个寄存器需要的时钟数计数器
    reg [07:0]  cnt_reg                    ;// 需要配置的寄存器计数器,最多255个!
    reg [23:0]  data_reg                   ;
    reg [00:0]  load_p                     ;
    reg [00:0]  load_p_d0                  ;
    reg [35:0]  mid_data_o                 ;
    reg [35:0]  mid_csn_o                  ;
    reg [00:0]  spi_sdo                    ;
    reg [00:0]  spi_cs_n                   ;
    wire[00:0]  spi_sdi                    ;
    reg [05:0]  sdo_cnt                    ;
//    //====================================================================//
//    //-----------------------------ila debug------------------------------//
//    //====================================================================//
//    //ila_spi
//    ila_spi ila_spi(
//    .clk        ( cfg_clk             ),
//
//    .probe0     ( cnt_clk             ),//8
//    .probe1     ( cnt_reg             ),//8
//    .probe2     ( data_reg            ),//24
//    .probe3     ( load_p              ),//1
//    .probe4     ( sdo_cnt             ),//6
//    .probe5     ( spi_cs_n            ),//1
//    .probe6     ( spi_sdi             ),//1
//    .probe7     ( spi_sdo             ),//1
//    .probe8     ( lmk_cfgen_d1        ) //1
//    );
    //====================================================================//
    //--------------------------main process------------------------------//
    //====================================================================//
    //lmk_clk_sel
    assign      lmk_clk_sel0= 1'b0 ;
    assign      lmk_clk_sel1= 1'b0 ;
    //spi signals;
    assign      lmk_rst     = cfg_rst    ;
    assign      lmk_spi_clk = (spi_cs_n) ? 1'b0 : ~cfg_clk    ;
    assign      lmk_spi_csn = spi_cs_n    ;
    assign      spi_sdi     = lmk_spi_sdio;
    assign      lmk_spi_sdio= (data_reg[23]==1'b1 && sdo_cnt>6'h18)? 1'bz : spi_sdo ;
    //lmk_cfgen_d0/lmk_cfgen_d1/lmk_cfgen_d2/load_p_d0
    always @(posedge cfg_clk or posedge cfg_rst)
    begin
        if(cfg_rst==1'b1)
        begin
            lmk_cfgen_d0 <= 1'b0 ;
            lmk_cfgen_d1 <= 1'b0 ;
            lmk_cfgen_d2 <= 1'b0 ;
            load_p_d0    <= 1'b0 ;
            vio_cfg_en_d0 <= 1'b0 ;
            vio_cfg_en_d1 <= 1'b0 ;
            vio_cfg_en_d2 <= 1'b0 ;
        end
        else
        begin
            lmk_cfgen_d0 <= lmk_cfgen ;
            lmk_cfgen_d1 <= lmk_cfgen_d0 ;
            lmk_cfgen_d2 <= lmk_cfgen_d1 ;
            load_p_d0    <= load_p ;
            vio_cfg_en_d0 <= vio_cfg_en ;
            vio_cfg_en_d1 <= vio_cfg_en_d0 ;
            vio_cfg_en_d2 <= vio_cfg_en_d1 ;
        end
    end
    //load_p/cnt_reg/cnt_clk
    always @(posedge cfg_clk or posedge cfg_rst)
    begin
        if(cfg_rst==1'b1)
        begin
            cnt_reg <= 8'd0  ;
            cnt_clk <= 8'd36 ;
            load_p  <= 1'b0  ;
        end
        else
        begin
            if(lmk_cfgen_d1==1'b1 && lmk_cfgen_d2==1'b0)
            begin
                cnt_clk <= 8'd0 ;
                cnt_reg <= 8'd0  ;
                load_p  <= 1'b0 ;
            end
            else if((cnt_clk==8'd36)&&(cnt_reg6'd18 && sdo_cnt<6'd25)//2-17;18-25;
                    begin
                        regdatareadvalid <= 1'b0 ;
                        regdataread <= {regdataread[6:0],spi_sdi};
                    end
                    else if(sdo_cnt==6'd25)
                    begin
                        regdatareadvalid <= 1'b1 ;
                        regdataread <= {regdataread[6:0],spi_sdi};
                    end
                    else
                    begin
                        regdatareadvalid <= 1'b0 ;
                        regdataread <= regdataread ;
                    end
                end
                else
                begin
                    regdatareadvalid <= 1'b0 ;
                    regdataread <= regdataread ;
                end
            end
            else
            begin
                regdatareadvalid <= 1'b0 ;
                regdataread <= regdataread ;
            end
        end
    end
    //lmk_cfgdone
    always @(posedge cfg_clk or posedge cfg_rst)
    begin
        if(cfg_rst)
        begin
            lmk_cfgdone <= 1'b0 ;
        end
        else
        begin
            if(cnt_reg>=NUM_REG)
            begin
                lmk_cfgdone <= 1'b1 ;
            end
            else
            begin
                lmk_cfgdone <= 1'b0 ;
            end
        end
    end
    //====================================================================//
    //-------------------------------  end  ------------------------------//
    //====================================================================//


endmodule

下一篇,将详细介绍jesd_204B IP核应用的相关知识,各位大侠,尽请关注。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章