FPGA 串列埠通訊協議

2021-10-18 13:09:42 字數 4462 閱讀 6907

fpga 串列埠通訊協議

波特率:波特率就是串列埠的通訊速率,常見的波特率有12000bps、4800bps、9600bps、115200bps、256000bps、500000bps,這裡波特率的意思是每秒可以傳輸bit的個數,這裡的5207=500000000/9600;傳遞乙個位元組需要的時間

串列埠接收模組

輸入為時鐘、復位訊號、輸入資料、輸出資料、資料接收完成標誌

源**:

module chuanxing_3(clk,rst_n,data_in,po_data,po_en);

input clk,rst_n;

input data_in;

output reg [7:0] po_data;

output reg po_en;

reg [2:0] state;

reg [2:0] next_state;

reg [3:0] cnt_bit;

reg [12:0] cnt;

parameter idle=0,start=1,read=2,stop=3;

parameter time=5207;

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

state<=idle;

else

state<=next_state;

end//計數模組

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

cnt<=0;

else

begin

if(statestart||stateread||statestop)

begin

if(cnttime)

cnt<=0;

else

cnt<=cnt+1;

endelse

cnt<=0;

endend

//傳遞位元組

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

cnt_bit<=0;

else

begin

if(next_stateread)

begin

if(cnt_bit8&&cnttime)

cnt_bit<=0;

else if(cnt_bit8&&cntalways @(*)

begin

case(state)

idle:

next_state=data_in?idle:start;

start:

begin

if(cnt==time)

next_state=read;

else

next_state=start;

endread:

begin

if(cnt_bit8&&cnttime)

next_state=stop;

else

next_state=read;

endstop:

begin

if(cnt==time/2)

next_state=idle;

else

next_state=stop;

endendcase

end//序列轉並行

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

po_data<=0;

else

begin

if(next_stateread&&cnttime/2)

po_data[7:0]<=;

else

po_data[7:0]<=po_data[7:0];

endend

//資料接收完成標誌

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

po_en<=0;

else begin

if(statestop&&cnttime)

po_en<=1;

else

po_en<=0;

endend

endmodule

傳送模組

module chuanxing_3_tx(clk,rst_n,pi_data,pi_en,data_out);

input clk,rst_n;

input [7:0] pi_data;

input pi_en;

output reg data_out;

parameter time=5207;

parameter idle=0,start=1,send=2,stop=3;

reg [3:0] cnt_bit; //9個位元組

reg [12:0] cnt;

reg [2:0] state,next_state;

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

state<=idle;

else

state<=next_state;

endalways @(*)

begin

case(state)

idle:

begin

if(pi_en)

next_state=start;

else

next_state=idle;

end

start:

begin

if(cnt==time)

next_state=send;

else

next_state=start;

endsend: begin

if(cnt_bit==8&&cnt==time)

next_state=stop;

else

next_state=send;

end

stop:begin

if(cnt==time)

next_state=idle;

else

next_state=stop;

endendcase

end//計數模組

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

cnt<=0;

else

begin

if(next_statestart||next_statesend||next_statestop)

begin

if(cnttime)

cnt<=0;

else

cnt<=cnt+1;

endelse

cnt<=0;

endend

//位元組計數

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

cnt_bit<=0;

else begin

if(next_statestop)

cnt_bit<=0;

else if(cnt_bit<8&&next_statesend&&cnt==time)

cnt_bit<=cnt_bit+1;

else

cnt_bit<=cnt_bit;

endend

//always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

data_out<=0;

else begin

if(next_statestart)

data_out<=0;

else if(next_statestop)

data_out<=1;

else

case(cnt_bit)

4』d1: data_out<=pi_data[cnt_bit-1];

4』d2: data_out<=pi_data[cnt_bit-1];

4』d3: data_out<=pi_data[cnt_bit-1];

4』d4: data_out<=pi_data[cnt_bit-1];

4』d5: data_out<=pi_data[cnt_bit-1];

4』d6: data_out<=pi_data[cnt_bit-1];

4』d7: data_out<=pi_data[cnt_bit-1];

4』d8: data_out<=pi_data[cnt_bit-1];

endcase

endend

endmodule

FPGA 之串列埠通訊協議

串列埠通訊協議 串列埠通訊 uart 是一種用兩線 rx 傳送端 tx 接收端 實現的非同步 全雙工通訊方式。由於串列埠通訊沒有時鐘訊號線,由此而出現波特率 baundrate 即接收和傳送雙方規定好相同的波特率 以此來保證傳送的資料的正確性 波特率 一秒鐘內傳送的位元組數目。如下圖1是串列埠通訊協...

UART串列埠通訊協議的FPGA實現

引言 uart串列埠通訊協議,全稱叫做通用非同步收發器 universal asynchronous receiver transmitter 通常稱作uart。uart是非同步通訊,它只需要一根線就可以進行資料的通訊。1 基本概念 具體的時序圖如下圖所示 2 verilog實現 module ua...

串列埠通訊協議

簡介 通訊協議分層理解 物理層和協議層 物理層規定通訊系統中具有機械 電子功能部分的特性,確保原始資料在物理 的傳輸。協議層規定通訊邏輯,統一收發雙方的資料打包 解包標準。物理層串列埠通訊結構圖 電平標準 ttl電平標準 理想狀態下使用5v表示二進位制邏輯1,使用0v表示二進位制邏輯0 rs232電...