基于Wishbone总线的UART IP核设计
扫描二维码
随时随地手机看文章
摘要:介绍了一种基于Wishbone总线的UART IP核的设计方法。该设计采用了自顶向下的模块化划分和有限状态机相结合的方法,由于其应用了标准的Wishbone总线接口,从而使微机系统与串行设备之间的通信更加灵活方便。验证结果表明,这种新的架构设计是有效的。
关键词:Wishbone总线;UART;有限状态机;IP核
随着集成电路与嵌入式技术的发展与广泛应用,许多嵌入式系统都需要进行串行通信,因此在片上嵌入式系统芯片中集成uART(通用异步接发装置)的IP核已成为一种趋势。
在基于IP核复用技术的集成电路设计中,片上总线的选取是最为关键的问题。目前,许多厂商已经开发了适用于各自片上总线标准的UART IP核,例如基于AMBA总线的UART IP核、基于CoreConnect总线的UART IP核等。如果用户要使用这些商业化的UART核,则需要得到授权。因此从成本、性能、开放性的角度来看,采用开源、易于实现的Wishbone总线标准设计出的UART IP核将会拥有广泛的市场。
1 UART IP核的设计原理
1.1 UART工作原理
通用非同步收发装置(UART)是计算机进行串行通信的重要组成部分。它将微机系统内部传送过来的并行数据转换为串行输出数据流,以电平的形式传输出去;将微机系统外部传送来的串行数据转换为字节,供微机系统内部使用并行数据的器件使用;在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验;在输出数据流中加入启停标记,并从接收数据流中删除状态标记。
对于UART而言,总线上的所有信号都是至关重要的。这些信号包括所需的控制信息和数据。因此总线接口的设计决定着UART的设计细节。本设计采用Wishbone总线作为UART核与微机系统进行通信的主机接口。UART核的接口信号如图1所示。
1.2 Wishbone总线接口
在集成电路设计领域,Wishbone总线结构是一种灵活、开源的设计方法。其目的是促进设计的再利用,简化系统级芯片的集成问题。通过在IP核之间创建一个总线接口,从而将各个IP核能方便地进行连接。这就提高了设计的可复用性和系统的可靠性,加快了产品推向市场的速度。在此之前,IP核之间都是使用非标准的总线规范进行连接的,这就难以实现复用。因此采用标准化的E总线结构设计IP核,已成为IC设计行业的主流。
在设计中,Wishbone总线为微机系统和UART控制器提供了操作接口。Wishbone总线接口的主要功能是协调处理器和UART核之间的信号,使处理器能正确地使用UART核进行数据通信。
2 UART IP核的设计实现
UART IP核的研发是遵照RS232协议和Wishbone总线标准进行的,集成了UART的基本功能。
UART IP核的主要技术特征包括:
(1)支持标准RSR232接口标准和Wishbone总线规范。
(2)全双工独立收发功能。
(3)接收通道进行奇偶校验,溢出,产生可选中断。
(4)内置支持接收和发送的16 Byte FIFO。
(5)发送“空”产生可选中断,接收“满”产生可选中断。
UART IP核体系结构如图2所示。
UART IP核内部主要包括数据发送模块、数据接收模块以及Wishbone总线接口模块。各模块的设计如下。
2.1 Wishbone总线接口模块设计
Wishbone总线接口模块将UART IP核与微机系统相连。该模块提供Wishbone Master和Wishbone Slave接口。
Wishbone总线接口模块的主要功能如下:
(1)提供UART IP核与其他设备的接口,如存储器或者主机的接口。
(2)包含缓冲描述符(储存于内部RAM)。
(3)包含信号在主机时钟、发送时钟和接收时钟之间的同步逻辑。
(4)发送功能。读取发送缓冲描述符,读取数据到发送FIFO并开始发送,其后将发送状态写到发送缓冲描述符。
(5)接收功能。读取接收缓冲描述符,将获得的字节写入接收FIFO,其后通过Wishbone Muter接口与微机系统进行通信。最后,将接收状态写到接收缓冲描述符。
当处理器需要串行发送数据时,先将数据以包的形式存储于主存储器中,然后将存储的所有包的起始地址、目的地址、长度以及发送控制信息写入发送描述符中。
Wishbone接口模块读取到一个非空的发送描述符后即发送数据,发送的数据要通过Wishbone接口逻辑访问位于总线上的主存储器,读取到的数据首先放到发送FIFO中,其后再通过发送控制和同步逻辑与数据发送模块进行握手,将数据从TX_O端口串行发送出去。
当接收数据时,数据由RX_I端口串行地移入接收FIFO中,每收满8位数据就移入接收保持寄存器,然后通过Wishbone总线并行传输给处理器核。
2.2 数据接收模块设计
由于外部信号是通过异步串行的形式传输,因此当接收端口检测到一个由高到低的数据就被视为一个帧的起始位。为了避免接收信号的噪声而产生的不正确的数据,检测到的起始位时钟至少要低于50%的波特率时钟。接收模块一旦接收到有效的起始位,就将通过RS232标准的波特率对数据位和校验位进行采样。
设计采用接收状态机控制整个模块的接收过程。接收状态机可分为5个状态,即IDLE、RX_START、RX_DATA、CHECK、RX_STOP,它们之间的状态转移,如图3所示。
IDLE状态:当产生复位信号或运行至停止状态之后,接收状态机将复位到这种状态。处于IDLE状态时,它等待外部传来的信号从高向低转变,此时视为产生了一个有效的起始位。一旦有效起始位被检测到,有限状态机就会切换到下个状态。
RX_DATA状态:当状态机跳转到此状态时,采样每得到一位数据,就把接收到数据放到准备好的接收移位寄存器中。在设计中需要一个接收计数器来进行计数。当计数器提示数据接收已完成,则状态机会转入下个状态。
CHECK状态:当处于CHECK状态时,通过对实际接收到的数据进行判断得出实际数据的奇偶性,然后再与发送过来的数据的奇偶校验位进行奇偶校验。
如果符合,那么表示接收数据有效,可以传入处理器;如不符,则不传,直接丢弃数据。
RX_STOP状态:无论停止位长度设定为1位或者是2位,有限状态机总是等待1位样本的采样时间,然后抽样停止位。只要一个逻辑采样停止位被检测到,数据接收模块就不会去检查是否停止位的配置出现错误。此时,有限状态机将返回IDLE状态。
2.3 数据发送模块设计
发送模块将从处理器接收到的数据,加上起始位,奇偶检验位和停止位组成规定的格式后串行输出。首先,利用缓存器FIFO存放需要发送的数据,这样处理器可以一次往FIFO中写入多个字节的数据。发送数据时依次从FIFO中每次取出1Byte进行串行输出。
设计采用发送状态机来控制整个模块的发送过程。发送状态机由以下5个状态组成:IDLE、TX_START、TX_DATA、CHECK、TX_STOP,它们的转移关系如图4所示。
IDLE状态:在没有接收到将要发送的数据时,发送模块一直处于该状态,此刻一直保持发送模块的数据位为高,当得到主机发出的工作信号时,发生状态跳转,进入下个状态。
TX_START状态:发送模块会先发送一个数据“0”,作为起始位。起始位传送完毕后,转入下个状态。
TX_DATA状态:发送完起始位后,接着发送由主机传来的有效数据。首先把数据存入模块内的移位寄存器中,利用移位寄存器实现并行输入到串行输出的转换。同时计数器开始计数,在发送完8位数据后,计数器清零,FSM随即跳入下个状态。
CHECK状态:当状态机处于这个状态,最后1位数据仍然在传输。传输完成时,状态机将判断校验位。如果校验位无误,则进入下个状态。
TX_STOP状态:在此状态下,根据发送模块的采样结果,将设置相关中断和状态位。发送完毕后,状态机返回IDLE状态。
3 UART IP核的验证方法
对UART IP核的验证主要是在Modelsim软件构建的虚拟平台中进行的,通过编写Testbench(测试代码)作为激励信号,将得到的值与期望值进行比较,从而判断功能是否正确。验证系统框图,如图5所示。
本次验证施加的测试激励包括两个部分,一部分是模拟发送数据的过程,如总线对于模块内部寄存器的读信号,UART串口输出信号和设备的硬件接口信号等,验证模块的正常功能是否实现;另一部分是模拟接收数据的过程,如外部设备对UART发送的数据接收过程,以及UART 将数据转换发送给微机系统。仿真波形图,如图6所示。
仿真波形图模拟的是UART在全双工的模式下同时接收一个完整的数据(51,16进制)和发送一个完整的数据(11,16进制)的过程。以接收过程为例:UART首先输出发送UART_INT中断信号,通知处理器准备接收数据,处理器响应中断。UART通过采样脉冲(Baud)将信号写入RX_UDR接收寄存器中,同时接收计数器计数,计数到8时自动清零,中断信号自动清除,随后将接收到的8位数据通过总线模块传入处理器中。发送过程为接收的逆过程。
4 结束语
IP核重用技术以及接口标准化问题是IC设计领域中的研究热点,其应用领域正在不断拓展。本文介绍的基于Wishbone总线的UART IP核的设计方法,通过验证表明了各项功能达到预期要求,为IP核接口的标准化设计提供了依据。此外,该IP核代码全部采用模块化的Verilog-HDL语言编写,便于以后不断完善,具有较强的实际效益。