基于FPGA的参数可调RS422接口电路设计实现
扫描二维码
随时随地手机看文章
当前应用广泛的串行通信接口标准主要有RS232,RS422和RS485,其中RS232串行通信方式采用单端输入输出,传输距离短、通信速率低、抗干扰性能差;RS485与RS422均采用差分串行输入输出,但RS485只有一对双绞线,只能工作于半双工模式;RS422采用全双工通信模式,通过两对双绞线可实现双向收发互不影响,且传输速率可达10 Mbit·s-1,传输距离可达2 000 m。以RS422通信协议为代表的串行通信在数据通信吞吐量较小的微处理电路中应用更加简便、灵活,尤其在远距离信息传输中更发挥着不可替代的作用。
1 硬件电路设计
设计主要使用Altera公司的EP3C80F78017和ADI公司的ADM2687EBRIZ。RX+、RX-为差分信号输入端口,差分信号经U2解差分后传输到U1中,通过其中数据接收模块的处理,传送并行数据给CPU。CPU发送的并行数据,经U1中的数据发送模块处理输出待处理的TTL信号,通过U2差分处理后输出差分信号到总线上,TX+、TX-为差分信号输出端口。U1同时接收CPU输出的控制信号,以完成对通信参数的调整。其设计原理如图1所示。
2 软件程序设计
2.1 FPGA整体模块
clk为全局时钟输入端,rst_n为全局复位端,syn_awe为写使能命令端,syn_are为读使能命令端,syn_aoe为输出使能命令端,EA为地址总线数据端,ED为数据总线数据端,rxd_xi为串行数据输入端,txd_xo为串行数据输出端。
divider为时钟产生模块,主要产生通信波特率采样时钟;txd为UART数据发送模块,进行数据并串转换;rxd为UART数据接收模块,进行数据串并转换;uart_wr_ctl为总线解析模块,主要负责解析CPU总线命令,控制其他模块的工作状态;uart422_state_reg为UART工作状态模块,综合rxd和txd的工作状态并输出;uart_rdout_sel为数据输出选择模块,其主要控制总工作状态数据与UART接收数据的选择输出。
2.2 时钟产生模块
模块主要为UART数据收发模块提供了工作时钟,根据时钟分频系数对输入的全局时钟进行计数处理,输出UART通信波特率16倍的分频时钟频率。将时钟分频系数加1,除去全局时钟频率,则等于分频时钟频率。
clk为全局时钟输入端,rst_n为模块复位端,enable为模块使能端,factor为时钟分频系数输入端,clk_out为分频时钟输出端。本模块采用计数分频的设计思想,当计数值大于factor值1/2时,clk_out输出为高电平,反之则输出低电平。
2.3 UART数据发送模块
UART数据发送模块设计简单,主要根据输入的控制信号,对输入的并行数据进行并串转换,并以控制信号要求的数据帧格式和波特率采用LSB模式发送出去。模块在接收到有效的8位并行数据后,根据控制信号命令,按串行数据帧格式,起始增加1位起始位0,然后根据控制信号命令决定是否添加奇偶校验位,再在尾部增加1位或2位停止位1,最后组成通信双方约定的数据帧格式发送出去。
clk为模块工作时钟输入端,rst_n为模块复位端,clk_en为时钟使能端,enable为模块使能端;ctrl_i为控制信号输入端。其中,ctrl_i[3]控制使能发送奇偶校验,ctrl_i[2]控制奇偶校验选择,ctrl_i[1]控制停止位的个数,ctrl_i[0]控制数据启动发送;data_i为待发送数据输入端,frame_bits_i为帧数据位数输入端,txd_xo为数据发送端,st at_o为发送状态输出端。其中,stat_o[1]为发送器完成发送标记位,star_o[0]为发送缓冲器数据载入完成标记位。UART数据发送模块状态机,如图5所示。
2.4 UART数据接收模块
由于外部使用环境的影响,RX输入线上可能产生毛刺。为减小这一影响,该模块设计时采用“多数表决法”,具体处理方法是在一个数据位中间取3个点的采样电平值,若少于2个点为电平“1”,则将该数据位判为电平“0”,否则判为电平“1”。
clk为模块工作时钟输入端,rst_n为模块复位端,clk_en为时钟使能端,enable为模块使能端,rxd_xi为UART数据接收端,ctrl_i为控制信号输入端。其中,ctrl_i[2]控制使能接收奇偶校验,ctrl_i[1]控制奇偶校验选择,ctrl_i[0]控制读UART数据缓冲器使能,frame_bits_i为帧数据位数输入端,data_o为已接收数据输出端,stat_o为接收状态输出端。其中,stat_o[3]为帧错误标记位,stat_o[2]为接收缓冲器数据溢出标记位,stat_o[1]为校验错误标记位,stat_o[0]为数据完成接收标记位。UART数据接收模块状态机,如图7所示。
2.5 总线解析模块
本模块主要根据地址总线数据和数据总线数据,以及输出使能和读写使能命令信号,产生对其他模块的控制信号和片选信号,即解析了总线命令。
clk为全局时钟输入端,rst_n为模块复位端,syn_awe为写使能命令端,syn_are为读使能命令端,syn_aoe为输出使能命令端,EA为地址总线数据端,ED为数据总线数据端,divider_factor为输出时钟产生模块时钟分频系数,divider_enable为输出时钟产生模块使能命令信号,rxd_clk_en为输出UART数据接收模块时钟使能命令信号,rxd_ctrl_i为输出UART数据接收模块控制命令信号,rxd_frame_bits_i为输出UART数据接收模块帧数据位数,rxd_enable为输出UART数据接收模块使能命令信号;txd_clk_en为输出UART数据发送模块时钟使能命令信号,txd_data_i为输出UART数据发送模块待发送数据,txd_enable为输出UART数据发送模块使能命令信号,txd_ctrl_i为输出UART数据发送模块控制命令信号,txd_frame_bits_i为输出UART数据发送模块帧数据位数;data_rd_cs为读UART接收数据命令选择端,uart_state_reg_cs为读总工作状态数据命令选择端。
2.6 UART工作状态模块
模块主要是将输入的UART数据接收模块状态数据与UART数据发送模块状态数据合并为总工作状态数据,并进行输出。
rx_stat_o为UART数据接收模块状态数据的输入端,tx_stat_o为UART数据发送模块状态数据的输入端,uart422_state_out为总工作状态数据输出端。
2.7 数据输出选择模块
模块主要根据输入的读数据命令选择信号,对输入的总工作状态数据和UART接收数据,进行选择输出。
clk为全局时钟输入端,uart_sta_reg_out为总工作状态数据输入端,data_out为UART接收数据输入端,data_rd_cs为读UART接收数据命令选择端,uarrt_state_reg_cs为读总工作状态数据命令选择端,EDO_422为所选数据输出端。
3 仿真结果
在Modelsim_SE10.1b的开发环境下,对FPGA源代码进行逻辑综合仿真,其仿真结果如图11~图18所示。仿真结果表明,设计实现了预期的各种逻辑功能,收发数据准确无误。图19和图20分别为CPU发送和接收的数据,图中所示数据与FPGA仿真结果一致。
4 结束语
设计灵活简单,并可动态调整通信波特率和数据位及停止位长度,还可选择是否使能数据奇偶校验功能,较好地实现了RS422串行总线之间的数据传输,从而大幅增强了设计的可靠性和通用性。后期测试使用证明了,该接口电路设计具有较高的稳定性和实用性,并可用于RS422通信的诸多场合。