收藏 分销(赏)

电路设计中的毛刺问题的研究.docx

上传人:可**** 文档编号:1647882 上传时间:2024-05-07 格式:DOCX 页数:16 大小:214.41KB 下载积分:10 金币
下载 相关 举报
电路设计中的毛刺问题的研究.docx_第1页
第1页 / 共16页
电路设计中的毛刺问题的研究.docx_第2页
第2页 / 共16页


点击查看更多>>
资源描述
FPGA电路设计中的毛刺问题的研究 目 录 1 引言 1 2 FPGA的相关概念 1 2.1 FPGA的基本特点 1 2.2 FPGA的工作原理 2 3 简述FPGA电路中毛刺的产生 2 3.1 毛刺产生的原因 2 3.2 毛刺产生条件的分析 4 4 毛刺的消除方法 4 4.1 冗余项法 4 4.2 采样法 5 4.3 吸收法 5 4.4 延迟法 5 4.5状态机控制法 5 4.6 硬件描述语言法 6 5 实例 7 5.1 输出加D触发器 9 5.2在有限状态机的基础上采用时钟同步信号 10 5.3直接把状态机的状态码作为输出信号 13 6 结语 15 参考文献 16 致 谢 17 FPGA电路设计中的毛刺问题的研究 摘要:目前,FPGA器件已经越来越广泛地应用在数字电路设计等领域,但它的毛刺问题却成为一个影响其可靠性和精确性的重要因素。本文探讨了毛刺产生的原因及产生的条件,以计数器和乘法器为例对解决方案进行了深入具体地分析,总结了多种不同的解决方法,并且通过仿真说明这几种方法能够有效地消除或在一定程度上减少数字电路设计中出现的毛刺。 Burr problem of FPGA circuit design research Abstract: The FPGA device at present, already more and more widely used in the field of digital circuit design and so on, but the burr problem has become one of important factors affecting its reliability and accuracy. Burr phenomenon is very common in the FPGA design, and the emergence of the burr tends to lead to the system results error. This paper discusses the cause of burr and the creation of conditions, to counter and multiplier as an example for solutions conducted in-depth analysis in detail, summarizes the different types of solutions, and through the simulation shows that these methods can effectively eliminate or reduce to a certain extent burr in digital circuit design. Key words:FPGA; Burr; Sampling; Competition adventure 1 引言 随着半导体技术的飞速发展,FPGA(Field Programmable Gate Array)的计算能力、容量及其可靠性也有了大幅的提高。本文FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上更进一步发展的产物。它作为专用集成电路(ASIC)领域中的一种半定制电路,既处理了定制电路的不到位,又克服了原有可编程器件门电路数量有限的缺点。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新的概念,里边包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分[1]。 2.1 FPGA的基本特点 主要有: 1)采用FPGA设计ASIC电路,用户不需投资生产,就能得到合适的芯片。 2)FPGA也可做其它全定制或半定制ASIC电路中的试样片。 3)FPGA内部有丰富的触发器和I/O引脚。 4)FPGA是ASIC电路中设计周期最短、研发费用最低并且风险最小的器件之一。 5)FPGA采用高速CHMOS工艺,功耗低,可与CMOS、TTL等电平兼容。 综上所诉,无疑FPGA芯片是小批量系统(System)、提高系统(System)集成度、可靠性的上好选择之一。目前FPGA的品种繁多,有XILINX的XC系列、TI公司的TPC系列、ALTERA公司的FIEX系列等等。 2.2 FPGA的工作原理 FPGA的工作状态是由存放在片内RAM中的程式来设置的,因此,工作时需对其片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。加电时,FPGA芯片将EPROM中数据读入片内的编程模块RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA则还原成白片,里边的所有逻辑关系消失,因此,FPGA芯片能够反复使用。FPGA的编程不需要专用的FPGA编程器,通用的EPROM、PROM编程器即可。如需修改FPGA功能,只需要换一片EPROM即可。这样,同一片FPGA,不同的编程数据,还可产生不同的电路功能。因此,FPGA的用法非常灵活。 FPGA有多种配置模式: 1)并行主模式,一片FPGA加一片EPROM的方式; 2)主从模式可支持一片PROM对多片FPGA进行编程; 3)串行模式可采用串行PROM编程FPGA; 4)外设模式可将FPGA作为微CPU的外部设备,由微CPU对其进行编程。 3 简述FPGA电路中毛刺的产生 我们知道,信号在FPGA器件中通过逻辑单元连线时,一定会存在延时。延时的大小不仅仅和连线的长短、逻辑单元的数目有关,还和器件的制造工艺、工作环境等有很大的关系。因此,信号在FPGA中传输的时候,所需的时间是不能精确估算的,当多路信号同时发生跳变的瞬间,就会产生“竞争冒险”。此时,往往会出现一些不正确的小的尖峰信号,这些尖峰信号就叫做“毛刺”。另外,由于FPGA及其它CPLD器件内部的电容和电感对电路中的毛刺几乎没有过滤作用,最终这些毛刺信号就会被“保留”并传递到下一级,从而使得毛刺问题更为突出。 可见,即使在最简单的逻辑运算中,如果出现多路信号同时发生跳变的情况,在通过内部走线后,就一定会产生毛刺。然而现在用在数字电路设计和数字信号处理中的信号常常是由时钟来控制的,在多数据输入的复杂运算系统,甚至每个数据都是由相当多的位数组成。此时,每一级产生的毛刺都会对结果有严重的影响,如果设计是多级的,那么毛刺的累加甚至会影响整个设计的可靠性和精确性。下面我们将以乘法运算电路来说明毛刺的产生以及消除[2]。 3.1 毛刺产生的原因 4 毛刺的消除方法 状态机控制法 对于大型的数字电路设计,状态机是一种非常理想的选择,能使运行性能和硬件资源的占用达到最佳的优化,另外灵活的使用状态机也可以实现信号的同步和消除毛刺的目的。在数据传递比较复杂的多模块系统中,由状态机在特定的时刻分别发出控制特定模块的时钟信号或者模块使能信号,状态机的循环控制就可以使得整个系统协调运作,同时减少毛刺信号。那么只要我们在状态机的触发时间上加以处理,就可以避免竞争冒险,从而抑制毛刺的产生。原理如图6-1所示。 图6-1状态机控制原理 首先,我们来设计一个简单的4位乘法器。其程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mul4 IS PORT(a,b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END mul4; ARCHITECTURE behave OF mul4 IS signal c0,c1,c2,c3:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(a,b,c0,c1,c2,c3) BEGIN IF b(0)='0' THEN c0<="0000"; ELSE c0<=a; end if; IF b(1)='0' THEN c1<="0000"; ELSE c1<=a; end if; IF b(2)='0' THEN c2<="0000"; ELSE c2<=a; end if; IF b(3)='0' THEN c3<="0000"; ELSE c3<=a; end if; y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000"); END PROCESS; END behave; 仿真结果如图5-1: 图5-1四位乘法器仿真结果 如上图所示,如果在不加任何的去除毛刺的措施的时候,我们可以看到结果y中含有大量的毛刺。产生的原因就是每个输入(a和b)的各个数据线上的数据都不可能保证能够同时到达,也就是说在时钟读取数据线上的数据的时候,往往有的数据线上读取的已经是新的数据了,而有的数据线上读取的仍然是上一个数据,无疑这样会产生毛刺信号,而当数据完全稳定的时候,毛刺信号也就自然消失了[8]。 5.1 输出加D触发器 前面我们也有讲到,这是一种比较传统的去除毛刺的方法。原理就是用一个D触发器去读取带毛刺的信号,利用D触发器对于输入信号的毛刺不敏感的特点,去除信号中的毛刺。这是一种在简单逻辑电路中常见的方法,尤其是对于信号中发生在非时钟跳变沿的毛刺信号,其去除效果非常的明显。 但是对于大多数的时序电路来讲,毛刺信号往往是发生在时钟信号的跳变沿,这样,D触发器的效果就不是那么明显了(见图5-2,加D触发器以后的输出D_OUT,仍含有毛刺)。另外,D触发器的使用还会给系统带来一定的延时,尤其是在系统级数较多的情况下,延时也将会随之变大,因此,在使用D触发器去除毛刺的时候,一定要视情况而定,并不是所有的毛刺信号都可以利用D触发器来消除[9]。 程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY mul4 IS PORT( D_IN :IN STD_LOGIC; CLK :IN STD_LOGIC; D_OUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0); a,b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); y:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0)); END mul4; ARCHITECTURE behave OF mul4 IS signal c0,c1,c2,c3:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(a,b,c0,c1,c2,c3,clk) BEGIN IF b(0)='0' THEN c0<="0000"; ELSE c0<=a; end if; IF b(1)='0' THEN c1<="0000"; ELSE c1<=a; end if; IF b(2)='0' THEN c2<="0000"; ELSE c2<=a; end if; IF b(3)='0' THEN c3<="0000"; ELSE c3<=a; end if; y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000"); IF CLK'EVENT AND CLK = '1' THEN Q(0)<=y(0); FOR I IN 1 TO 7 LOOP Q(I) <= y(I-1); END LOOP; END IF; D_OUT <= Q; END PROCESS; END behave; 仿真结果: 图5-2加D触发器后仿真结果 5.2在有限状态机的基础上采用时钟同步信号 在有限状态机的基础上采用时钟同步信号,即把时钟信号引入组合进程。状态机每一个输出信号都经过附加的输出寄存器,并由时钟信号同步,因而保证了输出信号没有毛刺。这种方法存在一些弊端:由于增加了输出寄存器,硬件开销增大,这对于一些寄存器资源较少的目标芯片是不利的,从状态机的状态位到达输出需要经过两级组合逻辑,这就限制了系统时钟的最高工作频率,由于时钟信号将输出加载到附加的寄存器上,所以在输出端得到信号值的时间要比状态的变化延时一个时钟周期[10]。 例如Mealy型状态机,其主要程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MEALY1 IS PORT ( CLK ,DATAIN,RESET : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); END MEALY1; ARCHITECTURE behav OF MEALY1 IS TYPE states IS (st0, st1, st2, st3,st4); SIGNAL STX : states ; BEGIN COMREG : PROCESS(CLK,RESET) BEGIN --决定转换状态的进程 IF RESET ='1' THEN STX <= ST0; ELSIF CLK'EVENT AND CLK = '1' THEN CASE STX IS WHEN st0 => IF DATAIN = '1' THEN STX <= st1; END IF; WHEN st1 => IF DATAIN = '0' THEN STX <= st2; END IF; WHEN st2 => IF DATAIN = '1' THEN STX <= st3; END IF; WHEN st3=> IF DATAIN = '0' THEN STX <= st4; END IF; WHEN st4=> IF DATAIN = '1' THEN STX <= st0; END IF; WHEN OTHERS => STX <= st0; END CASE ; END IF; END PROCESS COMREG ; COM1: PROCESS(STX,DATAIN) BEGIN --输出控制信号的进程 CASE STX IS WHEN st0 => IF DATAIN = '1' THEN Q <= "10000" ; ELSE Q<="01010" ; END IF ; WHEN st1 => IF DATAIN = '0' THEN Q <= "10111" ; ELSE Q<="10100" ; END IF ; WHEN st2 => IF DATAIN = '1' THEN Q <= "10101" ; ELSE Q<="10011" ; END IF ; WHEN st3=> IF DATAIN = '0' THEN Q <= "11011" ; ELSE Q<="01001" ; END IF ; WHEN st4=> IF DATAIN = '1' THEN Q <= "11101" ; ELSE Q<="01101" ; END IF ; WHEN OTHERS => Q<="00000" ; END CASE ; END PROCESS COM1 ; END behav; 其时序仿真波形如图5-3所示: 图5-3 Mealy型有限状态机的仿真时序图 不难看出有毛刺现象,采用时钟同步信号,将输出的Q值由时钟信号锁存后在输出,改进后的Mealy型状态机,其主要程序如下: LIBRARY IEEE; --MEALY FSM USE IEEE.STD_LOGIC_1164.ALL; ENTITY MEALY2 IS PORT ( CLK ,DATAIN,RESET : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); END MEALY2; ARCHITECTURE behav OF MEALY2 IS TYPE states IS (st0, st1, st2, st3,st4); SIGNAL STX : states ; SIGNAL Q1 : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN COMREG : PROCESS(CLK,RESET) --决定转换状态的进程 BEGIN IF RESET ='1' THEN STX <= ST0; ELSIF CLK'EVENT AND CLK = '1' THEN CASE STX IS WHEN st0 => IF DATAIN = '1' THEN STX <= st1; END IF; WHEN st1 => IF DATAIN = '0' THEN STX <= st2; END IF; WHEN st2 => IF DATAIN = '1' THEN STX <= st3; END IF; WHEN st3=> IF DATAIN = '0' THEN STX <= st4; END IF; WHEN st4=> IF DATAIN = '1' THEN STX <= st0; END IF; WHEN OTHERS => STX <= st0; END CASE ; END IF; END PROCESS COMREG ; COM1: PROCESS(STX,DATAIN,CLK) --输出控制信号的进程 VARIABLE Q2 : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN CASE STX IS WHEN st0=> IF DATAIN='1' THEN Q2 :="10000"; ELSE Q2:="01010"; END IF; WHEN st1=> IF DATAIN='0' THEN Q2 :="10111"; ELSE Q2:="10100"; END IF; WHEN st2=> IF DATAIN='1' THEN Q2 :="10101"; ELSE Q2:="10011"; END IF; WHEN st3=> IF DATAIN='0' THEN Q2 :="11011"; ELSE Q2:="01001"; END IF; WHEN st4=> IF DATAIN='1' THEN Q2 :="11101"; ELSE Q2:="01101"; END IF; WHEN OTHERS => Q2:="00000" ; END CASE ; IF CLK'EVENT AND CLK = '1' THEN Q1<=Q2; END IF; END PROCESS COM1 ; Q <= Q1 ; END behav; 其时序仿真波形如图5-4所示,改进后毛刺不复存在。 图5-4 改进后Mealy型有限状态机的仿真时序图 5.3直接把状态机的状态码作为输出信号 直接把状态机的状态码作为输出信号,即采用状态码直接输出型状态机, 使状态和输出信号一致,使得输出译码电路被优化掉了,因此不会出现竞争冒险。这种方案,占用芯片资源少,信号与状态变化同步,因此速度快,是一种较优方案。但在设计过程中对状态编码时可能增加状态向量,出现多余状态。虽然可用CASE语句中WHENOTHERS来安排多余状态,但有时难以有效控制多余状态,运行时可能会出现难以预料的情况。因此它适用于状态机输出信号较少的场合[11]。 若对AD0809的采样控制采用状态码直接输出型状态机方案,其程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY AD0809 IS PORT (D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK ,EOC : IN STD_LOGIC; ALE, START, OE, ADDA : OUT STD_LOGIC; c_state : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END AD0809; ARCHITECTURE behav OF AD0809 IS SIGNAL current_state, next_state: STD_LOGIC_VECTOR(4 DOWNTO 0 ); CONSTANT st0 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00000" ; CONSTANT st1 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "11000" ; CONSTANT st2 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00001" ; CONSTANT st3 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00100" ; CONSTANT st4 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00110" ; SIGNAL REGL : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK: STD_LOGIC; BEGIN ADDA<='1'; Q<=REGL; START<=current_state(4); ALE<=current_state(3); OE<=current_state(2); LOCK<=current_state(1);c_state <=current_state; COM: PROCESS(current_state,EOC) BEGIN --规定各状态转换方式 CASE current_state IS WHEN st0=> next_state <= st1; --0809初始化 WHEN st1=> next_state <= st2; --启动采样 WHEN st2=> IF (EOC='1') THEN next_state <= st3; --EOC=1表明转换结束 ELSE next_state <= st2; --转换未结束,继续等待 END IF ; WHEN st3=> next_state <= st4;--开启OE,输出转换好的数据 WHEN st4=> next_state <= st0; WHEN OTHERS => next_state <= st0; END CASE ; END PROCESS COM ; REG: PROCESS (CLK) BEGIN IF (CLK'EVENT AND CLK='1') THEN current_state<=next_state; END IF; END PROCESS REG ; LATCH1: PROCESS (LOCK) -- 此进程中,在LOCK的上升沿,将转换好的数据锁入 BEGIN IF LOCK='1' AND LOCK'EVENT THEN REGL <= D ; END IF; END PROCESS LATCH1 ; END behav;     其时序仿真波形如图5-5所示。改进后毛刺不复存在。 图5-5 AD0809采用改进后Moore型有限状态机控制方案的仿真时序图 6 结语 由于毛刺信号对FPGA器件的运行有很大的影响,如何有效抑制毛刺信号就成了一个非常突出的问题。但是必须强调的一点就是,我们首先必须对程序设计本身进行优化和改进,使毛刺信号的产生降低到最小,比如将一些信号用变量代替来减小延时等。另外,在实际应用中如何选用适合的方法也非常的重要,一定要慎重考虑。比如延时环节的加入会使整个系统的延时增大,加入太多时就会影响系统的运行等。 参考文献 [1]~ [2]赵艳秋,冯晓伟,冯健.FPGA应用愈加广泛,行业演进呈现三大趋势[N].中国电子报,2008,2(08):1~2. [3] [4]楼观涛,马跃.FPGA设计中毛刺信号的产生及消除[J].电子世界,2004,20(7):22~25. [5]孙晓东.FPGA毛刺产生的原因及其抑制方法[J].唐山电视发射台,唐山063000,电脑编程技巧与维护,2010,19(9):70~76. [6]褚振勇,翁木云.FPGA设计及应用[M].西安:西安电子科技大学出版社.2001:11~15. [7]刘一平,叶媲,凌朝东.FPGA的可靠时钟设计方案[N].华侨大学学报(自然科学版)2009,30(6):55~67. [8]钱立旺.0.6μm CMOS 622Mb/s高速分接器设计[J].电子世界,2004,27(6):36~38. [9]杨波,高德远.RTL电路的时序优化设计[J].小型微型计算机系统,2001,22(9):20~25. [10]陈智荣.大屏幕TFT-LCD源极驱动器数据输入接口设计[J].2007,54(3):10~13. [11]~ 致 谢 本论文是我在皇甫海燕老师的亲切关怀和悉心指导下完成的。她严肃的教学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从论文题目的选择到论文各个部分的最终完成,海燕老师都始终给予我细心的指导和不懈的支持。一直以来,海燕老师不仅在学业上给我以精心指导,同时还在生活上给我以无微不至的关怀,在此谨向海燕老师致以诚挚的谢意和崇高的敬意。 在此,我还要感谢在一起愉快的度过四年大学生活的电子09-11班的同学们,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。特别感谢我们班的党晨同学,他对于我的论文方面的编程与仿真做了不少工作,给予我很大的帮助。 在论文即将完成之际,我的心情无法平静,从开始的准备资料到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服