英语原文共 6 页
基于FIFO和FPGA的多通道UART控制器的实现
摘要
为了满足现代复杂控制系统的通信需求,本论文提出了一种基于FIFO(先进先出)技术和FPGA(现场可编程门阵列)的多通道UART控制器。论文介绍了异步FIFO的设计方法和控制器的结构。该控制器采用FPGA中的FIFO电路块和UART(通用异步接收发送器)电路块设计,实现了现代复杂控制系统的快速有效通信。从通信顺序图中可以很容易地看出,当主设备和次属设备的波特率不同时,该控制器可以用来实现通信。它还可以用于减少具有多个子系统的系统中的子系统之间的同步误差。控制器是可重新配置和可扩展的。
关键词:FIFO,FPGA,UART
1 介绍
如今,由于采用了最先进的微控制器和数字信号处理器(DSP),复杂的控制算法可以很容易地实现,以获得理想的系统性能。但在实际控制系统中,由于控制算法本身、控制器的能力、实现设备的能力以及控制环境的状态等因素的影响,很难达到预期的效果[1]。除这些因素外,控制系统的通信参数其中包括波特率、误码率和子系统间的同步也会产生很大的影响。为了提高控制系统的精度以及充分利用现代控制算法,我们应当充分重视控制系统中的通信。
在多个控制系统中,UART是一种应用广泛的串行通信电路。通用异步收发(UART)是一种在串行通信中起着重要作用的集成电路。它处理串行和并行数据之间的转换。串行通信减少了信号的失真,因此可以在相距很远的两个系统之间进行数据传输[2]。
在一些复杂的系统中,主控制器和从属控制器之间的通信是通过串行或并行端口实现的。并行通信需要大量的多位地址总线和数据总线,并且只便于短距离传输。串行通信是另一种通信方式,由于其结构简单、传输距离长而得到广泛应用。但有时一个通用的串行口不能满足具有不同波特率设备的复杂系统的要求,甚至某些特殊的波特率设备也不能满足。如图1所示,在一个系统中,电脑的波特率为115200bps,设备1的波特率为57600bps,设备2的波特率为19200bps,其他设备设置为9600bps或其他波特率。没有一个特殊的波特率转换器是不可能实现这种多波特率通信系统的。
图1 多设备通信图
在一个自由度为6的机器人中,有6个设计结构完全相同的子控制器。PC机用于实现机器人的控制算法,并将控制参数发送给子控制器,子控制器用于收集反馈信号并发送给PC机,PC机与子控制器通过RS485总线网络进行通信。每个子控制器都有一个唯一的地址号,PC使用这个号码来标识每个子控制器。当PC机要向节点6发送数据时,它必须访问前5个节点,这会产生时间延迟,使机器人的每个自由度的性能不同步。这样从而降低了控制算法的精度,给控制算法的研究带来了困难。
为了解决上述问题,我们设计了一种基于FIFO技术和FPGA的多通道UART控制器。它可以以一定的波特率接收带有UART块的数据,并以相同的波特率或其它不同于接收波特率的波特率将数据发送给带有UART块的子设备,它还可以用来减少子控制器之间的时间延迟。
现场可编程门阵列(FPGA)在数字电路设计中的应用越来越广泛,发挥着越来越重要的作用。它的可编程特性使电路设计更加灵活,缩短了上市时间。采用现场可编程门阵列还可以提高系统的集成度、可靠性和降低功耗。为了满足不同的系统需求,通常采用FPGA来实现简单的接口电路或复杂的状态机。本文利用Altera公司生产的FPGA-EP1C6Q和FIFO技术,设计了一种波特率转换器,实现设备内部不同波特率的通信。FIFO通常用于时钟域交叉,以安全地将数据从一个时钟域传递到另一个异步时钟域。使用FIFO将数据从一个时钟域传递到另一个时钟域需要多异步时钟设计技术。有不同的方法来设计一个FIFO,本文详细介绍了一种利用灰色码设计、合成和分析两个不同时钟域之间的安全FIFO的方法。
在高速数据采集系统、基于PCI的高速控制系统和多DSP信号处理系统等多个系统中,FIFO被用来完成高速设备与低速设备之间的通信或完成同一个子控制器之间的通信。FIFO是这些系统中最重要的部分,它是不同设备之间的桥梁[3,4]。同样,在我们的控制器中,基于FPGA的异步FIFO也是最重要的部分。因此,异步FIFO的特性和功能决定了控制器的特性,FIFO可用于完成并行或串行端口的通信。
2 多个异步FIFO的设计
2.1 FIFO的介绍
异步FIFO是指一种FIFO设计,其中数据值从一个时钟域写入FIFO缓冲区,数据值从另一个时钟域读取同一FIFO缓冲区,这两个时钟域是异步的。FIFOS通常用于数据缓存,存储异步信号的频率或相位差。异步FIFO通常用于快速、安全地将数据从一个时钟域传递到另一个异步时钟域。在异步时钟电路中,每个时钟域的周期和相位是完全独立的,因此数据丢失的概率总是不为零。介绍了一种基于FPGA的高读写速度、高可靠性的先进先出设计方法。
通常,FIFO由RAM数组块、状态块、写入指针(wr_ptr)和读取点(rd_ptr)组成,其结构如图2所示。
带有独立读写端口的RAM阵列用于存储数据。写入指针指向下一个要写入的位置,读取指针指向当前要读取的位置。写入操作增加写入指针,读取操作增加读取指针。重置时,两个指针都重置为零,FIFO为空。写入指针恰好是要写入的下一个FIFO位置,读卡器指针指向无效数据。状态块的职责是向FIFO生成“空”和“满”信号。如果“满”处于活动状态,则FIFO无法容纳更多数据;如果“空”处于活动状态,则FIFO无法提供更多数据供读取。当将数据写入FIFO时,“wclk”将用作时钟域,当从FIFO中读取数据时,“rclk”将用作时钟域。这两个时钟域都是异步的。
图2 异步FIFO结构图
在异步FIFO的设计中,有两个难题不容忽视。一种是如何根据写入指针和读取指针判断FIFOS状态。二是如何设计同步异步时钟域的电路以避免亚稳态。
2.2 FIFO的空满状态
创建空信号和满信号是设计FIFO的最重要部分。无论在什么情况下,读写指针都不能指向FIFO的相同地址。因此,空信号和满信号在FIFO中扮演着非常重要的角色,它们分别阻止对进一步读写的访问。这种阻塞的关键重要性在于指针位置是超过FIFO的唯一控制操作,即写或读操作更改指针。通常,在普通的FIFO中,当读取指针等于写入指针时,FIFO为空。但在循环FIFO中,当两个指针相等时,它要么是空的,要么是满的。因为满信号和空信号不仅可以由指针的值决定,还可以受导致指针变为相等的操作的影响。如果重置或读取使指针彼此相等,则FIFO实际上是空的。如果写入使指针相等,则FIFO已满[5]。
为了准确知道FIFO是满是空,我们可以设置一个方向标志来跟踪是什么导致指针彼此相等。该标志告诉状态电路FIFO当前的前进方向。方向标志的实现有点复杂,因为必须设置“向满”和“向空”的阈值。
在本文中,这种方法代替了另一种用于区分满和空的设计技术,即为每个指针添加一个额外的位。指针长度n=(数组大小)。数组大小是项目中所需的FIFO深度。例如,当设置FIFO 64字节(8位1字节)的数组大小时,写入和读取指针的长度为。当n是访问整个FIFO内存缓冲区所需的地址位数时,使用n 1位指针。当两个指针(包括MSB)相等时,FIFO为空。当两个指针都相等时,fifo就满了,msbs除外。如图3所示,当FIFO的数组大小为8字节时,访问整个FIFO内存缓冲区所需的地址位数为4。有了额外的地址位,就可以轻松地创建完整和空的信号[5,6]。
图3 FIFO的空满状态
状态块从根本上对两个指针执行操作,这些指针运行在两个不同的时钟域上。这就是导致真正困难的原因。如果使用写入指针对读取指针进行采样(反之亦然),则可能会遇到一个称为亚稳态的问题。亚稳态是当事件尝试对另一个事件进行采样时发生的物理现象的名称。在物理电路中,亚稳态导致输出不确定度要么是逻辑1,要么是逻辑0,或者介于两者之间。在物理系统中,用另一个事件对一个事件进行采样会产生不可预测的结果。不可预测性也意味着另一种现象,这就是亚稳态所带来的真正危险。在设计FIFO时要消除这些由亚稳态引起的问题是很困难的[5,7]。
2.3 亚稳态的解决办法
在先进先出的情况下,亚稳态会导致不可预测的问题,因此在设计阶段,我们应该尽最大努力减少亚稳态。如果系统中存在异步元件,那么亚稳态是不可避免的。绝对没有办法完全消除亚稳态,所以我们要做的是计算一个出现错误的“概率”,并用时间表示,即平均无故障时间。MTBF是对失效概率的统计度量,需要一些更复杂的经验数据和实验数据才能得到。在D触发器中,当输入信号在时间t 0瞬间从0变为1时,q的值是不确定的。这是转移性。
在FIFO中,它需要用与计数器时钟同步的时钟对计数器的值进行采样。因此,它将满足计数器从ffff变为0000的情况,并且每个位都是亚稳态的。这意味着计数器可能会读取ffff到0000之间的任何值,而FIFO不工作。必须做的最重要的事情是确保计数器的所有位不会同时改变。为了最小化这种错误发生的可能性,我们应该确保每次计数器递增时精确地改变一个位。所以我们需要一个计数格雷码的计数器。格雷码是以1953年最初获得该代码专利的人弗兰克·格雷命名的。灰色代码是不同形式的二进制代码,即每个下一个值与前一个值仅在一个位位置上不同。二进制码与格雷码之间的转换如下:
gn =bn
gi=bi oplus;bi 1 forall;i ne; n (1)
和 bn =gn
bi =gi oplus;bi 1 forall;i ne; n (2)
格雷计数器的设计有多种方法,本文详细介绍了一种简单而直接的设计方法。本文描述的技术只使用一组触发器作为格雷码计数器,如图4所示。在FIFO中,将格雷码转换为二进制代码,递增并将其转换回格雷码并存储。格雷码计数器假定寄存器位的输出为格雷码值。然后,格雷码输出被传递给格雷码到二进制转换器,该转换器被传递给二进制加法器,以生成下一个二进制值,该值被传递给二进制到格雷转换器,生成存储在寄存器中的下一个格雷码值。
关于格雷码,要记住的第一个事实是,任何两个相邻单词之间的代码距离只有1(只有一个位可以从一个格雷码计数变为下一个)。关于格雷码计数器的第二个事实是,最有用的格雷码计数器必须在序列中具有幂-2计数。
图4 格雷码计数器结构
3 多通道UART控制器的实现
3.1 硬件结构
在多通道控制器中,有不同的模块,包括UART模块、状态检测器、异步FIFOS模块和波特率发生器模块。每个模块在控制器中有不同的功能。
第一部分是UART电路块,其结构如图5所示。它由接收电路、发送电路和控制/状态寄存器三部分组成。传输电路由传输缓冲器和移位寄存器组成,传输缓冲器加载从本地CPU传输的数据。移位寄存器接受来自发送缓冲器的数据,并将其逐位发送到TXD引脚。接收电路由接收移位寄存器和接收缓冲器组成。接收移位寄存器从RxD逐位接收数据。接收缓冲区从远程MCU加载数据,并为本地PC读取做好准备。控制寄存器一个特殊的功能寄存器用于控制UART并指示其状态。根据每个比特的值,UART将选择不同类型的通信方法,UART知道如何接收或发送数据。FIFOS用于存储从PC接收的数据,并为子MCU做好准备。在将数据写入FIFOS和从FIFOS中读取数据时,我们可以根据PC和MCU的波特率设置不同的时钟域。因此,它可以用来实现不同波特率下MCU之间的通信。
该控制器还具有一个波特率发生器模块,可以根据不同类型系统的内容要求产生不同的波特率。该块由定时器(32/16位定时器)、分频器和波特率设置寄存器组成。
图5 UART模块的结构
利用FIFO技术和前面提到的COM块,设计了一种多通道控制器。它可以用于在复杂系统中实现MCU之间的通信。还可以完成高速设备和低速设备之间的通信。控制器的结构如图6所示。该控制器是建立在FPGA - EP1C6Q240,它是基于Altera公司生产的SRAM技术。可以像FIFO那样设计小型存储器。在设计FPGA中的FIFO时,您应该在实践中考虑FIFO的容量,还应该考虑FPGA的容量。
图6 控制器的结构
3.2 软件结构
可以使用Verilog HDL中的软件代码来设计FPGA硬件体系结构,很容易创建和调整以满足应用的要求。有一个UART用于与PC机或其他主MCU通信,还有四个UART用于与子MCU通信。每个通道有两个FIFO,一个用于接收数据,另一个用于传输数据。每个FIFO的深度是64字节。软件流程图如图7所示。
图7 软件流程图
如图7所示,当FIFO已满时,不能再向FIFO中写入任何字节。此时,状态检测器将设置CS高,以指示FIFO已满并停止写入FIFO。当FIFO为空时,将无法再从中读取。然后状态检测器将设置为空高,以指示FIFO的状态并停止从中读取。当FIFO未满或为空时,将根据控制顺序写入或读取数据。完成所有读写操作后,它将停止,直到下一次访问。
4仿真和验证
为了验证控制器的设计,设计了一个在ModelSim中进行验证的测试台。从PC或其他主MCU接收到的数据将存储在FPGA内的FIFO中,直到控制器接收到命令控制器向子控制器发送数据的命令。然后控制器根据需要的命令设置一种波特率。如图8所示,控制器正在接收数据,并将接收到的数据存储到等待读取的不同FIFO中。
当需要子控制器以不同的波特率接收数据时,控制器可以将每个通道设置为其所需的波特率以传输数据。发送顺序如图9所示。控制器以不同的波特率同时发送数据。
当要求子控制器以相同的波特率接收数据
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。