新闻中心

EEPW首页 > EDA/PCB > 设计应用 > 基于串口通讯的Verilog设计

基于串口通讯的Verilog设计

作者:时间:2012-09-03来源:网络收藏

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。

由输入输出波形图可以看出:本段程序实现了对输入数据的有效数据位的提取,并按照一定的波特率进行串行输出。程序中,波特率可以根据需要通过分频程序进行改动。硬件电路搭建简单,程序代码书写容易。数据传输稳定可靠,可以满足串口通信的要求。


上一页 1 2 3 下一页

关键词: Verilog 串口通讯

评论


相关推荐

技术专区

关闭