基于FPGA 的UART 擴展總線設計和應用
2.2 UART 的邏輯設計
UART 的通信協議十分簡單,以低電平作為起始位,高電平作為停止位,中間可傳輸 5~8 比特數據和1 比特奇偶校驗位,奇偶校驗位的有無和數據比特的長度由通信雙方約 定。一幀數據傳輸完畢后可以繼續傳輸下一幀數據,也可以繼續保持為高電平,兩幀之間 保持高電平,持續時間可以任意長。
UART模塊由SLAVE接口、波特率控制器、UART接收器和UART發送器構成。SLAVE 接口是為了實現WISHBONE 總線和功能模塊之間的數據傳輸;UART 發送器的用途是將準備輸出的并行數據按照基本UART 幀格式轉為TXD 信號串行輸出;UART 接收器接收RXD 串行信號,并將其轉化為并行數據,但串并轉換的時鐘同發送器一樣處理,收發設備間的時 鐘是會累計的,會導致接收數據不正確,波特率控制器就是專門產生一個遠遠高于波特率的 本地時鐘信號對輸入RXD 不斷采樣,以不斷地讓接收器與發送器保持同步。
波特率控制器實際上就是一個簡單的分頻器。可以根據給定的系統時鐘頻率(晶振時 鐘)和要求的波特率算出波特率分頻因子。已算出的波特率分頻因子作為分頻器的分頻數。 對于波特率發生器中的系數一般在FPGA 實現時往往是固定的,但對于不同的實現,這個 系數需要更改。波特率控制器產生的分頻時鐘,不是波特率時鐘,而是波特率時鐘的16 倍,目的是為了在接收事實進行精確地采樣,以提出異步的串行數據。
UART 發送器由16 個字節FIFO 和信號發送器組成。FIFO 主要是起到數據緩存的作用, 信號發送器的核心部分由有限狀態機實現的,實現偽代碼如下:
case (狀態機狀態)
空閑狀態:if ( FIFO 中有數據 )
狀態機跳轉到 FIFO 讀取狀態;
else
狀態機保持空閑狀態;
FIFO 讀取狀態:讀取FIFO 數據,保存到移位寄存器;狀態機跳轉到開始位狀態;
開始位狀態:時鐘計數,發送開始位;計數結束后狀態機跳轉到數據位狀態;
數據位狀態:時鐘計數,發送數據,移位寄存器移位;計數結束后
if(移位寄存器內數據發送完畢)
狀態機跳轉到停止位狀態;
else
狀態機跳轉到數據位狀態;
停止位狀態:時鐘計數,發送停止位;計數結束后狀態機跳轉到 s_idle;
default:狀態機復位到空閑狀態;
endcase
UART 接收器包括了16 個字節FIFO、信號同步器和信號接收器三個部分。其中信號同 步器則是為了解決串行數據幀和接收時鐘是異步問題,其它兩部分和UART 發送器的中的 功能相似,只是數據傳送的方向相反。
3 設備接口和驅動設計
3.1 設備接口設計
AT91ARM9200 芯片通過其靜態存儲控制器 (SMC)控制EP1K,而靜態存儲控制器 (SMC) 是控制外部靜態存儲器或外設的訪問。 SMC 可編程地址達512M 字節。它有8 個 片選及一個26 位地址總線。16 位數據總線能配置與8 位或16 位外部器件連接。獨立的讀寫控制信號允許存儲器與外設直接連接。SMC 支持不同的允許單時鐘周期存儲器訪問的訪 問協議。它還提供外部等待請求能力。
因為 EP1K 內部設計使用的是8 位數據總線和8 位地址總線,所以AT91ARM9200 芯片與EP1K 相連的I/O 端口為 A[7:0],D[7:0],NRD 和NWR0。然而EP1K 內部采用 的WISHBONE 總線規范,其讀寫信號wb_we_o,高電平表示為寫操作,低電平表示為 讀操作。所以需要將NRD 和NWR0 進行相應的信號轉換。而D[7:0]為雙向端口IO, 所以在EP1K 的設計中采用三態門的設計。
評論