基于FPGA的PS2鍵盤鼠標控制電子琴_第1頁
基于FPGA的PS2鍵盤鼠標控制電子琴_第2頁
基于FPGA的PS2鍵盤鼠標控制電子琴_第3頁
基于FPGA的PS2鍵盤鼠標控制電子琴_第4頁
基于FPGA的PS2鍵盤鼠標控制電子琴_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、江西制造職業(yè)技術(shù)學院信息工程系08級畢 業(yè) 論 文姓 名: 江 太 平 班 級: 08通信電子 設(shè)計題目:基于FPGA的PS/2鍵盤鼠標控制電子琴 指導教師: 吳 康 二一一年五月目錄第一章 FPGA簡介1.1 FPGA背景1.2 FPGA芯片結(jié)構(gòu)1.3 FPGA的基本特點第二章 FPGA工作原理2.1 查找表(Look-Up-Table)的原理與結(jié)構(gòu)2.2 FPGA工作原理第三章 PS2鍵盤通信3.1 PS2 背景3.2 PS2鍵盤通信3.3 VGA原理第四章 PS2鍵盤控制模型電子琴頂層電路的設(shè)計 4.1 PS2鍵盤控制電子琴程序結(jié)論、參考文獻第一章 FPGA簡介1.1 FPGA背景FPG

2、A主要生產(chǎn)廠商1、Altera 2、Xilinx 3、Actel 4、Lattice 其中Altera作為世界老牌可編程邏輯器件的廠家,是當前世界范圍內(nèi)市場占有率最大的廠家,它和Xilinx主要生產(chǎn)一般用途FPGA,其主要產(chǎn)品采用RAM工藝。Actel主要提供非易失性FPGA,產(chǎn)品主要基于反熔絲工藝和FLASH工藝。 目前以硬件描述語言(Verilog 或 VHDL)所完成的電路設(shè)計,可以經(jīng)過簡單的綜合與布局,快速的燒錄至 FPGA 上進行測試,是現(xiàn)代 IC 設(shè)計驗證的技術(shù)主流。這些可編輯元件可以被用來實現(xiàn)一些基本的邏輯門電路(比如AND、OR、XOR、NOT)或者更復雜一些的組合功能比如解碼

3、器或數(shù)學方程式。在大多數(shù)的FPGA里面,這些可編輯的元件里也包含記憶元件例如觸發(fā)器(Flipflop)或者其他更加完整的記憶塊。 系統(tǒng)設(shè)計師可以根據(jù)需要通過可編輯的連接把FPGA內(nèi)部的邏輯塊連接起來,就好像一個電路試驗板被放在了一個芯片里。一個出廠后的成品FPGA的邏輯塊和連接可以按照設(shè)計者而改變,所以FPGA可以完成所需要的邏輯功能。 FPGA一般來說比ASIC(專用集成芯片)的速度要慢,無法完成復雜的設(shè)計,而且消耗更多的電能。但是他們也有很多的優(yōu)點比如可以快速成品,可以被修改來改正程序中的錯誤和更便宜的造價。廠商也可能會提供便宜的但是編輯能力差的FPGA。因為這些芯片有比較差的可編輯能力,

4、所以這些設(shè)計的開發(fā)是在普通的FPGA上完成的,然后將設(shè)計轉(zhuǎn)移到一個類似于ASIC的芯片上。另外一種方法是用CPLD(復雜可編程邏輯器件備)。FPGA采用了邏輯單元陣列LCA(Logic Cell Array)這樣一個概念,內(nèi)部包括可配置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內(nèi)部連線(Interconnect)三個部分。 1.2 FPGA芯片結(jié)構(gòu)目前主流的FPGA仍是基于查找表技術(shù)的,已經(jīng)遠遠超出了先前版本的基本性能,并且整合了常用功能(如RAM、時鐘管理和DSP)的硬核(ASIC型)模塊。如圖1-1所示(

5、注:圖1-1只是一個示意圖,實際上每一個系列的FPGA都有其相應(yīng)的內(nèi)部結(jié)構(gòu)),F(xiàn)PGA芯片主 要由6部分完成,分別為:可編程輸入輸出單元、基本可編程邏輯單元、完整的時鐘管理、嵌入塊式RAM、豐富的布線資源、內(nèi)嵌的底層功能單元和內(nèi)嵌專用硬件模塊。 圖1-1 FPGA芯片的內(nèi)部結(jié)構(gòu)    FPGA芯片的內(nèi)部結(jié)構(gòu)每個模塊的功能如下: 1 可編程輸入輸出單元(IOB) 可編程輸入/輸出單元簡稱I/O單元,是芯片與外界電路的接口部分,完成不同電氣特性下對輸入/輸出信號的驅(qū)動與匹配要求,其示意結(jié)構(gòu)如圖1-2所示。 FPGA內(nèi)的I/O按組分類,每組都能夠獨立地支持不同的I/O標準。通過軟

6、件的靈活配置,可適配不同的電氣標準與I/O物理特性,可以調(diào)整驅(qū)動電流的大小,可以改變上、下拉電阻。目前,I/O口的頻率也越來越高,一些高端的FPGA通過DDR寄存器技術(shù)可以支持高達2Gbps的數(shù)據(jù)速率。 圖1-2 典型的IOB內(nèi)部結(jié)構(gòu)示意圖    典型的IOB內(nèi)部結(jié)構(gòu)示意圖外部輸入信號可以通過IOB模塊的存儲單元輸入到FPGA的內(nèi)部,也可以直接輸入FPGA 內(nèi)部。當外部輸入信號經(jīng)過IOB模塊的存儲單元輸入到FPGA內(nèi)部時,其保持時間(Hold Time)的要求可以降低,通常默認為0。 為了便于管理和適應(yīng)多種電器標準,F(xiàn)PGA的IOB被劃分為若干個組(bank),每個bank

7、的接口標準由其接口電壓VCCO決定,一個bank只能有 一種VCCO,但不同bank的VCCO可以不同。只有相同電氣標準的端口才能連接在一起,VCCO電壓相同是接口標準的基本條件。 2 可配置邏輯塊(CLB) CLB是FPGA內(nèi)的基本邏輯單元。CLB的實際數(shù)量和特性會依器件的不同而不同,但是每個CLB都包含一個可配置開關(guān)矩陣,此矩陣由4或6個輸入、一些 選型電路(多路復用器等)和觸發(fā)器組成。 開關(guān)矩陣是高度靈活的,可以對其進行配置以便處理組合邏輯、移位寄存器或RAM。在Xilinx公司的FPGA器件中,CLB由多個(一般為4個或2個)相同的Slice和附加邏輯構(gòu)成,如圖1-3所示。每個CLB模

8、塊不僅可以用于實現(xiàn)組合邏輯、時序邏輯,還可以配置為分布式RAM和分布式ROM。 圖1-3 典型的CLB結(jié)構(gòu)示意圖    典型的CLB結(jié)構(gòu)示意圖Slice是Xilinx公司定義的基本邏輯單位,其內(nèi)部結(jié)構(gòu)如圖1-4所示,一個Slice由兩個4輸入的函數(shù)、進位邏輯、算術(shù)邏輯、存儲邏輯和函數(shù)復用器組成。算術(shù)邏輯包括一個異或門(XORG)和一個專用與門(MULTAND),一個異或門可以使一個Slice實現(xiàn) 2bit全加操作,專用與門用于提高乘法器的效率;進位邏輯由專用進位信號和函數(shù)復用器(MUXC)組成,用于實現(xiàn)快速的算術(shù)加減法操作;4輸入函數(shù)發(fā)生 器用于實現(xiàn)4輸入LUT、分布式RA

9、M或16比特移位寄存器(Virtex-5系列芯片的Slice中的兩個輸入函數(shù)為6輸入,可以實現(xiàn)6輸入LUT或 64比特移位寄存器);進位邏輯包括兩條快速進位鏈,用于提高CLB模塊的處理速度。 圖1-4 典型的4輸入Slice結(jié)構(gòu)示意圖    典型的4輸入Slice結(jié)構(gòu)示意圖3 數(shù)字時鐘管理模塊(DCM) 業(yè)內(nèi)大多數(shù)FPGA均提供數(shù)字時鐘管理(Xilinx的全部FPGA均具有這種特性)。Xilinx推出最先進的FPGA提供數(shù)字時鐘管理和相位環(huán)路鎖定。相位環(huán)路鎖定能夠提供精確的時鐘綜合,且能夠降低抖動,并實現(xiàn)過濾功能。 4 嵌入式塊RAM(BRAM) 大多數(shù)FPGA都具有內(nèi)嵌的

10、塊RAM,這大大拓展了FPGA的應(yīng)用范圍和靈活性。塊RAM可被配置為單端口RAM、雙端口RAM、內(nèi)容地址存儲器 (CAM)以及FIFO等常用存儲結(jié)構(gòu)。RAM、FIFO是比較普及的概念,在此就不冗述。CAM存儲器在其內(nèi)部的每個存儲單元中都有一個比較邏輯,寫入 CAM中的數(shù)據(jù)會和內(nèi)部的每一個數(shù)據(jù)進行比較,并返回與端口數(shù)據(jù)相同的所有數(shù)據(jù)的地址,因而在路由的地址交換器中有廣泛的應(yīng)用。除了塊RAM,還可以將 FPGA中的LUT靈活地配置成RAM、ROM和FIFO等結(jié)構(gòu)。在實際應(yīng)用中,芯片內(nèi)部塊RAM的數(shù)量也是選擇芯片的一個重要因素。 單片塊RAM的容量為18k比特,即位寬為18比特、深度為1024,可以

11、根據(jù)需要改變其位寬和深度,但要滿足兩個原則:首先,修改后的容量(位寬 深度)不能大于18k比特;其次,位寬最大不能超過36比特。當然,可以將多片塊RAM級聯(lián)起來形成更大的RAM,此時只受限于芯片內(nèi)塊RAM的數(shù)量,而 不再受上面兩條原則約束。 5 豐富的布線資源 布線資源連通FPGA內(nèi)部的所有單元,而連線的長度和工藝決定著信號在連線上的驅(qū)動能力和傳輸速度。FPGA芯片內(nèi)部有著豐富的布線資源,根據(jù)工藝、長度、寬度和分布位置的不同而劃分為類不同的類別。第一類是全局布線資源,用于芯片內(nèi)部全局時鐘和全局復位/置位的布線;第二類是長線資源,用以完成芯片 Bank間的高速信號和第二全局時鐘信號的布線;第三類

12、是短線資源,用于完成基本邏輯單元之間的邏輯互連和布線;第四類是分布式的布線資源,用于專有時鐘、復位等控制信號線。 在實際中設(shè)計者不需要直接選擇布線資源,布局布線器可自動地根據(jù)輸入邏輯網(wǎng)表的拓撲結(jié)構(gòu)和約束條件選擇布線資源來連通各個模塊單元。從本質(zhì)上講,布線資源的使用方法和設(shè)計的結(jié)果有密切、直接的關(guān)系。 6 底層內(nèi)嵌功能單元 內(nèi)嵌功能模塊主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等軟處理核(SoftCore)?,F(xiàn)在越來越豐富的內(nèi)嵌功能單元,使得單片F(xiàn)PGA成為了系統(tǒng)級的設(shè)計工具,使其具備了軟硬件聯(lián)合設(shè)計的能力,逐步向SOC平臺過

13、渡。 DLL和PLL具有類似的功能,可以完成時鐘高精度、低抖動的倍頻和分頻,以及占空比調(diào)整和移相等功能。Xilinx公司生產(chǎn)的芯片上集成了 DLL,Altera公司的芯片集成了PLL,Lattice公司的新型芯片上同時集成了PLL和DLL。PLL 和DLL可以通過IP核生成的工具方便地進行管理和配置。DLL的結(jié)構(gòu)如圖1-5所示。 圖1-5 典型的DLL模塊示意圖    典型的DLL模塊示意圖7. 內(nèi)嵌專用硬核 內(nèi)嵌專用硬核是相對底層嵌入的軟核而言的,指FPGA處理能力強大的硬核(Hard Core),等效于ASIC電路。為了提高FPGA性能,芯片生產(chǎn)商在芯片內(nèi)部集成了一些專

14、用的硬核。例如:為了提高FPGA的乘法速度,主流的FPGA 中都集成了專用乘法器;為了適用通信總線與接口標準,很多高端的FPGA內(nèi)部都集成了串并收發(fā)器(SERDES),可以達到數(shù)十Gbps的收發(fā)速度。 Xilinx公司的高端產(chǎn)品不僅集成了Power PC系列CPU,還內(nèi)嵌了DSP Core模塊,其相應(yīng)的系統(tǒng)級設(shè)計工具是EDK和Platform Studio,并依此提出了片上系統(tǒng)(System on Chip)的概念。通過PowerPC、Miroblaze、Picoblaze等平臺,能夠開發(fā)標準的DSP處理器及其相關(guān)應(yīng)用,達到SOC的開發(fā)目 的。 1.3 FPGA的基本特點FPGA的基本特點:1

15、)采用FPGA設(shè)計ASIC電路(專用集成電路),用戶不需要投片生產(chǎn),就能得到合用的芯片。 2)FPGA可做其它全定制或半定制ASIC電路的中試樣片。 3)FPGA內(nèi)部有豐富的觸發(fā)器和IO引腳。 4)FPGA是ASIC電路中設(shè)計周期最短、開發(fā)費用最低、風險最小的器件之一。 5) FPGA采用高速CHMOS工藝,功耗低,可以與CMOS、TTL電平兼容。 可以說,F(xiàn)PGA芯片是小批量系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之一。 FPGA是由存放在片內(nèi)RAM中的程序來設(shè)置其工作狀態(tài)的,因此,工作時需要對片內(nèi)的RAM進行編程。用戶可以根據(jù)不同的配置模式,采用不同的編程方式。 加電時,F(xiàn)PGA芯片將EPRO

16、M中數(shù)據(jù)讀入片內(nèi)編程RAM中,配置完成后,F(xiàn)PGA進入工作狀態(tài)。掉電后,F(xiàn)PGA恢復成白片,內(nèi)部邏輯關(guān)系消失,因此,F(xiàn)PGA能夠反復使用。FPGA的編程無須專用的FPGA編程器,只須用通用的EPROM、PROM編程器即可。當需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片F(xiàn)PGA,不同的編程數(shù)據(jù),可以產(chǎn)生不同的電路功能。因此,F(xiàn)PGA的使用非常靈活。 FPGA配置模式FPGA有多種配置模式:并行主模式為一片F(xiàn)PGA加一片EPROM的方式;主從模式可以支持一片PROM編程多片F(xiàn)PGA;串行模式可以采用串行PROM編程FPGA;外設(shè)模式可以將FPGA作為微處理器的外設(shè),由微處理器對其

17、編程。 如何實現(xiàn)快速的時序收斂、降低功耗和成本、優(yōu)化時鐘管理并降低FPGA與PCB并行設(shè)計的復雜性等問題,一直是采用FPGA的系統(tǒng)設(shè)計工程師需要考慮的關(guān)鍵問題。如今,隨著FPGA向更高密度、更大容量、更低功耗和集成更多IP的方向發(fā)展,系統(tǒng)設(shè)計工程師在從這些優(yōu)異性能獲益的同時,不得不面對由于FPGA前所未有的性能和能力水平而帶來的新的設(shè)計挑戰(zhàn)。 例如,領(lǐng)先FPGA廠商Xilinx最近推出的Virtex-5系列采用65nm工藝,可提供高達33萬個邏輯單元、1,200個I/O和大量硬IP塊。超大容量和密度使復雜的布線變得更加不可預測,由此帶來更嚴重的時序收斂問題。此外,針對不同應(yīng)用而集成的更多數(shù)量的

18、邏輯功能、DSP、嵌入式處理和接口模塊,也讓時鐘管理和電壓分配問題變得更加困難。 幸運地是,F(xiàn)PGA廠商、EDA工具供應(yīng)商正在通力合作解決65nm FPGA獨特的設(shè)計挑戰(zhàn)。不久以前,Synplicity與Xilinx宣布成立超大容量時序收斂聯(lián)合工作小組,旨在最大程度地幫助系統(tǒng)設(shè)計工程師以更快、更高效的方式應(yīng)用65nm FPGA器件。設(shè)計軟件供應(yīng)商Magma推出的綜合工具Blast FPGA能幫助建立優(yōu)化的布局,加快時序的收斂。 最近FPGA的配置方式已經(jīng)多元化!第二章 FPGA工作原理FPGA工作原理FPGA采用了邏輯單元陣列LCA(Logic Cell Array)這樣一個概念,內(nèi)部包括可配

19、置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內(nèi)部連線(Interconnect)三個部分。 2.1 查找表(Look-Up-Table)的原理與結(jié)構(gòu)采用這種結(jié)構(gòu)的PLD芯片我們也可以稱之為FPGA:如altera的ACEX,APEX系列,xilinx的Spartan,Virtex系列等。查找表(Look-Up-Table)簡稱為LUT,LUT本質(zhì)上就是一個RAM。目前FPGA中多使用4輸入的LUT,所以每一個LUT可以看成一個有4位地址線的16x1的RAM。當用戶通過原理圖或HDL語言描述了一個邏輯電路以后,

20、PLD/FPGA開發(fā)軟件會自動計算邏輯電路的所有可能的結(jié)果,并把結(jié)果事先寫入RAM,這樣,每輸入一個信號進行邏輯運算就等于輸入一個地址進行查表,找出地址對應(yīng)的內(nèi)容,然后輸出即可。下面是一個4輸入與門的例子,實際邏輯電路LUT的實現(xiàn)方式a,b,c,d 輸入邏輯輸出地址RAM中存儲的內(nèi)容00000000000001000010.0.01111111111一.基于查找表(LUT)的FPGA的結(jié)構(gòu)我們看一看xilinx Spartan-II的內(nèi)部結(jié)構(gòu),如下圖:xilinx Spartan-II 芯片內(nèi)部結(jié)構(gòu)Slices結(jié)構(gòu)Spartan-II主要包括CLBs,I/O塊,RAM塊和可編程連線(未表示出)

21、。在spartan-II中,一個CLB包括2個Slices,每個slices包括兩個LUT,兩個觸發(fā)器和相關(guān)邏輯。 Slices可以看成是SpartanII實現(xiàn)邏輯的最基本結(jié)構(gòu) (xilinx其他系列,如SpartanXL,Virtex的結(jié)構(gòu)與此稍有不同,具體請參閱數(shù)據(jù)手冊)altera的FLEX/ACEX等芯片的結(jié)構(gòu)如下圖: altera FLEX/ACEX 芯片的內(nèi)部結(jié)構(gòu) 邏輯單元(LE)內(nèi)部結(jié)構(gòu)FLEX/ACEX的結(jié)構(gòu)主要包括LAB,I/O塊,RAM塊(未表示出)和可編程行/列連線。在FLEX/ACEX中,一個LAB包括8個邏輯單元(LE),每個LE包括一個LUT,一

22、個觸發(fā)器和相關(guān)的相關(guān)邏輯。LE是FLEX/ACEX芯片實現(xiàn)邏輯的最基本結(jié)構(gòu)(altera其他系列,如APEX的結(jié)構(gòu)與此基本相同,具體請參閱數(shù)據(jù)手冊) 二.查找表結(jié)構(gòu)的FPGA邏輯實現(xiàn)原理 我們還是以這個電路的為例:A,B,C,D由FPGA芯片的管腳輸入后進入可編程連線,然后作為地址線連到到LUT,LUT中已經(jīng)事先寫入了所有可能的邏輯結(jié)果,通過地址查找到相應(yīng)的數(shù)據(jù)然后輸出,這樣組合邏輯就實現(xiàn)了。該電路中D觸發(fā)器是直接利用LUT后面D觸發(fā)器來實現(xiàn)。時鐘信號CLK由I/O腳輸入后進入芯片內(nèi)部的時鐘專用通道,直接連接到觸發(fā)器的時鐘端。觸發(fā)器的輸出與I/O腳相連,把結(jié)果輸出到芯片管腳

23、。這樣PLD就完成了圖3所示電路的功能。(以上這些步驟都是由軟件自動完成的,不需要人為干預)這個電路是一個很簡單的例子,只需要一個LUT加上一個觸發(fā)器就可以完成。對于一個LUT無法完成的的電路,就需要通過進位邏輯將多個單元相連,這樣FPGA就可以實現(xiàn)復雜的邏輯。由于LUT主要適合SRAM工藝生產(chǎn),所以目前大部分FPGA都是基于SRAM工藝的,而SRAM工藝的芯片在掉電后信息就會丟失,一定需要外加一片專用配置芯片,在上電的時候,由這個專用配置芯片把數(shù)據(jù)加載到FPGA中,然后FPGA就可以正常工作,由于配置時間很短,不會影響系統(tǒng)正常工作。也有少數(shù)FPGA采用反熔絲或Flash工藝,對這種FPGA,

24、就不需要外加專用的配置芯片。 第三章 PS2鍵盤通信3.1 PS2背景PS2背景PS/2接口是目前最常見的鼠標接口,最初是IBM公司的專利,俗稱“小口”。這是一種鼠標和鍵盤的專用接口,是一種6針的圓型接口。但鼠標只使用其中的4針傳輸數(shù)據(jù)和供電,其余2個為空腳。PS/2接口的傳輸速率比COM接口稍快一些,而且是ATX主板的標準接口,是目前應(yīng)用最為廣泛的鼠標接口之一,但仍然不能使高檔鼠標完全發(fā)揮其性能,而且不支持熱插拔。在BTX主板規(guī)范中,這也是即將被淘汰掉的接口。     需要注意的是,在連接PS/2接口鼠標時不能錯誤地插入鍵盤PS/2接口(當然,也不能把

25、PS/2鍵盤插入鼠標PS/2接口)。一般情況下,符合PC99規(guī)范的主板,其鼠標的接口為綠色、鍵盤的接口為紫色,另外也可以從PS/2接口的相對位置來判斷:靠近主板PCB的是鍵盤接口,其上方的是鼠標接口。  PS2設(shè)備有主從之分,主設(shè)備采用Female插座,從設(shè)備采用Male插頭,現(xiàn)在廣泛實用的PS2鍵盤鼠標均在從設(shè)備方式下工作。PS2接口的時鐘與數(shù)據(jù)線都是集電極開路結(jié)構(gòu)。主從設(shè)備之間數(shù)據(jù)通信采用雙向同步串行方式傳輸,時鐘信號由從設(shè)備產(chǎn)生。a.從設(shè)備到主設(shè)備的通信當從設(shè)備向主設(shè)備發(fā)送數(shù)據(jù)時,首先檢查時鐘線,以確認時鐘線是否為高電平。如果是高電平,從設(shè)備就可以開始傳輸數(shù)據(jù);反之,

26、從設(shè)備要等待獲得總線的控制權(quán),才能開始傳輸數(shù)據(jù)。傳輸?shù)拿恳粠?1位組成,發(fā)送時序及每一位的含義如圖2所示。每一幀數(shù)據(jù)中開始位總是為0,數(shù)據(jù)校驗采用奇校驗方式,停止位始終為1。從設(shè)備到主設(shè)備通信時,從設(shè)備總是在時鐘線為高時改變數(shù)據(jù)線狀態(tài),主設(shè)備在時鐘下降沿讀入數(shù)據(jù)線狀態(tài)。如表1所示:3.2 PS2鍵盤通信目前,鍵盤有許多種,PS2鍵盤是當今PC機最常用的種類,這里僅涉及最常用的鍵盤,也就是6引腳發(fā)送數(shù)據(jù)的鍵盤。鍵盤通信時需要四根連接線:電源線、地線、時鐘線CLK、數(shù)據(jù)線DATA。DATA和CLK是可雙向通信的I/O線,也就是說,通過這兩根線,即可以把主機的數(shù)據(jù)發(fā)送到PS2設(shè)備,又可以把設(shè)備的數(shù)

27、據(jù)發(fā)向主機。在無鍵按下時,DATA和CLK一直處于高電平狀態(tài)。但有鍵按下時,鍵盤先檢查CLK,看它是否處于處于高電平,如果是處在低電平,說明主機無空閑接受數(shù)據(jù),這時鍵盤將會把數(shù)據(jù)放在自己的緩沖區(qū),直到CLK重新被拉高。鍵盤CLK首先產(chǎn)生下降沿,這時已在數(shù)據(jù)線上產(chǎn)生信號,如:起始位總是為0,之后每一個時鐘周期時鐘電平為高時數(shù)據(jù)線上加將要輸出的電平,在時鐘的下降沿它將被主機讀取。3.3 原理掃描是從屏幕的左上方開始的,從左到右、從上到下地進行掃描。每掃描完一行,電子束就會回到屏幕左邊下一行的起始位置。在這期間,CRT對電子束進行消隱。每行結(jié)束時,用行同步信號進行行同步。掃描完所有行后,用場同步信號

28、進行場同步,并使掃描回到屏幕的左上方,同時進行場消隱,預備下一次的掃描。PS2鍵盤控制模型電子琴頂層電路的設(shè)計如圖所示,該圖是電子琴頂層設(shè)計電路。按實現(xiàn)功能電路主要分成這幾個模塊:1) 鎖相環(huán)、用宏模塊搭建的22位.23位.24位計數(shù)器、用Verilog寫的時鐘分頻模塊fdiv:1 提供25MHz的時鐘信號驅(qū)動VGA顯示2 與24位計數(shù)器結(jié)合提供1Hz給數(shù)字時鐘用以計時3 與23位計數(shù)器結(jié)合提供2MHz給CNT138T與rom_qupu以控制節(jié)奏4 與22位計數(shù)器結(jié)合提供4MHz給cnt10b以控制RAM的地址5 與fdiv結(jié)合提供1MHz給SPEAK2) 模塊PS2_2:PS2通信模塊,將鍵

29、盤輸出碼轉(zhuǎn)換為ASCII碼,只處理字母3) 二進制編碼器CODE3:根據(jù)鍵盤碼的ASCII碼,用verilog寫高、中、低三個音階的分別對應(yīng)的鍵盤字母代碼,與F_CODE模塊相對應(yīng),以此來擴大音域4) 模塊F_CODE:1 模塊F_CODE的功能首先是為模塊SPKER提供決定所發(fā)音符的分頻預置數(shù),而此數(shù)在SPKER輸入口停留的時間即為此音符的節(jié)拍長度。2 同時,F(xiàn)_CODE把CODE3中音符的代碼轉(zhuǎn)化為音符頻率所對應(yīng)的數(shù)值3 與模塊DECL7S結(jié)合顯示音符4 H3.0顯示0,1,2表示高、中、低三個音階5) 模塊DECL7S:7段譯碼顯示模塊,在數(shù)碼管上顯示1,2,3,4,5,6,7音符6)

30、模塊RAM:與模塊cnt10b結(jié)合記錄彈奏的樂曲7) 模塊ROM:與模塊cnt138b結(jié)合可自動播放儲存的音樂8) 模塊shizhong:可記錄彈奏時間9) 模塊VGA:顯示按鍵的位置,當音樂響時同步顯示對應(yīng)的音的鍵盤位置10)模塊SPEAK輸出每一個音符的音調(diào)11)模塊MUX21選擇播放中的音樂或中的儲存音樂第四章 PS2鍵盤控制電子琴(VHDL)4.1 PS2鍵盤控制電子琴程序共分為DIV1、DIV2分頻模塊,PS2鍵盤控制模塊,music發(fā)音模塊,tone音符分頻模塊,spk發(fā)聲模塊。library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.ST

31、D_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity Div1 is    PORT(clk_50mhz: IN STD_LOGIC;           

32、0;-輸入時鐘為50MHZ;     c0: OUT STD_LOGIC;c1: OUT STD_LOGIC);      END Div1;architecture art of Div1 isbeginD1: PROCESS(clk_50mhz)          -工作進程開始,將50MHZ時鐘50分頻,=1MHZ;  VARIABLE count6:INTEGER RANGE 0 TO 50;   BEGIN

33、  IF(clk_50mhz 'EVENT AND clk_50mhz ='1')THEN         count6:=count6+1;                     IF count6=25 THEN               

34、;    c0 <='1'   ELSIF count6=50 THEN     c0 <='0' count6:=0;END IF;END IF;END PROCESS;D2: PROCESS(clk_50mhz)                -將50MHZ時鐘100分頻,=0.5MHZ;VARIABLE count7: INTEGER RANGE 0 TO

35、100;BEGINIF(clk_50mhz 'EVENT AND clk_50mhz ='1')THEN         count7:=count7+1;                     IF count7=50 THEN                &

36、#160;  c1<='1'   ELSIF count7=100 THEN     c1 <='0' count7:=0;END IF;END IF;END PROCESS;END art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declar

37、ation if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity Div2 is    PORT(clk4: IN STD_LOGIC;            -輸入時鐘為1MHZ;     c2: OUT STD_LOGIC;         

38、  -輸出100khz;          c3ut std_logic);       -輸出時鐘為4HZ;END Div2;ARCHITECTURE art OF Div2 ISbeginD1: PROCESS(clk4)          -工作進程開始,將1MHZ時鐘10分頻;  VARIABLE count8:INTEGER RANGE 0 TO 10;   BEGI

39、N  IF(clk4 'EVENT AND clk4 ='1')THEN         count8:=count8+1;                     IF count8=5 THEN                 &#

40、160; c2 <='1'   ELSIF count8=10 THEN     c2 <='0' count8:=0;END IF;END IF;END PROCESS;D2: PROCESS(clk4)                -250000分頻;VARIABLE count9: INTEGER RANGE 0 TO 250000;BEGINIF(clk4 'EVE

41、NT AND clk4 ='1')THEN         count9:=count9+1;                     IF count9=125000 THEN                   c3<='1&

42、#39;   ELSIF count9=250000 THEN     c3 <='0' count9:=0;END IF;END IF;END PROCESS;END art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any

43、Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity ps2 is    Port ( sysclk: in std_logic;                                      ps2clk: in s

44、td_logic;                                      ps2data: in std_logic;                         

45、          reset: in std_logic;       result: out std_logic_vector(7 downto 0); end ps2;architecture art of ps2 issignal ps2clk_r : std_logic_vector(2 downto 0);            signal ps2clkfall : std_logic;

46、60;                           signal q : std_logic_vector(11 downto 0);                  signal ps2serialdata : std_logic_vector(10 downto 0) ;   

47、;  begin        process(sysclk,reset) beginif reset='0' then  ps2clk_r <= "000"elsif rising_edge(sysclk) then     ps2clk_r(2) <= ps2clk_r(1);  ps2clk_r(1) <= ps2clk_r(0);  ps2clk_r(0) <= ps2

48、clk;end if;end process;ps2clkfall<='1' when ps2clk_r="110" else '0' process(sysclk) beginif rising_edge(sysclk) then                         if reset='0' then q <= (other

49、s =>'0');            elsif ps2clkfall='1' then                   if q(0)='0' then                     &

50、#160;      q <= ps2data & "01111111111"          else      q <= ps2data & q(11 downto 1);            end if;        end if;  &

51、#160; end if;end process;process(q)beginif q(0) = '0' then  ps2serialdata <= q(11 downto 1);  result <= not ps2serialdata(8 downto 1);else  result <="11111111"end if;end process;end art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOG

52、IC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity music is    PORT(clk2:   IN STD_LOGIC;           &

53、#160;           -4HZ時鐘信號          index1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);   -鍵盤輸入信號       index2: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);  -音符信號輸出END music;ARCHITECTURE art OF music ISSIGNAL coun

54、t3:INTEGER RANGE 0 TO 31;  -定義信號計數(shù)器,有32個元素BEGINM1ROCESS(count3,clk2,index1)               -music工作進程開始BEGIN  IF(clk2 'EVENT AND clk2 ='1')THEN       -時鐘信號2為1    IF(count3=31)THEN  

55、60;                -計數(shù)器值為31      count3<=0;                        -計數(shù)器清0ELSE      count3<=count3+1;END IF;END IF;END PROCES

56、S;M2ROCESS(count3,index1)-除去了敏感信號auto1BEGINIF index1="01001101" THEN                      按下P鍵生效CASE count3 IS          -由計數(shù)器從0到31的取?斷音符信號?制? WHEN 0=>index2<="00000011"&

57、#160;   -3WHEN 1=> index2<="00000011"    -3WHEN 2=> index2<="00000011"    -3WHEN 3=> index2<="00000011"    -3WHEN 4=> index2<="00000101"    -5WHEN 5=> index2<="00000101" 

58、   -5WHEN 6=> index2<="00000101"    -5WHEN 7=> index2<="00000110"    -6WHEN 8=> index2<="00001000"    -8WHEN 9=> index2<="00001000"    -8WHEN 10=> index2<="00001000"  

59、60;-8WHEN 11=> index2<="00000011"   -3WHEN 12=> index2<="00000010"   -2WHEN 13=> index2<="00000010"   -2WHEN 14=> index2<="00000001"   -1WHEN 15=> index2<="00000001"   -1

60、WHEN 16=> index2<="00000101"   -5WHEN 17=> index2<="00000101"   -5WHEN 18=> index2<="00000100"   -4WHEN 19=> index2<="00000100"   -4WHEN 20=> index2<="00000100"   -4WHEN

61、21=> index2<="00000011"   -3WHEN 22=> index2<="00000010"   -2WHEN 23=> index2<="00000010"   -2WHEN 24=> index2<="00000101"   -5WHEN 25=> index2<="00000101"   -5WHEN 26=&g

62、t; index2<="00000100"   -4WHEN 27=> index2<="00000100"   -4WHEN 28=> index2<="00000011"   -3WHEN 29=> index2<="00000011"   -3WHEN 30=> index2<="00000010"   -2WHEN 31=> in

63、dex2<="00000010"   -2WHEN OTHERS=>NULL;END CASE;ELSE -index2<=index1; case index1 iswhen"00010101"=>index2<="00000001"-qwhen"00011101"=>index2<="00000010"-wwhen"00100100"=>index2<="00000011"-ew

64、hen"00101101"=>index2<="00000100"-rwhen"00101100"=>index2<="00000101"-twhen"00110101"=>index2<="00000110"-ywhen"00111100"=>index2<="00000111"-uwhen"00011100"=>index2<="0000100

65、0"-awhen"00011011"=>index2<="00001001"-swhen"00100011"=>index2<="00001010"-dwhen"00101011"=>index2<="00001011"-fwhen"00110100"=>index2<="00001100"-gwhen"00110011"=>index2<=&qu

66、ot;00001101"-hwhen"00111011"=>index2<="00001110"-jwhen"00011010"=>index2<="00001111"-zwhen"00100010"=>index2<="00010000"-xwhen"00100001"=>index2<="00010001"-cwhen"00101010"=>inde

67、x2<="00010010"-vwhen"00110010"=>index2<="00010011"-bwhen"00110001"=>index2<="00010100"-nwhen"00111010"=>index2<="00010101"-mwhen         others=>index2<="11111111"end case;&

68、#160;                END IF;END PROCESS;  END art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitiv

69、es in this code.-library UNISIM;-use UNISIM.VComponents.all;entity tone is    Port (index3: IN STD_LOGIC_VECTOR(7 DOWNTO 0);  -音符輸入信號     code1:  OUT STD_LOGIC_VECTOR(6 DOWNTO 0);  -音符顯示信號     high1:  OUT STD_LOGIC_

70、VECTOR(2 DOWNTO 0);   -高低音顯示信號     tone1:  OUT INTEGER RANGE 0 TO 2047);       -音符的分頻系數(shù)end tone;architecture art of tone isbeginT1:process(index3)begincase index3 iswhen"00000001"=> tone1<=1191; code1<="1001111"

71、 high1<="001"WHEN"00000010"=> tone1<=1702; code1<="0010010" high1<="001"WHEN"00000011"=> tone1<=1517; code1<="0000110" high1<="001"WHEN"00000100"=> tone1<=1432; code1<="1001100&qu

72、ot; high1<="001"WHEN"00000101"=> tone1<=1276; code1<="0100100" high1<="001"WHEN"00000110"=> tone1<=1136; code1<="0100000" high1<="001"WHEN"00000111"=> tone1<=1012;  code1<=&q

73、uot;0001111" high1<="001"WHEN"00001000"=> tone1<=955;  code1<="1001111" high1<="010"WHEN"00001001"=> tone1<=851;  code1<="0010010" high1<="010"  WHEN"00001010"

74、;=> tone1<=758;  code1<="0000110" high1<="010"WHEN"00001011"=> tone1<=716;  code1<="1001100" high1<="010"WHEN"00001100"=> tone1<=638;  code1<="0100100" high1<="

75、;010"WHEN"00001101"=> tone1<=568;  code1<="0100000" high1<="010"WHEN"00001110"=> tone1<=506;  code1<="0001111" high1<="010"WHEN"00001111"=> tone1<=478;  code1<="1001111" high1<="100"WHEN"0001

溫馨提示

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

評論

0/150

提交評論