级联以避免故障? - VHDL

时间:2017-07-17 11:29:05

标签: vhdl

Glitch

我正在重新学习VHDL。在遇到一些问题之后,我又回到了像闹钟一样的琐碎事情。我想在经过多年的Java等而不是硬件之后,我有一个基本的误解和错误的方法。关于我下面的一般问题,请指出正确的方向(总是指小问题,我使用的是Xilinx ISE和Spartan3,但我的问题与实际硬件无关)。

  1. 由于位切换,计数器在硬件(仿真)中产生毛刺。这是可以预料的。如何在设计中弥补? 例如。该过程的一部分将是:

    if rising_edge(clk_base) then
       if(set_time='1') 
            if (sec_enable= '1') then
                sec1 <= sec1+1;
                if(sec1 = 59) then
                    sec1<=0;
                end if;
            end if;   ....
    

    在这个过程之后,我写了output_seconds&lt; = sec1;显然,在这个过程之外的这个非顺序(?)语句中,我总是直接在输出端口得到毛刺。有没有办法压制那个?所有端口的某种通用同步设置?

  2. 创建日期时,day_enable来自时间组件作为时钟启用就像sec_enable来自时钟分频器一样,我有一个进程计算日期和第30天(或31或者。 ..取决于月份和闰年)月份&lt; =月份+ 1,依此类推。我最初检查if day_enable ='1'部分内的天数,但模拟显示如果我的时钟在2月28日的闰年开始,它仍然采用默认值(is_leap ='0'),因为结果检查“if(year1 mod 4 = 0)”仅适用于下一个周期。反之亦然30/31选择。当在“if rising_edge(clk_base)然后”之后检查该权限时,它可以工作,但是如果日期(因此,几个月)变化很少,那么每X ns检查一次似乎有点过分。我的想法在哪里误入歧途?

  3. 在我看来,以某种方式级联整个事情会解决问题1和2,但我不知道它是否真的以这种方式完成,如果是这样,如何。避免我刚才描述的问题的标准做法是什么?我相信答案非常简单,但请帮助我。

1 个答案:

答案 0 :(得分:1)

  1. 如果你的计数器是sec1,它是在真正的同步过程中分配的,如:

    process(clk_base)
    begin
      if rising_edge(clk_base) then
        if(set_time='1') 
          if (sec_enable= '1') then
            sec1 <= sec1+1;
            if(sec1 = 59) then
              sec1<=0;
            end if;
          end if;
        end if;
      end if;
    end process;
    
  2. 然后sec1是寄存器的输出,并且没有毛刺。如果将其分配给形式的并发信号分配(在任何过程之外)中的另一个信号:

        output_seconds <= sec1;
    

    output_seconds上没有任何故障。

    1. 硬件是否存在。晶体管不是动态添加和从芯片中移除的。所以,如果你添加了一些硬件来比较某些东西,它就会存在,即使根本没有使用它。在不需要的情况下让部分硬件工作的唯一缺点可能是浪费能源。
    2. 请注意,如果您的硬件并不总是有用,那么现在是时候考虑它是否可以在几个类似的操作中共享......