矩陣鍵盤eda技術課程設計_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  《電子設計EDA》課程設計</p><p><b>  目 錄</b></p><p><b>  一、緒論1</b></p><p>  1.1 FPGA概況1</p><p>  1.2 本課題的研究意義2</p><p>  二、課程設計的

2、任務和目的3</p><p>  三、矩陣鍵盤接口電路的原理與總體設計3</p><p>  3.1 矩陣鍵盤接口電路的原理3</p><p>  3.2 總體設計5</p><p>  四、各模塊的設計及仿真6</p><p>  4.1 鍵盤掃描電路6</p><p>  4.2

3、 鍵盤譯碼電路和按鍵標志位產(chǎn)生電路8</p><p>  4.3 時鐘產(chǎn)生模塊10</p><p>  4.4 鍵盤接口電路頂層電路實現(xiàn)12</p><p><b>  五、參考文獻13</b></p><p><b>  六、心得體會13</b></p><p>

4、<b>  七、附錄14</b></p><p>  7.1 源程序代碼14</p><p>  題目:矩陣鍵盤控制接口設計</p><p><b>  一、緒論</b></p><p>  1.1 FPGA概況</p><p>  早期的可編程邏輯器件只有可編程只讀存儲

5、器(PROM)、紫外線可擦除只讀存儲器(EPROM)和電可擦除只讀存儲器(E2PROM)三種。由于結構的限制,它們只能完成簡單的數(shù)字邏輯功能。</p><p>  其后出現(xiàn)了一類結構上稍復雜的可編程芯片,即可編程邏輯器件(PLD),它能夠完成各種數(shù)字邏輯功能。典型的PLD由一個“與”門和一個“或”門陣列組成,而任意一個組合邏輯都可以用“與—或”表達式來描述,所以PLD能以乘積和的形式完成大量的組合邏輯功能。<

6、;/p><p>  這一階段的產(chǎn)品主要有PAL(可編程陣列邏輯)和GAL(通用陣列邏輯)。 PAL由一個可編程的“與”平面和一個固定的“或”平面構成,或門的輸出可以通過觸發(fā)器有選擇地被置為寄存狀態(tài)。PAL器件是現(xiàn)場可編程的,它的實現(xiàn)工藝有反熔絲技術、EPROM技術和E2PROM技術。還有一類結構更為靈活的邏輯器件是可編程邏輯陣列(PLA),它也由一個“與”平面和一個“或”平面構成,但是這兩個平面的連接關系是可編程的。

7、PLA器件既有現(xiàn)場可編程的,也有掩膜可編程的。在PAL的基礎上又發(fā)展了一種通用陣列邏輯(GAL、Generic ArrayLogic),如GAL16V8、GAL22V10等。它采用了E'PROM工藝,實現(xiàn)了電可擦除、電可改寫,其輸出結構是可編程的邏輯宏單元,因而它的設計具有很強的靈活性,至今仍有許多人使用。這些早期的PLD器件的一個共同特點是可以實現(xiàn)速度特性較好的邏輯功能,但其過于簡單的結構也使它們只能實現(xiàn)規(guī)模較小的電路。</p&

8、gt;<p>  為了彌補這一缺陷,20世紀80年代中期,Altera和Xilinx分別推出了類似于PAL結構的擴展型CPLD(Complex Programmable Logic Dvice)和與標準門陣列類似的FPGA(FieldProgrammable Gate Array),它們都具有體系結構和邏輯單元靈活、集成度高以及適用范圍寬等特點。這兩種器件兼容了PLD和通用門陣列的優(yōu)點,可實現(xiàn)較大規(guī)模的電路,編程也很靈活。

9、與門陣列等其他ASIC(Application Specific IC)相比,它們又具有設計開發(fā)周期短、設計制造成本低、開發(fā)工具先進、標準產(chǎn)品不需測試、質量穩(wěn)定以及可實時在線檢驗等優(yōu)點,因此被廣泛應用于產(chǎn)品的原型設計和產(chǎn)品生產(chǎn)(一般在10 000件以下)之中。幾乎所有應用門陣列、PLD和中小規(guī)模通用數(shù)字集成電路的場合均可應用FPGA和CPLD器件。</p><p>  1.2 本課題的研究意義</p>

10、<p>  近年來EDA技術在電子領域引發(fā)的技術革命,推動著電子技術的迅猛發(fā)展,為世人所矚目,而FPGA為代表的可編程邏輯器件的應用,更是受到業(yè)內人士的普遍關注。伴隨著大規(guī)模集成電路和計算機技術的高速發(fā)展,在設計工業(yè)自動化,儀器儀表,計算機設計與應用、通信、國防等領域的電子系統(tǒng)中,F(xiàn)PGA技術的含量正以驚人的速度提升。將盡可能大的完整的電子系統(tǒng)在單一FPGA芯片中實現(xiàn)已成為現(xiàn)實,電子類新技術項目的開發(fā)也更多地依賴于FPGA

11、技術的應用。</p><p>  作為FPGA研究課題之一的矩陣鍵盤控制接口電路的設計,在FPGA設計中是一個經(jīng)常被提到的話題,就像是利用PFGA設計數(shù)字中一樣,雖然簡單,但是卻是一個很有研究意義的話題,涉及到怎么樣才能是FPGA資源更加充分利用,現(xiàn)在很多電子產(chǎn)品都涉及到按鍵,小的有獨立按鍵,大的有N*N的矩陣鍵盤,獨立按鍵由于案件的個數(shù)少,也就沒必要考慮資源的利用問題了。而矩陣鍵盤,由于按鍵多,對整個系統(tǒng)的影響

12、大,所以肯定要考慮資源的利用問題,而且還要考慮一下電路里面的時序問題。本次設計要求設計一個4*9矩陣鍵盤,也就是行為4,列為9,一共可以設計36個按鍵。其中設計方法為:一般判斷鍵盤中有沒有按鍵按下是通過航線送入掃描信號,然后從列線中讀取狀態(tài)得到的,其方法是依次給行線送入低電平,檢查列線的輸入。如果列線信號趣味高電平,則代表低電平信號所在的行中無按鍵按下,反之,則有,則在低電平信號所在的行和出現(xiàn)低電平的交叉處有按鍵按下。</p>

13、;<p>  一共有三個模塊,分別為:掃描電路模塊、時鐘產(chǎn)生模塊、鍵盤譯碼電路和按鍵標志位產(chǎn)生電路。掃描模塊中是為了產(chǎn)生掃描信號,來利用掃描信號來掃描鍵盤中中是否有按鍵按下。鍵盤譯碼電路和按鍵標志位產(chǎn)生電路是為了配合掃描模塊來掃描電路中是否有按鍵按下,而且還要求它來產(chǎn)生按鍵標志信號,以便和外部電路握手。時鐘產(chǎn)生電路是為了產(chǎn)生不同頻率的信號,來驅動上面兩個電路的運轉。</p><p>  在設計完各個

14、模塊后,還要對每個模塊進行仿真,在仿真的過程中要對參數(shù)精心設計,要不然看不出結果的。</p><p>  二、課程設計的任務和目的</p><p>  20世紀90年代,國際上電子和計算機技術較先進的國家,一直在積極探索新的電子電路設計方法,并在設計方法、工具等方面進行了徹底的變革,取得了巨大成功。在電子技術設計領域,可編程邏輯器件(如CPLD、FPGA)的應用,已得到廣泛的普及,這些器件

15、為數(shù)字系統(tǒng)的設計帶來了極大的靈活性。這一切極大地改變了傳統(tǒng)的數(shù)字系統(tǒng)設計方法、設計過程和設計觀念,促進了EDA技術的迅速發(fā)展。 </p><p>  本次設計在EDA開發(fā)平臺QUARTUSⅡ7.2上利用VHDL語言設計矩陣鍵盤控制接口電路。要求設計一個4×9矩陣鍵盤,一共有三個模塊,分別為:掃描電路模塊、時鐘產(chǎn)生模塊、鍵盤譯碼電路和按鍵標志位產(chǎn)生電路。掃描模塊中是為了產(chǎn)生掃描信號,來利用掃描信號來掃描鍵

16、盤中是否有按鍵按下。鍵盤譯碼電路和按鍵標志位產(chǎn)生電路也是為了配合掃描模塊來掃描電路中是否有按鍵按下,而且還要求它來產(chǎn)生按鍵標志信號,以便和外部電路握手。時鐘產(chǎn)生電路是為了產(chǎn)生不同頻率的信號,來驅動上面兩個電路的運轉。</p><p>  通過對課題的分析研究,掌握了VHDL語言編程方法,同時也增強了個人的學習能力和動手能力。</p><p>  矩陣鍵盤接口電路的原理與總體設計</p

17、><p>  本章首先介紹矩陣鍵盤的設計思路,總體來說行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。最后介紹4*9鍵盤的總體設計思路。</p><p>  3.1 矩陣鍵盤接口電路的原理</p><p>  在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線

18、在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,列線通過電阻接正電源,并將行線所接的FPGA的I/O口作為輸出端,而列線所接的I/O口則作為

19、輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。</p><p>  行列式鍵盤的電路原理如圖3.1.1所示:(為了說明問題以4*4為例)</p><p>  圖3.1.1 行列式鍵盤的電路原理圖</p><p>  設置掃描信號為keydrv

20、3~keydrv0,列線按鍵輸入信號keyin3~keyin0與按鍵位置的關系如表3.1.1所示:</p><p>  表3.1.1 掃描信號和列線按鍵輸入信號與按鍵之間的關系表</p><p><b>  3.2 總體設計</b></p><p>  矩陣鍵盤控制系統(tǒng)的總體設計如圖3.2.1所示:</p><p> 

21、 圖3.2.1 鍵盤接口電路結構圖</p><p>  由行列式鍵盤原理就可以知道,要正確的完成鍵盤輸入工作必須有按鍵掃描電路產(chǎn)生keydrv3~keydrv0信號,同時還必須有按鍵譯碼電路從keydrv3~keydrv0信號和keyin3~keyin0信號中譯碼出按鍵的值。此外,一般還需要一個按鍵發(fā)生信號用于和其他模塊接口,通知其他模塊鍵盤上有按鍵動作發(fā)生,并可以從鍵盤上讀取按鍵的鍵值。由于各個模塊需要的時鐘

22、頻率是不一樣的,因此時鐘產(chǎn)生模塊就是用于產(chǎn)生各個模塊需要的時鐘信號。因此得到鍵盤接口電路的結構如上圖所示。</p><p>  四、各模塊的設計及仿真</p><p>  4.1 鍵盤掃描電路</p><p>  鍵盤掃描電路是用于產(chǎn)生keydrv3~keydrv0信號,其變化的順序依次是1110---1101---1011---0111---……周而復始地掃描。其

23、停留在某個狀態(tài)的時間大約為10ms。更短的停留時間是沒有必要的,因為人按鍵的時間大約為10ms,不可能有更快的按鍵動作發(fā)生;另外,更短的停留時間還容易采集到抖動信號,會干擾判斷,而太長的停留時間則會使某些較快的按鍵東走丟失。</p><p>  鍵盤掃描電路的外部接口電路如圖4.1.1所示,其中clk_scan是周期為10ms的掃描時鐘,keydrv為輸出到鍵盤的掃描信號,寬度為4位。</p>&l

24、t;p>  圖4.1.1 鍵盤掃描電路的外部接口電路圖</p><p>  其VHDL描述如下:</p><p>  LIBRARY ieee;</p><p>  USE ieee.std_logic_1164.all;</p><p>  ENTITY key_scan IS</p><p>  -- {{

25、ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!</p><p><b>  PORT</b></p><p><b>  (</b></p><p>  clk_scan : IN STD_LOGIC; --掃描時鐘,周期10ms</p><p&g

26、t;  keydrv : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) </p><p><b>  --輸出掃描信號</b></p><p><b>  );</b></p><p>  -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!&

27、lt;/p><p>  END key_scan;</p><p>  -- Architecture Body</p><p>  ARCHITECTURE key_scan_architecture OF key_scan IS</p><p>  CONSTANT s0 :STD_LOGIC_VECTOR (3 DOWNTO 0):=&q

28、uot;1110" ;</p><p><b>  --定義狀態(tài)機編碼</b></p><p>  CONSTANT s1 :STD_LOGIC_VECTOR (3 DOWNTO 0):="1101" ;</p><p>  CONSTANT s2 :STD_LOGIC_VECTOR (3 DOWNTO 0):=&

29、quot;1011" ;</p><p>  CONSTANT s3 :STD_LOGIC_VECTOR (3 DOWNTO 0):="0111" ;</p><p>  SIGNAL present_state:STD_LOGIC_VECTOR(3 DOWNTO 0);</p><p><b>  --狀態(tài)機現(xiàn)態(tài)</b

30、></p><p>  SIGNAL next_state:STD_LOGIC_VECTOR(3 DOWNTO 0); </p><p><b>  --狀態(tài)機次態(tài)</b></p><p><b>  BEGIN</b></p><p><b>  --狀態(tài)更新進程</b>

31、;</p><p>  PROCESS(clk_scan)</p><p><b>  BEGIN</b></p><p>  IF(clk_scan'event and clk_scan='1') then</p><p>  present_state<=next_state;</

32、p><p><b>  END IF;</b></p><p>  END PROCESS;</p><p><b>  --狀態(tài)譯碼</b></p><p>  PROCESS (present_state)</p><p><b>  BEGIN</b>

33、</p><p>  CASE present_state IS</p><p>  WHEN s0=>next_state<=s1;</p><p>  WHEN s1=>next_state<=s2;</p><p>  WHEN s2=>next_state<=s3;</p><p

34、>  WHEN s3=>next_state<=s0;</p><p><b>  --多余狀態(tài)處理</b></p><p>  WHEN OTHERS=>next_state<=s0;</p><p><b>  END CASE;</b></p><p>  END

35、 PROCESS;</p><p><b>  --輸出譯碼</b></p><p>  keydrv<=present_state;</p><p>  END key_scan_architecture;</p><p>  以上程序采用一個狀態(tài)機來實現(xiàn)掃描電路。該狀態(tài)機是一個one-hot狀態(tài)機,并且輸出值就

36、是狀態(tài)機的狀態(tài),沒有通過一個邏輯電路來做輸出譯碼。這樣的好處是得到的輸出信號比較“干凈”,沒有毛刺。</p><p>  其仿真波形如圖4.1.2所示:</p><p>  圖4.1.2 鍵盤掃描電路的仿真圖</p><p>  從圖4.1.2中很容易發(fā)現(xiàn)present_state的值的變化是隨著掃描信號key_scan的上升沿的到來而變化的,也就是key_sca

37、n每來一個脈沖,相應的present_state的值就變化一次。很容易發(fā)現(xiàn)keydrv的值的變化順序為1110---1101---1011---0111,也就是每個key_scan來一個脈沖時,保證keydrv相鄰的值只有一個變化,這樣為了防止產(chǎn)生不必要的毛刺。present_state值和keydrv值是相同的,只不過一個用的是二進制,一個用的是十進制,所以它的變化為14—13—11—7。</p><p>  

38、4.2 鍵盤譯碼電路和按鍵標志位產(chǎn)生電路</p><p>  鍵盤譯碼電路是從keydrv3~keydrv0和keyin3~keyin0信號中譯碼出按鍵的鍵值的電路,它的真值表就是以前行掃描信號、列掃描與按鍵位置的關系圖。按鍵標志位產(chǎn)生電路是產(chǎn)生按鍵標志位信號keypressed的電路。由于這兩個電路關系緊密,因此放入同一個模塊中實現(xiàn),其外部接口圖如圖4.2.1所示。其中clk為局信號,它是由FPGA芯片的外部晶

39、振給出的。clk在系統(tǒng)中的頻率是最高,其他時鐘都是它的分頻產(chǎn)生。keydrv為鍵盤掃描信號,keyin為鍵盤輸入信號,keyvalue為鍵值(代表按鍵所在的位置),keypressed表示有一個按鍵被按下,每發(fā)生一次按鍵動作,keypressed就輸出一個寬度為全局時鐘周期的正脈沖。該信號用于與其他模塊握手,負責通知其他模塊鍵盤是否有按鍵發(fā)生。其他模塊在keypressed有效時,可以讀取鍵值。</p><p>

40、  圖4.2.1 鍵盤譯碼電路的外部接口</p><p>  其VHDL實現(xiàn)如下:</p><p>  LIBRARY ieee;</p><p>  USE ieee.std_logic_1164.all;</p><p>  USE ieee.std_logic_arith.all;</p><p>  ENTI

41、TY keydecoder IS</p><p><b>  PORT(</b></p><p>  clk : IN STD_LOGIC;--全局時鐘</p><p>  clk_scan : IN STD_LOGIC; --掃描時鐘 </p><p>  keyin : IN STD_LOGIC_VE

42、CTOR(8 DOWNTO 0);--鍵盤輸入</p><p>  keydrv : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--掃描信號</p><p>  keyvalue : OUT STD_LOGIC_VECTOR(8 DOWNTO 0);--鍵值</p><p>  keypressed : OUT STD_LOGIC

43、--有按鍵按下</p><p><b>  );</b></p><p>  END keydecoder;</p><p>  ARCHITECTURE keydecoder_architecture OF keydecoder IS</p><p>  --TEMP <=keyin & keydrv

44、;</p><p>  SIGNAL temp:STD_LOGIC_VECTOR(12 DOWNTO 0) ;</p><p>  SIGNAL temp_pressed: STD_LOGIC;</p><p>  SIGNAL keypressed_asy: STD_LOGIC;</p><p>  SIGNAL q1,q2,q3,q4,q

45、5,q6 :STD_LOGIC;</p><p><b>  BEGIN</b></p><p>  temp<=keyin & keydrv;</p><p><b>  --譯碼進程</b></p><p><b>  參見附錄程序</b></p>

46、<p>  --按鍵標志產(chǎn)生電路</p><p>  process (clk_scan)</p><p><b>  begin</b></p><p>  if (clk_scan'event and clk_scan='1') then</p><p>  q1<=tem

47、p_pressed;</p><p><b>  q2<=q1;</b></p><p><b>  q3<=q2;</b></p><p><b>  q4<=q1;</b></p><p><b>  end if;</b></

48、p><p>  keypressed_asy<=q1 or q2 or q3 or q4 ;</p><p>  end process;</p><p>  --同步化keypressed_asy</p><p>  process(clk)</p><p><b>  begin</b>&l

49、t;/p><p>  if(clk'event and clk='1') then </p><p>  q5<=keypressed_asy;</p><p><b>  q6<=q5;</b></p><p><b>  end if;</b></p>

50、<p>  keypressed<=q5 and not(q6) ;</p><p>  end process;</p><p>  END keydecoder_architecture;</p><p>  上面程序是改進的程序,原程序是:</p><p>  --同步化有鍵被按下</p><p&

51、gt;  PROCESS(clk)</p><p><b>  BEGIN</b></p><p>  IF(clk'event and clk ='1')THEN</p><p>  q1<=temp_pressed;</p><p><b>  q2<=q1;</b

52、></p><p><b>  END IF;</b></p><p>  keypressed<=q1 and not(q2) ;</p><p>  END PROCESS;</p><p>  ENDkeydecoder_architecture;</p><p>  上面程序

53、中有兩個進程。第一個進程負責譯碼,值得注意的是WHEN OTHEN語句有沒有對temp_pressed和keyvalue信號賦值,這相當于不改變temp_presed和keyvalue信號的值,即實現(xiàn)了鎖存輸出。在不需要鎖存輸出時,在WHEN O-THEN語句中,一定要對所有的case語句中出現(xiàn)的信號逐一賦值,以免產(chǎn)生意想不到的結果。第二個進程負責把按鍵同步信號同步化與全局時鐘同步的并且脈寬為一個周期的脈沖。重新編寫按鍵發(fā)生標志電路,該

54、電路不僅要解決按鍵抖動導致一次按鍵被當成多次的問題,同時還要解決按鍵太長導致一次按鍵被當成多次的問題。考慮這些因素之后,編寫的程序應該是陰影部分的程序。</p><p>  該電路的仿真結果如圖4.2.2所示:</p><p>  圖4.2.2 鍵盤譯碼電路仿真圖</p><p>  通過仿真波形圖可以看出,按鍵的抖動不會影響輸出結果;無論一個按鍵動作持續(xù)時間有多

55、久,但仍然認為是一個按鍵。</p><p>  4.3 時鐘產(chǎn)生模塊</p><p>  時鐘產(chǎn)生模塊是用于掃描時鐘的,它的輸出供給給鍵盤掃描模塊和按鍵標志位的產(chǎn)生模塊,其外部接口圖如圖4.3.1所示:</p><p>  圖4.3.1 時鐘產(chǎn)生模塊外部接口電路</p><p>  其VHDL實現(xiàn)如下:</p><p&g

56、t;  LIBRARY ieee;</p><p>  USE ieee.std_logic_1164.all;</p><p>  USE ieee.std_logic_ARITH.all;</p><p>  ENTITY clk_gen IS</p><p><b>  PORT</b></p>&l

57、t;p>  (clk : IN STD_LOGIC; --全局時鐘 </p><p>  clk_scan : OUT STD_LOGIC --掃描時鐘 </p><p><b>  );</b></p><p>  END clk_gen;</p><p>  ARC

58、HITECTURE clk_gen_architecture OF clk_gen IS</p><p>  --做程序仿真時,用這個語句</p><p>  signal cnt :integer range 0 to 150; </p><p>  --需要下載到芯片上時,替換為下面這個語句</p><p>  signal cnt :i

59、nteger range 0 to 119999; </p><p><b>  begin</b></p><p><b>  --計數(shù)模塊</b></p><p>  process(clk)</p><p><b>  begin</b></p><p

60、>  if(clk'event and clk ='1') then</p><p>  if (cnt=cnt'high) then</p><p><b>  cnt<=0;</b></p><p><b>  else</b></p><p>  c

61、nt<=cnt+1;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;</p><p><b>  --譯碼輸出</b></p><p>  pro

62、cess(cnt,clk)</p><p><b>  begin</b></p><p>  if(clk'event and clk='1') then</p><p>  if cnt>=cnt'high/2 then</p><p>  clk_scan<='1

63、';</p><p><b>  else</b></p><p>  clk_scan<='0';</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p> 

64、 end process;</p><p>  END clk_gen_architecture;</p><p>  該程序主要包含有一個計數(shù)器模塊和一個譯碼輸出模塊,該程序是通過計數(shù)器模塊實現(xiàn)分頻的。要從12MHZ全局時鐘得到100HZ的時鐘,必須進行120000倍的分頻。這么大的分頻需要仿真時間很久。仿真時一般采用小分頻來代替,(在本程序中采用150分頻來仿真)以便快速觀察到結果。等

65、到真正下載到電路上時,就需要采用120000分頻了。該電路的仿真結果如圖4.3.2所示:</p><p>  圖4.3.2 時鐘產(chǎn)生模塊的仿真圖</p><p>  4.4 鍵盤接口電路頂層電路實現(xiàn)</p><p>  鍵盤接口電路的頂層電路只是把鍵盤掃描模塊、鍵盤譯碼且按鍵標志位產(chǎn)生模塊和時鐘產(chǎn)生模塊連接起來,其結構如圖4.4.1所示:</p>&

66、lt;p>  圖4.4.1 鍵盤接口電路的頂層電路</p><p>  該電路的仿真波形如圖4.4.2所示:</p><p>  圖4.4.2 鍵盤接口電路的頂層電路仿真圖</p><p><b>  五、參考文獻</b></p><p>  [1] 潘松,黃繼業(yè). EDA技術實用教程[M]. 北京:科學出版社

67、,2010.</p><p>  [2] 黃正槿,徐堅. CPLD系統(tǒng)設計技術入門與應用[M]. 北京:電子工業(yè)出版社,2006.</p><p>  [3] 徐惠民,安德寧. 數(shù)字邏輯設計與VHDL描述[M]. 北京:機械工業(yè)出版社,2008.</p><p>  [4] 周國祥. 匯編語言程序設計[M]. 合肥:合肥工業(yè)大學出版社,2010.</p>

68、<p>  [5] 趙曙光. 可編程邏輯器件原理開發(fā)與應用[M]. 西安:西安電子科技大學出版社,2008.</p><p>  [6] 求是科技. CPLD/FPGA應用開發(fā)技術與工程實踐[M]. 北京:人民郵電出版社,2007.</p><p><b>  六、心得體會</b></p><p>  矩陣式鍵盤是一種常見的輸入裝

69、置,在日常的生活中,矩陣式鍵盤在計算機、電話、手機、微波爐等電子產(chǎn)品上已被廣泛應用,各式各樣的矩陣鍵盤控制著各種各樣的功能。矩陣鍵盤控制接口電路是最基本的輸入電路,我們利用軟件Quartus II自行設計并修改的鍵盤輸入顯示電路是通過VHDL語言的編寫并實現(xiàn)了鍵碼的對應顯示,在設計中發(fā)現(xiàn)了許多問題,比如去按鍵抖動,這個過程很有意思但卻很繁瑣,在利用Quartus II進行仿真的時候,要細心地對參數(shù)進行設置,最后才能夠仿真出結果。<

70、/p><p>  本次設計中最為突出的是對鍵盤譯碼電路和按鍵標志位產(chǎn)生電路的設計,主要是去抖動,其中重要一點是按鍵去抖動電路不僅要解決按鍵抖動導致一次按鍵被當成多次的問題,同時還要解決按鍵太長導致一次按鍵被當成多次的問題。否則,當設計的鍵盤在實際中應用的時候,就會出現(xiàn)錯誤,所以應該把之前的程序重新編寫。在新程序中:</p><p>  多了一個輸入信號clk_scan,它是用于產(chǎn)生掃描信號的時

71、鐘,周期為10ms。</p><p>  按鍵信號tepm_pressed首先通過clk_scan信號的上升沿采樣,通過采樣后,抖動噪聲被消除。</p><p>  采樣后得到信號被分別延遲1~4個clk_csan周期得到4個信號q1、q2、q3、q4。這四個信號進行或運算得到一個寬度約為80ms并且與全局時鐘異步的按鍵信號keypressed_asy。原來程序中一個長時間的按鍵過程有可能

72、被認為是多次按鍵,通過這種方法使得一個長時間的按鍵仍然是一次按鍵。</p><p>  把keypressed_asy同步化。</p><p><b>  消除了按鍵抖動。</b></p><p><b>  七、附錄</b></p><p><b>  7.1 源程序代碼</b&g

73、t;</p><p>  PROCESS (temp)</p><p><b>  BEGIN </b></p><p>  case temp is</p><p>  when "1111111101110"=>keyvalue<=conv_std_logic_vector(1,9);

74、</p><p>  temp_pressed <='1';</p><p>  when "1111111101101"=>keyvalue<=conv_std_logic_vector(2,9);</p><p>  temp_pressed <='1';</p><

75、p>  when "1111111101011"=>keyvalue<=conv_std_logic_vector(3,9);</p><p>  temp_pressed <='1';</p><p>  when "1111111100111"=>keyvalue<=conv_std_logic

76、_vector(4,9);</p><p>  temp_pressed <='1';</p><p>  when "1111111011110"=>keyvalue<=conv_std_logic_vector(5,9);</p><p>  temp_pressed <='1';<

77、;/p><p>  when "1111111011101"=>keyvalue<=conv_std_logic_vector(6,9);</p><p>  temp_pressed <='1';</p><p>  when "1111111011011"=>keyvalue<=c

78、onv_std_logic_vector(7,9);</p><p>  temp_pressed <='1';</p><p>  when "1111111010111"=>keyvalue<=conv_std_logic_vector(8,9);</p><p>  temp_pressed <=&#

79、39;1';</p><p>  when "1111110111110"=>keyvalue<=conv_std_logic_vector(9,9);</p><p>  temp_pressed <='1';</p><p>  when "1111110111101"=>k

80、eyvalue<=conv_std_logic_vector(10,9);</p><p>  temp_pressed <='1';</p><p>  when "1111110111011"=>keyvalue<=conv_std_logic_vector(11,9);</p><p>  temp_

81、pressed <='1';</p><p>  when "1111110110111"=>keyvalue<=conv_std_logic_vector(12,9);</p><p>  temp_pressed <='1';</p><p>  when "111110111

82、1110"=>keyvalue<=conv_std_logic_vector(13,9);</p><p>  temp_pressed <='1';</p><p>  when "1111101111101"=>keyvalue<=conv_std_logic_vector(14,9);</p>

83、<p>  temp_pressed <='1';</p><p>  when "1111101111011"=>keyvalue<=conv_std_logic_vector(15,9);</p><p>  temp_pressed <='1';</p><p>  when

84、 "1111101110111"=>keyvalue<=conv_std_logic_vector(16,9);</p><p>  temp_pressed <='1';</p><p>  when "1111011111110"=>keyvalue<=conv_std_logic_vector(17

85、,9);</p><p>  temp_pressed <='1';</p><p>  when "1111011111101"=>keyvalue<=conv_std_logic_vector(18,9);</p><p>  temp_pressed <='1';</p>

86、<p>  when "1111011111011"=>keyvalue<=conv_std_logic_vector(19,9);</p><p>  temp_pressed <='1';</p><p>  when "1111011110111"=>keyvalue<=conv_std

87、_logic_vector(20,9);</p><p>  temp_pressed <='1';</p><p>  when "1110111111110"=>keyvalue<=conv_std_logic_vector(21,9);</p><p>  temp_pressed <='1&

88、#39;;</p><p>  when "1110111111101"=>keyvalue<=conv_std_logic_vector(22,9);</p><p>  temp_pressed <='1';</p><p>  when "1110111111011"=>keyva

89、lue<=conv_std_logic_vector(23,9);</p><p>  temp_pressed <='1';</p><p>  when "1110111110111"=>keyvalue<=conv_std_logic_vector(24,9);</p><p>  temp_pres

90、sed <='1';</p><p>  when "1101111111110"=>keyvalue<=conv_std_logic_vector(25,9);</p><p>  temp_pressed <='1';</p><p>  when "1101111111101

91、"=>keyvalue<=conv_std_logic_vector(26,9);</p><p>  temp_pressed <='1';</p><p>  when "1101111111011"=>keyvalue<=conv_std_logic_vector(27,9);</p><

92、p>  temp_pressed <='1';</p><p>  when "1101111110111"=>keyvalue<=conv_std_logic_vector(28,9);</p><p>  temp_pressed <='1';</p><p>  when &qu

93、ot;1011111111110"=>keyvalue<=conv_std_logic_vector(29,9);</p><p>  temp_pressed <='1';</p><p>  when "1011111111101"=>keyvalue<=conv_std_logic_vector(30,9);

94、</p><p>  temp_pressed <='1';</p><p>  when "1011111111011"=>keyvalue<=conv_std_logic_vector(31,9);</p><p>  temp_pressed <='1';</p><

95、;p>  when "1011111110111"=>keyvalue<=conv_std_logic_vector(32,9);</p><p>  temp_pressed <='1';</p><p>  when "0111111111110"=>keyvalue<=conv_std_log

96、ic_vector(33,9);</p><p>  temp_pressed <='1';</p><p>  when "0111111111101"=>keyvalue<=conv_std_logic_vector(34,9);</p><p>  temp_pressed <='1'

97、;</p><p>  when "0111111111011"=>keyvalue<=conv_std_logic_vector(35,9);</p><p>  temp_pressed <='1';</p><p>  when "0111111110111"=>keyvalue&

98、lt;=conv_std_logic_vector(36,9);</p><p>  temp_pressed <='1';</p><p>  when others =></p><p>  temp_pressed<='0';</p><p><b>  end case;&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論