1. 程式人生 > >FPGA 學習之路 (七) UART串列埠設計

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