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

0.引言

經過對疫情期間某天下午寫的代碼進行,多次調試後,終於輸出了波形,下面我們逐步跟着思路,對33個寄存器不同長度的寄存器進行配置。另外,其實,我看晚上有別人寫作AD9910的 verilog的代碼,只有一個模塊,並且讓我覺得不知所云,只有3個寄存器的配置。代碼風格可以說一片混亂,無法閱讀,無法複用,感興趣的可以去搜搜,我估計你搜到的也是那個版本。參考時序如圖所示:
在這裏插入圖片描述

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,10 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,10 rmb)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章