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