基于串口通訊的Verilog設(shè)計
else begin
counter=0;
state=s0;
end
end
s1:if(!din)//如果是0的話,轉(zhuǎn)入s2狀態(tài),提取八位有效數(shù)據(jù)
state=s2;
else //否則轉(zhuǎn)到s0狀態(tài)重新檢測
state=s0;
s2:if(cnt3==3)//是否采集四次數(shù)據(jù)
begin
cnt2=0;
indata_buf[bitpos]=din; //先進來的是高位數(shù)據(jù)
bitpos=bitpos-1;
if(bitpos==-1)
begin
bitpos=7;state=s3;end
end
else cnt3=cnt3+1;
s3:begin
tag1=tag;
tag=1'b1; //標志輸入寄存器滿。表明已把有用數(shù)據(jù)裝入寄存器
if(tag~tag1)txdone) //檢測到tag的上升沿以及txdone為高才把輸入緩沖數(shù)據(jù)放到輸出緩沖去
dout_buf={1'b1,indata_buf[7:0],1'b0};//停止位,高位,低位,起始位
state=s0;
end
endcase
end
//***********發(fā)送數(shù)據(jù)模塊
reg[3:0] state_tx=0;
always@(posedge txclk or posedge rst)
begin
if(rst)
begin
dout_ser=1'bz;
state_tx=0;
txdone=1;
end
else
case(state_tx)
0:begin
dout_ser=dout_buf[0];state_tx=state_tx+1;txdone=1'b0;end
1:begin
dout_ser=dout_buf[1];state_tx=state_tx+1;end
2:begin
dout_ser=dout_buf[2];state_tx=state_tx+1;end
3:begin
dout_ser=dout_buf[3];state_tx=state_tx+1;end
4:begin
dout_ser=dout_buf[4];state_tx=state_tx+1;end
5:begin
dout_ser=dout_buf[5];state_tx=state_tx+1;end
6:begin
dout_ser=dout_buf[6];state_tx=state_tx+1;end
7:begin
dout_ser=dout_buf[7];state_tx=state_tx+1;end
8:begin
dout_ser=dout_buf[8];state_tx=state_tx+1;end
9:begin
dout_ser=dout_buf[9];state_tx=state_tx+1;end
endcase
end
endmodule
注:兩個頻率信號nclk、txclk由相應(yīng)的分頻程序產(chǎn)生。由于篇幅所限未在文中列出。
FPGA模塊接收從RS-485發(fā)送過來的串行數(shù)據(jù)。25位為一個字符。數(shù)據(jù)的傳輸速率是700kbps,用四倍于波特率的速率進行采樣,這樣可以大大降低系統(tǒng)的噪聲。數(shù)據(jù)的串行輸出波特率選為11200bps。
由輸入輸出波形圖可以看出:本段程序?qū)崿F(xiàn)了對輸入數(shù)據(jù)的有效數(shù)據(jù)位的提取,并按照一定的波特率進行串行輸出。程序中,波特率可以根據(jù)需要通過分頻程序進行改動。硬件電路搭建簡單,程序代碼書寫容易。數(shù)據(jù)傳輸穩(wěn)定可靠,可以滿足串口通信的要求。
評論