在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 21182|回复: 28

[讨论] 用verilog写一段代码,实现消除一个glitch

[复制链接]
发表于 2012-8-6 20:56:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
verilog写一段代码,实现消除一个glitch
    最近在准备FPGA方面的求职面试,遇到这样一题目“用verilog写一段代码,实现消除一个glitch”,于是在网上找了些资料,根据一篇博客作者提供的资料,现把消除glitch方法做了如下整理,望批评指正:
    滤掉小于1个周期glitch的原理图如下:
1.jpg
verilog代码实现如下:
module digital_filter_(clk_in,rst,host_rst,host_rst_filter);
input  clk_in;
input  rst;
input  host_rst;
output host_rst_filter;
reg host_rst_d1;
reg host_rst_d2;

always@(posedge clk_in or negedge rst)
  begin
    if(~rst)
    begin
        host_rst_d1 <= 1'b1;
        host_rst_d2 <= 1'b1;
       end
    else
      begin
        host_rst_d1 <= host_rst;
        host_rst_d2 <= host_rst_d1;
      end
  end
assign host_rst_filter = host_rst_d1 | host_rst_d2;
endmodule

    滤掉大于1个周期且小于2个周期glitch的原理图如下:



2.jpg
verilog代码如下:
module digital_filter_(clk_in,rst,host_rst,host_rst_filter);
input  clk_in;
input  rst;
input  host_rst;
output host_rst_filter;
reg host_rst_d1;
reg host_rst_d2;
reg host_rst_d3;
always@(posedge clk_in or negedge rst)
  begin
    if(~rst)
    begin
        host_rst_d1 <= 1'b1;
        host_rst_d2 <= 1'b1;
        host_rst_d3 <= 1'b1;
      end
    else
  begin
        host_rst_d1 <= host_rst;
        host_rst_d2 <= host_rst_d1;
        host_rst_d3 <= host_rst_d2;
       end
  end
assign host_rst_filter = host_rst_d1 | host_rst_d2 | host_rst_d3;
endmodule
发表于 2012-8-7 09:54:35 | 显示全部楼层
`timescale 1ns/1ps
module glitch_filter_TB;

/********************************************************\
    parameter
\********************************************************/
parameter   U_DLY   = 1;
parameter   CLK_P   = 10;

/********************************************************\
    signals
\********************************************************/
reg                        clk;
reg                        rst_n;

reg                        glitch1;
reg [1:0]                  glitch_shifter1;
wire                       filter1;

reg                        glitch2;
reg [1:0]                  glitch_shifter2;
wire                       filter2;

/********************************************************\
    Generat clok and reset
\********************************************************/
initial
begin
    clk = 1'b0;
    rst_n = 1'b0;
    #(CLK_P*10);
    @(negedge clk);
    rst_n = 1'b1;
end

always #(CLK_P/2) clk = ~clk;

/********************************************************\
    main code
\********************************************************/
assign filter1 = &glitch_shifter1;
assign filter2 = &glitch_shifter2;

initial
begin
    glitch1 = 1'b0;
    glitch2 = 1'b0;
    wait(rst_n==1'b1);
    #(CLK_P*10);
    @(negedge clk)
    begin
        glitch1 <= 1'b1;
        glitch2 <= 1'b1;
    end
    @(posedge clk);
    glitch1 <= #1 1'b0;
    @(negedge clk);
    glitch2 <= #1 1'b0;
    #(CLK_P*10);
    $stop;
end

always@(posedge clk,negedge rst_n)
begin
    if(rst_n==1'b0)
    begin
        glitch_shifter1 <= 'h0;
        glitch_shifter2 <= 'h0;
    end
    else
    begin
        glitch_shifter1 <= #1 {glitch_shifter1[0],glitch1};
        glitch_shifter2 <= #1 {glitch_shifter2[0],glitch2};
    end
end

endmodule

仿真结果如下:
发表于 2012-8-7 09:56:17 | 显示全部楼层
filter.bmp
发表于 2012-8-7 10:17:23 | 显示全部楼层
看电路图只是消除单边glitch,一般使用都会用双边。
发表于 2012-8-7 11:13:52 | 显示全部楼层
有两个问题:
1.glitch的位置如果是随机的,那么通过第1个触发器之后的信号是亚稳态的,不能用于后面的与门,会导致与门的结果出错。
2.功能上,连续两个周期为1,才输出1,否则输出0.实际中的glitch有可能是反过来的。当然根据需要来调整就好了。
发表于 2012-8-18 22:49:56 | 显示全部楼层
输出应该是与的关系而不是或的关系吧?
并且第一个触发器输出亚问题的时候怎么办?
发表于 2012-8-19 14:21:01 | 显示全部楼层
异步信号输入起码要用两个触发器打一下,第一用于同步,第二个用于消除亚稳态。
所以第一个图中应该再加一个触发器,第二个要三个或,也需要再加一个。
发表于 2012-8-19 16:33:48 | 显示全部楼层
用寄存器打两拍也不能完全消除亚稳态的出现,不让亚稳态出现的唯一办法是不用异步信号。当然打两拍能够大大减少亚稳态出现的概率。
发表于 2013-9-23 15:34:09 | 显示全部楼层
ghefjwefqwerjwerj
发表于 2013-9-23 15:51:39 | 显示全部楼层
学习了。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-28 23:58 , Processed in 0.034589 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表