这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA设计经验谈之边沿检测

共4条 1/1 1 跳转至

FPGA设计经验谈之边沿检测

助工
2014-07-30 22:21:11     打赏
在同步电路设计中,边沿检测是必不可少的! 

  例如:在一个时钟频率16MHz的同步串行总线接收电路里,串行总线波特率为1Mbps。在串行总线的发送端是在同步时钟(1MHz)的上升沿输出数据,在接收端在同步时钟的下降沿对输入数据进行接收采样。在这个接收电路里检测同步时钟的下降沿是必不可少的。假设主时钟——clk,同步时钟——rck,同步数据——data。


  有些人在边沿检测的时候就喜欢这样做:


  signal rck_dly: std_logic;   --定义一个触发器


  signal data_buf: std_logic;  --数据缓冲器


  RCK_Delay:process(clk,rst_n)


  begin


      if rst_n='0' then


         rck_dly <= '0';


      elsif rising_edge(clk) then


         rck_dly <= rck;


      end if;


  end process;


 


  Data_Receivee:process(clk,rst_n)


  begin


    if rst_n='0' then


       data_buf <= '0';


    elsif rising_edge(clk) then


       if (rck_dly='1' and rck='0') then   --RCK下降沿(但这个条件是否总会出现?)


           data_buf <= data;


       end if;


    end if;


  end process;


  但是大家忽略了一种情况,就是clk与rck之间比没有必然的同步关系,当rck的下降沿刚好略滞后于clk的上升沿(大概几个ns),这样就会使高电平保持时间不足,就会发现在本时钟上升沿时还是rck_dly='1' and rck='1',而在下一个时钟的上升沿来的时候,就会出现rck_dly='0' and rck='0',所以就不会有rck_dly='1' and rck='0'的情况出现!! 从而导致丢失数据。


  如果用下面的方法就可以避免上面的情况,并且可以做到正确无误地接收数据:


  signal rck_dly: std_logic_vector(1 downto 0);


  signal data_buf: std_logic;


  RCK_Delay:process(clk,rst_n)


  begin


    if rst_n='0' then


       rck_dly <= (others=>'0');


    elsif rising_edge(clk) then


       rck_dly <= rck_dly(0) & rck;


    end if;


  end process;


 


  Data_Receiver:process(clk,rst_n)


  begin


    if rst_n='0' then


       data_buf <= '0';


    elsif rising_edge(clk) then


       if rck_dly="10" then


          data_buf <= data;


       edn if;


    end if;


  end process;


  至于以上电路为什么就可以克服上面出现的情况,就留给大家分析了。


  不得不承认后一种方法所耗的资源要比前一种方法多(一个触发器),但是就可以大大提高可靠性,这绝对是物有所值!!




关键词: 检测     经验谈     设计    

菜鸟
2014-07-31 15:16:02     打赏
2楼
好好看一下,先感谢楼主分享

助工
2014-08-01 13:44:43     打赏
3楼

菜鸟
2014-08-05 17:08:01     打赏
4楼
好东西

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]