FPGA实现UART和MCU一体化设计
0赞计算机技术和微电子技术的发展为现代电子设计提供了新的方法和途径。传统的电子设计采用功能独立的分立元件进行功能组合从而实现特定的功能,计算机设计初期也一直采用这种模式。但是随着近代电子技术的进步,尤其是FPGA(FieldProgrammableGateArray)的出现,使得电子设计和计算机设计都发生了很大的变化,尤其是在数字电子系统的设计领域。利用现场可编程门阵列FPGA可以实现任何数字器件的功能,而且还可以大大缩短设计时间,减少PCB的面积,提高信号的传输质量,提高系统的可靠性,增加设计的灵活性和可维护性。本文采用FPGA技术实现一个MCU与串行通信外设进行简易通信的平台,一方面了解了计算机的一些控制原理和工作流程;另一方面可以了解利用FPGA进行电子设计的优越性。
1FPGA与电子设计
用FPGA进行计算机I/O通信设备的开发设计,实现了功能类似Intel8250及8251,美国半导体公司的16550串行通信接口的功能,同时实现了带有简单类忙编指令的微控制单元MCU来控制与外围I/O设备的通信。整个设计采用VHDL在Altera的QuartusⅡV6.0进行设计实现,并进行仿真验证。
1.1FPGA的原理及其开发平台
通常的FPGA由布线资源分隔的可编程逻辑单元构成阵列,又由司编程I/O单元围绕阵列构成整个芯片,排成这列的逻辑单元由布线通道中可编程内连线连接来实现一定的逻辑功能,也就是说分段的互连线可以通过可编程开关以任意方式连接起来形成逻辑单元的信号线。一个FPGA主要由逻辑阵列块(LAB)、I/O块、RAM块和可编程的行/列线等组成。
1.2FPGA的开发软件及设计流程
FPGA的开发软件一般由生产FPGA的厂商根据自己的产品特性提供专门的开发工具,目前主要流行的是Xilinx的ISE平台和Altera的Quar-tus平台。本文使用的是后者。使用该设计开发软件能够完成FPGA系统设计的流程基本包括了设计输入(原理图输入或HDL语言描述输入)、综合、布线、下载等工作。本文所设计的电子系统设计输入采用VHDL语言。
选定了设计平台后,只要考虑所要设计系统的功能,借助集成开发环境即可完成想要的设计。一般来说,利用FPGA进行电子设计的完整的设计流程分为电路的设计与输入、功能仿真、综合、综合后仿真、实现、布局布线后仿真、配置下载与调试等步骤。由于FPGA的灵活性和设计的可重复性,可以保证在任何仿真或者验证步骤出现问题时都能根据错误定位返回相应的步骤,以进行更改或者重新设计。这是传统电子设计方法无法比拟的。
2系统设计与实现
本文所设计的系统实现了一个可简易汇编指令的微控制器MCU和一个计算机组成中的外围串行通信I/O设备。通过实现的一部分I/O输入/输出指令和条件跳转指令可实现与外设的通信控制。系统功能模块划分如图1所示。
2.1串行通信外设的设计与实现
在计算机系统组成中,串行通信占据重要地位,它的使用范围包括计算机与外部设备之间,计算机与计算机之间、甚至在进行前期CPU设计时都会用到。传统的设计方法是应用Intel公司的8250/8251或者美国半导体的16550等芯片,但因设计复杂,占用电路体积大,而且出现问题不容易跟踪定位,所以本文采用FPGA实现。将串行通信的关键器件UART集成到FPGA内部,增加系统的可靠性,缩小PCB板体积,使得系统更加紧致,且能根据需要进行适当的设计、扩充和裁剪。实现的该I/O设备功能划分如图2所示。
2.1.1UART模块的设计与实现
UART串行数据格式如图3所示,串行数据包括5~8位数据(可更改设置)、1位起始位、1~2位停止位、1位校验位。该模块主要由发送模块和接收模块两部分构成。在各自模块中分别由接收缓冲器、接收控制电路、发送缓冲区、发送控制电路、数据总线缓冲器、读写控制电路组成,逻辑框图如图4所示。
UART模块的发送模块和接收模块公用复位信号、时钟信号和并行数据线,并且有各自的输入/输出模块和控制电路单元。
(1)发送模块的设计。发送模块将从微控制器MCU送来的8位并行数据转换成图3所示的数据帧格式的串行数据发送出去。该模块分为3种工作模式:空闲模式、载入数据模式、移位模式输出模式。当并行的8位数据从微控制器MCU通过数据线写入发送FIFO(在以下2.1.2节实现)中时,发送模块自动将并行数据装入锁存器THR中,首先发送起始位0,然后根据LCR定义的数据格式将数据移位,并通过状态机和节拍器实现完整的发送序列,并以相应的波特率从TX发送出去。发送模块的状态机FSM如图5所示。
(2)接收模块的设计。接收模块接收串行输入的数据(见图3),然后将其转换为并行数据送给微控制器MCU。与发送模块相同,也分为3种工作模式:空闲模式,检测起始位模式、移位输入模式。首先接收模块在接收时钟的控制下,不断地在RX端口检测输入数据的起始位,当检测到起始位后,接收模块由空闲模式转变为移位输入模式。此时通过RX端口进来的串行数据可能存在着些许抖动,因此需要添加消抖电路进行处理。消抖处理一般有两种办法,一种是在前端添加非门的R8触发器来完成,一种是类似软件的方式控制采集输入端的数据,并将前后采集的数据值进行比较,相同则保持,否则继续采集比较,这里采用的是后者。当接收完数据,更新接收缓冲区状态,以提供微控制器MCU查询,方便读取数据。接收模块的状态机FSME如图6所示。
2.1.2输入/输出缓冲区(FIFC))的设计与实现
FIFO(FirstInFirstOut)是一种先进先出的缓冲区结构。主要在通信过程中解决通信两端速度不匹配的问题。访问FIFO仅需要读/写控制线,不需要地址线,因此采用FIFO实现的缓冲区接口简单,读写方便。由于文中的微控制器MCU和I/O设备均在FPGA内部实现,因此采用同步FIFO实现,即写端口和读端口采用同一个时钟进行控制操作。该系统分别实现了位宽为8位,深度为256b的缓冲区来对MCU发送给外设的数据和从外设接收的数据进行缓冲处理。实现方法可以采用Altera公司FPGA内部的资源实现。对FIFO的读/写控制可根据缓冲区的使用状态和MCU发送来的命令来实现。FIFO模块的结构图如图7所示。
读信号和写信号由微控制器MCU通过向I/O设备进行数据输入和输出操作产生。空标志和满标志用于MCU探测缓冲区状态,应用查询方式对外设进行读写数据操作。对于发送缓冲区,当缓冲区处于满状态时表明已经没有可用的存储空间缓冲数据,此时不允许进行写操作;对于接收缓冲区,当缓冲区处于空状态时,表明没有从设备收到任何的时间,此时不允许微控制器MCU从外设接收缓冲区读取数据。
通过QuartusⅡ产生的FIFO如图8所示。
图8中,aclr是异步复位信号;clock是时钟输入;rdreq和wrreq分别是读和写信号线;data[7…O]是FIFO的并行数据输入端;q[7…0]是FIFO的并行数据输出端;empty和full分别为FIFO空满标志的状态线;usedw[7…O]为当前状态下FIFO已经使用的存储量,即FIFO中已经写入并保存的数据量。
2.2微控制器MCU的设计与实现
在一个计算机系统中,中央处理器处于核心控制地位,它不仅是参与运算的核心器件,而且是控制外设的中枢。一般情况下,它实现了一定的功能指令集,用来由用户自己编程控制外部设备动作或者进行一些算术逻辑运算。本文中所实砚的微控制器MCU主要以实现对外设的控制,实现了对外设端口的读写控制以及一些必要的程序控制指令。在一个微控制器的设计中,指令系统的设计尤其重要,它不仅关系到控制器的设计,也关系到软件程序的设计方法。指令系统的设计分为指令集设计和指令动作设计两部分,前者侧重于控制器的总体功能;后者侧重于指令的具体实现。进行指令设计时首先要进行指令分析,根据系统所要完成的功能,完成所需指令的功能设想,这是指令设计的基础;然后分析指令该放在什么地方,微控制器如何取指令和对指令进行识别等操作;最后确定指令格式以及每个指令完成指定功能所需要的一系列基本动作过程。可以使用ALtera公司FPGA内部的ROM作为程序存储器,详细的实现过程参看参考文献。通过此系统进行分析,设计实现如表1所示指令。每条指令功能的完成具有取指令、指令译码、执行指令阶段。指令的分析译码执行由状态机逻辑控制具体实现。
3系统仿真验证
用硬件描述语言VHDL所实现的设计输入,需要经过完整的编译过程才可以进行仿真验证,甚至下载配置。整个编译过程包括4个阶段:分析/综合(Analysis&Synthesis)、适配(Filter)、装配(Assembier)、时序分析(TimingAnalyzer)。
分析/综合阶段使用QuartusⅡ中Integrated综合用VHDL实现的输入文件,生成后续过程使用的EDIFice网表文件(.edf)。适配阶段使用由上一阶段建立的网表数据库,将工程的逻辑和时序要求与器件的可用资源相匹配,这个过程会将每个逻辑功能分配给最佳的逻辑单元位置,并选定相应的互联路径和引脚分配,为以后的布线和时序分析做准备。装配阶段根据上一阶段的资源匹配生成可供下载配置的功能文件。时序分析是对所有的逻辑进行分析,根据适配阶段的资源匹配情况进行时序分析,验证最佳情况(最快速率等级的最小延时)下的时序。在Quartus中可以通过选择StartComplieation来运行所有的编译器模块,也可以通过选择Start单独运行各个模块,还可以通过选择omplierTool(Tools菜单),在ComplierTool窗口运行该模块,以启动编辑器模块。在ComplierTool窗口中,可以打开该模块的设置文件或报告文件,或打开其他相关的窗口。
完成上述编译阶段以后,就要编程实现数据的发送和接收工作。在本例中,为了方便测试,在外设内部通过将发送线直接连接至接收线进行内部环路的自检测试,外设缓冲区状态采用轮询方式工作。测试程序编写如下:
上述简单程序段所对应的微控制器码加载在程序存储器中,如图9所示。
建立仿真输入文件,设置时钟信号和发送总线数据即可。首先对串行通信设备进行仿真测试,测试输入如图10所示。串行通信设备的仿真结果如图11所示。
从仿真结果可以看出,串行通信设备已达到预定的功能要求。
加入微控制器MCU作用后,使用图8所对应的类汇编程序进行测试。在此例程中,只简单发送了一个8位数据来说明问题,如图12所示。
系统仿真结果如图13所示。
可以看出程序的执行结果如预想一样,最终在数据总线上显示的是接收到并从接收缓冲区读出的数据。说明加入MCU和FIFO缓冲区后系统环路测试功能正常,已达到设计要求。
4结语
在当今电子设计领域,尤其是电子核心器件和设计软件落后的情况下,应用传统的电子设计方法既浪费时间,且成本可能太高,甚至有时候性能也不能满足要求,通过FPGA技术进行设计可以使性能得到大大改观。本文就是利用FPGA技术实现的一个计算机外围I/O设备和一个简单的微控制器。随着FPGA技术的进一步成熟和发展,它的性能和灵活性会更加出色,将来完全有可能将一台计算机系统在其内部,并搭配外围接口电路,而且性能会更加突出。随着计算机技术应用的扩大,尤其是嵌入式计算机的广泛使用,应用FPGA技术进行现代数字系统的设计,会使系统更加紧致,功能更加完善,功耗更加降低,性能更加稳定。因此,应用FPGA进行电子设计势在必行。