2017-07-17 67 views
-1

Glitch级联以避免小故障? - VHDL

我正在重新学习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 < = SEC1;显然,在这个过程之外的非顺序(?)语句中,我总是直接在输出端口获得毛刺。有没有办法抑制这一点?某种通用的同步设置的所有端口?

  2. 创建日期时,day_enable来自时钟组件的时钟使能,就像sec_enable来自时钟分频器一样,我会有一个过程来计算日期和第30天(或31或.. 。取决于月份和闰年)的月份是< =月份+ 1,依此类推。我最初检查了if day_enable ='1'部分的天数,但仿真表明,如果我的时钟在闰年的2月28日开始,它仍然采用默认值(is_leap ='0'),因为结果的检查“if(year1 mod 4 = 0)”只适用于下一个周期。反之亦然30/31选择。如果在“如果rising_edge(clk_base)then”之后检查这个权限,那么它可以工作,但是如果天(以及因此几个月)很少改变,那么每检查一次X ns似乎就会过度。我的思想在哪里走了?

在我的脑海里,不知何故级联,整个事情就解决问题1和问题2,但我不知道,如果它实际上是这样做的方式,如果是这样,如何。避免刚刚描述的问题的标准做法是什么?我相信答案是相当微不足道的,但请在这里帮助我。

+1

这实在是两个问题。你应该单独发布它们。 –

+0

如果您的FPGA/IC输出它们,毛刺是个坏消息。毛刺会导致输出单元中的大晶体管迅速导通和关断,从而吸收过量电流并引起干扰。触发器的输出是_coherent_。也就是说,它不会产生小故障。因此,您应该始终直接从触发器驱动任何FPGA/IC的输出,而不是通过组合逻辑。 –

+0

在你的例子中,你似乎直接从触发器驱动FPGA的输出。 'sec'将合成为触发器,因为在钟控过程中分配的任何信号都将合成为触发器_。如果执行_unconically_(即不是从其他条件语句内部执行),那么'output_seconds <= sec1;'行不会添加任何逻辑。 –

回答

1
  1. 如果计数器秒-1,它是在一个真正的同步过程中分配,如:

    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; 
    

然后sec1是寄存器的输出,有它无毛刺。如果你在并行信号分配将其分配给另一个信号(任何过程之外)的形式为:

output_seconds <= sec1; 

上会有output_seconds无毛刺。硬件是否存在。

  1. 硬件是否存在。晶体管不会动态添加并从芯片上移除。因此,如果您添加了一些硬件来与某些其他硬件进行比较,那么即使它没有被使用,它也会在那里。在不需要的时候让硬件的一部分工作的唯一缺点就是能源浪费。

请注意,如果您的硬件不总是有用,现在该考虑是否可以在多个类似操作之间共享硬件......

+0

1.我的过程就是这样,不同之处在于异步重置。这是否应归咎于后综合模拟中的毛刺? 2.“检查月份长度”if-part当然总是存在,所以当然相应的硬件总是存在的,但是在时钟启用之前它会比以后更频繁地被调用。能源浪费在这里不是问题,但是必须有更好的方法,因为我只是在每个时钟都会调用它,因为它的结果被延迟了1天的周期?! – kaliyanei91

+0

那么,如果你的异步重置故障,那么是的,这可能是责怪。你能否详细解释一下你看到的内容?每个时钟周期切换多次会产生一次输出吗?或者它是每个时钟周期多次改变的完整多位值? –

+0

我在上面添加了一张图片。令我更加困惑的是,正确的值相差1(尽管关于触发边缘的延迟),但在此之前出现小故障,所以没有延迟,它实际上会先于边缘。我不明白为什么这样一个简单的设计(大多数教程中的标准)会在输出上出现问题(正如你所说的那样)。复位本身不会出现毛刺,它应该像它应该那样工作,并且无论reset ='1'还是'0'都会出现毛刺。我无法想象为什么hw会因为复位异步而在这种不可靠的情况下综合。 – kaliyanei91