歡迎您光臨本站 登入註冊首頁

FPGA設計經驗之邊沿檢測

admin @ 2014-03-26 , reply:0

概述

   在同步電路設計中,邊沿檢測是必不可少的!   例如:在一個時鐘頻率16MHz的同步串列匯流排接收電路里,串列匯流排波特率為1Mbps。……

    在同步電路設計中,邊沿檢測是必不可少的!
    例如:在一個時鐘頻率16MHz的同步串列匯流排接收電路里,串列匯流排波特率為1Mbps。在串列匯流排的發送端是在同步時鐘(1MHz)的上升沿輸出數據,在接收端在同步時鐘的下降沿對輸入數據進行接收採樣。在這個接收電路里檢測同步時鐘的下降沿是必不可少的。假設主時鐘-clk,同步時鐘-rck,同步數據-data。
  有些人在邊沿檢測的時候就喜歡這樣做:

代碼
  1. signal rck_dly: std_logic;   --定義一個觸發器   
  2. signal data_buf: std_logic;  --數據緩衝器   
  3. RCK_Delay:process(clk,rst_n)   
  4. begin   
  5.     if rst_n='0' then   
  6.        rck_dly <= '0';   
  7.     elsif rising_edge(clk) then   
  8.        rck_dly <= rck;   
  9.     end if;   
  10. end process;   
  11.   
  12. Data_Receivee:process(clk,rst_n)   
  13. begin   
  14.   if rst_n='0' then   
  15.      data_buf <= '0';   
  16.   elsif rising_edge(clk) then   
  17.      if (rck_dly='1' and rck='0') then   --RCK下降沿(但這個條件是否總會出現?)   
  18.          data_buf <= data;   
  19.      end if;   
  20.   end if;   
  21. 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'的情況出現!! 從而導致丟失數據。
  如果用下面的方法就可以避免上面的情況,並且可以做到正確無誤地接收數據:

代碼
  1. signal rck_dly: std_logic_vector(1 downto 0);   
  2. signal data_buf: std_logic;   
  3. RCK_Delay:process(clk,rst_n)   
  4. begin   
  5.   if rst_n='0' then   
  6.      rck_dly <= (others=>'0');   
  7.   elsif rising_edge(clk) then   
  8.      rck_dly <= rck_dly(0) & rck;   
  9.   end if;   
  10. end process;   
  11.   
  12. Data_Receiver:process(clk,rst_n)   
  13. begin   
  14.   if rst_n='0' then   
  15.      data_buf <= '0';   
  16.   elsif rising_edge(clk) then   
  17.      if rck_dly="10" then   
  18.         data_buf <= data;   
  19.      edn if;   
  20.   end if;   
  21. end process;  

  至於以上電路為什麼就可以克服上面出現的情況,就留給大家分析了。
  不得不承認后一種方法所耗的資源要比前一種方法多(一個觸發器),但是就可以大大提高可靠性,這絕對是物有所值!!


[admin via 研發互助社區 ] FPGA設計經驗之邊沿檢測已經有2571次圍觀

http://cocdig.com/docs/show-post-43049.html