基于串口通讯的Verilog设计
else begin
counter=0;
state=s0;
end
end
s1:if(!din)//如果是0的话,转入s2状态,提取八位有效数据
state=s2;
else //否则转到s0状态重新检测
state=s0;
s2:if(cnt3==3)//是否采集四次数据
begin
cnt2=0;
indata_buf[bitpos]=din; //先进来的是高位数据
bitpos=bitpos-1;
if(bitpos==-1)
begin
bitpos=7;state=s3;end
end
else cnt3=cnt3+1;
s3:begin
tag1=tag;
tag=1'b1; //标志输入寄存器满。表明已把有用数据装入寄存器
if(tag~tag1)txdone) //检测到tag的上升沿以及txdone为高才把输入缓冲数据放到输出缓冲去
dout_buf={1'b1,indata_buf[7:0],1'b0};//停止位,高位,低位,起始位
state=s0;
end
endcase
end
//***********发送数据模块
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由相应的分频程序产生。由于篇幅所限未在文中列出。
FPGA模块接收从RS-485发送过来的串行数据。25位为一个字符。数据的传输速率是700kbps,用四倍于波特率的速率进行采样,这样可以大大降低系统的噪声。数据的串行输出波特率选为11200bps。
由输入输出波形图可以看出:本段程序实现了对输入数据的有效数据位的提取,并按照一定的波特率进行串行输出。程序中,波特率可以根据需要通过分频程序进行改动。硬件电路搭建简单,程序代码书写容易。数据传输稳定可靠,可以满足串口通信的要求。
评论