UART 原理 以及VHDL實現

Uart: 異步串口通信

Uart: Universal Asynchronous Transmitter/Receiver 是異步串口通信的總稱。 在其數據發送時將並行輸入的數據轉換成串行輸出,在接受數據時將串行數據轉換爲並行數據輸出。

通信協議: UART, IIC, SPI, USE, Ethernet

RS232,RS449,RS423,RS485是接口標準規範和總線標準規範,規定了通信口的電器特性,傳輸速率,連接特性和接口的機械特性等。

Uart 管腳

uart pins description
我們現在只用到pin2和pin3,也就是發送數據和接受數據。

Uart 關鍵參數以及時序圖

  1. 數據位(Data bits): 該參數定義單個UART數據傳輸從開始到停止期間發送的數據位數。可選擇: 5,6,7,8(默認)。
  2. 波特率(Buad):從一設備發送到另一設備的波特率,即每秒鐘可以通信的數據比特個數。典型的波特率:300,1200,2400,9600,19200,115200。例:當波特率爲2400時, 也就是1秒傳輸2400比特的數據,所以1比特需要416666 ns。
  3. 開始位(Start bit): 在數據發送之前,發送開始位,來標誌着傳輸開始。從高電平‘1’變爲低電平‘0’;
  4. 停止位(Stop bit): 在每個字節的數據爲發送完成之後,發送停止位,來標誌着一次數據傳輸完成。可選擇爲:1 (默認),1.5 或 2 位。

RS-232 標準中,常用的配置時8N1(8個數據位,無奇偶校驗,一個停止位)

UART 時序圖
1: 1位起始位 :0
2: 8位數據位: 低位先輸出
3: 1位停止位:0

實現的邏輯功能:

uart頂層模塊
send_en: 高電平有效時,數據才能傳輸;
data_in: 八位輸入數據;
baud_set: 波特率設置;
rs232_tx: 輸出數據;
tx_done: 完成信號;
uart_state: 開始發送數據置1, 完成置0;

VHDL 代碼實現

Baud_set的實現

本實驗中硬件開發板的系統時鐘爲100MHZ,也就是時鐘週期爲10ns,所以 當波特率爲2400, 傳輸一個數據需要416666ns, 也就是需要41666個時鐘週期,其他的以此類推。
定義波特率

sclk的實現

如下圖所示,當cnt=1的時候將sclk置爲‘1’可以提前發送數據,而如果等到cnt=period的時候再發送數據,那麼就會有一定的延遲。
sclk對比圖
實現的VHDL代碼如下:
sclk的實現

數據傳輸的實現:

當send_en爲‘1’,且sclk=‘1’的時候,case語句開始運行。
idle狀態的時候,RS232_tx=‘1’,
爲start狀態的時候, Rs232_tx=‘0’, 標誌着起始位,
爲stop狀態的時候,Rs232_tx=‘1’,標誌着結束。
translate_data

仿真結果:

start 仿真結果:

start
如上圖所示,當send_en=1,sclk=1, 檢測到state=idle, state從ilde => start ,rs232_tx輸出從 置爲1;

cnt再次計數到1在這裏插入圖片描述

如上圖所示,當baud=101時,cnt計數到10416復位,再次計數到1,sclk=‘1’,系統檢測到state = start, state: start => data0, rs232_tx:1 => 0, 標誌着開始位

stop: 一次數據傳輸完成

stop
如上圖所示,傳輸完成之後,當sclk=1, uart_state =>0, state : stop => idle.

VHDL代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章