日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制)

發布時間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 0.引言
  • 1、verilog思路
  • 2、modelsim調試
  • 3、總結

0.引言

經過對疫情期間某天下午寫的代碼進行,多次調試后,終于輸出了波形,下面我們逐步跟著思路,對22個寄存器不同長度的寄存器進行配置。另外,其實,我看晚上有別人寫作AD9910的 verilog的代碼,只有一個模塊,并且讓我覺得不知所云,只有3個寄存器的配置。代碼風格可以說一片混亂,無法閱讀,無法復用,感興趣的可以去搜搜,我估計你搜到的也是那個版本。而我的代碼風格一定是可以復用的,而且可以讓初學者對verilog的寫法有個全新的認識,掌握之后你可以任意時序的verilog,參考時序如圖所示:

1、verilog思路

分為三個模塊

對應的解釋模塊功能如下所示:

//module: AD9910_pro //tips:以AD9910的串行模式,三線模式 3-wires 40MHZ的外部晶振倍頻到1GHZ主頻生成單頻200MHz //author: Lee Ruifeng//程序設計思路: //設計開始按鍵start脈沖,當脈沖為1時候開始配置。脈沖寬度高于FPGA一個系統時鐘即可 //設計master_reset按鍵,先按下master_reset后,所有AD9910的寄存器均清零 //然后再按下啟動start按鈕,啟動寄存器的數據寫入//總共寫下23個通信周期,23個寄存器進行配置,FPGA晶振50MHz,三線模式,不用進行讀操作 //module: 該模塊控制的是控制數據sdio_sdo線的時序,在SCLK啟動后的下降沿改變數據 // 同時,需要控制好并行數據的存儲,啟動后,存儲第一個地址H00的寄存器值,之后如果收到sclk傳輸完畢的finish標志,收到 // 一個finish標志就開始計數,從而才知道寄存器對應的地址。更新寄存器值以及sdio通信周期的個數等 //module功能: sclk分頻模塊 ,用于控制SCLK時鐘的時序,串行端口端口傳輸時鐘速度,SCLK通信分為第一階段的指令傳輸和第二階段的數據傳輸

2、modelsim調試

1、首先,我們需要保證insruct_and_data在正確的變化。
下面查看驗證了了地址的正確性



驗證了數據的正確性傳輸后,我們需要確保地址為h17時候,sclk不啟動。傳輸全部完成。

2、確保sclk、cs的正確性
sclk的準確,高電平兩個時鐘,低電平兩個時鐘。
此外,start_sclk正確,用于控制每一個通信周期的啟動,最后一個通信周期完成后不啟動。
經過測量:

parameter sclk_delay_start_time_I = 4,//用于控制第一階段cs拉低后至sclk開始啟動的那一段時間(指令傳輸) sclk先低后高 實際為5個時鐘 parameter sclk_finish_delay_time_ID = 4,//用于控制第一階段最后一個sclk后的那一段結束時間延遲(指令傳輸)和第二階段開始的延遲 實際為4個時鐘 parameter sclk_delay_finish_time_D = 4,//用于控制第二階段sclk傳輸完成后的結束延時,結束后CS將拉高(數據傳輸) 實際為6個時鐘


cs出現的高電平位置,均為一個周期的idle狀態

在最后所有周期傳輸結束,可以看到傳輸全部結束,cs拉高

3、 下面確保sdio的正確性
其實在驗證sdio的正確性時候,我們可以通過testbench里面來讀數據,顯示出來,或寫到文本中。這個在以后補充。由于我明天要飛回北京,我這里暫時用最笨的方法,直接記錄下數據,抽了部分,來驗證。(if you want to get my verilog code to improve your coding skill,please add my QQ:1183699227,備注:ad9910 coding,30 rmb)

在檢查sdio的正確性時候,我發現一件有趣的事情,當我的啟動信號,設置時間比較長,假設一直為高電平,仿真我們按鍵,因為按鍵,按下的一瞬間,保持的時間其實是非常長的。此時,sclk都有,但是sdio卻一直為低電平。但我當start時間只有1個時鐘時候,是正常的,這是為什么呢,其實從,我們的程序中的這一部分可以看出端倪。在sdio_protocol_mod 模塊中,如下圖所示的代碼,也就是說,else if里面的條件一直滿足,然后每一個時鐘,instruc_and_data一直保持著這個值。

注意看一下,下面代碼,每次sclk的下降沿,instruct_and_data都會進行移位操作,但是如果一直保持start呢,及時到了sclk—fall也是賦值為原來寄存器的值,并沒有進行移位操作。我們來看一下modelsim的圖。

從如圖可以看出,sdio始終為低電平,并且instruct_and_data 在一個sdio的周期結束后,才開始變,移位并沒有發生。

所以我在頂層,增加了這一module,目的是將輸入的start給寄存,輸出一個高脈沖即可,這個高脈沖不能超過第一個sclk_fall的到來時間。

下面,再來看一下,增加了這一模塊后的仿真。可以看到,這樣在sclk的下降沿就能起作用了。

3、總結

如果在實際中,與功能仿真不符合,可以看看tb文件是否與真正的實際場景相符合,沒準,代碼有漏洞。

(if you want to get my verilog code to improve your coding skill,please add my QQ:1183699227 ps:ad9910 coding,30 rmb)

總結

以上是生活随笔為你收集整理的AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。