之前總是抄人家的程序,感覺這樣,不會有質的發展,還記得之前看的一篇怎麼學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