微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Verilog串口通讯设计

Verilog串口通讯设计

时间:06-06 来源:互联网 点击:
3 系统软件设计

  FPGA模块是本设计的主体,使用Verilog硬件描述语言进行编写,本段代码共有两个子模块,分别实现提取八位数据和串行数据发送的功能。

  下面是verilog源代码

module SIMO(din,clk,rst,dout_ser);
input din; //串行输入数据
input clk; //时钟信号
input vat; 复位信号
reg[7:0] indata_buf; //输入缓冲寄存器,存提取的有效位
reg[9:0] dout_buf; //输出缓冲寄存器,加了起停位
output reg dout_ser; //串行数据输出
reg nclk; //提取八位有效数据的采样时钟.是4倍于波特率的时钟
reg txclk; //发送数据时钟。发数据取11.2k的波特率
integer bitpos=7; //当前位
parameter s0=0,s1=1,s2=2,s3=3;
reg[2:0]state;
reg[4:0]counter; //用来计算报头报尾中1的个数
reg tag,tag1;
reg[2:0]cnt3;
reg txdone=1'b1;//一个字节数据传输完毕标志

  *********提取有效数据位并按串行通讯格式装载数据********
always@ (posedge nclk or posedge rst) begin
if(rst)
begin
state=0;
counter=0;
tag1=0;
tag=0;
indata_buf=8'bz;
dout_buf=10'bz;
bitpos=7;
cnt3=0;
end
else case(state)
s0:begin
tag=0;//表示数据没有装好
if(din)
begin
counter=counter+1;
state=s0;
if(counter==15)//如果检测到16个1则转入s1状态检测接下来的是不是0
begin
state=s1;
counter=0;
end
end
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。

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top