引言:UART是一種通用串行數據總線,用于異步通信。該總線雙向通信,可實現全雙工傳輸和接收。UART通常用來實現與PC之間數據通信,命令和控制信息的傳輸等。本文我們介紹UART通信協議、傳輸時序及如何利用HDL編程實現FPGA與PC通信。
1.異步串行通信的理解
首先需要介紹幾個概念。
通信協議:指雙方實體完成通信或服務所必須遵循的規則和約定。交流什么、怎樣交流及何時交流,都必須遵循某種互相都能接受的規則。這個規則就是通信協議。
串行通信:是指通信雙方按位進行,遵守時序的一種通信方式。串行通信中,將數據按位依次傳輸,每位數據占據固定的時間長度,即可使用少數幾條通信線路就可以完成系統間交換信息,特別適用于計算機與計算機、計算機與外設之間的遠距離通信。
異步通信:它是對于同步通信來說的,異步通信在發送字符時,所發送的字符之間的時隙可以是任意的,當然,接收端必須時刻做好接收的準備(如果接收端主機的電源都沒有加上,那么發送端發送字符就沒有意義,因為接收端根本無法接收)。發送端可以在任意時刻開始發送字符,因此必須在每一個字符的開始和結束的地方加上標志,即加上開始位和停止位,以便使接收端能夠正確地將每一個字符接收下來。
2.UART通信協議介紹
UART使用的是異步串行通信機制,其數據傳輸協議格式如下圖所示。
圖1:UART數據傳輸協議格式
其中各位的含義如下:
起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。
數據位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴展BCD碼(8位)。
校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗);數據的奇偶校驗位是可以選擇的,如果不使用奇偶,那么就沒有這個數據位。
停止位:它是一個數據字段的結束標志。可以是1位、1.5位、2位的高電平。
空閑位:處于邏輯“1”狀態,表示當前線路上沒有數據信息傳輸。
UART數據傳輸協議格式,通常需要在收發設備提前定義好,如傳輸數據的位數、是否需要校驗位、停止位。另外還一個重要的參數就是數據傳輸的波特率。
圖2:常見標準波特率
UART數據傳輸的速度通常用波特率來衡量。在一次串口通信過程中,數據接收與發送雙方沒有共享時鐘,因此,雙方必須協商好數據傳輸波特率。根據雙方協議好的傳輸速率,相鄰bit的時間間隔就會固定下來,接收端即可對發送端的數據進行采樣。
標準波特率:包括2400bps、4800bps、9600bps、19200bps、38400bps、57600bps、115200bps等。當然更塊的速度意味著對采樣的要求更高,有可能誤碼率會逐漸提高。
3.數據傳輸工作流程
本文設定傳輸協議為:1位起始位+8位數據位+1位結束位,無奇偶校驗位,傳輸波特率為9600bps。
(1)發送端按照預先設定好的傳輸協議及波特率,發送端依次發送:
1bit數據起始位+8bit數據位+1bit停止位
其中,起始位為邏輯 0(低電平) ,結束位為邏輯 1(高電平) ,發送端在空閑狀態為 1 。
(2)接收端:接收端通過檢測電平“1”(空閑狀態)到“0”(起始位)的跳變來確定一個數據包的開始。確定開始位接收完成之后,依次接收數據使用更高的采樣時鐘,完成數據采集。接收完數據位后,繼續接收停止位。
4.硬件介紹
硬件上采用USB轉RS232芯片CP2104實現PC與FPGA之間通信。電路中設計了一片ESD靜電防護芯片RCLAMP0522P,與轉換芯片CP2104一起,可以防止靜電浪涌燒毀FPGA芯片,起到隔離保護作用。
圖3:USB轉RS232電路圖
5.軟件設計
軟件設計劃分為接收模塊uart_rx.v和uart_tx.v兩個模塊,頂層模塊uart_driver.v互聯兩個模塊,如下圖所示。
圖4:軟件模塊劃分
UART數據傳輸主要包括兩個部分:
波特率的產生設計;
數據傳輸設計,包括接收與發送。
(1)波特率產生設計:
板載 FPGA 輸入時鐘 100Mhz,為得到常用的波特率,采用計數分頻來得到。BAUD_DIV=100000000/ 波特率。其中采樣中心點為發送或接收時鐘的中心點,即 BAUD_DIV_CAP= 100000000/(2*波特率) 。
(2)數據傳輸設計
數據接收模塊:在設置好傳輸波特率9600bps下,根據串口傳輸時序,進行解串(串并轉換)。空閑狀態時,接收數據為邏輯高電平,等待起始位邏輯低電平的到來。當起始位到達后,由低位到高位,依次采集8位數據,并進行相應的解串,存入臨時寄存器。接收有效數據完成后,判斷結束位,接收完畢。
數據發送模塊:設置發送使能信號和待發送的數據。通過計數器,表示10 個數據發送的周期。這 10 個數據,依次為:1位起始位+8 位數據位 +1 位結束位,實現數據位的逐個發送。本設計中,采用PC機的串口調試助手,發送數據位至FPGA。FPGA 接收到數據位之后,立即回傳至 PC 機。
6.軟件功能仿真與測試
編寫testbench仿真文件,利用Vivado自帶仿真器對軟件代碼進行功能仿真,仿真結果如下圖所示。
圖5:UART串行通信仿真
圖中①處,仿真UART接收串口信號uart_rx_i輸入數據8'b10101001,baud_bps在每個bit位寬中間時刻采樣,bit_num計數接收到的數據bit個數,數據按照LSB端接收;
圖中②處完成8bit數據位接收后,產生接收完畢信號uart_rx_done;
來源: 本文轉載自FPGA技術實戰公眾號
-
通信協議
+關注
關注
28文章
882瀏覽量
40307 -
uart
+關注
關注
22文章
1235瀏覽量
101387 -
串口通信
+關注
關注
34文章
1626瀏覽量
55526 -
異步串行通信
+關注
關注
0文章
16瀏覽量
8427
原文標題:FPGA入門基礎之UART串口通信設計
文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論