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電...