这样算同步处理

[复制链接]
2622|4
 楼主| entepino 发表于 2013-3-24 14:32 | 显示全部楼层 |阅读模式
本帖最后由 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 | 显示全部楼层
   图片见二楼

本帖子中包含更多资源

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

×
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 了!欢迎大家提出意见。

本帖子中包含更多资源

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

×

评论

不错  发表于 2013-3-30 20:32
GoldSunMonkey 发表于 2013-3-24 21:54 | 显示全部楼层
cuianbin 发表于 2013-3-24 16:14
看楼主的意思是 想用一个高频信号计数一个低频信号。 PulseIN 如果直接输入到FPGA 中 用一条语句always @(p ...

标准电路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

214

主题

653

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部