Uart2
FPGA設計思路
那rs232舉例來說,它采用的是全雙工,有兩條數據線,rx和tx,每次只能傳輸1bit,用FPGA設計一個具有uart功能其實不難,只要了解它的功能是什么。
uart功能就是:接收數據時。將串行數據轉換成并行數據;在發送數據時,將并行的數據再轉換成串行數據。
我們只要在FPGA內部實現這個功能描述就可以了。
一般只要兩個模塊就能解決,發送模塊和接收模塊。這兩個模塊分別詮釋了uart的功能。
?
野火的波形圖教學非常好,明白了時序是怎樣的,那么代碼就游刃有余了,大家可以根據下圖的波形,自己編寫verilog代碼。
下圖取之野火FPGA開發指南(接收模塊波形圖)
上圖:綠色表示輸入信號,黃色表示內部變量,紅色表示輸出信號。
可以看出rx接收信號經過了三次打拍操作,這是因為rx是異步信號,所以要處理,打拍是為了減小亞穩態帶來的影響,同樣作用是檢測下降沿,這就意味著起始位出現,因為起始位是低電平,不傳輸數據時處于高電平。
start_nedge是一幀數據開始標志信號,work_en是8位數據接收有效使能信號。bit_flag信號是采樣數據的信號,在一個波特的中間位置數據是穩定的,所以位于5208/2,拉高一個信號,目的就是采樣這個數據,提高準確性。
為什么baud_cnt是0~5207,因為這是一個波特的時間,也就是1bit傳輸所需要的時間,怎么算的呢,因為系統時鐘是50MHZ,周期就是20ns,而傳輸采用的波特率為9600Bps,這是描述數據傳輸快慢的,9600Bps就是1秒鐘傳輸9600bit,那么每一個bit所需的時間不就是,1/9600s,用系統clk計數就要計數到5208,計算:(1/9600*10^9)ns/20ns? ?=5208。
rx_data采用的是移位拼接,目的就是把接收到1個bit拼接成8bit,因為一個數據是8bit,而且傳輸過程中是低位到高位。
rx_flag是數據剛好拼接完成的信號
?
下圖取之野火FPGA開發指南(發送模塊波形圖)
上圖是發送過程,這與接收過程差不多,不多介紹了!
?
?
?
?
?
總結
- 上一篇: 测试用例模板(个人习惯使用)
- 下一篇: FreeEIM - 沟通最简单