uart——我的第一個獨立完成的fpga程序

之前總是抄人家的程序,感覺這樣,不會有質的發展,還記得之前看的一篇怎麼學FPGA的文章,上面寫道,能獨立完成串口收發程序,算是入門了,之前雖然獨立寫過,可那是eda課設的時候,用的還是low到不行的原理圖設計,後來雖然搞過fir濾波器,畢竟是用的ip核,對寫程序,沒啥大的提高。這次從開始打算做到最後獨立調試成功,前前後後,斷斷續續,大概用了一天半的時間吧。是在借鑑黑金的程序後完成的,所以程序裏少不了黑金程序的影子,大體框架也差不多來自黑金。

完成程序的基礎,是對串口通信協議的理解,之前總是感覺自己理解了,結果調試出來,總是出問題。比如,空閒狀態下,rx,tx應爲高電平,之前就是一直忽略了這句,rx還好,畢竟輸入端,只需去判斷其狀態,電平不用刻意去拉高,也拉高不了,而tx就不一樣了,需要手動去拉高的,這個一直是忘記拉高了。最開始的問題是,沒有去濾波,直接在原始波特率下,來一個時鐘邊沿,就傳輸一位的數據,最後發現收發不一致,就以爲是這裏的問題【別處也有問題】,雖然在寫testbench的時候,數據沒問題【單獨測試】,燒到板子上時,雖然能收能發,但是收發就是不一致,同一個數據,每次接收到的也不一樣。參考了黑金、特權同學和小梅哥的串口程序後,發現他們都對其進行了濾波,便採用了黑金老師的方案,以16倍波特率作時鐘,每次都在收發數據每個位的中間進行採樣,結果發現,還是不行,便又開始看仿真波形,在觀察rx的波形時,發現瞭如下問題:

也就是說,接收到的第一位數據dataout[0]爲rx的起始位,回到了自己程序中很順利的找到了問題,當計數到8,也就是第一個數據位時,接收到的位起始位0而不是第一個數據位。

經過改正後,波形終於恢復正常,但是1,燒到板子上時,發送,收發還是不一致。真讓人頭大,這個時候,又一次看了uart協議,發現了其中一句話,即空閒位:沒有數據傳輸時線路上的電平狀態。爲邏輯1。 找到了癥結,之前寫串口發送程序時,一直忽略了這句話,一直沒有管tx空閒時的電平狀態,修改後,終於成功了。

總結:

1、testbench很重要,好多問題,都是通過看波形找到的。

2、雖然錯誤不是一起找到的,有時甚至會誤判,但是,反覆研讀協議,觀察波形,總能找到,總之就是不能放棄。寫程序容易,難就難在後期調試中,總不能一蹴而就。

3、本次程序的主要問題有:

a、進行數據收發時沒進行濾波

b、在接收數據的第一位搞成了數據的起始位

c、在發送數據時,空閒狀態下沒拉高電平

 

串口發送仿真波形:

串口接收仿真波形:

串口收發仿真波形:

RTL:

 

運行結果:

 

正確率還是蠻高的

代碼下載地址:https://download.csdn.net/download/yulang007_/10568614

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