匯流排通訊協議 UART

2021-10-14 17:00:37 字數 4199 閱讀 3795

2. 傳輸協議

3. 小結

uart:universal asynchronous receiver and transmitter通用非同步收發器,序列介面,適用於速度較慢的點對點通訊場景,由於是非同步通訊,沒有時鐘訊號,因此需要收發雙方的波特率相同、

usart:universal synchronous asynchronous receiver and transmitter通用同步/非同步收/髮器,是uart的公升級版,可以進行同步通訊

非同步,序列介面,速度較慢,20kbps,可以實現全雙工傳輸和接收

tx:傳送資料線

rx:接受資料線

一般還會加上vcc和gnd

1對1傳輸,所以不用傳輸位址,i2c是要傳輸位址的,psi由於有片選訊號,所以也不用傳輸位址。

預設:高電平

起始:1bit/低電平

資料:8bit

校驗位:1bit; 奇校驗表示資料中1的個數為奇數,則校驗位為0,如果為偶數,那麼校驗位為1,也就是說資料碼+校驗位共有奇數個1.

終止位 : 1bit/ 高電平

傳送模組

module tx #(

parameter data_width = 8,

parameter odd_even = 0 // 0 stand for the even

)( input wire [data_width-1 : 0] data_in,

input wire data_vld,

input wire sys_clk,

input wire sys_rst_n,

output reg data_out

);parameter idle = 5'b00001;

parameter start = 5'b00010;

parameter data_tra = 5'b00100;

parameter check = 5'b01000;

parameter stop = 5'b10000;

reg [4:0] cur_state;

reg [4:0] nxt_state;

always_ff @(posedge sys_clk or negedge sys_rst_n) begin

if (!sys_rst_n)

cur_state <= idle;

else

cur_state <= nxt_state;

end

reg [7:0] data_in_reg;

always_ff @(posedge sys_clk or negedge sys_rst_n) begin : proc_data_in_reg

if(~sys_rst_n) begin

data_in_reg <= 0;

end else if (data_vld)begin

data_in_reg <= data_in;

endendreg [2:0] data_cnt;

always_latch begin

nxt_state = idle;

case (cur_state)

idle :

if (data_vld)

nxt_state = start;

start :

nxt_state = data_tra;

data_tra :

if(data_cnt == data_width-1)

nxt_state = check;

else

nxt_state = data_tra;

check :

nxt_state = stop;

stop :

nxt_state = idle;

endcase

endalways_ff @(posedge sys_clk or negedge sys_rst_n) begin : proc_data_cnt

if(~sys_rst_n) begin

data_cnt <= 'd0;

end else if (cur_state == data_tra)begin

data_cnt <= data_cnt + 1'b1;

end else

data_cnt <= 'd0;

endreg check_tmp;

always_ff @(posedge sys_clk or negedge sys_rst_n) begin : proc_check_tmp

if(~sys_rst_n) begin

check_tmp <= 'b0;

end else if (cur_state == data_tra)begin

check_tmp <= check_tmp + (data_in_reg >> data_cnt); //calculate the number of 1

end else if (cur_state == stop)

check_tmp <= 'b0;

endalways_ff @(posedge sys_clk or negedge sys_rst_n) begin : proc_data_out

if(~sys_rst_n) begin

data_out <= 'b1;

end else if (cur_state == start) begin

data_out <= 'b0;

end else if (cur_state == data_tra ) begin

data_out <= data_in_reg >> data_cnt;

end else if (cur_state == check) begin

data_out <= check_tmp ^ odd_even;

end else

data_out <= 'b1;

endendmodule

整個**的狀態機就是根據時序圖得到的,因為一般傳輸協議的時序圖都代表著一定的順序關係,所以用狀態機實現是最方便的。

從波形圖可以看出,和我們的時序圖幾乎一致,開始,資料傳輸10001001, 奇偶校驗位:採用的是偶校驗,所以校驗位為1,結束高電平。

urrt是非同步的,因為它沒有時鐘訊號作為基準,它以乙個低電平作為開始訊號,因為tx預設是拉高的,然後通過設定波特率讓接受方和傳送方同步。

UART通訊協議

第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...

Uart通訊協議

第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...

UART通訊協議

第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...