可编程逻辑系统通常部署在可能存在噪声的应用中。这种噪声会影响可编程逻辑设计接收的信号。例如,它可能会导致信号故障或跳动,如果处理不当,可能会导致设计和操作出现问题。
毛刺的持续时间是随机的,并且与时钟沿不同步。因此,它们可能会导致下游信息损坏。
处理此问题的最常见方法是使用毛刺滤波器来滤除毛刺和反弹。
毛刺滤波器核心是使用长度可变的移位寄存器,噪声信号被放到寄存器中,直到移位寄存器的所有值都一致。此时,信号可以视为稳定。当然,我们必须确定潜在毛刺和反弹可能持续多长时间,以确保时钟周期的寄存器大小正确。这就是为什么我们的毛刺滤波器需要非常灵活,并且需要确保其大小能够适合每个应用程序的要求。
滤波器应该能够接收噪声输入并滤除持续时间为多个时钟脉冲的毛刺。
library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity glitch_filter is generic( g_filer_len : integer := 8 ); port( i_clk : in std_ulogic; i_noisy : in std_ulogic; o_clean : out std_ulogic );end glitch_filter;architecture behaviour of glitch_filter is signal s_delay_line : std_ulogic_vector(g_filer_len - 1 downto 0); signal s_delay_and : std_ulogic; signal s_delay_nor : std_ulogic; signal s_output_clean : std_ulogic;begin o_clean <= s_output_clean; --delay disctete using delay line synchroniser_process : process (i_clk) begin if rising_edge(i_clk) then s_delay_line <= s_delay_line(g_filer_len - 2 downto 0) & i_noisy; end if; end process; --generate and and nor of delay line bits s_delay_and '1') else '0'; s_delay_nor '0') else '0'; --set discrete based on delay line output_process : process (i_clk) begin if rising_edge(i_clk) then if s_delay_nor = '1' then s_output_clean <= '0'; elsif s_delay_and = '1' then s_output_clean i_clk, i_noisy => i_noisy, o_clean => o_clean );uut : process variable glitch_duration : integer; variable seed1 : positive := 1; variable seed2 : positive := 283647823; impure function integer_random(min, max : integer) return integer is variable random : real; begin uniform(seed1, seed2, random); return integer(round(random * real(max - min) + real(min))); end function;begin i_noisy <= '0'; wait until rising_edge(i_clk); wait for g_filer_len * clk_period; test: for i in 0 to 1 loop i_noisy <= '1'; wait until rising_edge(i_clk); glitch_duration := integer_random(1,5); for x in 0 to glitch_duration loop i_noisy <= not i_noisy; wait until rising_edge(i_clk); end loop; i_noisy <= '1'; wait for 20 * clk_period; report loop high completed severity note; i_noisy <= '0'; wait until rising_edge(i_clk); glitch_duration := integer_random(1,5); for x in 0 to glitch_duration loop i_noisy <= not i_noisy; wait until rising_edge(i_clk); end loop; i_noisy <= '0'; wait for 20 * clk_period; report loop low completed severity note; end loop; report simulation complete severity failure; end process;end;
运行仿真后显示在信号状态改变后随机数量的脉冲便增加。检查输出信号表明滤波器已正确滤除输入信号中可能存在的毛刺。
正如在一开始所说的,这样的滤波器对于部署在可能存在电噪声的环境中非常有用。与 bram 上的 edac 等其他缓解策略相结合,这是可用于实现设计弹性的关键方法之一。
AMD入主Intel CPU,携手共同发展
码头视频监控系统设计
MICLEDI:计划在300mm晶圆上展示RGB Micro LED显示器
过氧化氢在SC1清洁中的应用
基于STM32单片机的多肉系统设计
怎样使用毛刺滤波器来滤除毛刺和反弹?
苹果宣布对Harlem Capital进行1000万美元投资
100%国产化FPGA核心板!骨折价——限时仅售299元!
新冠肺炎疫情影响谷歌和微软加速将生产工作从中国转移
台积电关注量子计算机 3倍薪资挖量子人才
币安DEX对区块链和金融交易的意义是什么
量子传感器让你见识什么是纳米级精致成像
如何选择合适的电磁干扰滤波器
惠威M200MKIIWiFi版无线音箱评测 无愧高端HIFI音箱经典之作
线路充电保护动作原理 线路充电保护动作有哪些
机智云生活电器智能化软硬件一体化解决方案提高企业管理效率
沃尔玛或将销售一款运行Comcast软件的电视机
提高企业服务器安全防护的八点建议
微信支付宝后,移动支付新人崛起:云闪付3年获3亿用户!
VR告别“野蛮”生长期 新一轮产业洗牌期将至