版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《電子設(shè)計(jì)EDA》課程設(shè)計(jì)</p><p><b> 目 錄</b></p><p><b> 一、緒論1</b></p><p> 1.1 FPGA概況1</p><p> 1.2 本課題的研究意義2</p><p> 二、課程設(shè)計(jì)的
2、任務(wù)和目的3</p><p> 三、矩陣鍵盤接口電路的原理與總體設(shè)計(jì)3</p><p> 3.1 矩陣鍵盤接口電路的原理3</p><p> 3.2 總體設(shè)計(jì)5</p><p> 四、各模塊的設(shè)計(jì)及仿真6</p><p> 4.1 鍵盤掃描電路6</p><p> 4.2
3、 鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路8</p><p> 4.3 時(shí)鐘產(chǎn)生模塊10</p><p> 4.4 鍵盤接口電路頂層電路實(shí)現(xiàn)12</p><p><b> 五、參考文獻(xiàn)13</b></p><p><b> 六、心得體會13</b></p><p>
4、<b> 七、附錄14</b></p><p> 7.1 源程序代碼14</p><p> 題目:矩陣鍵盤控制接口設(shè)計(jì)</p><p><b> 一、緒論</b></p><p> 1.1 FPGA概況</p><p> 早期的可編程邏輯器件只有可編程只讀存儲
5、器(PROM)、紫外線可擦除只讀存儲器(EPROM)和電可擦除只讀存儲器(E2PROM)三種。由于結(jié)構(gòu)的限制,它們只能完成簡單的數(shù)字邏輯功能。</p><p> 其后出現(xiàn)了一類結(jié)構(gòu)上稍復(fù)雜的可編程芯片,即可編程邏輯器件(PLD),它能夠完成各種數(shù)字邏輯功能。典型的PLD由一個(gè)“與”門和一個(gè)“或”門陣列組成,而任意一個(gè)組合邏輯都可以用“與—或”表達(dá)式來描述,所以PLD能以乘積和的形式完成大量的組合邏輯功能。<
6、;/p><p> 這一階段的產(chǎn)品主要有PAL(可編程陣列邏輯)和GAL(通用陣列邏輯)。 PAL由一個(gè)可編程的“與”平面和一個(gè)固定的“或”平面構(gòu)成,或門的輸出可以通過觸發(fā)器有選擇地被置為寄存狀態(tài)。PAL器件是現(xiàn)場可編程的,它的實(shí)現(xiàn)工藝有反熔絲技術(shù)、EPROM技術(shù)和E2PROM技術(shù)。還有一類結(jié)構(gòu)更為靈活的邏輯器件是可編程邏輯陣列(PLA),它也由一個(gè)“與”平面和一個(gè)“或”平面構(gòu)成,但是這兩個(gè)平面的連接關(guān)系是可編程的。
7、PLA器件既有現(xiàn)場可編程的,也有掩膜可編程的。在PAL的基礎(chǔ)上又發(fā)展了一種通用陣列邏輯(GAL、Generic ArrayLogic),如GAL16V8、GAL22V10等。它采用了E'PROM工藝,實(shí)現(xiàn)了電可擦除、電可改寫,其輸出結(jié)構(gòu)是可編程的邏輯宏單元,因而它的設(shè)計(jì)具有很強(qiáng)的靈活性,至今仍有許多人使用。這些早期的PLD器件的一個(gè)共同特點(diǎn)是可以實(shí)現(xiàn)速度特性較好的邏輯功能,但其過于簡單的結(jié)構(gòu)也使它們只能實(shí)現(xiàn)規(guī)模較小的電路。</p&
8、gt;<p> 為了彌補(bǔ)這一缺陷,20世紀(jì)80年代中期,Altera和Xilinx分別推出了類似于PAL結(jié)構(gòu)的擴(kuò)展型CPLD(Complex Programmable Logic Dvice)和與標(biāo)準(zhǔn)門陣列類似的FPGA(FieldProgrammable Gate Array),它們都具有體系結(jié)構(gòu)和邏輯單元靈活、集成度高以及適用范圍寬等特點(diǎn)。這兩種器件兼容了PLD和通用門陣列的優(yōu)點(diǎn),可實(shí)現(xiàn)較大規(guī)模的電路,編程也很靈活。
9、與門陣列等其他ASIC(Application Specific IC)相比,它們又具有設(shè)計(jì)開發(fā)周期短、設(shè)計(jì)制造成本低、開發(fā)工具先進(jìn)、標(biāo)準(zhǔn)產(chǎn)品不需測試、質(zhì)量穩(wěn)定以及可實(shí)時(shí)在線檢驗(yàn)等優(yōu)點(diǎn),因此被廣泛應(yīng)用于產(chǎn)品的原型設(shè)計(jì)和產(chǎn)品生產(chǎn)(一般在10 000件以下)之中。幾乎所有應(yīng)用門陣列、PLD和中小規(guī)模通用數(shù)字集成電路的場合均可應(yīng)用FPGA和CPLD器件。</p><p> 1.2 本課題的研究意義</p>
10、<p> 近年來EDA技術(shù)在電子領(lǐng)域引發(fā)的技術(shù)革命,推動著電子技術(shù)的迅猛發(fā)展,為世人所矚目,而FPGA為代表的可編程邏輯器件的應(yīng)用,更是受到業(yè)內(nèi)人士的普遍關(guān)注。伴隨著大規(guī)模集成電路和計(jì)算機(jī)技術(shù)的高速發(fā)展,在設(shè)計(jì)工業(yè)自動化,儀器儀表,計(jì)算機(jī)設(shè)計(jì)與應(yīng)用、通信、國防等領(lǐng)域的電子系統(tǒng)中,F(xiàn)PGA技術(shù)的含量正以驚人的速度提升。將盡可能大的完整的電子系統(tǒng)在單一FPGA芯片中實(shí)現(xiàn)已成為現(xiàn)實(shí),電子類新技術(shù)項(xiàng)目的開發(fā)也更多地依賴于FPGA
11、技術(shù)的應(yīng)用。</p><p> 作為FPGA研究課題之一的矩陣鍵盤控制接口電路的設(shè)計(jì),在FPGA設(shè)計(jì)中是一個(gè)經(jīng)常被提到的話題,就像是利用PFGA設(shè)計(jì)數(shù)字中一樣,雖然簡單,但是卻是一個(gè)很有研究意義的話題,涉及到怎么樣才能是FPGA資源更加充分利用,現(xiàn)在很多電子產(chǎn)品都涉及到按鍵,小的有獨(dú)立按鍵,大的有N*N的矩陣鍵盤,獨(dú)立按鍵由于案件的個(gè)數(shù)少,也就沒必要考慮資源的利用問題了。而矩陣鍵盤,由于按鍵多,對整個(gè)系統(tǒng)的影響
12、大,所以肯定要考慮資源的利用問題,而且還要考慮一下電路里面的時(shí)序問題。本次設(shè)計(jì)要求設(shè)計(jì)一個(gè)4*9矩陣鍵盤,也就是行為4,列為9,一共可以設(shè)計(jì)36個(gè)按鍵。其中設(shè)計(jì)方法為:一般判斷鍵盤中有沒有按鍵按下是通過航線送入掃描信號,然后從列線中讀取狀態(tài)得到的,其方法是依次給行線送入低電平,檢查列線的輸入。如果列線信號趣味高電平,則代表低電平信號所在的行中無按鍵按下,反之,則有,則在低電平信號所在的行和出現(xiàn)低電平的交叉處有按鍵按下。</p>
13、;<p> 一共有三個(gè)模塊,分別為:掃描電路模塊、時(shí)鐘產(chǎn)生模塊、鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路。掃描模塊中是為了產(chǎn)生掃描信號,來利用掃描信號來掃描鍵盤中中是否有按鍵按下。鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路是為了配合掃描模塊來掃描電路中是否有按鍵按下,而且還要求它來產(chǎn)生按鍵標(biāo)志信號,以便和外部電路握手。時(shí)鐘產(chǎn)生電路是為了產(chǎn)生不同頻率的信號,來驅(qū)動上面兩個(gè)電路的運(yùn)轉(zhuǎn)。</p><p> 在設(shè)計(jì)完各個(gè)
14、模塊后,還要對每個(gè)模塊進(jìn)行仿真,在仿真的過程中要對參數(shù)精心設(shè)計(jì),要不然看不出結(jié)果的。</p><p> 二、課程設(shè)計(jì)的任務(wù)和目的</p><p> 20世紀(jì)90年代,國際上電子和計(jì)算機(jī)技術(shù)較先進(jìn)的國家,一直在積極探索新的電子電路設(shè)計(jì)方法,并在設(shè)計(jì)方法、工具等方面進(jìn)行了徹底的變革,取得了巨大成功。在電子技術(shù)設(shè)計(jì)領(lǐng)域,可編程邏輯器件(如CPLD、FPGA)的應(yīng)用,已得到廣泛的普及,這些器件
15、為數(shù)字系統(tǒng)的設(shè)計(jì)帶來了極大的靈活性。這一切極大地改變了傳統(tǒng)的數(shù)字系統(tǒng)設(shè)計(jì)方法、設(shè)計(jì)過程和設(shè)計(jì)觀念,促進(jìn)了EDA技術(shù)的迅速發(fā)展。 </p><p> 本次設(shè)計(jì)在EDA開發(fā)平臺QUARTUSⅡ7.2上利用VHDL語言設(shè)計(jì)矩陣鍵盤控制接口電路。要求設(shè)計(jì)一個(gè)4×9矩陣鍵盤,一共有三個(gè)模塊,分別為:掃描電路模塊、時(shí)鐘產(chǎn)生模塊、鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路。掃描模塊中是為了產(chǎn)生掃描信號,來利用掃描信號來掃描鍵
16、盤中是否有按鍵按下。鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路也是為了配合掃描模塊來掃描電路中是否有按鍵按下,而且還要求它來產(chǎn)生按鍵標(biāo)志信號,以便和外部電路握手。時(shí)鐘產(chǎn)生電路是為了產(chǎn)生不同頻率的信號,來驅(qū)動上面兩個(gè)電路的運(yùn)轉(zhuǎn)。</p><p> 通過對課題的分析研究,掌握了VHDL語言編程方法,同時(shí)也增強(qiáng)了個(gè)人的學(xué)習(xí)能力和動手能力。</p><p> 矩陣鍵盤接口電路的原理與總體設(shè)計(jì)</p
17、><p> 本章首先介紹矩陣鍵盤的設(shè)計(jì)思路,總體來說行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。最后介紹4*9鍵盤的總體設(shè)計(jì)思路。</p><p> 3.1 矩陣鍵盤接口電路的原理</p><p> 在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線
18、在交叉處不直接連通,而是通過一個(gè)按鍵加以連接。這樣,一個(gè)端口就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來做鍵盤是合理的。矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,列線通過電阻接正電源,并將行線所接的FPGA的I/O口作為輸出端,而列線所接的I/O口則作為
19、輸入。這樣,當(dāng)按鍵沒有按下時(shí),所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。</p><p> 行列式鍵盤的電路原理如圖3.1.1所示:(為了說明問題以4*4為例)</p><p> 圖3.1.1 行列式鍵盤的電路原理圖</p><p> 設(shè)置掃描信號為keydrv
20、3~keydrv0,列線按鍵輸入信號keyin3~keyin0與按鍵位置的關(guān)系如表3.1.1所示:</p><p> 表3.1.1 掃描信號和列線按鍵輸入信號與按鍵之間的關(guān)系表</p><p><b> 3.2 總體設(shè)計(jì)</b></p><p> 矩陣鍵盤控制系統(tǒng)的總體設(shè)計(jì)如圖3.2.1所示:</p><p>
21、 圖3.2.1 鍵盤接口電路結(jié)構(gòu)圖</p><p> 由行列式鍵盤原理就可以知道,要正確的完成鍵盤輸入工作必須有按鍵掃描電路產(chǎn)生keydrv3~keydrv0信號,同時(shí)還必須有按鍵譯碼電路從keydrv3~keydrv0信號和keyin3~keyin0信號中譯碼出按鍵的值。此外,一般還需要一個(gè)按鍵發(fā)生信號用于和其他模塊接口,通知其他模塊鍵盤上有按鍵動作發(fā)生,并可以從鍵盤上讀取按鍵的鍵值。由于各個(gè)模塊需要的時(shí)鐘
22、頻率是不一樣的,因此時(shí)鐘產(chǎn)生模塊就是用于產(chǎn)生各個(gè)模塊需要的時(shí)鐘信號。因此得到鍵盤接口電路的結(jié)構(gòu)如上圖所示。</p><p> 四、各模塊的設(shè)計(jì)及仿真</p><p> 4.1 鍵盤掃描電路</p><p> 鍵盤掃描電路是用于產(chǎn)生keydrv3~keydrv0信號,其變化的順序依次是1110---1101---1011---0111---……周而復(fù)始地掃描。其
23、停留在某個(gè)狀態(tài)的時(shí)間大約為10ms。更短的停留時(shí)間是沒有必要的,因?yàn)槿税存I的時(shí)間大約為10ms,不可能有更快的按鍵動作發(fā)生;另外,更短的停留時(shí)間還容易采集到抖動信號,會干擾判斷,而太長的停留時(shí)間則會使某些較快的按鍵東走丟失。</p><p> 鍵盤掃描電路的外部接口電路如圖4.1.1所示,其中clk_scan是周期為10ms的掃描時(shí)鐘,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; --掃描時(shí)鐘,周期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)機(jī)編碼</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)機(jī)現(xiàn)態(tài)</b
30、></p><p> SIGNAL next_state:STD_LOGIC_VECTOR(3 DOWNTO 0); </p><p><b> --狀態(tài)機(jī)次態(tài)</b></p><p><b> BEGIN</b></p><p><b> --狀態(tài)更新進(jìn)程</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> 以上程序采用一個(gè)狀態(tài)機(jī)來實(shí)現(xiàn)掃描電路。該狀態(tài)機(jī)是一個(gè)one-hot狀態(tài)機(jī),并且輸出值就
36、是狀態(tài)機(jī)的狀態(tài),沒有通過一個(gè)邏輯電路來做輸出譯碼。這樣的好處是得到的輸出信號比較“干凈”,沒有毛刺。</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每來一個(gè)脈沖,相應(yīng)的present_state的值就變化一次。很容易發(fā)現(xiàn)keydrv的值的變化順序?yàn)?110---1101---1011---0111,也就是每個(gè)key_scan來一個(gè)脈沖時(shí),保證keydrv相鄰的值只有一個(gè)變化,這樣為了防止產(chǎn)生不必要的毛刺。present_state值和keydrv值是相同的,只不過一個(gè)用的是二進(jìn)制,一個(gè)用的是十進(jìn)制,所以它的變化為14—13—11—7。</p><p>
38、4.2 鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路</p><p> 鍵盤譯碼電路是從keydrv3~keydrv0和keyin3~keyin0信號中譯碼出按鍵的鍵值的電路,它的真值表就是以前行掃描信號、列掃描與按鍵位置的關(guān)系圖。按鍵標(biāo)志位產(chǎn)生電路是產(chǎn)生按鍵標(biāo)志位信號keypressed的電路。由于這兩個(gè)電路關(guān)系緊密,因此放入同一個(gè)模塊中實(shí)現(xiàn),其外部接口圖如圖4.2.1所示。其中clk為局信號,它是由FPGA芯片的外部晶
39、振給出的。clk在系統(tǒng)中的頻率是最高,其他時(shí)鐘都是它的分頻產(chǎn)生。keydrv為鍵盤掃描信號,keyin為鍵盤輸入信號,keyvalue為鍵值(代表按鍵所在的位置),keypressed表示有一個(gè)按鍵被按下,每發(fā)生一次按鍵動作,keypressed就輸出一個(gè)寬度為全局時(shí)鐘周期的正脈沖。該信號用于與其他模塊握手,負(fù)責(zé)通知其他模塊鍵盤是否有按鍵發(fā)生。其他模塊在keypressed有效時(shí),可以讀取鍵值。</p><p>
40、 圖4.2.1 鍵盤譯碼電路的外部接口</p><p> 其VHDL實(shí)現(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;--全局時(shí)鐘</p><p> clk_scan : IN STD_LOGIC; --掃描時(shí)鐘 </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> --譯碼進(jìn)程</b></p><p><b> 參見附錄程序</b></p>
46、<p> --按鍵標(biāo)志產(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> 上面程序是改進(jìn)的程序,原程序是:</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、中有兩個(gè)進(jìn)程。第一個(gè)進(jìn)程負(fù)責(zé)譯碼,值得注意的是WHEN OTHEN語句有沒有對temp_pressed和keyvalue信號賦值,這相當(dāng)于不改變temp_presed和keyvalue信號的值,即實(shí)現(xiàn)了鎖存輸出。在不需要鎖存輸出時(shí),在WHEN O-THEN語句中,一定要對所有的case語句中出現(xiàn)的信號逐一賦值,以免產(chǎn)生意想不到的結(jié)果。第二個(gè)進(jìn)程負(fù)責(zé)把按鍵同步信號同步化與全局時(shí)鐘同步的并且脈寬為一個(gè)周期的脈沖。重新編寫按鍵發(fā)生標(biāo)志電路,該
54、電路不僅要解決按鍵抖動導(dǎo)致一次按鍵被當(dāng)成多次的問題,同時(shí)還要解決按鍵太長導(dǎo)致一次按鍵被當(dāng)成多次的問題??紤]這些因素之后,編寫的程序應(yīng)該是陰影部分的程序。</p><p> 該電路的仿真結(jié)果如圖4.2.2所示:</p><p> 圖4.2.2 鍵盤譯碼電路仿真圖</p><p> 通過仿真波形圖可以看出,按鍵的抖動不會影響輸出結(jié)果;無論一個(gè)按鍵動作持續(xù)時(shí)間有多
55、久,但仍然認(rèn)為是一個(gè)按鍵。</p><p> 4.3 時(shí)鐘產(chǎn)生模塊</p><p> 時(shí)鐘產(chǎn)生模塊是用于掃描時(shí)鐘的,它的輸出供給給鍵盤掃描模塊和按鍵標(biāo)志位的產(chǎn)生模塊,其外部接口圖如圖4.3.1所示:</p><p> 圖4.3.1 時(shí)鐘產(chǎn)生模塊外部接口電路</p><p> 其VHDL實(shí)現(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; --全局時(shí)鐘 </p><p> clk_scan : OUT STD_LOGIC --掃描時(shí)鐘 </p><p><b> );</b></p><p> END clk_gen;</p><p> ARC
58、HITECTURE clk_gen_architecture OF clk_gen IS</p><p> --做程序仿真時(shí),用這個(gè)語句</p><p> signal cnt :integer range 0 to 150; </p><p> --需要下載到芯片上時(shí),替換為下面這個(gè)語句</p><p> signal cnt :i
59、nteger range 0 to 119999; </p><p><b> begin</b></p><p><b> --計(jì)數(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> 該程序主要包含有一個(gè)計(jì)數(shù)器模塊和一個(gè)譯碼輸出模塊,該程序是通過計(jì)數(shù)器模塊實(shí)現(xiàn)分頻的。要從12MHZ全局時(shí)鐘得到100HZ的時(shí)鐘,必須進(jìn)行120000倍的分頻。這么大的分頻需要仿真時(shí)間很久。仿真時(shí)一般采用小分頻來代替,(在本程序中采用150分頻來仿真)以便快速觀察到結(jié)果。等
65、到真正下載到電路上時(shí),就需要采用120000分頻了。該電路的仿真結(jié)果如圖4.3.2所示:</p><p> 圖4.3.2 時(shí)鐘產(chǎn)生模塊的仿真圖</p><p> 4.4 鍵盤接口電路頂層電路實(shí)現(xiàn)</p><p> 鍵盤接口電路的頂層電路只是把鍵盤掃描模塊、鍵盤譯碼且按鍵標(biāo)志位產(chǎn)生模塊和時(shí)鐘產(chǎn)生模塊連接起來,其結(jié)構(gòu)如圖4.4.1所示:</p>&
66、lt;p> 圖4.4.1 鍵盤接口電路的頂層電路</p><p> 該電路的仿真波形如圖4.4.2所示:</p><p> 圖4.4.2 鍵盤接口電路的頂層電路仿真圖</p><p><b> 五、參考文獻(xiàn)</b></p><p> [1] 潘松,黃繼業(yè). EDA技術(shù)實(shí)用教程[M]. 北京:科學(xué)出版社
67、,2010.</p><p> [2] 黃正槿,徐堅(jiān). CPLD系統(tǒng)設(shè)計(jì)技術(shù)入門與應(yīng)用[M]. 北京:電子工業(yè)出版社,2006.</p><p> [3] 徐惠民,安德寧. 數(shù)字邏輯設(shè)計(jì)與VHDL描述[M]. 北京:機(jī)械工業(yè)出版社,2008.</p><p> [4] 周國祥. 匯編語言程序設(shè)計(jì)[M]. 合肥:合肥工業(yè)大學(xué)出版社,2010.</p>
68、<p> [5] 趙曙光. 可編程邏輯器件原理開發(fā)與應(yīng)用[M]. 西安:西安電子科技大學(xué)出版社,2008.</p><p> [6] 求是科技. CPLD/FPGA應(yīng)用開發(fā)技術(shù)與工程實(shí)踐[M]. 北京:人民郵電出版社,2007.</p><p><b> 六、心得體會</b></p><p> 矩陣式鍵盤是一種常見的輸入裝
69、置,在日常的生活中,矩陣式鍵盤在計(jì)算機(jī)、電話、手機(jī)、微波爐等電子產(chǎn)品上已被廣泛應(yīng)用,各式各樣的矩陣鍵盤控制著各種各樣的功能。矩陣鍵盤控制接口電路是最基本的輸入電路,我們利用軟件Quartus II自行設(shè)計(jì)并修改的鍵盤輸入顯示電路是通過VHDL語言的編寫并實(shí)現(xiàn)了鍵碼的對應(yīng)顯示,在設(shè)計(jì)中發(fā)現(xiàn)了許多問題,比如去按鍵抖動,這個(gè)過程很有意思但卻很繁瑣,在利用Quartus II進(jìn)行仿真的時(shí)候,要細(xì)心地對參數(shù)進(jìn)行設(shè)置,最后才能夠仿真出結(jié)果。<
70、/p><p> 本次設(shè)計(jì)中最為突出的是對鍵盤譯碼電路和按鍵標(biāo)志位產(chǎn)生電路的設(shè)計(jì),主要是去抖動,其中重要一點(diǎn)是按鍵去抖動電路不僅要解決按鍵抖動導(dǎo)致一次按鍵被當(dāng)成多次的問題,同時(shí)還要解決按鍵太長導(dǎo)致一次按鍵被當(dāng)成多次的問題。否則,當(dāng)設(shè)計(jì)的鍵盤在實(shí)際中應(yīng)用的時(shí)候,就會出現(xiàn)錯(cuò)誤,所以應(yīng)該把之前的程序重新編寫。在新程序中:</p><p> 多了一個(gè)輸入信號clk_scan,它是用于產(chǎn)生掃描信號的時(shí)
71、鐘,周期為10ms。</p><p> 按鍵信號tepm_pressed首先通過clk_scan信號的上升沿采樣,通過采樣后,抖動噪聲被消除。</p><p> 采樣后得到信號被分別延遲1~4個(gè)clk_csan周期得到4個(gè)信號q1、q2、q3、q4。這四個(gè)信號進(jìn)行或運(yùn)算得到一個(gè)寬度約為80ms并且與全局時(shí)鐘異步的按鍵信號keypressed_asy。原來程序中一個(gè)長時(shí)間的按鍵過程有可能
72、被認(rèn)為是多次按鍵,通過這種方法使得一個(gè)長時(shí)間的按鍵仍然是一次按鍵。</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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 矩陣鍵盤eda技術(shù)課程設(shè)計(jì)
- eda課程設(shè)計(jì)--矩陣鍵盤接口設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)報(bào)告
- protel與eda技術(shù)課程設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)--鬧鐘系統(tǒng)
- eda技術(shù)課程設(shè)計(jì)鬧鐘系統(tǒng)設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)---鬧鐘系統(tǒng)設(shè)計(jì)
- 電子密碼鎖eda技術(shù)課程設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì) ---eda數(shù)字頻率計(jì)
- 課程設(shè)計(jì)4乘4矩陣鍵盤設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)---8位加法器設(shè)計(jì)
- eda優(yōu)質(zhì)課程設(shè)計(jì)鍵盤掃描電路設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)---脈沖寬度測量儀
- eda技術(shù)課程設(shè)計(jì)--出租車計(jì)費(fèi)器
- eda技術(shù)課程設(shè)計(jì)----數(shù)字頻率計(jì)
- eda技術(shù)課程設(shè)計(jì)--電梯控制器電路設(shè)計(jì)
- 適用多功能數(shù)字鐘(eda技術(shù)課程設(shè)計(jì))
- eda技術(shù)課程設(shè)計(jì)交通燈控制器的設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)---六位頻率計(jì)的設(shè)計(jì)
- eda技術(shù)課程設(shè)計(jì)--數(shù)碼管顯示數(shù)字鐘設(shè)計(jì)
評論
0/150
提交評論