概述:
????????UART(Universal Asynchronous Receiver/Transmitter)是一種通用的異步收發(fā)傳輸協(xié)議,用于在計算機系統(tǒng)和外部設(shè)備之間進行串行數(shù)據(jù)傳輸。UART 協(xié)議定義了數(shù)據(jù)的傳輸格式和通信規(guī)則,使得不同設(shè)備之間能夠進行可靠的數(shù)據(jù)交換。
首先先把設(shè)計代碼放到這里:UART_TX完整代碼下載
以下是 UART 協(xié)議的幾個關(guān)鍵要素:
? ? ? ? 1、異步傳輸:UART 使用異步傳輸方式,不需要共享時鐘信號來進行數(shù)據(jù)同步。發(fā)送端和接收端通過起始位、數(shù)據(jù)位和停止位進行數(shù)據(jù)的有效傳輸。
????????2、起始位和停止位:在每個數(shù)據(jù)字節(jié)的開始之前,UART 使用一個起始位來標識傳輸?shù)钠鹗键c。而在數(shù)據(jù)字節(jié)的末尾,UART 添加一個或多個停止位以標識傳輸?shù)慕Y(jié)束。起始位和停止位的數(shù)量可以根據(jù)協(xié)議和設(shè)置進行配置。
????????3、數(shù)據(jù)位:UART 協(xié)議規(guī)定了數(shù)據(jù)位的傳輸順序和位數(shù)。數(shù)據(jù)位是實際傳輸?shù)臄?shù)據(jù)位數(shù),典型的位數(shù)為 5、6、7 或 8 位,具體取決于協(xié)議和配置。重要的一點:UART的傳輸數(shù)據(jù)為:
????????4、波特率:UART 通信的波特率指的是每秒傳輸?shù)奈粩?shù)。發(fā)送端和接收端必須以相同的波特率進行通信,以確保數(shù)據(jù)的正確傳輸。常見的波特率包括 9600、115200 等。
????????5、校驗位(可選):為了增加數(shù)據(jù)傳輸?shù)目煽啃?,UART 還可以使用校驗位進行錯誤檢測。校驗位是在數(shù)據(jù)位之后添加的一個位,用于驗證數(shù)據(jù)的準確性。常見的校驗方式包括奇校驗和偶校驗。
UART 協(xié)議在許多應(yīng)用中得到廣泛應(yīng)用,例如串口通信、嵌入式系統(tǒng)、傳感器和外圍設(shè)備等。它提供了一種簡單而有效的數(shù)據(jù)傳輸方式,允許設(shè)備之間進行可靠的異步通信。
本章將介紹如何使用Verilog實現(xiàn)UART發(fā)送部分并進行下板驗證:
一、UART構(gòu)成
根據(jù)概述可以簡單的提取出來,如下圖:UART接受傳輸?shù)臄?shù)據(jù)格式:
講解幾個關(guān)鍵點:
? ? ? ? 1、UART傳輸數(shù)據(jù)順序:
????????????????LSB → MSB,從最低位到最高位
? ? ? ? ? ? ? ? 例如:d=8'b1011_0011? ? :傳輸順序:d[0],d[1] ....... d[6],d[7]
? ? ? ? 2、通信方式:
????????????????異步通信:“不需要額外的時鐘線進行數(shù)據(jù)的同步傳輸”
????????????????全雙工傳輸:UART 只需要兩條信號線:RXD?和?TXD ,可以同時進行傳輸
? ? ? ? 3、傳輸數(shù)據(jù)速率:
????????????????采用波特率作為傳輸數(shù)據(jù)的速率(每秒傳輸二進制位數(shù)的多少),單位:BPS,常用波特率有9600、14400、38400、57600...115200。
????????例如波特率=115200,則它傳輸一位數(shù)據(jù)位(1bit)的時間為1/115200s
? ? ? ? 兩個設(shè)備通過UART傳輸?shù)臅r候,必須是相同波特率。
二、時鐘與波特率的計算
? ? ? ? 涉及到兩個量:
? ? ? ? 1、FPGA時鐘主頻率:FPGA 主頻指的是 FPGA 設(shè)備上時鐘信號的頻率,通常以赫茲(Hz)為單位。
? ? ? ? 2、波特率:波特率指的是數(shù)據(jù)傳輸?shù)乃俾?,以位每秒(bps)為單位。
根據(jù)這兩個量,可以計算出數(shù)據(jù)傳輸?shù)臅r間,所需要的時鐘周期:、
? ? ? ? 例如:時鐘頻率100M,波特率115200bps
? ? ? ? ? ? ? ? bps_cnt = 100_000_000 / 9600 = 868?
? ? ? ? 可以得出:FPGA傳輸數(shù)據(jù),需要翻轉(zhuǎn)868個時鐘周期,才可以傳輸一位數(shù)據(jù)。
簡單一點就是時鐘頻率除以波特率就是需要的計數(shù)。
三、Verilog實現(xiàn)
1、UART_TX設(shè)計框圖?????????????
端口名稱 | 端口屬性 | 介紹 |
i_clk | 輸入端口 | FPGA輸入時鐘 |
i_reset | 輸入端口 | FPGA輸入復(fù)位,高有效 |
i_data[7:0] | 輸入端口 | UART發(fā)送數(shù)據(jù) |
i_valid | 輸入端口 | 輸入數(shù)據(jù)有效 |
o_ready | 輸出端口 | 數(shù)據(jù)傳輸完成 |
o_txd | 輸出端口 | UART輸出接口 |
部分代碼:
module uart_tx #(
parameter CHECK_BIT = "None", //“None”無校驗 “Odd”奇校驗 “Even”偶校驗
parameter BPS = 115200, //系統(tǒng)波特率
parameter CLK = 25_000_000, //系統(tǒng)時鐘頻率 hz
parameter DATA_BIT = 8, //數(shù)據(jù)位(6、7、8)
parameter STOP_BIT = 1 //停止位 (1、2、3... 整數(shù))
)(
input i_reset,
input i_clk,
input [DATA_BIT-1:0] i_data,
input i_valid,
output reg o_ready,
output reg o_txd
);
endmodule
2、UART_TX狀態(tài)轉(zhuǎn)移圖
?
代碼中采用三段式狀態(tài)機:
IDLE:空閑狀態(tài),無數(shù)據(jù)傳輸,輸出高電平,當i_valid信號到來時跳轉(zhuǎn)到START狀態(tài);
START:起始位,無數(shù)據(jù)傳輸,輸出低電平為 ,無條件跳轉(zhuǎn)至DATA狀態(tài);
DATA:數(shù)據(jù)位,進行數(shù)據(jù)傳輸,先發(fā)送低比特,根據(jù)數(shù)據(jù)輸出高低電平,假如有校驗位,跳到CHECK狀態(tài),假如數(shù)據(jù)傳輸不設(shè)校驗位,跳轉(zhuǎn)到STOP狀態(tài);
CHECK:奇偶校驗位處理狀態(tài),根據(jù)CHECK_BIT參數(shù)進行添加校驗位值。
STOP:停止位狀態(tài),輸出STOP_BIT個高電平。?
部分代碼:
reg [3:0] c_state, n_state;
parameter IDLE = 0,
STATE = 1,
DATA = 2,
CHECK = 3,
STOP = 4;
///* FSM *3 *//
always @(posedge i_clk, posedge i_reset) begin
if (i_reset)
c_state <= 0;
else
c_state <= n_state;
end
always @(*) begin
case (c_state)
IDLE : begin
if (tx_en && i_valid)
n_state = STATE;
else
n_state = IDLE;
end
STATE : begin
if (tx_en)
n_state = DATA;
else
n_state = STATE;
end
DATA : begin
if (tx_en && tx_cnt >= DATA_BIT && CHECK_BIT == "None")
n_state = STOP;
else if (tx_en && tx_cnt >= DATA_BIT)
n_state = CHECK;
else
n_state = DATA;
end
CHECK : begin
if (tx_en)
n_state = STOP;
else
n_state = CHECK;
end
STOP : begin
if (tx_en && stop_cnt == 1)
n_state = IDLE;
else
n_state = STOP;
end
default : n_state = 0;
endcase
end
3、發(fā)送數(shù)據(jù)格式
此模塊用于輔助大家更好的運用UART_TX模塊,展示了握手信號的工作方式,以及串口發(fā)送模塊的調(diào)用方法。
為了方便大家理解,給大家畫了一個發(fā)送數(shù)據(jù)的時序圖:
在數(shù)據(jù)發(fā)送過程中,握手信號的細致描述如下:(接收端即UART_TX模塊)
初始狀態(tài):發(fā)送端準備好發(fā)送數(shù)據(jù),并將VALID信號置高,表示數(shù)據(jù)有效。接收端處于等待狀態(tài),READY信號為低電平,表示接收端尚未準備好接收數(shù)據(jù)。
數(shù)據(jù)傳輸開始:發(fā)送端在VALID信號置高后,開始傳輸數(shù)據(jù)。發(fā)送端將要發(fā)送的數(shù)據(jù)值放置在DATA線上,并保持穩(wěn)定。VALID信號保持高電平,表示數(shù)據(jù)一直有效。
握手信號等待:接收端檢測到VALID信號置高后,開始等待READY信號的響應(yīng)。接收端會持續(xù)監(jiān)測READY信號狀態(tài),直到它被置高。
數(shù)據(jù)接收和響應(yīng):一旦接收端檢測到READY信號置高,它表示接收端已經(jīng)準備好接收數(shù)據(jù)。在READY信號置高后,發(fā)送端可以改變DATA的值,并且VALID信號也可以跟隨著改變。這表示發(fā)送端可以發(fā)送下一個數(shù)據(jù)。
握手信號完成:發(fā)送端發(fā)送數(shù)據(jù)后,繼續(xù)保持VALID信號的高電平,表示數(shù)據(jù)仍然有效。接收端在接收完數(shù)據(jù)后,如果準備好接收下一個數(shù)據(jù),則保持READY信號的高電平。這樣一個完整的握手信號周期就完成了。
通過這種握手信號的交互,發(fā)送端和接收端能夠進行同步的數(shù)據(jù)傳輸。VALID信號的高電平表示數(shù)據(jù)有效,READY信號的高電平表示接收端準備好接收數(shù)據(jù)。只有在READY信號置高后,發(fā)送端才能改變數(shù)據(jù)并發(fā)送下一個數(shù)據(jù)。
這種握手機制確保了數(shù)據(jù)的可靠傳輸,發(fā)送端和接收端在數(shù)據(jù)傳輸過程中能夠以協(xié)調(diào)的方式進行通信。
部分代碼:
module UART_tx_gen_data(
input clk_a,
input rst_n,
output txd
);
reg [7:0] temp_data;
reg [7:0] tx_data;
reg tx_valid;
wire ready;
reg [3:0] c_state, n_state;
parameter S0 = 0,
S1 = 1;
uart_tx #(
.CHECK_BIT ("None" ) , //“None”無校驗 “Odd”奇校驗 “Even”偶校驗
.BPS (115200 ) , //系統(tǒng)波特率
.CLK (25_000_000) , //系統(tǒng)時鐘頻率 hz
.DATA_BIT (8 ) , //數(shù)據(jù)位(6、7、8)
.STOP_BIT (1 ) //停止位
) TX (
.i_reset(!rst_n),
.i_clk(clk_a),
.i_data(tx_data),
.i_valid(tx_valid),
.o_ready(ready),
.o_txd(txd)
);
always @(posedge clk_a, negedge rst_n) begin
if (!rst_n)
c_state <= 0;
else
c_state <= n_state;
end
四、下板驗證
通過上面兩個模塊,既可以對串口發(fā)送進行驗證,把UART_tx_gen_data置為頂層,然后對端口進行引腳約束,生成下載文件,然后下載到板卡:
同時打開串口調(diào)試助手,選擇波特率115200,數(shù)據(jù)位8,停止位1,校驗位none,按16進制顯示:
然后運行程序,即可在接收窗口收到連續(xù)變換的數(shù)據(jù):
這樣的話,此UART_TX設(shè)計已經(jīng)完全完成了,下一期將更新UART_RX的設(shè)計和講解。文章來源:http://www.zghlxwxcb.cn/news/detail-843664.html
如果感覺文章對您有用,麻煩三連支持一下,方便下次用到的時候,就可以快速找到我,非常感謝您的支持!?。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-843664.html
到了這里,關(guān)于FPGA協(xié)議篇:UART通信及Verilog最易懂實現(xiàn)方式/通用于任何工程/帶握手信號 ----UART_TX的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!