1、引言
随着集成电路(IC)技术进入深亚微米时代,片上系统SoC(System-on-a-Chip)以其显著的优势成为当代IC设计的热点。基于软硬件协同设计及IP复用技术的片上系统具有功能强大、高集成度和低功耗等优点,可显著降低系统体积和成本,缩短产品上市的时间。IP核是SoC设计的一个重要组成部分,已成为目前微电子设计的热点和主要方向[1]。
UART 核以其可靠性、传送距离远的特点被广泛应该到通信系统和嵌入式微处理器上。利用传统的EDA工具通过对RTL代码仿真、验证、综合、布局布线后生成网表,下载到FPGA中实现,这样做成的核主要用于验证的[2],不适合用来做掩膜。在ASIC/SoC技术日渐成熟的今天,设计商更希望得到能够做掩膜的IP核,从而便于嵌入到ASIC/SoC设计中。本文描述的UART核采用SYNOPSYS软件的设计流程,在RTL级上进行优化,解决了综合优化中碰到的一些常见问题。利用VCS 仿真、编写测试激励来验证,最后用design compile 综合优化做成的IP核可以满足此要求,应用到ASIC/SoC设计中将产生巨大的效益。
2、UART核的功能分析和设计
2.1 UART 核的传输协议与总体模块设计
通常信息是通过数据帧来传送的,由起始位、8位数据位、停止位组成。起始位为低电平,表示串行数据开始传输,停止位为高电平,表示数据传送结束。
UART的结构框图如图1所示[3],主要有由波特率发生器、发送部分和接收部分等组成。本设计采用全双工异步通信的方式,通过层次结构化、划分模块的方法来实现。
图1 UART 的结构框图
2.2 UART 核的功能设计
2.2.1 波特率发生器
波特率是用来实现数据接收和发送的异步,波特率实际上就是分频器。UART的数据接收和发送是通过对波特率的设置进行实现的,本文采用16分频[3]。
2.2.2 接收器模块设计
接收器模块将8 位串行数据并行发出,用loadbuf 信号来装载八位串行数据。接收8位串行数据之前先要判断起始位;当起始位到来后经过5个clk16x采样,使采样点接近中央位置,这样数据稳定。然后每过16个时钟clk16x后,将8位串行数据逐位接收进来。当数据接收完毕,检查是否到达停止位,若是则表示接收成功,否则出现帧错误(framing_err), 并重新检测等待。当数据接收完毕后,等待数据的并行发出,当中断信号(rask)有效时发送数据。
接收数据停止位的判断采用9位移位寄存器(shift_reg)来实现。开始时将shift_reg全部置1,当16个clk16x到来时候,将串行数据从低位到高位逐位地移入到shift_reg的低位到高位。每接收一位数据后,判断是否接收完,由于起始位是最先进入shift_reg的,所以当数据全部接收完后。起始位已经进入了shift_reg的最后一位,表示数据接收完,如果在接收到停止位的逻辑是0,则表示产生帧错误(framing_err),等待再次检测直到停止位为1,表示接收完毕。采用状态机来实现数据起始位、停止位的判断和串行数据的接收[4]。
图2给出了接收模块的仿真波形。由波形可以看出,当输入0F0H,并行输出正确,其中state、reset、clk1x、flag、dout和rbuffer分别是状态机、复位信号、使异步的时钟同步、数据发送出去的标志、并行数据输出和数据缓冲器,而ask、rask和flag是中断发送控制,其中rask是控制数据发送。
图2 接收模块的仿真波形
2.2.3 发送器模块设计
发送器模块将8位并行数据串行发出,用wr写信号装载并行进来的8位数据到9位移位寄存器(shift_reg)的低8位,最高位置为0,表示数据的起始位,数据发送完后发送1。