微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于FPGA的UART接口模块设计

基于FPGA的UART接口模块设计

时间:09-21 来源:互联网 点击:

UART(UniversalAnynchronousReceiverTransmitter,通用异步接收发送器)是广泛应用的串行数据传输协议之一,其应用范围遍及计算机外设、工控自动化等场合。虽然USB传输协议比UART协议有更高的性能,但电路复杂开发难度大,并且大多数的微处理器只集成了UART,因此UART仍然是目前数字系统之间进行串行通信的主要协议。

随着FPGA的广泛应用,经常需要FPGA与其他数字系统进行串行通信,专用的UART集成电路如8250,8251等是比较复杂的,因为专用的UART集成电路既要考虑异步的收发功能,又要兼容RS232接口设计,在实际应用中,往往只需要用到UART的基本功能,使用专用芯片会造成资源浪费和成本提高。可以将所需要的UART功能集成到FPGA内部,实现FPGA与其他数字系统的直接通信,从而简化了整个系统电路,提高了可靠性、稳定性和灵活性。

1 UART简介

基本的UART通信只需要两条信号线(RXD,TXD)就可以完成数据的相互通信,接收与发送是全双工形式,其中TXD是UART发送端,RXD是UART接收端。UART基本特点是:在信号线上有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应保持在逻辑高电平状态。发送器是通过发送起始比特而开始一个字符传送,起始比特使数据线处于逻辑0状态,提示接收器数据传输即将开始。数据位一般为8位一个字节的数(也有6位7位的情况),低位(LSB)在前,高位(MSB)在后。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。停止位在最后,用以标志UART一个字符传送的结束,它对应于逻辑1状态,UART数据帧格式如图1所示。

图1 UART数据帧格式

2 UART功能实现

UART可以分解为3个子模块:波特率发生器模块;发送模块;接收模块。UART的功能主要由VHDL硬件描述语言编程,图2是编译后生成的图元SCI,它包括了UART的最主要的部分,即发送模块和接收模块。SCI的外部口线可分为3类:

一是与数字系统的接口,包括数据DATA[7.0],片选CS,读写RD、WR,状态RDFULL、TDEMPTY.这部分接口完成的功能是将待发送的数据写入SCI或从SCI读出已接收到的数据。

二是串行通信接口2条线RXD、TXD,其中RXD是接收数据线、TXD是发送数据线,因此,SCI实现的是全双工通信的设计。

三是系统控制线RESET、CLK,RESET为模块复位输入,CLK为模块时钟输入,通信的波特率由CLK来决定(实际的波特率是CLK/4)。

图2 UART的图元模块结构

RDFULL、TDEMPTY为两个状态标志位,RDFULL为输入寄存器满标志,高电平表示已经接收到一个有效数据并存储到输入数据寄存器中,当CS、RD有效将数据读出后变为低电平无效。

TDEMPTY为输出寄存器空标志,高电平表示由CS、WR有效写入到输出寄存器的数据已经发送完毕,可以向输出寄存器写入另外待发送的数据,低电平时表示数据目前正在发送中。

2.1 发送模块设计

发送模块由发送控制进程、写数据进程、并/串转换进程、状态操作进程等进程构成。其中,最主要的是发送控制进程,在发送控制进程中声明了一个6比特的变量scit_v,由它的取值(状态机)状态来控制整个发送过程。scit_v被分为高四位的sh_t和低两位的sl_,tscit_v在系统复位后被赋初值28(011100B),每来一个时钟scit_v增量,每来四个时钟sh_t增量,当sh_t为0111B时发送起始位,sh_t为1000~1111B时发送8比特的数据。下面给出的是发送控制进程和发送接收数据进程的原代码:

-----数据发送控制进程-----

PROCESS(clk,reset)

variablescit_v:integerrange0to63;

variablescit_s:std_logic_vector(tdownto0);

BEGIN

IF(reset=0')'THEN

scit_v:=0;--000000

ELSIF(clkE'VENTANDclk=1')'THEN

IF(scit_v=27)THEN

IF(tdEMPTY_s=0''ANDwr=1')'THEN

scit_v:=28;--sci_v=011100

ELSE

scit_v:=0;

ENDIF;

ELSE

scit_v:=scit_v+1;

ENDIF;

ENDIF;

scit_s:=conv_std_logic_vector(scit_v,6);

scit=TO_STDULOGICVECTOR(scit_s);

ENDPROCESS;

------数据的串行发送-----

PROCESS(sh_t)

BEGIN

CASEsh_tIS

WHEN0111=>txd=0';'

WHEN1000=>txd=din_latch(0);

WHEN1001=>txd=din_latch(1);

WHEN1010=>txd=din_latch(2);

WHEN1011=>txd=din_latch(3);

WHEN1100=>txd=din_latch(4);

WHEN1101=>txd=din_latch(5);

WHEN1110=>txd=din_latch(6);

WHEN1111=>txd=din_latch(7);

WHENOTHERS=>txd=1';'

ENDCASE;

ENDPROCESS;

图3给出的是发送数据的仿真图。当CS和WR有效时写入数据55H,同时EMPTY被置成无效状态,开始数据的发送,从图中可以看到TXD上电平的变化过程,当发送

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

网站地图

Top