UART 通訊 (VHDL)

邏輯主頁

程式碼下載

版本 1.1:uart.vhd (13.1 KB)
修正了 rx 啟動位元錯誤檢查

版本 1.0:
uart_v1_0.vhd (13.0 KB)
首次公開發布

特點

  • 通用非同步收發器(UART)元件的 VHDL 原始碼
  • 全雙工
  • 可配置波特率
  • 可配置資料寬度
  • 可設定奇偶校驗(偶/奇/無)
  • 可配置接收資料過採樣率
  • 無流量控制

介紹

本文詳細介紹了一個用於 CPLD 和 FPGA 的 UART 元件,該元件採用 VHDL 語言編寫。此元件使用 Quartus II 13.1.0 版本設計。資源需求取決於具體實現。圖 1 展示了一個 UART 整合到系統中的典型範例。


圖 1. 範例實現

背景

UART 是一種用於非同步串列通訊的裝置。它由兩條資料傳輸線組成:RX 和 TX,每個方向各一條。有時還會包含額外的線路來實現流量控制,最常見的是 RTS(準備發送)和 CTS(清除發送)。傳輸速度、資料寬度、奇偶同位和流量控制均可配置,且兩個 UART 通訊端必須設定相同。

圖 2 顯示了傳輸的資料結構。當通訊中斷時,線路保持高電平,以指示線路和發送器均未受損壞。傳輸以低起始位元開始。接下來是資料字元。接下來是可選的同位位元,可以將其配置為偶同位、奇同位或無同位。最後,高停止位元結束傳輸。

data_framing
圖 2. 資料取樣

通訊可以是單工、半雙工或全雙工。在此元件中,發送和接收線路獨立運作。雖然這使得元件本身俱有全雙工特性,但如果由使用者邏輯控制,它也可以以單工或半雙工方式運作。

工作原理

產生波特率和過取樣率時脈使能

波特率是以比特/秒為單位的資料傳輸速度。過取樣率是接收電路在每個波特週期(即每個資料位元)對接收輸入進行取樣的次數。

該組件透過產生相應頻率的時脈使能脈衝來實現波特率和過採樣率。這些訊號源自於系統時脈 clk 的頻率,該頻率必須在通用參數 clk_freq 中指定。

組件內的計數器會產生以波特率發生的波特脈衝。此週期性脈衝使系統時脈能夠以波特率操作發送電路。由於產生的波特率必須是系統時鐘的整數倍,因此每個波特週期都會引入一個小的誤差。但是,此誤差不會超過系統時鐘的一個週期。

類似地,另一個計數器產生一個過取樣脈衝,其頻率 = 過取樣率 X波特率。此脈衝使系統時脈能夠以過取樣率操作接收電路。請注意,該計數器也會在每個波特脈衝處重置,以確保計數誤差不會在一個波特週期後累積。這樣,接收電路所實現的波特率與發送電路的波特率相同。

發送電路

tx_ena 輸入有效時,tx_data 上的資料將被閂鎖到內部移位暫存器。此時,奇偶同位位元也使用異或邏輯計算,並與起始位元和停止位元一起閂鎖到同一個移位暫存器。然後,波特率脈衝週期性地使系統時脈以指定的波特率將暫存器內容移出到 tx 線。tx_busy 輸出指示使用者邏輯何時傳輸完成,電路已準備好接收新的資料。

接收電路

接收電路在每個過取樣脈衝上監控 rx 輸入。如果偵測到邏輯低電平,它就會開始計數,並在檢測到足夠數量的連續低電平輸入後識別到傳入的起始位元。此時,它開始以指定的波特率將 rx 線的值轉移入移位暫存器,波特率是透過對過取樣脈衝進行計數來實現的。

整個資料字移入暫存器後,接收電路使用異或邏輯驗證資料奇偶同位。然後,它將接收到的資料輸出到 rx_data 端口,並標記在 rx_error 端口上檢測到的任何錯誤。rx_busy 連接埠上的高到低轉換向使用者邏輯表示新的接收資料現在可用。

配置 UART

透過設定 ENTITY 中的通用參數來配置 UART。表 1 列出了這些參數。


表 1. 通用參數說明

連接埠描述

表 2 列出了 UART 的連接埠。


表 2. 連接埠描述

傳輸

雖然發送和接收傳輸屬於同一元件,但它們互不影響,因此可以獨立運作。

傳送

圖 3 顯示了範例傳輸的時序圖。請注意,圖中所示的 baud_tb 訊號是 UART 內部訊號,此處僅用於說明。使用者使用 UART 時無需考慮此訊號。

image
圖 3. 發送時序範例

tx_busy 輸出埠上的邏輯低電位表示元件已準備好傳送資料。元件在 tx_ena 輸入確定的時脈週期的第一個上升沿閂鎖 tx_data 連接埠上的資料。在接下來的時脈週期,元件確定 tx_busy 訊號,指示 UART 發送電路處於繁忙狀態。在此狀態下,發送電路的任何輸入都將被忽略。當 UART 內部產生下一個波特率脈衝 baud_tb 時,實際發送就開始了。此時,tx 訊號輸出邏輯低電平起始位,發送正在進行。UART 首先傳送 tx_data 的最低有效位元(LSB)。在所示的傳輸中,資料字後面跟著一個偶同位位元。發送邏輯高電平停止位並完成發送後,tx_busy 訊號取消確定,指示發送電路已準備好進行下一個交易。

接收

圖 4 所示為範例接收的時序圖。接收傳輸由 UART 的通訊方透過 rx 輸入連接埠上的邏輯低電位起始位元發起。一旦 UART 偵測到 rx 輸入線已保持低電平達半個波特率週期,它就會識別起始位元並確定 rx_busy 訊號,通知用戶邏輯接收傳輸正在進行中。它繼續以預定的波特率移入位,計算並驗證奇偶同位位元,並確保在正確的時間出現邏輯高電平停止位。一旦偵測到停止位,它會將接收到的資料輸出到 rx_data 端口,並將接收的第一位作為最低有效位(LSB)。它還會輸出 rx_error 訊號,指示是否偵測到起始位元、奇偶同位位元或停止位元錯誤。它同時確定 rx_busy 訊號,通知使用者邏輯接收傳輸已完成,結果可在 rx_datarx_error 連接埠上查看。

image
圖 4. 接收時序範例

圖 5 顯示了 UART 如何偵測接收線路上的傳入位元。 UART 在每個過採樣脈衝處監控 rx 輸入。在此模擬中,過取樣率(os_rate)設定為 16,因此每個波特週期進行 16 次取樣。一旦 UART 偵測到 rx 輸入連續 8 個取樣(os_rate/2)為邏輯低,它便確定存在起始位元。然後,它會每 16 個取樣移入一個資料位,該資料位對應於每個接收位的中間位置。

transaction_receive_with_oversampling
圖 5. UART 內的接收位

重置

reset_n 輸入連接埠必須為邏輯高電平,UART 元件才能運作。此連接埠上的低電平訊號會非同步重置組件。重置期間,元件將 tx_busy 連接埠保持高電平,以指示其無法傳送資料。任何正在進行的發送操作都會停止,並且 tx 輸出將呈現邏輯高電平狀態。rx_busy 連接埠保持低電平,以指示沒有正在進行的接收操作。任何正在進行的接收操作都會被放棄,並且 rx_datarx_error 輸出埠將被清除。重置解除後,tx_busy 連接埠將在下一個時脈週期置低,指示 UART 已準備好進行通訊。

結論

此 UART 是一個可設定的可程式邏輯元件,可透過簡單的非同步序列介面進行通訊。它允許使用者指定系統時鐘、波特率、資料長度、奇偶同位位元和過取樣率。