李斐玥
(中国空空导弹研究院,河南 洛阳 471000)
随着应用技术的发展,各种仪器精密程度的提高,人们对信号质量的要求更加严格。由于设备的缺陷和环境的干扰,不可避免地会产生各种各样的毛刺。在处理数据时,必须通过必要的方法消除或者减弱这些毛刺信号的影响。去除信号毛刺常用的有两种方法,一种是接收信号前在硬件上串联电阻或者并联电容,另一种是接收信号后用软件识别毛刺并去除。本文主要讨论第二种方法。
真实信号中毛刺的宽度一般要远远小于信号自身的周期,因此,从理论上讲,可以通过延时的方法去除较窄的毛刺信号.在信号发生突变之后,计数器对后面的信号宽度进行同步计数.若信号突变之后保持的宽度小于规定的数值n(滤波宽度),认为该信号为毛刺,否则认为是真实的信号突变。
使用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在最高位发生变化后认为该突变为真实信号,计数清零,输出发生跳变。
使用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 本方法由于tmp的累计过程需要时间,在真实信号突变时相位会发生改变,为了尽量减小误差,可以提高qmcClk的频率,此外,滤波精度受毛刺宽度和毛刺分布的影响。由于毛刺会使计数清零,毛刺频繁发生时,间隔若小于nT,正常信号会无法显示。其中,0-1毛刺会降低占空比,1-0毛刺会提高占空比。如果毛刺恰好在信号跳变时发生,本方法将无法识别,也会降低信号的精度。为了保证精度,qmcClk应保证来源稳定,根据毛刺宽度和出现频率调整qmcClk的频率和tmp的位数,其中毛刺出现频率越高,选择qmcClk的频率应越高,tmp的位数应越少。延时较长时不适用于对信号同步性要求很高的场所。 本文提出了一种去除毛刺的方法,适用于毛刺宽度较窄的情况,通过仿真计算分析,可知该方法可以有效消除毛刺。在实际应用中,该方法在方波滤波中取得了良好的效果。该方法通过延时实现对毛刺的过滤,而滤波宽度需要根据毛刺特性,信号特性等因素综合确定。识别的正确率和信号精度依赖于滤波宽度的选择,如果滤波宽度太小,则较宽的毛刺会被当作真实信号;如果太大,则真实信号容易被误认为毛刺信号,使得信号失真。当毛刺出现在信号突变附近时,该方法滤波后会对真实信号的频率产生影响[1]。4 结论
5 结语