首页 > 其他分享 >FPGA处理编码信号进行毛刺滤波

FPGA处理编码信号进行毛刺滤波

时间:2023-12-28 20:22:05浏览次数:37  
标签:编码 20us FPGA 毛刺 滤波 信号 reg

目录

一、前言

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

二、滤波算法

这里使用的是一篇专利里的滤波方法:陈诚.一种基于FPGA的编码器滤波算法:202011344154.4P.2021.04.09.

image-20230604153606309

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

image-20230604154419762

image-20230604154104896

三、代码设计

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

image-20230604155037846

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

module encoder_filter (
  input clk,
  input A,  //原始编码信号A
  
  output reg A_f, //滤波后的编码信号A_f

  output led,  //观测程序是否烧录成功
  output samp_clk_20us  //SigalTapII中采样时钟
);

pll_ip	pll_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、在程序使用了软复位,由于未设置按键这种异步复位,就实际程序随板子上电后在主时钟下进行软件同步复位

标签:编码,20us,FPGA,毛刺,滤波,信号,reg
From: https://www.cnblogs.com/lgziyan/p/17933486.html

相关文章

  • DAC转化——FPGA驱动LTC1446
    目录一、前言二、结合LTC1446芯片手册分析三、Verilog代码与仿真四、总结一、前言最近在学习利用FPGA结合DAC芯片实现数模转换,在实验中选择的LTC1446这款芯片。接下来自己将结合芯片手册进行分析,并编写Verilog代码并进行仿真验证。二、结合LTC1446芯片手册分析首先从上述第......
  • FPGA驱动AD9240实现AD转换
    目录一、前言二、时序原理三、代码设计四、结果验证一、前言在做项目中,经常会用到AD转换模块。前段时间做毕业设计的时候需要用到FPGA驱动AD9240模块实现模拟数据的采集和转换,尽管相对来说AD9240算比较简单的驱动模块,但是也想记录下分析和设计过程。二、时序原理首先通过芯片......
  • 基于FPGA的图像差分运算及目标提取实现,包含testbench和MATLAB辅助验证程序
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      基于FPGA(Field-ProgrammableGateArray)的图像差分运算及目标提取实现主要涉及图像处理、差分运算和目标提取等原理和数学公式。 一、图像处理原理       图像处理是......
  • 01 FPGA流水灯实验
    软件版本:VIVADO2021.1操作系统:WIN1064bitaa硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述本章课程以大家熟悉的流水灯为例子,详细讲解了VIVADO软件的使用,包括创建FPGA工程,编写Verilog代码,添加......
  • 基于FPGA的图像PSNR质量评估计算实现,包含testbench和MATLAB辅助验证程序
    1.算法运行效果图预览设置较大的干扰,PSNR=15。   设置较小的干扰,PSNR=25。   2.算法运行软件版本matlab2022a vivado2019.2  3.算法理论概述      基于FPGA的图像PSNR(峰值信噪比)质量评估计算实现涉及到数字图像处理、硬件设计和编程等多个领域......
  • FPGA学习笔记---verilog学习(2)--过程块always@(*)
    在Verilog中always@(*)语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行。1、always语句有两种触发方式。第一种是电平触发,例如always@(aorborc),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。2、第二种是沿触发,例如always......
  • 各种二端口滤波器网络仿真遇到的问题
    各种滤波器网络仿真遇到的问题目录各种滤波器网络仿真遇到的问题1、仿真的前置问题研究2、电路1仿真3、电路2仿真4、电路3仿真使用软件:LTspice(ADI推荐的仿真软件)1、仿真的前置问题研究为什么在LC谐振点会产生大于0的增益?问题比较突兀,以简单的例子来验证:上图添加了一个简......
  • 模拟集成电路设计系列博客——4.4.5 基于自适应滤波的修调
    4.4.5基于自适应滤波的修调自适应滤波一般用于数字信号处理应用中,例如模型观察,通道均衡,或者噪声消除。同时也可以使用自适应滤波技术来修调一个给定场景中的连续时间滤波器。一个实现的例子可以参考下图[Kozma,1991]:其中自适应修调电路被用于最小化误差信号。在进行修调时,输......
  • 最大工作频率为32MHz,R7F100GPL2DFA、R7F100GPL3CFA低功耗MCU,10M08SAU169C8GGB MAX® 1
    一、RL78/G23 新一代RL78微控制器,最大工作频率为32MHz,外围功能得到进一步扩展,低功耗性能也有所提升。RL78/G23微控制器是RL78系列的新一代产品,CPU工作时的功耗为41μA/MHz,STOP(保持4KBSRAM)时的功耗为210nA,其低功耗在业内首屈一指。此外,由于采用SNOOZE模式定序器,它还能大幅度减少......
  • 基于Zynq FPGA对雷龙SD NAND的测试
    文章目录一、SDNAND特征1.1SD卡简介1.2SD卡Block图二、SD卡样片三、Zynq测试平台搭建3.1测试流程3.2SOC搭建四、软件搭建五、测试结果六、总结一、SDNAND特征1.1SD卡简介  雷龙的SDNAND有很多型号,在测试中使用的是CSNP4GCR01-AWM与CSNP32GCR01-AOW。芯片是基于NANDFLASH......