一个基于FIFO技术和基于FPGA执行多通道UART控制器.docx
《一个基于FIFO技术和基于FPGA执行多通道UART控制器.docx》由会员分享,可在线阅读,更多相关《一个基于FIFO技术和基于FPGA执行多通道UART控制器.docx(9页珍藏版)》请在冰豆网上搜索。
![一个基于FIFO技术和基于FPGA执行多通道UART控制器.docx](https://file1.bdocx.com/fileroot1/2023-1/31/0375b26e-65ad-44d6-affe-be5d7ec8069c/0375b26e-65ad-44d6-affe-be5d7ec8069c1.gif)
一个基于FIFO技术和基于FPGA执行多通道UART控制器
一个基于FIFO技术和基于FPGA执行多通道UART控制器
摘要:
为满足现代复杂控制系统的通讯需求,本文提出了一种基于FIFO(先进先出)技术和FPGA(现场可编程门阵列)的多通道UART控制器。
本文提出的设计异步FIFO和控制器结构的方法。
这种使用FPGA中FIFO电路模块和UART(通用异步收发器)电路模块设计的控制器实现了现代复杂控制系统通信的迅速和有效。
通过通信序列图表,很容易知道这种控制器可以用于实现当主设备和从设备在不同波特率设置的通讯。
它也可以用于减少在一个拥有多个子系统的系统中各个子系统之间的同步误差。
同时该控制器是可配置和可扩展的。
关键词:
先进先出FPGA异步
一、导言
今天,由于国家提供的最先进的微控制器和数字信号处理器(DSP),复杂的控制算法可以轻松实现取得理想的系统性能。
但是在实际控制系统中很难达到预期,因为各种因素影响控制系统,如控制算法自身功能的控制器,功能的实现设备和环境控制状态[1]。
除了这些因素,控制系统的通信参数包括波特率,二进制误码率和子系统之间同步也带来很大的影响。
为了提高控制系统精确度和更好地利用现代控制算法,我们要将更多的注意力集中在控制系统的通信。
在一些控制系统,通信电路的一个系列——UART被广泛应用。
通用异步接收/发送器(UART)是扮演的串行通信最重要的作用集成电路。
它处理之间的串行和并行数据转换。
串行通信减少了信号失真,从而使相隔很远的两个系统之间数据传输成为可能[2]。
在一些复杂的系统,主控制器与口水控制器之间通信是通过串行或并行端口实施的。
并行通信需要大量的多位地址总线和数据总线,只是方便短距离传输。
串行通信由于其结构简单,传输距离长,是另一种广泛使用的通信方式。
但有时一个共同的串行端口不能满足不同波特率复杂系统的要求,甚至是一些特殊设备的波特率设备。
图一、多设备通信图
如图1显示,在一个系统中,PC的波特率是115200bps,设备Ep1的波特率是57600bps,设备Ep2的波特率是19200bps,其他设备设置在为9600bps或其他波特率。
如果没有特殊的波特率转换器是不可能实现本多波特率通信系统的。
在6自由度机器人,有6个有相同的结构设计分控制器,主机是用于实现机器人的控制算法并传送控制参数分控制器子控制器用于收集反馈信号并将其发送到电脑。
个人电脑和分控制器通过RS485总线网互相沟通。
每个子控制器有一个唯一的地址号码,PC通过此号码来确定每个子控制器。
当PC想将数据发送到节点6它不得不通过前5节点,这就产生了时间延迟,导致机器人的每一个自由度不同步的表现。
因此,它减少了控制算法的精度,并带来了控制算法的研究的困难。
为了解决上述问题,我们设计了基于FIFO的技术和FPGA的多通道UART控制器,它可以接收在一定的UART波特率块数据。
并将在同一波特率UART的块或在与接收波特率不同的其他类型的波特率数据传输到子设备。
它也可用于减少时间延迟至子控制器。
FPGA(现场可编程门阵列)正被广泛使用和在数字电路设计中发挥着越来越重要的角色。
它的可编程特性使电路设计更加灵活,缩短产品上市时间。
采用FPGA技术可以提高系统的集成度,可靠性,减少电力消耗。
FPGA是一般用于实现简单的接口电路或复杂的状态机,以满足不同的系统要求。
本文使用ALTERA公司生产的FPGAEP1C6Q和FIFO技术设计的波特率转换器,以便在不同的波特率设备之间实施通信。
先进先出堆栈通常用于时钟交叉域安全通过从一个时钟域数据到另一个异步时钟域。
使用先进先出通过从一个时钟域数据到另一个时钟域需要多异步时钟设计技术。
有不同的方法来设计一个FIFO的权利。
本文详细的方法之一就是用来设计,综合和分析两种不同的时钟采用格雷码域安全的FIFO。
在一些系统,如高速数据采集系统,基于PCI总线高速控制系统,和多DSP信号处理系统,FIFO是用来完成高速设备和低速设备之间的通信交流或完成同一子控制器的通信交流先进先出是这些系统的最重要组成部分,它可以作为不同设备之间的桥梁[3,4]。
同样,在我们的控制器,基于FPGA的异步FIFO也是最重要的部分。
因此,异步FIFO的功能和特征决定了我们的控制器特性。
FIFO可用于完成并行或串行端口通信。
二,设计异步FIFO
A、FIFO导言
异步FIFO指的是设计一个FIFO,使其在一个时钟域,将数据值写入FIFO缓冲区,在另一个时钟域从相同的FIFO缓冲区读取数据值,其中两个时钟域异步对方。
FIFO总是用于数据缓存——储存的频率或异步信号的相位差。
异步FIFO经常被用来快速
安全地将数据从一个时钟域传输到另一个异步时钟域。
在异步时钟电路,时钟周期和每个时钟域阶段是完全独立的,因此数据丢失的可能性始终不为零。
本文介绍的设计与高读/写速度和高可靠性的FPGA的FIFO的方式。
一般来说,一个FIFO包括一个内存阵列块,一个状态栏,写入点(WR-ptr)和读取点(RD-ptr)结构如图2。
带有单独的读,写内存阵列端口是用来存储数据。
写指针指向将写入下一个位置,和读指针指向将要读目前所在的位置。
写操作递增写指针和一个读操作读指针递增。
上电复位,两个指针被重置为零,FIFO为空。
写指针正好是下一个FIFO的位置写入和读取器的指针指向无效数据。
状态块的作用是为FIFO产生“Empty”和“Full”信号。
如果“Full”是有效的,则FIFO无法容纳更多的数据,而“Empty”是有效的,则FIFO不能提供更多的数据读出。
图二、异步FIFO结构图当数据写入FIFO时,“wclk”将被用作时钟域,当从FIFO读取数据,“rclk”将被用作时钟域。
这两个时钟域是异步的。
在设计异步FIFO过程中,有两个困难不容忽视。
一是如何根据写指针和读指针判断FIFO的地位;二是如何设计的电路同步异步时钟域,以避免亚稳态。
B、“Empty”状态和“Full”状态的FIFO
创建“Empty”和“Full”信号是设计一个FIFO最重要的部分。
无论在什么情况下,读、写指针不能指向FIFO的同一地址。
因此,“Empty”和“Full”信号先进先出内发挥非常重要的角色,他们阻止进一步读取或分别写入。
一般来说,在一个普通的FIFO,当读指针等于写指针时,FIFO状态为“Empty”。
但是,在一个循环的FIFO中,当指针相等时,它要么是Empty状态,要么是“Full”。
由于“Empty”和“Full”信号,不仅可以由指针的价值决定,也将受到使指针变为平等的操作的影响。
如果复位或读使指针等于对方,则FIFO就真正“Empty”。
如果写入使指针相等时,FIFO就“Full”[5]。
为了确切地知道FIFO是否已满或为空,我们可以设置指示标志不断跟踪是什么原因使指针变成彼此相等。
该标志告诉状态电路中的FIFO正在前进的方向。
方向标志的执行有一些复杂,那因为你必须设置“goingtowardfull”和“goingtowardempty”起点位置。
在本文,这种方法是不是另一个设计用来区分充分和空是技术添加一个额外的比特每个指针。
长度为n的指针等于log2(数组大小)。
数组大小是_FIFO所需长度。
例如,当设置数组大小为64字节(8位1字节)的FIFO时,写和读指针'长度为log264=6。
当n是地址数量位需要访问整个FIFO存储器缓冲区时,使用N+1位指针。
当两个包括最高位指针是相等时,则FIFO为“Empty”。
同时当两个不包括最高位指针相等时,则FIFO为“Full”。
正如图3显示,当数组大小为8字节,则需要访问整个FIFO存储器缓冲区地址位数为4。
通过增设一个地址位,“Empty”和“Full”信号可以轻松地创建[5,6]。
图三、FIFOFull和Empty的条件
状态块从根本上执行两个指针操作,而且这些操作属于两个不同的时钟域。
这就是导致实际困难的原因。
如果你进行采样读指针和写指针(或反之亦然),你将有可能遇到称为亚稳态的问题。
亚稳态是物理现象,发生在一个事件试图抽样另一事件时。
在物理电路的稳态输出的不确定性的原因既可以是一个逻辑1或逻辑0或两者之间的东西。
在物理系统,通过另一事件抽样一件事件会产生不可预知的结果。
不可预测性也意味着另一种现象,这是亚稳态构成的真正的危险。
消除由亚稳态造成这类问题是设计一个FIFO的难点。
[5,7]
C、解决亚稳态
亚稳态可能导致FIFO的不可预知的问题,所以在设计阶段,我们应该尽力减少亚稳态。
如果异步元素在一个系统,亚稳态是不可避免的。
还绝对没有办法彻底消除亚稳态,所以我们做的是计算出错误的“可能性”,并表示,即在这一点时间上的ie。
MTBF(平均故障间隔时间)。
MTBF是失败的概率统计方法,并要求一些更复杂的,经验的和实验的数据得出。
在D触发器中,当t=0时,输入信号瞬间从0变化到1时,Q值是不确定的。
这就是亚稳态。
在FIFO,它需要抽样一个用同步时钟计数器计算的计数器的值。
因此,将面临计数器从FFFF转0000和每一位变为亚稳态的情况。
这意味着计数器将有可能读出FFFF至0000之间的任何数据并且FIFO的值不起作用。
必须做的最重要的工作是确保并非所有计数器的位的改变将会同时进行。
为了尽量减少此类错误的发生率,我们应该确保一个位的变化正是每次计数器递增。
因此,我们需要一个计数器,用Gray码计数。
Gray码是以人名命名的,那人原本在1953年获得专利的程序代码,叫FrankGray。
Gray码不同于二进制代码,它是每一个值不同于只在一个位的位置上的值。
二进制代码和Gray码之间的转换如下:
(1)
和
(2)
有多种方法来设计一个Gray计数器,并且本文详细描述了简单和直接的方法来做设计。
本文描述的这项技术使用只有一个触发器的格雷码计数器,如图4所示。
在一个FIFO中,Gray码转换为二进制代码,使它递增并将其转换回Gray码并储存。
Gray码计数器假设寄存器位的产出就是Gray码值。
在Gray输出值然后传递到Gray二进制转换器.这是通过一个二进制加法器产生下一个二进制值,是传递给Gray二进制转换器,它生成下一个二进制格雷码值存储在寄存器里。
图四、Gray计数器结构
第一个要记住的关于Gray码的事实是,任何两个相邻的字码的距离仅是1(只有1位就可以从Gray数值到下一个)。
第二个要记住的关于Gray码的事实是,最有用的Gray码计数器必须在计数序列中有2次幂。
三、实现一个多通道UART控制器
A、硬件结构
在多通道控制器,有不同的块包括UART的块,状态检测,异步FIFO块和波特率发生器块。
每个块在控制器中都有不同功能。
第一部分是异步电路块,其结构如图5所示。
它由三部分组成接收电路,传输电路和控制/状态寄存器。
发射电路由一个发送缓冲器和移位寄存器组成。
发送缓冲器加载数据从本地的CPU传送出去。
移位寄存器接收发送缓冲区的数据并将其一位接一位发送到TxD引脚。
接收电路由一个接收移位寄存器和一个接收缓冲区组成。
接收移位寄存器一位接一位接收来自RxD的数据。
接收缓冲区从远距离MCU加载数据,并为本地PC读数做好准备。
图五、UART的块结构
控制寄存器是一个具有特殊功能的寄存器,它用于控制UART和说明它的地位。
根据每个位的值,UART会选择不同的通信方式,且UART知道该怎么接收或传输数据。
FIFO用于存储从PC机接收到的数据和为亚MCU做准备。
当FIFO写入数据和读取数据时,我们可以根据PC和MCU的波特率设置不同的时钟域。
因此,它可以用来实现在不同波特率下,MCU之间的通信。
该控制器还拥有一个波特率发生器模块,产生不同的波特率,满足不同类型系统的要求。
它由定时器(32/16位定时器)构成,分频器和波特率设置寄存器。
采用FIFO技术和如前所述的COM模块,我们设计了多通道控制器。
它可用于执行复杂的系统中MCU之间的通信。
它也可以用来完成高速设备和低速设备之间的通信。
控制器的结构如图6所示。
该控制器是被建立在一个FPGA-EP1C6Q240上的,而它是基于由ALTERA公司生产的SRAM的技术上的。
很可能设计规模小的存储器,如FIFO。
在FPGA中设计FIFO时,你应该考虑FIFO的实际容量,还要考虑到FPGA容量。
图六、结构控制器
B、软件结构
您可以在VerilogHDL语言中使用软件代码,来设计FPGA的硬件结构,它可以很容易地创建和调整以满足应用的需要。
有一个用与和PC或其他主要MCU通信的UART,也有4个另外的UART控制器用来与亚MCU通信。
每个通道有两个FIFO,一个是接收数据的,另一个是传输数据的。
每个FIFO的深度是64字节。
该软件流程图如图7所示。
图七、该软件的流程图
正如图7所示,当FIFO已满时,你无法再在FIFO中写入字节了。
在这个时候,状态探测器将竖起CS以指示该FIFO已满,且停止写入FIFO。
当FIFO为空,你无法从中读取了。
然后,状态探测器将竖起Empty以指示FIFO的状态,并停止读出。
当FIFO不满也不空时,它将根据控制命令被写入或读取数据。
完成所有写入或读取操作将以后,它将直到下次访问到来时才停止。
四、仿真和验证
要验证控制器的设计,一个测试台已被写入在Modelsim中核查。
从PC或其他主要MCU接收到的数据将被存储在FPGA的FIFO中直到控制器接到让控制器发送数据到子控制器的命令。
然后,控制器将根据理想命令设置一种波特率。
正如图8所示,该控制器是接收数据,并存储接收到的不同等待被读的FIFO数据。
图八、接受序列
当子控制器必须接受在不同波特率下的数据,该控制器可以设置每一个在必要的波特率下的通道来传输数据。
转交序列,如下图9所示。
该控制器在同一时间不同波特率下发送数据。
图九、不同波特率产生的序列
图十、相同波特率产生序列
我们设计的VerilogHDL语言的4个通道是完全相同的结构用always块实现通信。
所以在理论上,当控制器在同一时间传输数据到子控制器时,在子控制器之间不存在时间上的分歧。
但事实上,存在FPGA中硬件的延误,这些延误可能导致子控制器不能同时精确地接收控制器的数据。
与RS485的延误相比,这些延误可以被忽略。
因此,使用这种控制器可以大大提高子控制器的同步性[8,9]。
五、结论
本文介绍了一种方法来设计基于FPGA上的同步FIFO。
并利用同步FIFO的技术实现了FPGA的多通道UART控制器,它以高速和高可靠性的SRAM为基础。
该控制器可用于实现复杂系统与不同波特率的子控制器之间的通讯。
它也可用于减少复杂的控制系统中子控制器之间的时间延迟,以提高各子同步控制器。
该控制器可配置,可扩展。
基于SRAM的FPGA缺点是可重配置的,所以控制器的缺点就在于它会容易受到来自周围环境的辐射和短时脉冲的影响。