打印

这样算同步处理

[复制链接]
2107|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 entepino 于 2013-3-24 14:37 编辑

我把外部输入的异步信号进行同步处理,请教大家,这样处理算同步吗?谢谢!

  --由系统clk(100M)产生200k的clk
  CLKDIV200K :process         
  begin   
      WAIT UNTIL CLK100M ='1';  
        if RESET = '0'  then
                     CLK200k<= '0';   
                count200k<=0 ;      
        elsif count200k>=499 then                 
            CLK200k<= '1';   
            count200k<=0 ;     
                                          
        elsif count200k =249 then               
             CLK200k<= '0';     
             count200k <= count200k+1;   
        else
             count200k <= count200k+1;
        end if;   
      
  end process CLKDIV200K;
  
--用系统clk(100M)同步外部输入的异步脉冲PulseIN,相当于图中触发器1,a_clk相当于clk(100M),同步后的输出信号为SynPulseINCLK1。
  SynPulseCLK1:process
  begin
        WAIT UNTIL CLK100M ='1';  
         if RESET = '0'  then
            SynPulseINCLK1<= '0';        
         else                                 
                     SynPulseINCLK1 <= PulseIN;
                        end if;
  end process SynPulse;
  
  
--用系统clk产生的200k时钟,再次同步一下信号SynPulseINCLK1,相当于图中的触发器2,输出信号为SynPulseINCLK2。
SynPulseCLK2:process
  begin
        WAIT UNTIL CLK200k ='1';  
         if RESET = '0'  then
            SynPulseINCLK2<= '0';        
         else                                 
                     SynPulseINCLK2 <= SynPulseINCLK1;
                        end if;
  end process SynPulseCLK2;
  
--第三次同步一下信号SynPulseINCLK2,相当于图中的触发器3,输出信号为SynPulseIN。
  SynPulse:process
  begin
        WAIT UNTIL CLK200k ='1';  
         if RESET = '0'  then
            SynPulse<= '0';        
         else                                 
                     SynPulseIN <= SynPulseINCLK2;
                        end if;
  end process SynPulse;
  经过这三次处理后我是不是可以认为外部输入的信号PulseIN现在已经变成与系统时钟clk同步的信号了?是不是就可以用
  if (SynPulseIN 'EVENT AND SynPulseIN = '1') then
                 
                                CntINPulse<=CntINPulse+1;
对它进行计数了,谢谢!





相关帖子

沙发
entepino|  楼主 | 2013-3-24 14:34 | 只看该作者
   图片见二楼

未命名1.JPG (18.85 KB )

未命名1.JPG

使用特权

评论回复
板凳
ifpga| | 2013-3-24 14:46 | 只看该作者
写得好复杂
1. 首先,你200K的这个时钟这样写不太好,这应该是典型的 ripple clock,这样会引入一个200K的时钟,因此,你的FPGA内部就多了一个时钟域
2. 没太弄明白,你的输入是 100M的,内部为什么要降到 200K 来采样
3. 如果,一定要用200K的带宽的话,可以用一个计数器生一个 tick 信号,时钟还是使用 100M
4. 异步信号同步的概念应该是没什么问题的,两级寄存器输入可以降低亚稳态概率,但用200K去采样 100M 数据会不会有问题

使用特权

评论回复
地板
cuianbin| | 2013-3-24 16:14 | 只看该作者
看楼主的意思是 想用一个高频信号计数一个低频信号。 PulseIN 如果直接输入到FPGA 中 用一条语句always @(posedge pulseIN) ,遇到的问题可能是 PluseIN 本身质量不好,抖动。那么容易误判。如果采用下面的电路图,PulseIN (也就是途中的Triger)最终经过 与门输出后,去检测这个信号,就OK 了!欢迎大家提出意见。

使用特权

评论回复
评论
1003704680 2013-3-30 20:32 回复TA
不错 
5
GoldSunMonkey| | 2013-3-24 21:54 | 只看该作者
cuianbin 发表于 2013-3-24 16:14
看楼主的意思是 想用一个高频信号计数一个低频信号。 PulseIN 如果直接输入到FPGA 中 用一条语句always @(p ...

标准电路

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

649

帖子

2

粉丝