邊沿檢測方法-FPGA入門教程

本節實驗主要講解FPGA開發中邊沿檢測方法,咱們在設計中會常常用到。這個地方你們必定要理解。 異步

1.1.1.原理介紹

學習HDL語言設計與其餘語言不同,HDL語言設計須要考慮更多的信號的電氣特性,時序特性。咱們先看一下邊沿檢測的基本原理。 學習

如上圖,爲咱們待檢測信號,能夠看出邊沿的特性:邊沿兩側信號的電平發生了變化。紅色爲上升沿,綠色爲降低沿。上升沿以前電平爲低,上升沿以後電平爲高。降低沿以前爲電平爲高,降低沿以後電平爲低。 spa

設計思路:設計一個多位寄存器key_sfr[2:0],每當系統時鐘來一次,就將key_sfr寄存器低2位與輸入信號i_key拼接{key_sfr[1:0],i_key},而後再賦值給key_sfr[2:0]寄存器,這樣就把i_key信號同步到了key_sfr寄存器的bit0,而以前bit0移位到了bit1bit1移位到bit2。容易理解key_sfr[1]key_sfr[0]前一時刻狀態,而key_sfr[2]又爲key_sfr[1]前一時刻狀態。咱們經過key_sfr[2:1]既能夠判斷相鄰時刻,輸入信號的電平是否發生了變化。當key_sfr[2:1]=2’b01,表示按鍵前一時刻爲低電平,然後一時刻爲高電平,相鄰時刻,輸入信號的電平發生了變化,此時爲上升沿。當key_sfr[2:1]=2’b10,表示按鍵前一時刻爲高電平,然後一時刻爲低電平,此時爲降低沿。 設計

1.1.2.  代碼實現

代碼主要實現了按鍵按下時,LED指示燈輸出不一樣的狀態,循環8次按下按鍵,LED分別輸出8種不一樣的指示燈狀態。 orm

1.  module edge_detect blog

2.      ( 圖片

3.          input                  i_clk        ,//模塊輸入時鐘 ,50mhz ci

4.          input                  i_rst_n      ,//復位信號,低電平有效 element

5.          input                  i_key        ,//按鍵輸入 開發

6.          output reg [3:0]       o_led_out       //LED指示燈輸出

7.      );

8.      reg    [2:0]               key_sfr               ;   //按鍵同步移位寄存器

9.      wire                       w_key_rise            ;//按鍵上升沿

10.     wire                       w_key_fall            ;//按鍵降低沿   

11. //-------------------------------------------------------------------

12. //  同步i_key信號,i_key爲按鍵輸入異步時鐘域信號,應同步到本地時鐘域

13. //-------------------------------------------------------------------

14.     always @ (posedge i_clk or negedge i_rst_n)

15.     begin

16.         if(!i_rst_n)

17.             key_sfr      <=3'b000;  

18.         else  

19.             key_sfr      <={key_sfr[1:0],i_key}   ; // key_sfr[2]信號是                          i_key通過同步3拍後的信號                           

20.     end

21. //-------------------------------------------------------------------

22. //  判別i_key信號的邊沿

23. //-------------------------------------------------------------------   

24.     assign  w_key_rise=(key_sfr[2:1]==2'b01)?1'b1:1'b0;

25. //-------------------------------------------------------------------

26. //  按鍵按下時,計數器加1,循環記數從0-7.

27. //-------------------------------------------------------------------     

28.     always @ (posedge i_clk or negedge i_rst_n)

29.     begin

30.         if(!i_rst_n)

31.             key_cnt        <=3'b000;

32.         else if(w_key_rise)

33.             key_cnt        <=key_cnt  +   1'b1;

34.     end

35. //-------------------------------------------------------------------

36. //  計數器在不一樣狀態時輸出不一樣的LED指示燈狀態

37. //-------------------------------------------------------------------      

38.     always @ (posedge i_clk or negedge i_rst_n)

39.     begin

40.         if(!i_rst_n)

41.             o_led_out   <=4'b1110;    

42.         else begin

43.             case(key_cnt)  //計數器不一樣狀態,輸出指示燈狀態不一樣

44.                 3'b000:     o_led_out<=  4'b1110;       

45.                 3'b001:     o_led_out<=  4'b1101;   

46.                 3'b010:     o_led_out<=  4'b1011;  

47.                 3'b011:     o_led_out<=  4'b0111;  

48.                 3'b100:     o_led_out<=  4'b1100;      

49.                 3'b101:     o_led_out<=  4'b1001;                                                             

50.                 3'b110:     o_led_out<=  4'b0011;

51.                 3'b111:     o_led_out<=  4'b0000;

52.                 default:    o_led_out<=  o_led_out;                

53.             endcase      

54.         end

55.     end     

56. endmodule

1.1.3.  功能仿真

咱們再也不列出仿真代碼,你們能夠參考sim文件夾下的代碼。雙擊的批處理文件modelsim_run.bat,就能夠啓動仿真,調出仿真結果,以下圖。能夠看到咱們模擬8次按鍵操做,每次按鍵鬆開時,LED指示燈都切換至不一樣的輸出狀態。

下面咱們再經過仿真,具體看一下邊沿檢測的時序仿真結果。咱們找到任意一個i_key信號的上升沿,放大至下圖。能夠看到i_key先置1,而key_sfrbit0延遲了一個時鐘週期後才置1key_sfrbit1則比i_key信號延遲了2個時鐘週期,而key_sfrbit2則比i_key信號延遲了3個時鐘週期。上升沿標誌信號w_key_rise比實際i_key上升沿是延遲了2個時鐘週期的。你們在從此的設計中必定要注意這些時序的小細節,考慮這些延遲是否會給你的設計帶來問題。

1.1.4.  實驗結果

根據第四章2.4.6節介紹的程序燒寫方法,將工程燒寫文件燒寫至FPGA中,觀察現象,並驗證設計的正確性。



相關文章
相關標籤/搜索