FPGA中竞争冒险问题的研究

2024-01-17 20:18
文章标签 问题 fpga 竞争 研究 冒险

本文主要是介绍FPGA中竞争冒险问题的研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 引言
     现场可编程门阵列(FPGA)在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑功能。 FPGA可以替代其他PLD或者各种中小规模数字逻辑芯片在数字系统中广泛应用,也是实现具有不同逻辑功能ASIC的有效办法。FPGA是进行原型设计最 理想的载体,原型机的最初框架和实现通过PFGA来验证,可以降低成本、缩短开发周期。利用FPGA的可重配置功能,可以在使用过程中,在不改变所设计的 设备的硬件电路情况下,改变设备的功能。但和所有的数字电路一样,FPGA电路中也存在毛刺问题。它的出现会影响电路工作的可靠性、稳定性,严重时会导致 整个数字系统的误动作和逻辑紊乱。在此详细论述了解决此问题的多种方法。

2 FPGA的功能和结构特点
2.1 FPGA的功能
    FPGA的功能由逻辑结构的配置数据决定,在工作时,这些配置数据存放在片内的SRAM或者熔丝图上。使用SRAM的FPGA器件,在工作前需要从芯片外 部加载配置数据,这些配置数据可以存放在片外的EPROM或其他存储体上,人们可以控制加载过程,在现场修改器件的逻辑功能。


图1     实际逻辑电路


图2 LUT的实现方式

2.2 FPGA的结构特点
    FPGA使用了可编程的查找表(Look Up Table ,LUT)结构,LUT是可编程的最小逻辑构成单元。大部分FPGA采用基于SRAM的查找表逻辑形成结构,就是用SRAM(静态随机存储器)来构成逻辑 函数发生器。图1、2分别是4输入LUT的实际逻辑电路和LUT的实现方式。FLEX10KE系列器件的结构和工作原理在Altera的FPGA器件中具 有典型性,下面以此类器件为例,介绍PFGA的结构。其内部结构如图3所示:


图3      FLEX10KE内部结构

    FLEX10KE内部结构包含嵌入式阵列块(EAB,Embedded Array Block)、逻辑阵列块(LAB,Logic Array Block)、快速通道(Fast Track)互连和输入/输出单元(I/O Element,IOE)四部分。
(1) 嵌入式阵列用来实现各种存储器及复杂的逻辑功能,如数字信号处理、微控制器等。嵌入式阵列由一系列嵌入式阵列块(EAB)构成。EAB是在输入输出口上具有寄存器的能变形的RAM块。
(2) 逻辑阵列用来实现普通逻辑功能,如计数器、加法器、状态机等。逻辑阵列由一系列逻辑阵列块(LAB)构成。每个LAB包含八个LE和一些局部互连。LAB 构成了FLEX10KE的“粗粒度”结构,有利于EDA软件进行布局布线,优化器件的利用,提高性能。LE是FLEX10KE结构中的最小单元,每个LE 含有一个4输入查找表(LUT)、一个带有同步使能的可编程触发器(Programmable Register)、一个进位链(Carry Chain)和一个级连链(Cascade)。每个LE都能驱动LAB局部互连(LAB Local Interconnect)和快速通道互连(Fast Track Interconnect)。LE的内部结构如图4所示。


图4     逻辑单元(LE)内部结构

(3) 器件内部信号的互连和器件引出端之间的信号互连由快速通道(FastTrack)连线提供,FastTrack遍布于整个FLEX10KE器件,是一系列水平和垂直走向的连续式布线通道。FastTrack互连是一系列贯通器件行、列的快速连接通道。
(4) I/O引出端由一些I/O单元(IOE)驱动。IOE位于快速通道的行和列的末端,每个IOE有一个双向I/O缓冲器和一个既可做输入寄存器也可做输出寄存器的触发器。

3 竞争冒险

在组合电路中,当逻辑门有两个互补输入信号同时向相反状态变化时,输出端可能产生过渡干扰脉冲的现象,称为竞争冒险。

3.1 FPGA中产生竞争冒险的原因

信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等 条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺 序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为“毛刺”。如果一个组合逻辑电路中有“毛刺”出现,就说明该电路存在“冒 险”。(与分立元件不同,由于PLD内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在PLD、FPGA 设计中尤为突出)

3.2 FPGA中竞争冒险的危害

图5给出了一个逻辑冒险的例子,从图6的仿真波形可以看出,“A、B、C、D”四个输入信号经过布线延时以后,高低电平变换不是同时发生的,这导致输出信 号“OUT”出现了毛刺。而当数据完全稳定的时候,毛刺信号也就自然消失了。可以概括的讲,只要输入信号不同时变化,(经过内部走线)组合逻辑必将产生毛 刺。将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的,这可能会导致严重的后果。而现在FPGA设计中的信号往往是由时钟控制的,多 数据输入的复杂运算系统,甚至每个数据都由相当多的位数组成。这时,每一级的毛刺都会对结果有严重的影响,如果是多级的设计,那么毛刺累加后甚至会影响整 个设计的可靠性和精确性。时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒 险是设计人员必须要考虑的问题。


图5 一个逻辑冒险的例子


图6 仿真波形


任何组合电路、反馈电路和计数器都可能是潜在的毛刺信号发生器。毛刺并不是对所有输入都有危害,如触发器的D输入端,只要毛刺不出现在时钟的上升沿并满足 数据的建立保持时间,就不会对系统造成危害。而当毛刺信号成为系统的启动信号、控制信号、握手信号,触发器的清零信号(CLEAR)、预置信号 (PRESET)、时钟输入信号(CLK)或锁存器的输入信号就会产生逻辑错误。任何一点毛刺都可能使系统出错。

3 毛刺的消除

3.1 利用冗余项消除毛刺

函数式和真值表所描述的是静态逻辑,而竞争则是从一种稳态到另一种稳态的过程。因此竞争是动态过程,它发生在输入变量变化时。此时,修改卡诺图,增加多余 项,在卡诺图的两圆相切处增加一个圆,可以消除逻辑冒险。但该法对于计数器型产生的毛刺是无法消除的。<

3.2 采用格雷码

我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。

3.3 采样法

由于冒险出现在变量发生变化的时刻,如果待信号稳定之后加入取样脉冲,那么就只有在取样脉冲作用期间输出的信号才能有效。这样可以避免产生的毛刺影响输出波形。

一般说来,冒险出现在信号发生电平转换的时刻,也就是说在输出信号的建立时间内会发生冒险,而在输出信号的保持时间内是不会有毛刺信号出现的。如果在输出信号的保持时间内对其进行“采样”,就可以消除毛刺信号的影响。

有两种基本的采样方法:一种方法是在输出信号的保持时间内,用一定宽度的高电平脉冲与输出信号做逻辑“与”运算,由此获取输出信号的电平值。图7说明了这 种方法,采样脉冲信号从输入引脚“SAMPLE”引入。油?的仿真波形上可以看出,毛刺信号出现在“TEST”引脚上,而“OUT”引脚上的毛刺已被消除 了。


图7   采样法一


图8   采样法一仿真波形


上述方法的一个缺点是必须人为的保证sample信号必须在合适的时间中产生,另一种更常见的方法是利用D触发器的D输入端对毛刺信号不敏感的特点,在输 出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。图9给出了这种方法的示范电路,图 10是仿真波形。在仿真时,我们也可能会发现在FPGA器件对外输出引脚上有输出毛刺,但由于毛刺很短,加上PCB本身的寄生参数,大多数情况下,毛刺通 过PCB走线,基本可以自然被虑除,不用再外加阻容滤波。



图9     采样法二


图10      采样法二仿真波形


3.4 吸收法  

增加输出滤波,在输出端接上小电容C可以滤除毛刺,图11所示。但输出波形的前后沿将变坏,在对波形要求较严格时,应再加整形电路,该方法不宜在中间级使用。


图11     吸收法消除毛刺图

3.5 延迟办法

因为毛刺最终是由于延迟造成的,所以可以找出产生延迟的支路。对于相对延迟小的支路,加上毛刺宽度的延迟可以消除毛刺。当需要对某一信号作一段延时时,初 学者往往在此信号后串接一些非门或其它门电路,此方法在分离电路中是可行的。但在FPGA中,开发软件在综合设计时会将这些门当作冗余逻辑去掉,达不到延 时的效果。用Altera公司的 MaxplusII开发FPGA时,可以通过插入一些LCELL原语或调用延时线模块来产生一定的延时,但这样形成的延时在FPGA芯片中并不稳定,会随 温度等外部环境的改变而改变,因此并不提倡这样。在此,可以用高频时钟来驱动一移位寄存器,待延时信号作数据输入,按所需延时正确设置移位寄存器的级数, 移位寄存器的输出即为延时后的信号。在此以实现双口RAM的读写时序中IDT7132的读时序为例,时序图如图12所示。无论用CE还是OE来控制读取, 都需要CE或OE保持一段低电平。令OE保持低电平,CE平时为高电平,读双口RAM时触发CE变为低电平,延迟一小段时间再恢复高电平。本设计产生这段 延时的方法是用高频计数器产生,具体方法为:在FPGA中设计一个计数器,取系统可用的高频时钟(周期小于所需延时)驱动它计数,计到设定好的终值时产生 触发脉冲。不同的计数终值可以产生不同的延时。此方法所产生的延时为高频时钟周期的整数倍,若高频时钟周期与所需延时相比很小,则延时较精确,否则只能做 一粗略的延时。


图12     双口RAM IDT7132读操作时序图

4 FPGA设计中避免毛刺的其他注意事项

4.1 电路选用

要用寄存器和触发器设计电路,尽量不要用锁存器,因它对输入信号的毛刺太敏感。如果坚持用锁存器设计必须保证输入信号绝对没有毛刺,且满足保持时间。

4.2 译码器

设计设计译码逻辑电路时必须十分小心,因为译码器和比较器本身会产生尖峰,容易产生毛刺,把译码器或比较器的输出直接连到时钟输入端或异步清除端,会造成严重的后果。

4.3 避免隐含RS触发器

应该尽量避免隐含RS触发器的出现。一般要控制输出被直接反馈到输入端,采用反馈环路会出现隐含RS触发器,其对输入尖峰和假信号很敏感,输入端有任何变 化都有可能使输出值立刻改变,此时易造成毛刺的产生,导致时序的严重混乱。一旦具有隐含的RS触发器,加锁存器消除毛刺是不能解决问题的。此时只有通过全 面修改电路来从根本上解决。

4.4 避免使用多时钟设计

每一个模块中只用一个时钟,避免使用多时钟设计,同时避免使用主时钟分频后的二次时钟作为时序器件的时钟输入,因为二次时钟相对于一次时钟可能存在过大的 时钟歪斜。对所有模块的输入时钟、输入信号、输出信号都用D触发器或寄存器进行同步处理,即输出信号直接来自触发器或寄存器的输出端。这样可以消除尖峰和 毛刺信号。不论是控制信号还是地址总线信号、数据总线信号,都要采用另外的寄存器,以使内部歪斜的数据变成同步数据。这些表面上看似乎无用的操作可以大大 提高电路系统的性能。

4.5 避免使用延迟线

应该尽量避免使用延迟线,因它对工艺过程的变化极为敏感,会大大降低电路的稳定性和可靠性,并将为测试带来麻烦。

4.6 充分利用资源

大部分FPGA器件都为时钟、复位、预置等信号提供特殊的全局布线资源,要充分利用这些资源。这样可以减少电路中的毛刺并且大大提高设计电路的性能.

4.7 不要期望仿真器替你找到毛刺错误

注意仿真结果和实际综合的电路的不一致性。无论是时序电路还是异步逻辑电路,其行为与其仿真器结果都是不完全一样的。特别是异步逻辑电路,仿真结果将会隐 藏竞争冒险和毛刺现象,与实际行为相差较远。故在FPGA设计中,对每一个逻辑门、每一行VHDL (Verilof)语言,必须完全理解,不要期望仿真器替你找到错误。

使用FPGA开发数字电路,可以大大缩短设计时间、减少PCB 面积、提高系统的可靠性。它的这些优点使得FPGA技术得到飞速的发展,已经在通信、电子、信号处理、工业控制等领域被广泛应用。随着FPGA容量的增 加,SOPC (可编程芯片上系统)SOPC(对信号的处理和整个系统的控制)的应用时代即将到来。SOPC既有嵌入处理器、I/O电路和大规模嵌入存储器,也有 CPLD/FPGA,用户可以选择。同时也可以选择PLD公司提供的FPGA IP Intellectual Property内核。使用IP核能保证系统级芯片的开发效率、质量,并能大大缩短产品开发时间。

5 结束语

FPGA已成为解决系统级设计的重要选择方案之一。因而毛刺是设计系统中不可忽视的问题,实际电路中它常惹出很多的麻烦。本文结合FPGA的特点,论述了如何解决FPGA设计中的毛刺问题。增强电路的稳定性和可靠性,并为实际电路的测试带来方便。


这篇关于FPGA中竞争冒险问题的研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617091

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明