FPGA 學習之路 (七) UART串口設計

UART串口通信協議

UART使用的是 異步,串行通信。
串行通信是指利用一條傳輸線將資料一位位地順序傳送。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用於遠距離通信,但傳輸速度慢的應用場合。
異步通信以一個字符爲傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。
數據傳送速率用波特率來表示,即每秒鐘傳送的二進制位數。例如數據傳送速率爲120字符/秒,而每一個字符爲10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率爲10×120=1200字符/秒=1200波特。
數據通信格式如下圖:
這裏寫圖片描述

其中各位的意義如下:
起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。
數據位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴展BCD碼(8位)。
校驗位:數據位加上這一位後,使得“1”的位數應爲偶數(偶校驗)或奇數(奇校驗)。
停止位:它是一個字符數據的結束標誌。可以是1位、1.5位、2位的高電平。
空閒位:處於邏輯“1”狀態,表示當前線路上沒有資料傳送。

異步通信是按字符傳輸的,接收設備在收到起始信號之後只要在一個字符的傳輸時間內能和發送設備保持同步就能正確接收。下一個字符起始位的到來又使同步重新校準(依靠檢測起始位來實現發送與接收方的時鐘自同步的)

UART的Verilog程序設計:

本次在設計UART的Verilog程序時,我們採用的UART通信協議是:1個起始位,8個數據位,無校驗位,1個停止位。
波特率:我們採用9600波特率,但在FPGA分頻電路上我們產生了一個9600*16倍的波特率,即FPGA的16個脈衝接收一位PC端的數據。爲當採樣到RXD數據起始位信號有效時,0-7-15開始計數,其中7爲數據的中點,最穩定的時刻。因此在此時採樣數據,能夠達到最穩定的效果。

接收模塊uart_receiver設計

1)異步數據的同步化
由於PC和FPGA端的數據不同步,爲了保證數據的同步,需要將外部輸入信號同步化。採用簡單的D觸發器時序電路。
2)數據接收狀態機的設計
狀態機分配表:
R_IDLE:初始化等待狀態
R_START:接收到起始位0(還要判斷是否爲數據抖動)
R_SAMPLE:接收數據
R_STOP:等待停止位結束,回到初始化狀態
3)設計程序步驟:
兩段式狀態機
第一段:採用組合邏輯取判斷狀態轉換的條件
(1)在初始化狀態下檢測起始位,來實現狀態的轉換。R_IDLE
(2)判斷起始位是否抖動,在中點檢測信號,當計數結束(SMP_TOP)數據依然有效,則表示起始位的開始。 R_START
(3)接收8位數據,採用在數據中點採樣。 R_SAMPLE
(4)UART結束位的等待,完成一幀數據的接收。 R_STOP
第二段:採用同步時序電路同步接收

最後輸出數據捕獲使能信號rxd_flag,作爲後續模塊的捕獲使能信號。

發送模塊uart_transfer設計

1)數據接收狀態機的設計
狀態機分配表:
T_IDLE:初始化等待狀態,等待發送使能信號
T_START:數據發送,發送完畢回到初始化狀態,等待下一次發送使能。
2)設計程序步驟:
兩段式狀態機
第一段:採用組合邏輯取判斷狀態轉換的條件
(1)在初始化狀態下檢測發送使能信號,來實現狀態的轉換。T_IDLE
(2)發送10位數據,採用在計數中點發送。 等待下一次發送 T_START
第二段:採用同步時序電路同步逐位發送UART數據。10個數據需要按照UART的通信協議發送不得有誤。

最後輸出數據發送完成信號txd_flag,作爲後續模塊的使能信號。

本文采用的時網友Crazybingo的《FPGA設計技巧與案例開發一書中的》程序07_PC2FPGA_UART_Test

發佈了46 篇原創文章 · 獲贊 141 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章