RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解

FPGA技術(shù)江湖 ? 來源:FPGA技術(shù)江湖 ? 2023-11-07 17:40 ? 次閱讀

204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解(二)

一、SPI協(xié)議

通過閱讀LMK04821數(shù)據(jù)手冊,我們可以從中知道,可以通過SPI協(xié)議對LMK04821進行寄存器的配置工作,進而實現(xiàn)我們設(shè)計所需要的功能。

SPI協(xié)議部分,咱們可以用3線,或者4線,在本次設(shè)計中,使用3線。關(guān)于SPI的時序部分,這兒就不再贅述,手冊里面都有詳細的描述。

ee76fdf4-7d4e-11ee-939d-92fbcf53809c.png

圖1

二、SPI寄存器配置模塊設(shè)計

ee946c9a-7d4e-11ee-939d-92fbcf53809c.png

圖2

如圖2所示,就是配置LMK04821存器的單元,信號定義如下:

1、cfg_clk:系統(tǒng)時鐘;

2、cfg_rst:系統(tǒng)復位;

3、通過VIO控制的信號,這組信號存在的目的在于方便檢測自己配置寄存器的正確性。

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

vio_cfg_wr:配置寄存器讀寫使能,0寫1讀;

vio_cfg_addr:配置的寄存器地址;

vio_cfg_wdata:寄存器中配置的值;

addr_118_data:預留信號,模塊中沒有用;

我們在配置LMK04821寄存器時,要驗證配置寄存器操作是否正確,就要有寫有讀,在對應(yīng)的寄存器內(nèi)寫入對應(yīng)的數(shù)值,然后進行讀操作,觀察正確性。本次設(shè)計是在vivado環(huán)境下進行設(shè)計,通過添加VIO的IP核,來控制讀寫操作。同時,添加ILA配合VIO來進行讀寫數(shù)據(jù)操作的觀測。別的開發(fā)環(huán)境下思路一樣。

該組信號僅在回讀寄存器時使用,目的是為了驗證寄存器讀寫正確性。

eeb25cb4-7d4e-11ee-939d-92fbcf53809c.png

圖3

4、lmk_rst:LMK04821復位信號,用于復位LMK04821,直接和LMK04821芯片相連;

5、3線制SPI信號:

lmk_spi_csn:片選;

lmk_spi_sdio:數(shù)據(jù);

lmk_spi_clk:時鐘;

6、可編程管教:主要和LMK04821內(nèi)部的PLL相關(guān),本次設(shè)計中默認為0;

lmk_clk_sel0 :sel0;

lmk_clk_sel1 :sel1;

三、SPI數(shù)據(jù)buffer定義

在本次設(shè)計中,SPI配置數(shù)據(jù)buffer,data_reg為24bit,r_w占1bit,箭頭1所指包含W1、W2以及地址位占13bit,具體見SPI時序圖;箭頭2所指數(shù)據(jù)位8bit。

eed2938a-7d4e-11ee-939d-92fbcf53809c.png

圖4

根據(jù)圖5我們可以知道,要配置LMK04821我們需要配置126個寄存器,這126個寄存器來源參見第一章實戰(zhàn)記錄。

其中,126個寄存器包含必須要配的寄存器、一些無關(guān)緊要的寄存器、以及功能實現(xiàn)所需要的寄存器等,有些寄存器需要配置多次。

eed9cbc8-7d4e-11ee-939d-92fbcf53809c.png

圖5

四、SPI時序?qū)崿F(xiàn)

設(shè)計中,我們需要按照順序配置126個寄存器,也就是說SPI要執(zhí)行126次。因此,在代碼實現(xiàn)過程中,注意寄存器配置的順序,并且保證每個寄存器都準確無誤的配置完成,才能進行下一個寄存器的配置。如果在設(shè)計中,要求LMK004821實現(xiàn)不同的功能,當配置的寄存器個數(shù)不一致時,在v文件中更改圖6所示的參數(shù)即可。

eef5071c-7d4e-11ee-939d-92fbcf53809c.png

圖6

如下:是LMK04821配置的模塊,讀者可以作為參考。

代碼區(qū)(參考代碼):

//###########################################################################//
// 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      ;//需要配置的寄存器個數(shù)
    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                    ;// 每個寄存器需要的時鐘數(shù)計數(shù)器
    reg [07:0]  cnt_reg                    ;// 需要配置的寄存器計數(shù)器,最多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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602977
  • 芯片
    +關(guān)注

    關(guān)注

    455

    文章

    50714

    瀏覽量

    423132
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1706

    瀏覽量

    91501
  • JESD204B
    +關(guān)注

    關(guān)注

    5

    文章

    76

    瀏覽量

    19125

原文標題:往期精選:204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FPGA開發(fā)經(jīng)驗分享:基于JESD204BLMK04821芯片項目開發(fā)

    今天給各位大俠帶來一篇項目開發(fā)經(jīng)驗分享基于JESD204BLMK04821芯片項目開發(fā),這是本人實打?qū)嵉捻椖块_發(fā)經(jīng)驗,希望可以給有需要的大俠提供一些參考學習作用。 以后機會多多,慢慢分享一些項目
    發(fā)表于 04-21 09:33 ?3247次閱讀
    FPGA開發(fā)經(jīng)驗分享:基于JESD<b class='flag-5'>204B</b>的<b class='flag-5'>LMK04821</b>芯片項目開發(fā)

    請問LMK04821能否和LMK04826/8直接pin to pin兼容,外圍電路是否需要修改?

    LMK04821能否和LMK04826/8直接兼容,外圍電路是否需要修改?除了VCO輸出頻率不同,還有什么其他重要差異?目前希望應(yīng)用于WiFi設(shè)備,VCO頻率需要為320M的整數(shù)倍。
    發(fā)表于 11-08 07:28

    LMK04821測量SPI波形異常,無法寫入及讀取怎么解決?

    串接電阻兩端電壓,LMK04821側(cè)電位為1.56V,F(xiàn)PGA側(cè)電位為2.10V,由此推算CSn管腳有輸入電流540uA。 2:加載FPGA程序,SPI串口處于默認狀態(tài)不發(fā)送數(shù)據(jù),此時代碼驅(qū)動CSn管腳
    發(fā)表于 11-08 06:16

    LMK04821 SPI通信不了是怎么回事?如何解決?

    在通過SPI配置LMK04821時,發(fā)現(xiàn)SDIO的管腳不能正常的拉高或者拉低,導致MCU與LMK04821通信失敗,SDIO的幅值一直在1.5V左右。請教一下如何處理。SDIO管腳外部上拉4.7K 地址1f1f 數(shù)據(jù)ff
    發(fā)表于 11-08 07:59

    LMK04821遇到的問題求解

    LMK04821問題: 1、兩級鎖相環(huán)的分頻器輸出波形占空比不是50%,基本為(n-1):1; 2、PLL1無法鎖定; 3、PLL2在特定鑒相頻率下能鎖定; 4、拉SYNC管腳對齊device clock,不生效;
    發(fā)表于 11-11 06:52

    如何設(shè)計lmk04821時鐘補償電路以及參數(shù)的計算?

    如何設(shè)計lmk04821時鐘補償電路以及參數(shù)的計算
    發(fā)表于 11-11 07:27

    如何采用系統(tǒng)參考模式設(shè)計JESD204B時鐘

    LMK04821系列器件為該話題提供了很好的范例研究素材,因為它們是高性能的雙環(huán)路抖動清除器,可在具有器件和SYSREF時鐘的子類1時鐘方案里驅(qū)動多達七個JESD204B轉(zhuǎn)換器或邏輯器件。圖1是典型
    發(fā)表于 11-18 06:36

    FPGA項目開發(fā):204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解(二)

    大俠一起切磋交流。也歡迎進群交流,文章末尾有進群方式。話不多說,上貨。FPGA項目開發(fā):204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解(二)一、
    發(fā)表于 04-20 16:59

    基于JESD204BLMK04821芯片項目詳解

    可以給有需要的大俠提供一些參考學習作用。 以后機會多多,慢慢分享一些項目開發(fā)以及學習方面的內(nèi)容,歡迎各位大俠一起切磋交流。 204B實戰(zhàn)應(yīng)用-LMK04821代碼
    的頭像 發(fā)表于 04-04 17:08 ?1824次閱讀
    基于JESD<b class='flag-5'>204B</b>的<b class='flag-5'>LMK04821</b>芯片項目<b class='flag-5'>詳解</b>

    204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解(二)

    可以給有需要的大俠提供一些參考學習作用。 以后機會多多,慢慢分享一些項目開發(fā)以及學習方面的內(nèi)容,歡迎各位大俠一起切磋交流。也歡迎進群交流,文章末尾有進群方式。話不多說,上貨。 204B實戰(zhàn)應(yīng)用-LMK04821
    的頭像 發(fā)表于 10-08 10:18 ?3020次閱讀
    <b class='flag-5'>204B</b><b class='flag-5'>實戰(zhàn)</b>應(yīng)用-<b class='flag-5'>LMK04821</b><b class='flag-5'>代碼</b><b class='flag-5'>詳解</b>(二)

    LMK04821芯片項目代碼詳解

    可以給有需要的大俠提供一些參考學習作用。 以后機會多多,慢慢分享一些項目開發(fā)以及學習方面的內(nèi)容,歡迎各位大俠一起切磋交流。 204B實戰(zhàn)應(yīng)用-LMK04821代碼
    的頭像 發(fā)表于 10-08 17:51 ?2387次閱讀
    <b class='flag-5'>LMK04821</b>芯片項目<b class='flag-5'>代碼</b><b class='flag-5'>詳解</b>

    采用系統(tǒng)參考模式設(shè)計JESD 204B時鐘

    中,筆者將談?wù)摱秳雍铣善髋c清除器的不同系統(tǒng)參考信號(SYSREF)模式,以及如何用它們來最大限度地提高JESD204B時鐘方案的性能。 ? LMK04821系列器件為該話題提供了很好的范例研究素材,因為
    的頭像 發(fā)表于 11-24 14:48 ?2690次閱讀
    采用系統(tǒng)參考模式設(shè)計JESD <b class='flag-5'>204B</b>時鐘

    基于JESD204BLMK04821芯片項目開發(fā)

    LMK0482X系列是德州儀器推出的高性能時鐘調(diào)節(jié)芯片系列,該芯片目前有三種,分別為LMK04821、LMK04826以及LMK04828,該系列芯片都支持最新的JESD
    的頭像 發(fā)表于 01-05 11:03 ?1074次閱讀

    FPGA項目開發(fā)精選:204B實戰(zhàn)應(yīng)用-LMK04821代碼詳解

    我們在配置LMK04821寄存器時,要驗證配置寄存器操作是否正確,就要有寫有讀,在對應(yīng)的寄存器內(nèi)寫入對應(yīng)的數(shù)值,然后進行讀操作,觀察正確性。本次設(shè)計是在vivado環(huán)境下進行設(shè)計,通過添加VIO的IP核,來控制讀寫操作。同時,添加ILA配合VIO來進行讀寫數(shù)據(jù)操作的觀測。別的開發(fā)環(huán)境下思路一樣。
    的頭像 發(fā)表于 01-05 14:05 ?1590次閱讀

    采用系統(tǒng)參考模式設(shè)計JESD 204B時鐘

      LMK04821系列器件為該話題提供了很好的范例研究素材,因為它們是高性能的雙環(huán)路抖動清除器,可在具有器件和SYSREF時鐘的子類1時鐘方案里驅(qū)動多達七個JESD204B轉(zhuǎn)換器或邏輯器件。圖1是典型JESD204B系統(tǒng)(以
    的頭像 發(fā)表于 04-18 09:25 ?1500次閱讀
    采用系統(tǒng)參考模式設(shè)計JESD <b class='flag-5'>204B</b>時鐘
    RM新时代网站-首页