1 串口通讯根本特色
跟着多微机体系的运用和微机网络的开展,通讯功用越来越显得重要。串行通讯是在一根传输线上一位一位地传送信息。这根线既作数据线又作联络线。串行通讯作为一种首要的通讯办法,因为所用的传输线少,而且能够凭借现存的电话网进行信息传送,因而特别适合于远距离传送。在串行传输中,通讯两边都按通讯协议进行,所谓通讯协议是指通讯两边的一种约好。约好对数据格局、同步办法、传送速度、传送过程、纠错办法以及控制字符界说等问题做出一致规则,通讯两边有必要一起恪守。异步起止式的祯信息格局为:每祯信息由四部分组成:
a.1位开始位。
b.5“8位数据位。传送次序是低位在前,高位在后。顺次传送。
c.一位校验位,也能够没有。
d.最终是1位或是2位中止位。
FPGA(Field Pmgrammable Gate Array)现场可编程门阵列在数字电路的规划中现已被广泛运用。这种规划办法能够将曾经需求多块集成芯片的电路规划到一块大模块可编程逻辑器材中,大大减少了电路板的尺度,增强了体系的牢靠性和规划的灵活性。本文具体介绍了已在实践项目中运用的根据FPGA的串口通讯规划。
本规划分为硬件电路规划和软件规划两部分,最终用仿真验证了程序规划的正确性。
2 体系的硬件规划
本方案的异步串行通讯的硬件接口电路图如图1所示,首要由四部分组成:RS-485数据发送模块、FPGA串口模块、MAX3223和DB9。各部分功用简述如下:
RS-485数据发送模块是将前续电路的数据发送到FPGA,供本电路处理,亦即本电路的输入。RS485是契合RS-485和RS-4225串口规范的低功耗半双工收发器件,有3.3V和5V两种,在本规划中选用了3.3V的器材SP3485。SP3485的内部结构示意图如图2所示
图1异步串行通讯硬件接口功用框图
图2 SP3485的内部结构示意图
FPGA串口模块是将由RS-485发送过来的数据进行处理,提取出8位有用数据,并按异步串口通讯的格局要求输出到MAX3223的12脚。FPGA选用Xilinx公司的Spartan II系列xc2s50。此部分为该规划的主体。如上所述,输入数据的传输速率为700k波特率。为了使FPGA能够正确地对输入数据进行采样,进步分辨率才能和抗干扰才能,采样时钟有必要选用比波特率更高的时钟,理论上至少是波特率时钟的2倍。在本规划中选用4倍于波特率的时钟,运用这种4倍于波特率的接纳时钟对串行数据流进行检测和定位采样,接纳器能在一个位周期内采样4次。假如没有这种倍频联系,定位采样频率和传送波特率相同,则在一个位周期中,只能采样一次,分辨率会差。比方,为了检测开始位下降沿的呈现,在开始位的前夕采样一次之后,下次采样要到开始位结束前夕才进行。而假若在这个周期期间,因某种原因恰恰使接纳时钟往后偏移了一点点,就会错失开始位。形成整个后边位的检测和辨认过错。针对本规划,FPGA的软件共分了三个模块:
1.时钟分频模块。模块的功用是用来发生所需求的数据收集时钟和数据传输时钟。体系主频是40M的。数据收集时钟是2.8M的,发送时钟是11.2k。
2.提取数据模块。由RS485发送过来的数据共有25位,其间只要8位是有用数据。为了发送这8位有用数据。有必要先将其提取出来。提取的办法是这样的:经过接连检测到的16个高电平缓一个低电平。判别8位有用数据的到来。然后依照串行数据传输的格局,在加上开始位和中止位后,将其存储于输出缓冲寄存器中。在这里,咱们的串行数据输出格局是这样规则的,一位开始位,八位数据位,一位中止位,无校验位。
3.串行数据输出模块。这一模块相对比较简略,波特率选为11.2k,模块的功用是在移位输出脉冲的效果下,将输出缓冲寄存器中的数据移位输出。
MAX3223是完成电平转化的芯片。因为RS-232c是用正负电压来标明逻辑状况。与TTL以凹凸电平标明逻辑状况的规则不同。因而,为了能够同核算机接口或终端的TTL器材衔接,有必要在RS-232与TTL电路之间进行电平缓逻辑联系的改换。完成这种改换的办法可用分立元件,也可用集成电路芯片。MAXIM公司的MAX3223是为满意RS-232c的规范而规划的具有功耗低、波特率高、价格低一级长处,外接电容仅为0.1uF或1uF,为双组RS232收发器。由MAX3223的12脚输入的数据,经过电平转化后由8脚输出,再经过DB9的TxD端输出,由PC机接纳并做后续处理。
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
statecountertag1=0;
tag=0;
indata_bufdout_bufbitpos=7;
cnt3end
else case(state)
s0:begin
tag=0;//标明数据没有装好
if(din)
begin
counterstateif(counter==15)//假如检测到16个1则转入s1状况检测接下来的是不是0
begin
statecounterend
end
else begin
counterstateend
end
s1:if(!din)//假如是0的话,转入s2状况,提取八位有用数据
stateelse //不然转到s0状况从头检测
states2:if(cnt3==3)//是否收集四次数据
begin
cnt2indata_buf[bitpos]bitpos=bitpos-1;
if(bitpos==-1)
begin
bitpos=7;stateend
else cnt3s3:begin
tag1=tag;
tag=1’b1; //标志输入寄存器满。标明已把有用数据装入寄存器
if(tag&&”tag1)&&txdone) //检测到tag的上升沿以及txdone为高才把输入缓冲数据放到输出缓冲去
dout_bufstateend
endcase
end
//***********发送数据模块
reg[3:0] state_tx=0;
always@(posedge txclk or posedge rst)
begin
if(rst)
begin
dout_serstate_txtxdone=1;
end
else
case(state_tx)
0:begin
dout_ser1:begin
dout_ser2:begin
dout_ser3:begin
dout_ser4:begin
dout_ser5:begin
dout_ser6:begin
dout_ser7:begin
dout_ser8:begin
dout_ser9:begin
dout_serendcase
end
endmodule
注:两个频率信号nclk、txclk由相应的分频程序发生。因为篇幅所限未在文中列出。
FPGA模块接纳从RS-485发送过来的串行数据。25位为一个字符。数据的传输速率是700kbps,用四倍于波特率的速率进行采样,这样能够大大下降体系的噪声。数据的串行输出波特率选为11200bps。
由输入输出波形图能够看出:本段程序完成了对输入数据的有用数据位的提取,并依照必定的波特率进行串行输出。程序中,波特率能够根据需求经过分频程序进行改动。硬件电路建立简略,程序代码书写简单。数据传输安稳牢靠,能够满意串口通讯的要求。
责任编辑:gt