精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

204B實戰應用-LMK04821代碼詳解

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

204B實戰應用-LMK04821代碼詳解(二)

一、SPI協議

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

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

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

圖1

二、SPI寄存器配置模塊設計

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

圖2

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

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來進行讀寫數據操作的觀測。別的開發環境下思路一樣。

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

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

圖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、W2以及地址位占13bit,具體見SPI時序圖;箭頭2所指數據位8bit。

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

圖4

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

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

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

圖5

四、SPI時序實現

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

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

圖6

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

代碼區(參考代碼):

//###########################################################################//
// 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

審核編輯:湯梓紅

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

    關注

    1626

    文章

    21665

    瀏覽量

    601807
  • 芯片
    +關注

    關注

    453

    文章

    50387

    瀏覽量

    421784
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1700

    瀏覽量

    91312
  • JESD204B
    +關注

    關注

    5

    文章

    74

    瀏覽量

    19109

原文標題:往期精選:204B實戰應用-LMK04821代碼詳解

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA開發經驗分享:基于JESD204BLMK04821芯片項目開發

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

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

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

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

    串接電阻兩端電壓,LMK04821側電位為1.56V,FPGA側電位為2.10V,由此推算CSn管腳有輸入電流540uA。 2:加載FPGA程序,SPI串口處于默認狀態不發送數據,此時代碼驅動CSn管腳
    發表于 11-08 06:16

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

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

    LMK04821遇到的問題求解

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

    如何設計lmk04821時鐘補償電路以及參數的計算?

    如何設計lmk04821時鐘補償電路以及參數的計算
    發表于 11-11 07:27

    如何采用系統參考模式設計JESD204B時鐘

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

    FPGA項目開發:204B實戰應用-LMK04821代碼詳解(二)

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

    基于JESD204BLMK04821芯片項目詳解

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

    204B實戰應用-LMK04821代碼詳解(二)

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

    LMK04821芯片項目代碼詳解

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

    采用系統參考模式設計JESD 204B時鐘

    中,筆者將談論抖動合成器與清除器的不同系統參考信號(SYSREF)模式,以及如何用它們來最大限度地提高JESD204B時鐘方案的性能。 ? LMK04821系列器件為該話題提供了很好的范例研究素材,因為
    的頭像 發表于 11-24 14:48 ?2656次閱讀
    采用系統參考模式設計JESD <b class='flag-5'>204B</b>時鐘

    基于JESD204BLMK04821芯片項目開發

    LMK0482X系列是德州儀器推出的高性能時鐘調節芯片系列,該芯片目前有三種,分別為LMK04821LMK04826以及LMK04828,該系列芯片都支持最新的JESD
    的頭像 發表于 01-05 11:03 ?1013次閱讀

    FPGA項目開發精選:204B實戰應用-LMK04821代碼詳解

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

    采用系統參考模式設計JESD 204B時鐘

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