版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)設(shè)計(論文)</b></p><p> 題 目:基于FPGA的通用外設(shè)電路設(shè)計</p><p> 英文題目:Design of Universal Peripheral Circuit Based on FPGA</p><p><b> 摘 要</b></p>
2、;<p> FPGA器件作為可編程邏輯主流硬件,近年來,應(yīng)用越來越廣泛,在現(xiàn)代科學(xué)技術(shù)中占有舉足輕重的作用和地位。其外設(shè)電路作為芯片與外界輸入方式之一,是十分具有研究價值的。FPGA器件不斷增加新的模塊,功能越來越強大,基于FPGA的外設(shè)電路也順應(yīng)形勢,不斷升級。</p><p> 本設(shè)計綜合行列式鍵盤、LED顯示器、時鐘一體,應(yīng)用Verilog HDL語言實現(xiàn)下述功能:計時功能,包括時分秒的計
3、時;校時功能:對時分秒手動調(diào)整以校準(zhǔn)時間;鍵盤功能:應(yīng)用4*4行列式鍵盤,可實現(xiàn)0-9數(shù)字的直接輸入;LED動態(tài)掃描顯示和閃爍,移位,滅零等功能,突出了其作為硬件描述語言的良好的可讀性、可移植性和易理解等優(yōu)點,并通過Altera QuartusⅡ8.0完成綜合、仿真。</p><p> 本設(shè)計實現(xiàn)以上FPGA各功能,可作為EDA技術(shù)發(fā)展的價值體現(xiàn)。此程序通過下載到FPGA芯片后,可應(yīng)用于實際的數(shù)字鐘顯示中。&l
4、t;/p><p> 關(guān)鍵字:行列式鍵盤、LED顯示器、時鐘、Verilog HDL。</p><p><b> ABSTRACT</b></p><p> FPGA programmable logic devices, as the mainstream of hardware, in recent years, more and more
5、 extensive applications in modern science and technology plays a vital role and status. Its peripheral circuit chip with the outside world as one of input is very valuable in research. FPGA devices are constantly adding
6、new modules, more powerful, FPGA-based response to the peripheral circuit is also the situation escalated.</p><p> The determinant of the design of an integrated keyboard, LED display, integrated clock, app
7、lication Verilog HDL language to achieve the following functions: time functions, including the time when minutes and seconds; school functions: every minute of time to manually adjust the calibration time; keyboard func
8、tions: application of 4 * 4 determinant keyboard, numbers 0-9 can be directly imported; LED dynamic scanning display and blinking, shift, such as anti-zero function, highlights the hardware</p><p> This pro
9、cess by downloading to the FPGA chip can be used in practical digital clock display.</p><p> Keywords: determinant keyboard, LED display, clock, Verilog HDL.</p><p><b> 目 錄</b>&
10、lt;/p><p><b> 引 言1</b></p><p> 第一章 系統(tǒng)硬件及設(shè)計軟件介紹2</p><p> 1.1 開發(fā)板介紹2</p><p> 1.2 設(shè)計軟件介紹3</p><p> 第二章 系統(tǒng)方案設(shè)計4</p><p>
11、2.1 總設(shè)計方案4</p><p> 2.2 分頻器設(shè)計方案4</p><p> 2.3 行列式鍵盤設(shè)計方案5</p><p> 2.4 六位7段LED顯示設(shè)計方案6</p><p> 2.5 頂層模塊設(shè)計方案7</p><p> 第三章 系統(tǒng)程序設(shè)計8</p><
12、;p> 3.1 分頻器程序設(shè)計8</p><p> 3.2 行列式鍵盤程序設(shè)計10</p><p> 3.3 六位7段LED顯示程序設(shè)計12</p><p> 3.4 頂層模塊程序設(shè)計13</p><p> 第四章 程序仿真20</p><p> 4.1 分頻器程序仿真20&l
13、t;/p><p> 4.2 行列式鍵盤程序仿真20</p><p> 4.3 六位7段LED顯示程序仿真21</p><p> 4.4 頂層模塊程序仿真22</p><p><b> 結(jié) 論25</b></p><p><b> 致 謝27</b>&
14、lt;/p><p><b> 參考文獻28</b></p><p> 附錄1 分頻器程序29</p><p> 附錄2 行列式鍵盤程序31</p><p> 附錄3 六位7段LED顯示程序33</p><p> 附錄4 頂層時鐘程序35</p><p&g
15、t;<b> 引 言</b></p><p> 計算機技術(shù)和微電子工藝的發(fā)展,使得現(xiàn)代數(shù)字系統(tǒng)的設(shè)計和應(yīng)用進入了新的階段。電子設(shè)計自動化(EDA)技術(shù)在數(shù)字系統(tǒng)設(shè)計中起的作用越來越重要,新的工具和新的設(shè)計方案不斷推出,可編程邏輯器件不斷增加新的模塊,功能越來越強,硬件設(shè)計語言也順應(yīng)形式,推出新的標(biāo)準(zhǔn),更加好用,更加便捷。</p><p> 本設(shè)計主要以FP
16、GA器件、EDA軟件工具、Verilog HDL硬件描述語言三方面內(nèi)容作為主線,綜合行列式鍵盤,LED顯示器件,以及時鐘模塊于一體,實現(xiàn)三個主要模塊的聯(lián)動,輸入部分為4*4行列式鍵盤,具備0-9十個數(shù)字鍵、修改/確認鍵、左右移動鍵,輸出數(shù)據(jù)為6位二進制代碼,輸出部分為六位7段LED數(shù)碼管,可實現(xiàn)時分秒顯示,時鐘滅零顯示,修改閃爍以及小數(shù)點秒閃爍功能。而頂層文件時鐘模塊則將輸入輸出部分聯(lián)結(jié)起來,實現(xiàn)時鐘發(fā)生,顯示緩存,數(shù)據(jù)修改,移位,滅零
17、等功能。另時鐘產(chǎn)生模塊采用FPGA硬件內(nèi)置66MHz分頻,產(chǎn)生250Hz,5Hz,1Hz信號供時鐘模塊,輸入輸出模塊使用。</p><p> 本設(shè)計完全采用Verilog HDL語言完成,此程序通過下載到FPGA芯片后,可應(yīng)用于實際的數(shù)字鐘顯示中。</p><p> 第一章 系統(tǒng)硬件及設(shè)計軟件介紹</p><p> 1.1 開發(fā)板介紹</p>
18、<p> 本設(shè)計需要的硬件資源主要有:</p><p><b> 1、六位七段數(shù)碼管</b></p><p> 2、4*4行列式鍵盤</p><p> 經(jīng)過仔細篩選,最終選定聯(lián)華眾科FPGA開發(fā)板FA130。聯(lián)華眾科FPGA開發(fā)板FA130核心器件為 Altera Cyclone系列的EP1C3,配置芯片為EPCS1,F(xiàn)A1
19、30上可以運行SOPC Builder制作的簡單的工程。FA130具有豐富的板載資源,由于板載有51單片機,F(xiàn)A130還可以作為51單片機的學(xué)習(xí)開發(fā)板。FA130實現(xiàn)了3.3V系統(tǒng)與5V系統(tǒng)對接功能,具體是通過74LVXC3245(或簡稱3245)實現(xiàn)的。FA130隨板資料中包括豐富的開發(fā)實例和制作開發(fā)實例的詳細步驟說明,以及Quartus II環(huán)境下的設(shè)計輸入,綜合,仿真等內(nèi)容,另外還包括SOPC建立和開發(fā)方面內(nèi)容,如Nios II的
20、建立和Nios II環(huán)境下C/C++程序開發(fā)等。FA130的EDA開發(fā)實例包括VHDL和Verilog兩個版本,F(xiàn)A130的51單片機開發(fā)實例包括匯編和C語言兩個版本。同時FA130還包括詳細的使用手冊和豐富的配套資料,非常適合FPGA,VHDL,Verilog開發(fā)學(xué)習(xí)者使用。另外FA130隨板DVDROM中還包括VS.NET的開發(fā)實例,在學(xué)習(xí)FPGA開發(fā)、51單片機開發(fā)的同時還可以</p><p> 圖1-1
21、 FA130開發(fā)板</p><p> 聯(lián)華眾科FPGA開發(fā)板FA130具有豐富的板載資源。</p><p> 核心器件包括FPGA芯片Altera EP1C3T100和PLCC封裝的單片機STC89LE52。EP1C3可用I/O分4組全部以插針的形式引出,供外部擴展時使用。</p><p> FPGA配置芯片為EPCS1,EPCS1為FLASH類型存儲器,存儲
22、空間為1M位(1,046,496bits),EPCS1可以工作在5V或3.3V,在本開發(fā)板EPCS1與FPGA的IO相同工作電壓為3.3V。</p><p> 時鐘資源包括頻率為66M有源晶振和1個外接有源晶振插座,外接有源晶振插座可直接安裝用戶自己希望的任何頻率有源晶振。</p><p> 復(fù)位電路由一個復(fù)位按鍵和一片復(fù)位芯片組成,復(fù)位芯片為IMP812T,IMP812T輸出高電平有
23、效的復(fù)位脈沖,脈沖寬度為140ms。IMP812T的復(fù)位門限(Reset Threshold)為3.08V,輸出的復(fù)位信號同時提供給FPGA芯片和單片機使用,F(xiàn)A130上EP1C3和51單片機89LE52均工作在3.3V電源電壓。</p><p> 顯示資源包括6位共陰七段數(shù)碼管,8位LED(綠色),1片1602LCD顯示屏。</p><p> 鍵盤資源包括4*4按鍵陣列,4個獨立按鍵
24、,其中4個獨立按鍵可以作為單片機的中斷源使用。</p><p> 電源部分包括1片LM1085-5.0,1片AS2830-3.3和1片AS2830-1.5,LM1085-5.0提供5V直流電源作為AS2830-3.3,AS2830-1.5輸入電源和LCD1602供電電源。AS2830-3.3提供3.3V直流電源,作為FPGA的IO電源和開發(fā)板上其他設(shè)備電源。AS2830-1.5提供1.5V直流電源,作為FPGA
25、的核心供電電源。</p><p> 存儲資源包括1片24C02和1片93C46,24C02連接在I2C總線上,是存儲空間為256字節(jié)串行E2PROM,24C02的設(shè)備地址也可以由板上的3位撥碼開關(guān)設(shè)置。93C46為SPI接口的串行E2PROM,93C46存儲空間為128字節(jié)。</p><p> 其他資源還包括8位撥碼開關(guān),連接到EP1C3上。</p><p>
26、 1.2 設(shè)計軟件介紹</p><p> 本設(shè)計使用Altera公司的Quartus II軟件,版本為8.0。Altera Quartus II設(shè)計軟件是業(yè)界唯一提供FPGA和固定功能HardCopy器件統(tǒng)一設(shè)計流程的設(shè)計工具。工程師使用同樣的低價位工具對 Stratix FPGA進行功能驗證和原型設(shè)計,又可以設(shè)計HardCopy Stratix器件用于批量成品。系統(tǒng)設(shè)計者現(xiàn)在能夠用Quartus II軟件評
27、估HardCopy Stratix器件的性能和功耗,相應(yīng)地進行最大吞吐量設(shè)計。</p><p> Altera的Quartus II可編程邏輯軟件屬于第四代PLD開發(fā)平臺。該平臺支持一個工作組環(huán)境下的設(shè)計要求,其中包括支持基于Internet的協(xié)作設(shè)計。Quartus平臺與Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供應(yīng)商的開發(fā)工具相
28、兼容。改進了軟件的LogicLock模塊設(shè)計功能,增添 了FastFit編譯選項,推進了網(wǎng)絡(luò)編輯性能,而且提升了調(diào)試能力。</p><p> 第二章 系統(tǒng)方案設(shè)計</p><p><b> 設(shè)計要求:</b></p><p> 1、行列式鍵盤電路包括:時鐘產(chǎn)生電路,掃描電路、按鍵標(biāo)志產(chǎn)生電路和鍵盤譯碼器;</p><
29、p> 2、LED顯示電路設(shè)計包括:時鐘發(fā)生器、掃描信號發(fā)生器、顯示緩存器、七段譯碼器、小數(shù)點產(chǎn)生模塊和閃爍模塊;</p><p> 3、鍵盤與LED顯示電路配合,完成數(shù)據(jù)修改,移位,滅零和小數(shù)點移動等功能。</p><p> 2.1 總設(shè)計方案</p><p> 根據(jù)課題要求,本設(shè)計主要由三個模塊完成,</p><p> 輸
30、入:行列式鍵盤,具備0-9十個數(shù)字鍵及數(shù)據(jù)修改/確認,左移位鍵,右移位鍵三個功能鍵。</p><p> 輸出:六位7段數(shù)碼管。</p><p> 主程序:實現(xiàn)時鐘產(chǎn)生,鍵位識別,數(shù)據(jù)修改,移位等功能。</p><p> 應(yīng)以上三個模塊要求,設(shè)計分頻模塊,產(chǎn)生符合要求的方波。</p><p><b> 如圖2-1所示:<
31、/b></p><p> 圖2-1 系統(tǒng)設(shè)計方案圖</p><p> 2.2 分頻器設(shè)計方案</p><p> 本設(shè)計采用FPGA硬件設(shè)計,其內(nèi)置時鐘頻率為66MHz,而三個模塊需要的是頻率較低的信號,應(yīng)通過寄存器計數(shù)來實現(xiàn)分頻,考慮到高低頻率差異太大,所以拆分成為兩個寄存器來實現(xiàn),這樣可以得到250Hz信號,然后再使用兩個寄存器可分別得到5Hz,1H
32、z兩個信號。如圖2-2所示。</p><p> 圖2-2 分頻示意圖</p><p> 2.3 行列式鍵盤設(shè)計方案</p><p> 行列式鍵盤的工作方式是讀取行列線的狀態(tài),查看是否有按鍵按下。鍵盤部分提供一種掃描的工作方式,能對鍵盤不斷掃描、自動消抖、自動識別按下的鍵,并給出編碼,能對雙鍵或n個鍵同時按下的情況實行保護。</p><p&
33、gt; 本設(shè)計需要實現(xiàn)數(shù)據(jù)修改,移位,所以除了0-9數(shù)字鍵盤以外,還至少需要左右移位鍵及修改/確認三個功能鍵,如圖2-3所示。</p><p> 圖2-3 鍵盤示意圖</p><p> 鍵盤需要響應(yīng)迅速,所以采用了250Hz信號,輸入由X1,X2,X3,X4;Y1,Y2,Y3,Y4八根縱橫交錯的連接線組成,當(dāng)某根X連接線和Y連接線同時為低電平時有效,例如當(dāng)X3,Y2為低電平時,識別為
34、“0”鍵,將輸出相應(yīng)信號供主程序識別。</p><p><b> 如圖2-4所示。</b></p><p> 圖2-4 鍵盤電路原理</p><p> 2.4 六位7段LED顯示設(shè)計方案</p><p> 在譯碼器設(shè)計時,常用發(fā)光二極管的狀態(tài)驗證設(shè)計是否滿足要求。這種方式是很直觀的,但在計數(shù)器設(shè)計時,這樣的驗證
35、方式就顯得很不直觀,尤其當(dāng)計數(shù)器的位數(shù)增加時(如百進制計數(shù)),太多的發(fā)光管將使結(jié)果的獨處非常困難。此時應(yīng)采用數(shù)碼管顯示,但是當(dāng)用七段數(shù)碼顯示器顯示的位數(shù)較多時(如顯示8位)BCD碼十進制數(shù)),為了節(jié)省硬件開支,常用動態(tài)顯示方法,即對各LED數(shù)碼管循環(huán)掃描。分時使用顯示器驅(qū)動電路。</p><p> 驅(qū)動方式:直接驅(qū)動方式,直接對數(shù)碼管相應(yīng)的字段給出驅(qū)動電平,以顯示字形,其真值表如表2-1所示:</p>
36、;<p> 表2-1 LED真值表</p><p><b> 2)動態(tài)掃描顯示</b></p><p> 動態(tài)掃描的FPGA實現(xiàn)可以采用將所有數(shù)碼管的相同字段并聯(lián),由FPGA芯片的輸出信號a,b,c,d,e,f,g直接驅(qū)動相應(yīng)字段,由軟件編程產(chǎn)生片選信號MS1,MS2,…,MS6循環(huán)選中6個數(shù)碼管。數(shù)碼管顯示的字形由表2-2決定。</p>
37、;<p><b> 3)相關(guān)知識</b></p><p> 共陰數(shù)碼管如右圖2-5所示:每一條線分別對應(yīng)一個管腳,當(dāng)管腳為‘1’時,這條線為亮,當(dāng)管腳設(shè)置為‘0’時,這條線不亮。例如:設(shè)置a的管腳為‘1’,那么0這條線就會亮;設(shè)置g的管腳為‘1’,那么6這條線就會亮。要讓數(shù)碼管顯示數(shù)字0,那么我們可以設(shè)置{a,b,c,d,e,f,g}為“1111110”。</p&g
38、t;<p> 圖2-5 數(shù)碼管示意圖</p><p> 2.5 頂層模塊設(shè)計方案</p><p> 此模塊為系統(tǒng)核心模塊,大部分的功能都由此模塊完成。</p><p><b> 時鐘模塊</b></p><p> 設(shè)計思路:定義一個長度為24位的時鐘顯示緩存寄存器,每4
39、位用BCD碼來分別顯示時分秒的個位,十位,每當(dāng)1秒周期則秒個位加一,當(dāng)秒個位為9時則清零,秒十位加一,當(dāng)秒為59時清零,分加一,同理當(dāng)分為59,秒為59時,分、秒清零,時加一,同理當(dāng)時為23,分為59,秒為59時,時分秒清零。完成時鐘的設(shè)計。</p><p><b> 2)鍵盤譯碼模塊</b></p><p> 設(shè)計思路:定義1位寄存器sel,每當(dāng)檢測到sel信號
40、則自加1,當(dāng)sel為1時進入修改狀態(tài),為0則為時鐘狀態(tài)。</p><p><b> 3)數(shù)據(jù)移位模塊</b></p><p> 設(shè)計思路:定義3位寄存器flag,當(dāng)flag不為0時,每當(dāng)檢測到“←”信號時,flag自減1,當(dāng)flag不為5時,每當(dāng)檢測到“→”信號,flag自加1。</p><p><b> 4)數(shù)據(jù)修改模塊<
41、;/b></p><p> 設(shè)計思路:當(dāng)sel為1時,進入修改狀態(tài),檢測flag的值,flag的值分別對應(yīng)各將被修改的數(shù)據(jù),如圖2-6。</p><p> 圖2-6 數(shù)據(jù)修改信號</p><p> 檢測鍵盤輸入信號,若有0-9數(shù)字信號輸入則將對應(yīng)數(shù)字賦值給相應(yīng)時鐘顯示緩存寄存器。</p><p><b> 5)閃爍模塊
42、</b></p><p> 設(shè)計思路:當(dāng)sel為1時,引入5Hz信號clkss,當(dāng)clkss為1時,flag所對應(yīng)數(shù)據(jù)輸出信號為緩存數(shù)據(jù),為0時對應(yīng)數(shù)據(jù)電平將為高阻態(tài)不顯示,這樣可實現(xiàn)被修改數(shù)據(jù)會以5Hz的頻率閃爍顯示。</p><p><b> 6)顯示輸出模塊</b></p><p> 設(shè)計思路:將時鐘顯示緩存寄存器的數(shù)據(jù)
43、賦值給輸出管腳。</p><p> 第三章 系統(tǒng)程序設(shè)計</p><p> 3.1 分頻器程序設(shè)計</p><p> 在現(xiàn)代電子系統(tǒng)中,數(shù)字系統(tǒng)所占的比例越來越大。系統(tǒng)發(fā)展的趨勢是數(shù)字化和集成化,而CPLD/FPGA作為可編程ASIC(專用集成電路)器件,它將在數(shù)字邏輯系統(tǒng)中發(fā)揮越來越重要的作用。</p><p> 在數(shù)字邏輯電路
44、設(shè)計中,分頻器是一種基本電路。通常用來對某個給定頻率進行分頻,以得到所需的頻率。整數(shù)分頻器的實現(xiàn)非常簡單,可采用標(biāo)準(zhǔn)的計數(shù)器,也可以采用可編程邏輯器件設(shè)計實現(xiàn)。本設(shè)計采用標(biāo)準(zhǔn)計數(shù)器來實現(xiàn)。根據(jù)設(shè)計思路,本模塊將66MHz信號分頻成為250Hz,5Hz,1Hz三個輸出信號,流程圖如圖3-1所示。</p><p> 程序每當(dāng)檢測到內(nèi)置時鐘上升沿,計數(shù)寄存器1自加1,如果寄存器1等于999,則寄存器1置0,寄存器2自
45、加1,如果寄存器2等于131,則clksy取反,寄存器3,寄存器4均自加1,寄存器2清零,F(xiàn)s=fx/ns=50M/[(999+1)*(131+1)]=500,可得clksy每秒鐘取反500次,即可得clksy=250Hz, 圖3-1分頻程序流程圖 同理寄存器3和寄存器4每1/500秒自加1。如果寄存器3等于249,則寄存器3清零,clk取反,根據(jù)以上結(jié)果可得clk每秒取反
46、2次,即可得clk=1Hz。 </p><p> 如果寄存器3等于49,則寄存器4清零,clkss取反,根據(jù)以上結(jié)果可得clkss每秒取反10次,即可得clkss=5Hz。</p><p> 根據(jù)以上思路,Verilog HDL程序如下:</p><p> module clkfs(clk,clkss,clksy,clk66MHz); <
47、/p><p> input clk66MHz; output clk,clkss,clksy;</p><p> reg clk,clkss,clksy; reg[9:0] count1;</p><p> reg[6:0] count2; reg[7:0] count3;</p><p> reg[5:0] count4;
48、 reg cin1,cin2;</p><p> always @(posedge clk66MHz)</p><p> if(count1[9:0]==10'd999)</p><p> begin count1[9:0]=10'd0;</p><p> cin1=1'd1;//產(chǎn)生進位信號1<
49、;/p><p><b> end</b></p><p><b> else </b></p><p> begin count1[9:0]=count1[9:0]+10'd1;</p><p> cin1=1'd0;//進位信號1清零</p><p
50、><b> end</b></p><p> always @(posedge clk66MHz)</p><p> if(count2[7:0]==8'd131)</p><p> begin count2[7:0]=8'd0;</p><p> clksy=~clksy; //
51、clksy=250Hz</p><p> cin2=1'd1;//產(chǎn)生進位信號2</p><p><b> end</b></p><p><b> else </b></p><p> begin count2[7:0]=count2[7:0]+cin1;//若進位信號1
52、為1則加1,為0則不變</p><p> cin2=1'd0;//進位信號2清零</p><p><b> end</b></p><p> always @(posedge clk66MHz)</p><p> if(count3[7:0]==8'd249)</p><
53、p> begin count3[7:0]=8'd0;</p><p> clk=~clk; //clk=1Hz</p><p><b> end</b></p><p> else count3[7:0]=count3[7:0]+cin2;//若進位信號2為1則加1,為0則不變</p><p&
54、gt; always @(posedge clk66MHz)</p><p> if(count4[5:0]==6'd49)</p><p> begin count4[5:0]=6'd0;</p><p> clkss=~clkss; //clkss=5Hz</p><p><b> end<
55、;/b></p><p> else count4[5:0]=count4[5:0]+cin2;</p><p> endmodule</p><p> 3.2 行列式鍵盤程序設(shè)計</p><p> 相對if語句只有兩個分支而言,else語句是一種多分支語句,故case語句多用于條件譯碼電路,本設(shè)計的行列式鍵盤模塊采
56、用case語句鍵盤譯碼。利用250Hz信號掃描X軸和Y軸電位信號,當(dāng)某根X連接線和Y連接線同時為低電平時有效。</p><p> 鍵盤去抖功能:按鍵在閉合和斷開時,觸點會存在抖動現(xiàn)象,本設(shè)計采用250Hz低頻信號,觸發(fā)判定為clk信號上升沿和下降沿,也就是在40ms時間內(nèi)會有兩次判定,如果兩次判定均為同一鍵位,則輸出鍵值,否則輸出為0,可以消除觸點抖動的負面作用。示意圖如下:</p><p&
57、gt; 圖3-2 去抖示意圖</p><p> 圖示為兩次按鍵,第一次按鍵時間極短,可視為一次抖動,第二次為正常按鍵(時間較長,可以是多個CLK周期,圖示只列出1個周期),現(xiàn)分析如下:</p><p> 圖示1處:讀取key1為低;圖示2處:讀取key2為高;結(jié)果:key為0,判定無按鍵。</p><p> 圖示1處:讀取key1為低;圖示2處:讀取key2
58、為低;結(jié)果:key為對應(yīng)鍵位值,判定有按鍵。</p><p><b> 程序如下:</b></p><p> module keypad(clksy,x,y,key); //clksy=64hz</p><p> input clksy;</p><p> input[3:0] x,y; //4*4 key ,l
59、ow active</p><p> output[5:0] key;</p><p> reg[5:0] key1,key2;</p><p> always @(posedge clksy) //第一次判定</p><p><b> begin</b></p><p> cas
60、e({~y[3:0],~x[3:0]})</p><p> 8'b00010001:key1[5:0]=6'd1;</p><p> 8'b00010010:key1[5:0]=6'd2;</p><p> 8'b00010100:key1[5:0]=6'd3;</p><p> 8
61、39;b00011000:key1[5:0]=6'd4;</p><p> 8'b00100001:key1[5:0]=6'd5;</p><p> 8'b00100010:key1[5:0]=6'd6;</p><p> 8'b00100100:key1[5:0]=6'd7;</p>&l
62、t;p> 8'b00101000:key1[5:0]=6'd8;</p><p> 8'b01000001:key1[5:0]=6'd9;</p><p> 8'b01000010:key1[5:0]=6'd10;</p><p> 8'b01000100:key1[5:0]=6'd16;
63、</p><p> 8'b01001000:key1[5:0]=6'd32;</p><p> 8'b10001000:key1[5:0]=6'd48;</p><p> default:key1[5:0]=6'd0; //輸出結(jié)果寄存在key1</p><p><b> en
64、dcase</b></p><p><b> end</b></p><p> always @(negedge clksy) //第二次判定</p><p><b> begin</b></p><p> case({~y[3:0],~x[3:0]})</p&g
65、t;<p> 8'b00010001:key2[5:0]=6'd1; //鍵位1</p><p> 8'b00010010:key2[5:0]=6'd2; //鍵位2</p><p> 8'b00010100:key2[5:0]=6'd3; //鍵位3</p><p>
66、8'b00011000:key2[5:0]=6'd4; //鍵位4</p><p> 8'b00100001:key2[5:0]=6'd5; //鍵位5</p><p> 8'b00100010:key2[5:0]=6'd6; //鍵位6</p><p> 8'b00100100:key
67、2[5:0]=6'd7; //鍵位7</p><p> 8'b00101000:key2[5:0]=6'd8; //鍵位8</p><p> 8'b01000001:key2[5:0]=6'd9; //鍵位9</p><p> 8'b01000010:key2[5:0]=6'd10; //鍵
68、位0</p><p> 8'b01000100:key2[5:0]=6'd16; //鍵位←</p><p> 8'b01001000:key2[5:0]=6'd32; //鍵位→</p><p> 8'b10001000:key2[5:0]=6'd48; //鍵位sel</p>
69、<p> default:key2[5:0]=6'd0;//輸出結(jié)果寄存在key2</p><p><b> endcase</b></p><p><b> end</b></p><p> assign key=(key1==key2)?key1:6'd0; //判定 如果兩次
70、結(jié)果相同 則輸出為</p><p> //鍵值 如果不同 則輸出為0</p><p><b> endmodule</b></p><p> 3.3 六位7段LED顯示程序設(shè)計</p><p> 聯(lián)華眾科FPGA開發(fā)板FA130的數(shù)碼顯示為六位7段共陰極數(shù)碼管,其工作特點是,當(dāng)筆段電極接高電平,公共陰
71、極接低電平時,相應(yīng)筆段發(fā)光。本模塊同時具有片選,七段譯碼,滅零功能。</p><p> 本模塊由250Hz信號驅(qū)動,采用動態(tài)顯示方法,即對六個LED數(shù)碼管循環(huán)掃描。分時使用顯示器驅(qū)動電路。可得每個數(shù)碼管顯示頻率為250/6≈42Hz,人眼視覺暫留時間的要求為25幀每秒,可達到要求。</p><p><b> 程序如下:</b></p><p&g
72、t; module xianshi(clksy,a,b,c,d,e,f,g,D0,D1,D2,D3,D4,D5,num0,num1,num2,num3,num4,num5);</p><p> input clksy;</p><p> input[3:0] num0,num1,num2,num3,num4,num5; //num0-num5為時分秒6位輸入</p>
73、<p> output a,b,c,d,e,f,g,D0,D1,D2,D3,D4,D5; //a-g為數(shù)碼管7段電平</p><p> reg a,b,c,d,e,f,g,D0,D1,D2,D3,D4,D5; //D0-D5為片選信號</p><p> reg[3:0] num10,num11,num12,num13,num14,num15;</p>
74、<p> reg[3:0] temp;</p><p> reg[2:0] flag;</p><p> always@(posedge clksy)</p><p><b> begin</b></p><p> {D0,D1,D2,D3,D4,D5}=6'b000000;</p>
75、;<p> if(flag==6) flag=0;</p><p> else flag=flag+1;</p><p> {num10,num11,num12,num13,num14,num15}={num0,num1,num2,num3,num4,num5};</p><p> if(num15==0) //首位滅零</p
76、><p> num15=4'bzzzz;</p><p> case(flag)//片選</p><p> 0:begin temp=num10;D0=1;end</p><p> 1:begin temp=num11;D1=1;end</p><p> 2:begin temp=num12
77、;D2=1;end</p><p> 3:begin temp=num13;D3=1;end</p><p> 4:begin temp=num14;D4=1;end</p><p> 5:begin temp=num15;D5=1;end</p><p> default:temp=0;</p><p>&l
78、t;b> endcase</b></p><p> case(temp) //七段譯碼</p><p> 4'd0:{a,b,c,d,e,f,g}=7'b1111110; //顯示數(shù)字0</p><p> 4'd1:{a,b,c,d,e,f,g}=7'b0110000; //顯示數(shù)字1
79、</p><p> 4'd2:{a,b,c,d,e,f,g}=7'b1101101; //顯示數(shù)字2</p><p> 4'd3:{a,b,c,d,e,f,g}=7'b1111001; //顯示數(shù)字3</p><p> 4'd4:{a,b,c,d,e,f,g}=7'b0110011; //顯示數(shù)字4&
80、lt;/p><p> 4'd5:{a,b,c,d,e,f,g}=7'b1011011; //顯示數(shù)字5</p><p> 4'd6:{a,b,c,d,e,f,g}=7'b1011111; //顯示數(shù)字6</p><p> 4'd7:{a,b,c,d,e,f,g}=7'b1110000; //顯示數(shù)字7&l
81、t;/p><p> 4'd8:{a,b,c,d,e,f,g}=7'b1111111; //顯示數(shù)字8</p><p> 4'd9:{a,b,c,d,e,f,g}=7'b1111011; //顯示數(shù)字9</p><p> default:{a,b,c,d,e,f,g}=7'b0000000; //無任何顯示<
82、/p><p><b> endcase</b></p><p><b> end</b></p><p><b> endmodule</b></p><p> 3.4 頂層模塊程序設(shè)計</p><p> 根據(jù)設(shè)計思路,畫出流程圖,見3-3。&l
83、t;/p><p> 程序是無限循環(huán),也就是到了流程圖結(jié)束的地方后又會回到開始,程序首先判定是否有鍵按下,如果有,則判定鍵值:若鍵值為←或→移動鍵,則會修改flag的值,有前文所述,flag的值代表時分秒的個、十位;若鍵值為Sel修改鍵,則會改變sel寄存器的值,設(shè)計需求是按一次Sel鍵將會進入修改狀態(tài),再按一次將退出修改狀態(tài),方案為設(shè)定sel寄存器為1位。程序接下來會判斷sel的值,如果為1則進入修改狀態(tài),為零則進
84、入計時狀態(tài)。 </p><p> 在修改狀態(tài)下,程序再次判定鍵值,若為數(shù)字鍵,則會將對應(yīng)數(shù)據(jù)賦值給flag所對應(yīng)緩存,若為←或→移動鍵,則會修改flag的值,若為Sel修改/確認鍵,將退出修改狀態(tài)。</p><p> 圖3-3 頂層模塊設(shè)計流程圖</p><p> 在計時狀態(tài),程序?qū)⒅鹈雽γ刖彺?/p>
85、加1,</p><p> 判斷:若秒低位為9,則秒低位清零,秒高位加一;</p><p> 判斷:若秒高位為5,則秒高位清零,分低位加一;</p><p> 判斷:若分低位為9,則分低位清零,分高位加一;</p><p> 判斷:若分高位為5,則分高位清零,時低位加一;</p><p> 判斷:若時低位為9,
86、則時低位清零,時高位加一;</p><p> 判斷:若時高低位為23,則時清零。</p><p> 程序到這里還沒有結(jié)束,關(guān)于修改位閃爍的方案,我將它和輸出管腳賦值整合在一起,首先判定是否為修改狀態(tài),若是,則將該修改數(shù)據(jù)和5Hz頻率相與再賦值給輸出管腳,當(dāng)5Hz頻率為高電平,輸出緩存數(shù)據(jù),反之則無輸出信號,這樣可實現(xiàn)被修改字符出現(xiàn)頻率為5Hz的閃爍。</p><p&
87、gt;<b> 程序如下:</b></p><p> module clock(clkss,key,sec,min,hour);</p><p> input clkss;</p><p> input[5:0] key;</p><p><b> reg sel;</b></p&g
88、t;<p> reg[2:0] flag1,sumsec;</p><p> output[7:0] sec,min,hour;</p><p> wire[7:0] sec,min,hour; </p><p> reg[23:0] sum;</p><p> reg seccin,cinsec,cinmin,ss0
89、,ss1,ss2,ss3,ss4,ss5;</p><p> initial flag1=3'd0;</p><p> always@(posedge clkss)</p><p><b> begin</b></p><p> if(key==6'd48) sel=sel+1'd1;
90、//如果為Sel鍵 將在修改/確認間切換</p><p> else if(key==6'd16) //如果為←鍵</p><p> begin if(!flag1) flag1=flag1-3'd1; //如果flag不為0 ,那么flag減1</p><p><b> end&l
91、t;/b></p><p> else if(key==6'd32) //如果為→鍵</p><p> begin if(flag1==5) flag1=3'd5;//如果flag等于5 ,flag值不變</p><p> else flag1=flag1+3'd1;//否則flag加1</p>
92、<p><b> end</b></p><p><b> end</b></p><p> always@(posedge clkss) //這段語句將5Hz信號分頻成為1Hz時鐘信號</p><p><b> begin </b></p>&l
93、t;p> if(sumsec[2:0]==3'd4)</p><p> begin sumsec[2:0]=3'd0;</p><p> seccin<=1;</p><p><b> end</b></p><p><b> else </b></p&g
94、t;<p> begin sumsec[2:0]=sumsec[2:0]+3'd1;</p><p> seccin<=0;</p><p><b> end</b></p><p><b> end</b></p><p> always@(posedge c
95、lkss)</p><p><b> begin </b></p><p> if(sel)//判定是否為修改狀態(tài)</p><p> begin if(flag1==0)</p><p> begin if(key==6'd10) sum[3:0]=4'd0; //零鍵
96、位的識別</p><p> else sum[3:0]=key[3:0]?key[3:0]:sum[3:0]; //key低四位不為零則賦值</p><p><b> end</b></p><p> else if(flag1==1)</p><p> begin if(key==6'd10) sum[
97、7:4]=4'd0;</p><p> else sum[7:4]<=key[3:0]?key[3:0]:sum[7:4];</p><p><b> end</b></p><p><b> end</b></p><p> else if(seccin)</p>
98、<p><b> begin</b></p><p> if(sum[3:0]==4'd9)</p><p> begin sum[3:0]=4'd0;</p><p> if(sum[7:4]==4'd5)</p><p> begin sum[7:4]<=4
99、9;d0;</p><p> cinsec<=1;</p><p><b> end</b></p><p><b> else </b></p><p> begin sum[7:4]<=sum[7:4]+4'd1;</p><p> cins
100、ec<=0;</p><p><b> end</b></p><p><b> end</b></p><p><b> else </b></p><p> begin sum[3:0]=sum[3:0]+seccin;</p><p>
101、; cinsec<=0;</p><p><b> end</b></p><p><b> end</b></p><p><b> end</b></p><p> always@(posedge clkss)</p><p>&l
102、t;b> begin </b></p><p><b> if(sel)</b></p><p> begin if(flag1==2)</p><p> begin if(key==6'd10) sum[11:8]<=4'd0;</p><p> else sum[11
103、:8]<=key[3:0]?key[3:0]:sum[11:8];</p><p><b> end</b></p><p> else if(flag1==3)</p><p> begin if(key==6'd10) sum[15:12]<=4'd0;</p><p> else
104、 sum[15:12]<=key[3:0]?key[3:0]:sum[15:12];</p><p><b> end</b></p><p><b> end</b></p><p> else if(cinsec)</p><p><b> begin</b>
105、;</p><p> if(sum[11:8]==4'd9)</p><p> begin sum[11:8]<=4'd0;</p><p> if(sum[15:12]==4'd5)</p><p> begin sum[15:12]<=4'd0;</p><p>
106、 cinmin<=1;</p><p><b> end</b></p><p><b> else </b></p><p> begin sum[15:12]<=sum[15:12]+4'd1;</p><p> cinmin<=0;</p>&
107、lt;p><b> end</b></p><p><b> end</b></p><p><b> else </b></p><p> begin sum[11:8]<=sum[11:8]+cinsec;</p><p> cinmin<=0;
108、</p><p><b> end</b></p><p><b> end</b></p><p><b> end</b></p><p> always@(posedge clkss)</p><p><b> begin<
109、;/b></p><p><b> if(sel)</b></p><p> begin if(flag1==4)</p><p> begin if(key==6'd10) sum[19:16]<=4'd0;</p><p> else sum[19:16]<=key[3:0]
110、?key[3:0]:sum[19:16];</p><p><b> end</b></p><p> else if(flag1==5)</p><p> begin if(key==6'd10) sum[23:20]<=4'd0;</p><p> else sum[23:20]<
111、=key[3:0]?key[3:0]:sum[23:20];</p><p><b> end</b></p><p><b> end</b></p><p> else if(cinmin)</p><p><b> begin</b></p>&l
112、t;p> if(sum[23:16]==8'd23) sum[23:16]<=8'd0;</p><p> elseif(sum[19:16]==4'd9)</p><p> begin sum[19:16]<=4'd0;</p><p> sum[23:20]<=sum[23:20]+4'd
113、1;</p><p><b> end</b></p><p><b> else </b></p><p> sum[19:16]<=sum[19:16]+cinmin;</p><p><b> end</b></p><p><
114、b> end</b></p><p> always @(posedge clkss)</p><p><b> begin</b></p><p><b> if(sel)</b></p><p> begin case(flag1)//判定是否為修
115、改狀態(tài)</p><p> 0:{ss0,ss1,ss2,ss3,ss4,ss5}=6'b100000;</p><p> 1:{ss0,ss1,ss2,ss3,ss4,ss5}=6'b010000;</p><p> 2:{ss0,ss1,ss2,ss3,ss4,ss5}=6'b001000;</p><p>
116、 3:{ss0,ss1,ss2,ss3,ss4,ss5}=6'b000100;</p><p> 4:{ss0,ss1,ss2,ss3,ss4,ss5}=6'b000010;</p><p> 5:{ss0,ss1,ss2,ss3,ss4,ss5}=6'b000001;</p><p> default:{ss0,ss1,ss2,ss3
117、,ss4,ss5}=6'd0;</p><p><b> endcase</b></p><p><b> end</b></p><p> else {ss0,ss1,ss2,ss3,ss4,ss5}=6'd0;</p><p><b> end</b>
118、;</p><p> assign sec[3:0]=ss0?(clkss?sum[3:0]:4'bz):sum[3:0]; </p><p> assign sec[7:4]=ss1?(clkss?sum[7:4]:4'bz):sum[7:4];</p><p> assign min[3:0]=ss2?(clkss?sum[11:8]:4
119、'bz):sum[11:8];</p><p> assign min[7:4]=ss3?(clkss?sum[15:12]:4'bz):sum[15:12];</p><p> assign hour[3:0]=ss4?(clkss?sum[19:16]:4'bz):sum[19:16];</p><p> assign hour[7
120、:4]=ss5?(clkss?sum[23:20]:4'bz):sum[23:20]; </p><p> /*括號內(nèi)的值:clkss高電平sum,低電平為高阻態(tài),</p><p> 輸出管腳的值:該管腳在修改狀態(tài)則為括號內(nèi)的值</p><p><b> 否則為sum值*/</b></p><p><
121、b> endmodule</b></p><p><b> 第四章 程序仿真</b></p><p> 4.1 分頻器程序仿真</p><p> 因為分頻比例太大,在仿真時將比例減小。</p><p> 下圖為將寄存器1的分頻比1000:1改為1:1,</p><p&g
122、t; 即:if(count1[9:0]==10'd999)→if(count1[9:0]==10'd0);</p><p> 寄存器2的分頻比132:1改為2:1,</p><p> 即:if(count2[7:0]==8'd131)→if(count2[7:0]==8'd1);</p><p> 將寄存器3的分頻比250:1
123、改為3:1,</p><p> 即:if(count3[7:0]==8'd249)→if(count3[7:0]==8'd2);</p><p> 將寄存器4的分頻比50:1改為6:1,</p><p> 即:if(count4[5:0]==6'd49) →if(count4[5:0]==6'd5);</p>&l
124、t;p> 其他程序部分無任何改變,圖4-1為修改后的程序仿真結(jié)果。</p><p> 圖4-1 分頻器模擬仿真</p><p> 設(shè)在單位時間內(nèi):clk50MHz的上升沿的次數(shù)為N,clksy取反次數(shù)為Nsy,計數(shù)器1的分頻比為p1,計數(shù)器2的分頻比為p2,計數(shù)器3的分頻比為p3,計數(shù)器4的分頻比為p4,則Nsy=N/(p1*p2),代入模擬仿真數(shù)據(jù),得Nsy=N/2,若在4個
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于fpga的樂曲演奏電路設(shè)計
- 基于fpga的串口通信電路設(shè)計
- 基于fpga的簡單音樂電路設(shè)計
- 基于fpga的時序邏輯電路設(shè)計
- 基于fpga音樂硬件演奏電路設(shè)計
- 基于fpga的ccd時序電路設(shè)計
- 基于fpga的樂曲演奏電路設(shè)計課程設(shè)計
- 基于fpga的電子密碼鎖電路設(shè)計
- 基于fpga的音樂播放控制電路設(shè)計
- 基于fpga的pcb測試機硬件電路設(shè)計
- 基于FPGA的GZIP硬件壓縮電路設(shè)計.pdf
- 基于fpga的圖像采集與處理電路設(shè)計
- 畢業(yè)論文--基于fpga的串口通信電路設(shè)計
- 基于fpga的交通燈控制電路設(shè)計
- 基于fpga的qpsk調(diào)制解調(diào)電路設(shè)計與實現(xiàn)
- 基于FPGA實現(xiàn)高速串口通信的電路設(shè)計.pdf
- 基于fpga的交通燈控制電路設(shè)計設(shè)計(1)
- 開題報告---基于fpga的tft lcd驅(qū)動電路設(shè)計
- 基于FPGA的短基線定位系統(tǒng)電路設(shè)計.pdf
- 基于FPGA的ADS7817驅(qū)動電路設(shè)計.pdf
評論
0/150
提交評論