0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA处理编码信号进行毛刺滤波的方法实现

FPGA设计论坛 来源:CSDN 2024-02-21 14:46 次阅读

一、前言

在利用处理编码信号时,一般在较为理想的环境下可以很方便进行计算,判断等。但是由于有时候受到电磁干扰等环境因素,会导致编码信号产生毛刺等,这时候如果不对编码信号进行预处理而是直接进行边缘判断等操作则极容易导致错误,所以需要提前对编码信号进行滤波。

二、滤波算法

ab68d698-d084-11ee-a297-92fbcf53809c.png

其算法思想也容易理解:如果有电平跳变,则立即进行计数,如果计数值超过设定阈值,则电平跳转有效,否则依然保持原电平不变。另外如果在计数时又发生电平跳转,则重新进行计数。滤波算法跳转图如下:

ab7a4fc2-d084-11ee-a297-92fbcf53809c.png

ab8b9f52-d084-11ee-a297-92fbcf53809c.png

三、代码设计

首先我们需要确定编码信号的毛刺信号大概时间宽度为多少,这样我们才能设置阈值进行滤波。以Altera芯片设计为例,可以利用SigalTapII嵌入式逻辑观测毛刺的时间宽度。

ab9fea5c-d084-11ee-a297-92fbcf53809c.png

这样设计代码如下即可实现滤波效果:

module encoder_filter (

input clk,

input A, //原始编码信号A

output reg A_f, //滤波后的编码信号A_f

output led, //观测程序是否烧录成功

output samp_clk_20us //SigalTapII中采样时钟

);

pll_ippll_ip_inst ( //调用PLL_IP

.inclk0 ( clk ),

.c0 ( samp_clk_20us )

);

parameter [11:0] Cnt_20us=12'd1000; //20us/20ns=1000; //毛刺的脉宽不会大于20us

parameter [1:0] S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;

reg [1:0] state; //当前状态

reg [2:0] A_delay; //延迟打拍

reg [11:0] count; //电平跳转计数

reg last_level; //A的上一个电平状态

reg A_sig_pos;

reg A_sig_neg;

reg [7:0] reset_counter=8'd0;

always@(posedge clk) //软件不发复位信号,FPGA自己产生,逻辑加载起来后马上自己复位一次。

begin

if (reset_counter != 8'h59 )

reset_counter <= reset_counter + 8'h1;  

end

reg n_rst;

always@(posedge clk) //软件不发复位信号,FPGA自己产生,逻辑加载起来后马上自己复位一次。

begin

if((reset_counter > 8'd1)&&(reset_counter < 8'd6))

n_rst <= 1'b0;     

else

n_rst <= 1'b1;

end

assign led=1'b0;

always @(posedge clk or negedge n_rst ) //将外部a信号进行时钟同步

begin

if(n_rst==1'b0)

A_delay <=2'b00;

else

A_delay <={A_delay[1:0],A};

end

wire A_risingedge=(A_delay[2:1]==2'b01);

wire A_fallingedge=(A_delay[2:1]==2'b10);

always @(posedge clk or negedge n_rst )

begin

if(n_rst==1'b0)

begin

state<= S0;

count<=12'b0;

last_level<=1'b0;

A_sig_neg<=1'b0;

A_sig_pos<=1'b0;

end

else

case(state)

S0://空闲状态,判断电平是否变化

begin

if(A_risingedge||A_fallingedge)

begin

state<= S1;

count<=12'b0;

last_level<=A_delay[2];

end

end

S1://计数状态

begin

if(A_delay[2]==A_delay[1])

if(count==Cnt_20us)//判断计数是否达到20us

begin

count<=12'b0;

state<= S2;

end

else

count<=count+1'b1;

else

count<=12'b0;

end

S2://判决状态

begin

state<= S3;

if(!last_level&&A_delay[1])//确定是由低电平---->高电平

begin

A_sig_pos<=1'b1;

A_sig_neg<=1'b0;

end

else if(last_level&&!A_delay[1])//确定是由高电平---->低电平

begin

A_sig_neg<=1'b1;

A_sig_pos<=1'b0;

end

else

begin

A_sig_neg<=1'b0;

A_sig_pos<=1'b0;

end

end

S3:

begin

state<= S0;

count<=12'b0;

end

default:

begin

state<= S0;

count<=12'b0;

end

endcase

end

always @(posedge clk or negedge n_rst )

begin

if(n_rst==1'b0)

A_f<=1'b0;

else if(A_sig_pos==1'b1)

A_f<=1'b1;

else if(A_sig_neg==1'b1)

A_f<=1'b0;

else

A_f<=A_f;

end

endmodule

值得注意的是:

1、需要根据实际毛刺Cnt_20us的时间宽度改变阈值

2、在程序使用了软复位,由于未设置按键这种异步复位,就实际程序随板子上电后在主时钟下进行软件同步复位。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21324

    浏览量

    593215
  • 嵌入式
    +关注

    关注

    4982

    文章

    18286

    浏览量

    288483
  • 电磁干扰
    +关注

    关注

    36

    文章

    2049

    浏览量

    104748
  • 异步复位
    +关注

    关注

    0

    文章

    45

    浏览量

    13251

原文标题:FPGA处理编码信号进行毛刺滤波

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA设计中毛刺信号的产生及消除

    摘要:主要讨论了FPGA设计中毛刺信号产生的原因,分析总结了处理毛刺信号的几种
    发表于 04-21 16:47

    fpga毛刺的产生及处理讨论

    ,然后判断在信号同时变化的时候,是否会产生冒险,这可以通过逻辑函数的卡诺图或逻辑函数表达式来进行判断。对此问题感兴趣的读者可以参考有关脉冲与数字电路方面的书籍和文章。 . 如何处理毛刺
    发表于 02-10 09:50

    fpga实现滤波

    本帖最后由 eehome 于 2013-1-5 10:03 编辑 fpga实现滤波器在利用FPGA实现数字
    发表于 08-11 18:27

    fpga实现滤波

    fpga实现滤波fpga实现滤波器在利用FPGA
    发表于 08-12 11:50

    FPGA数字信号处理实现原理及方法

    FPGA数字信号处理实现原理及方法
    发表于 08-15 19:00

    FPGA数字信号处理实现原理及方法

    FPGA数字信号处理实现原理及方法
    发表于 08-19 13:37

    毛刺滤波方法

    ,放大毛刺后如图2所示,大约维持10ns的高电平。图1图2如何滤除这些毛刺呢?办法有两个,其一就是用纯粹硬件的办法,在信号进入FPGA之前进行
    发表于 06-04 05:00

    采用FPGA增量式编码实现接口设计

    ,不宜实现小型化。增量式光电编码器不具有计数和接口电路,一般输出A、B、Z脉冲信号,价格较低,在实际工程中比较常用。文中设计了一个基于FPGA的简单且精度高的接口电路,其结构简单、性能
    发表于 06-10 05:00

    如何利用FPGA实现级联信号处理器?

    傅里叶变换、脉冲压缩、线性预测编码语音处理、高速定点矩阵乘法等,有较好的应用前景和发展空间。那有谁知道该如何利用FPGA实现级联信号
    发表于 07-30 07:22

    数字信号处理FPGA实现

    FPGA正在掀起一场数字信号处理的变革。本书旨在讲解前端数字信号处理算法的高效实现。首先概述了当
    发表于 09-19 06:38

    FPGA | 竞争冒险和毛刺问题

    布尔式中有相反的信号则可能产生 竞争和冒险现象); 2、卡诺图:有两个相切的卡诺圈并且相切处没有被其他卡诺圈包围,就有可能出现竞争冒险; 3、实验法:示波器观测; 解决方法: 1、加滤波电路,消除
    发表于 11-02 17:22

    FPGA设计中毛刺信号解析

    本文从FPGA的原理结构的角度探讨了产生毛刺的原因及产生的条件,在此基础上,总结了多种不同的消除方法,在最后结合具体的应用对解决方案进行深入的分析。
    发表于 08-03 11:48 1953次阅读
    <b class='flag-5'>FPGA</b>设计中<b class='flag-5'>毛刺</b><b class='flag-5'>信号</b>解析

    数字信号处理FPGA实现

    本书比较全面地阐述了fpga在数字信号处理中的应用问题。本书共分8章,主要内容包括典型fpga器件的介绍、vhdl硬件描述语言、fpga设计
    发表于 12-23 11:07 44次下载

    基于FPGA毛刺问题及解决方法

    毛刺现象在FPGA设计中非常普遍, 而毛刺的出现往往导致系统结果的错误。本文从FPGA的原理结构的角度深入探讨了毛刺产生的原因及产生的条件,
    发表于 11-22 14:24 8594次阅读

    在 FlexIO上进行毛刺滤波方法

    0 -EVK,软件基于 SDK2.13.0。 FlexIO 需要毛刺滤波的原因 以使用 FlexIO 模拟 UART 为例,其在理论上可以支持很高的波特率,但在每个 bit 只会进行一次采样。 单次采样
    的头像 发表于 10-19 11:25 441次阅读