【FPGA】消除信号上的毛刺

个人笔记。

最近在做一个编码器实验,发现采集到的编码器信号会出现一些毛刺来干扰数据。

 现场发现可能是以下原因产生的

1、编码器本身产生的影响。

2、编码器与FPGA连接处产生的干扰。

3、现场其他设备产生的磁场对它的干扰。

对于毛刺的解决主要有两种方法,分为硬件上和软件上解决。

硬件上可以在编码器与FPGA连接处加上电容电阻来滤波。

软件上可以设计程序实现滤波去毛刺。

首先可以取多个信号点,然后判别大多数信号点是高电平还是低电平,最后将滤波完的信号置高还是置低。

integer     i;
integer     a_sum;               //取和

reg          a_buf[99:0];        //取信号点
reg          r_a;                //滤波完的信号

//a信号采集50个数
always @(posedge i_clk or negedge i_rst_n) begin   
if(!i_rst_n)begin end
else
   begin
       a_buf[0]<=i_a;
       for(i=1;i<64;i=i+1)
       begin
       a_buf[i]<=a_buf[i-1];
       end          
   end
end

//对a信号50个数求和
always @(posedge i_clk or negedge i_rst_n) begin//x(1) * h(1)      
if(!i_rst_n)begin  a_sum <=0; end
else
   begin
      a_sum <= a_buf[0]+ a_buf[1]+ a_buf[2]+ a_buf[3]+ a_buf[4]+ a_buf[5]+ a_buf[6]+ 
a_buf[7]+ a_buf[8]+ a_buf[9]+ a_buf[10]+ a_buf[11]+ a_buf[12]+ a_buf[13]+ a_buf[14]+ a_buf[15]+ a_buf[16]+ a_buf[17]+a_buf[18]+ a_buf[19]+ a_buf[20]+ a_buf[21]+ a_buf[22]+ a_buf[23]+ a_buf[24]+ a_buf[25]+ a_buf[26]+ a_buf[27]+a_buf[28]+ a_buf[29]+ a_buf[30]+ a_buf[31]+ a_buf[32]+ a_buf[33]+ a_buf[34]+ a_buf[35]+ a_buf[36]+ a_buf[37]+a_buf[38]+ a_buf[39]+ a_buf[40]+ a_buf[41]+ a_buf[42]+ a_buf[43]+ a_buf[44]+ a_buf[45]+ a_buf[46]+ a_buf[47]+a_buf[48]+ a_buf[49];
       
   end
end

always @(posedge i_clk or negedge i_rst_n) begin
if(!i_rst_n)begin  r_a<=0; end
else
   begin
         if(a_sum>25) begin  r_a <=1;end              //和大于25取高电平
         else begin  r_a <=0;end                      //和小于25取低电平
   end
end

网上找的计数器消抖去毛刺方法

//10ms计数器,用于消抖。
reg D_10ms;
reg [31:0]cnt;
always@(posedge clk,negedge rst_n)
begin
    if(!rst_n)begin
        cnt <= 0;
        D_10ms <= 1'b0;
    end
    else begin
        if(cnt < 32'd49_9999)begin//10ms消抖 // 根据主频情况此值设置可变49999
            cnt <= cnt + 1'b1;
            D_10ms <= 1'b0;
        end
        else begin
            cnt <= 0;
            D_10ms <= 1'b1;
        end
    end
end


//同步消抖 A、B
reg A_buf,A_buf0;
reg B_buf,B_buf0;
wire A_Debounce;                        //消完抖A
wire B_Debounce;                        //消完抖B
always@(posedge clk,negedge rst_n)begin
    if(!rst_n)begin
        A_buf <= 1'b1;
        A_buf0 <= 1'b1;
        B_buf <= 1'b1;
        B_buf0 <= 1'b1;
    end
    else begin
        if(D_10ms)begin
            A_buf <= A;
            A_buf0 <= A_buf;
            B_buf <= B;
            B_buf0 <= B_buf;
        end
    end
end

assign A_Debounce = A_buf0 && A_buf && A;
assign B_Debounce = B_buf0 && B_buf && B;

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值