AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制)
文章目錄
- 0.引言
- 1、verilog思路
- 2、modelsim調試
- 3、總結
0.引言
經過對疫情期間某天下午寫的代碼進行,多次調試后,終于輸出了波形,下面我們逐步跟著思路,對22個寄存器不同長度的寄存器進行配置。另外,其實,我看晚上有別人寫作AD9910的 verilog的代碼,只有一個模塊,并且讓我覺得不知所云,只有3個寄存器的配置。代碼風格可以說一片混亂,無法閱讀,無法復用,感興趣的可以去搜搜,我估計你搜到的也是那個版本。而我的代碼風格一定是可以復用的,而且可以讓初學者對verilog的寫法有個全新的認識,掌握之后你可以任意時序的verilog,參考時序如圖所示:
1、verilog思路
分為三個模塊
對應的解釋模塊功能如下所示:
2、modelsim調試
1、首先,我們需要保證insruct_and_data在正確的變化。
下面查看驗證了了地址的正確性
驗證了數據的正確性傳輸后,我們需要確保地址為h17時候,sclk不啟動。傳輸全部完成。
2、確保sclk、cs的正確性
sclk的準確,高電平兩個時鐘,低電平兩個時鐘。
此外,start_sclk正確,用于控制每一個通信周期的啟動,最后一個通信周期完成后不啟動。
經過測量:
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通信周期控制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AD9910高速集成DDS芯片(芯片阅读
- 下一篇: Modelsim do文件的自动化仿真及