一种基于VHDL实现的数字信号的滤波方法

2019-05-09 07:33李斐玥
山西电子技术 2019年2期
关键词:毛刺延时时钟

李斐玥

(中国空空导弹研究院,河南 洛阳 471000)

0 引言

随着应用技术的发展,各种仪器精密程度的提高,人们对信号质量的要求更加严格。由于设备的缺陷和环境的干扰,不可避免地会产生各种各样的毛刺。在处理数据时,必须通过必要的方法消除或者减弱这些毛刺信号的影响。去除信号毛刺常用的有两种方法,一种是接收信号前在硬件上串联电阻或者并联电容,另一种是接收信号后用软件识别毛刺并去除。本文主要讨论第二种方法。

1 原理

真实信号中毛刺的宽度一般要远远小于信号自身的周期,因此,从理论上讲,可以通过延时的方法去除较窄的毛刺信号.在信号发生突变之后,计数器对后面的信号宽度进行同步计数.若信号突变之后保持的宽度小于规定的数值n(滤波宽度),认为该信号为毛刺,否则认为是真实的信号突变。

2 程序设计

使用VHDL语言实现该功能。具体程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity QMC is

port(qmcClk, input : in std_logic;

y : out std_logic);

end QMC;

architecture behav of QMC is

signal tmp : std_logic_vector(7 downto 0);

signal x : std_logic;

begin

process(x,input, qmcClk)

begin

if(x=input) then

tmp<=(others=>x);

elsif(qmcClk'event and qmcClk=’1’)

then

tmp<=tmp(6 downto 0) & input;

x<= tmp(7);

end if;

end process;

y<= x;

end behav;

该程序中,y为输出,input为输入,tmp用于信号突变后的时钟周期计数.其中,input产生跳变并保持若干个时钟周期才能使tmp的最高位改变,从而使输出改变。该时序电路在qmcClk的上升沿发生状态转换.tmp位数为n,可以通过参数设置改变。输入信号与输出信号先进行比较,一致时tmp的所有位保持不变,不一致时开始计数,将变化后的输入从最低位依次往高位存入tmp,输出暂时不变。如果信号突变后的宽度小于滤波宽度,tmp在最高位发生变化之前输入信号与输出信号重新变得一致,则认为该突变由毛刺造成,计数清零,输出保持不变。如果信号突变之后的累计宽度大于滤波宽度,tmp在最高位发生变化后认为该突变为真实信号,计数清零,输出发生跳变。

3 试验结果

使用ISE14.6进行仿真验证,生成原理图如图1所示。

图1 软件ISE14.6生成的FPGA内部原理图

从图1可以看出ISE14.6自动生成的原理图使用了与门、非门、寄存器、触发器等,并使用反馈的方法保持输出稳定。

为了验证滤波效果,使用软件自带的仿真工具生成测试波形,编写测试波形程序如下:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

ENTITY test IS

END test;

ARCHITECTURE behavior OF test IS

COMPONENT QMC

PORT(

qmcClk:IN std_logic;

input:IN std_logic;

y:OUT std_logic

);

END COMPONENT;

signal qmcClk:std_logic:=’0’;

signal input:std_logic:=’0’;

signal y:std_logic;

constant qmcClk_period:time:=10 ns;

BEGIN

uut:QMC PORT MAP(

qmcClk=>qmcClk,

input=>input,

y=>y

);

qmcClk_process:process

begin

qmcClk<=’0’;

wait for qmcClk_period/2;

qmcClk<=’1’;

wait for qmcClk_period/2;

end process;

stim_proc:process

begin

wait for 100 ns;

wait for qmcClk_period*10;

input<=’1’;

wait for 20ns;

input <=’0’;

wait for 20ns;

input <=’1’;

wait for 180ns;

input<=’0’;

wait for 20ns;

input<=’1’;

wait for 20ns;

input<=’0’;

wait for 50ns;

input<=’1’;

wait for 20ns;

input<=’0’;

wait for 100ns;

input<=’1’;

wait for 70ns;

input<=’0’;

wait for 20ns;

input<=’1’;

wait for 70ns;

input<=’0’;

wait for 20ns;

input<=’1’;

wait for 20ns;

input<=’0’;

wait for 180ns;

input<=’1’;

wait for 20ns;

input<=’0’;

wait for 20ns;

input<=’1’;

wait for 180ns;

end process;

END;

其中qmcClk为周期10 ns,占空比50%的时钟信号,input为带有毛刺的输入信号,分别在信号的上升沿、下降沿和中间部分插入了一些宽度为20 ns的毛刺。y为输出信号。

由测试程序生成的波形仿真结果如图2所示。

图2 滤波效果图

由波形可以看出,输出波形比输入波形产生了约125.5ns的延迟,在高电平和低电平都成功过滤了毛刺,还原了信号。设时钟信号qmcClk周期为T,tmp位数为n,理想状态下延时为(n-1)T,实际由于输出信号在时钟信号qmcClk的上升沿触发,输入信号的上升沿和下降沿的时延不一致会产生额外的误差,其时长小于T。因此总延迟时间t的取值范围是(n-1)T

4 结论

本方法由于tmp的累计过程需要时间,在真实信号突变时相位会发生改变,为了尽量减小误差,可以提高qmcClk的频率,此外,滤波精度受毛刺宽度和毛刺分布的影响。由于毛刺会使计数清零,毛刺频繁发生时,间隔若小于nT,正常信号会无法显示。其中,0-1毛刺会降低占空比,1-0毛刺会提高占空比。如果毛刺恰好在信号跳变时发生,本方法将无法识别,也会降低信号的精度。为了保证精度,qmcClk应保证来源稳定,根据毛刺宽度和出现频率调整qmcClk的频率和tmp的位数,其中毛刺出现频率越高,选择qmcClk的频率应越高,tmp的位数应越少。延时较长时不适用于对信号同步性要求很高的场所。

5 结语

本文提出了一种去除毛刺的方法,适用于毛刺宽度较窄的情况,通过仿真计算分析,可知该方法可以有效消除毛刺。在实际应用中,该方法在方波滤波中取得了良好的效果。该方法通过延时实现对毛刺的过滤,而滤波宽度需要根据毛刺特性,信号特性等因素综合确定。识别的正确率和信号精度依赖于滤波宽度的选择,如果滤波宽度太小,则较宽的毛刺会被当作真实信号;如果太大,则真实信号容易被误认为毛刺信号,使得信号失真。当毛刺出现在信号突变附近时,该方法滤波后会对真实信号的频率产生影响[1]。

猜你喜欢
毛刺延时时钟
别样的“时钟”
阀芯去毛刺工艺研究
一种铸铁钻孔新型去毛刺刀具的应用
基于级联步进延时的顺序等效采样方法及实现
古代的时钟
一种筒类零件孔口去毛刺工具
日光灯断电关闭及自动延时开关设计
可抑制毛刺的钻头结构
有趣的时钟
时钟会开“花”