

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> ××大學××學院××課程設計</p><p><b> ××大學××學院</b></p><p><b> 二○一一年六月</b></p><p> 摘要:本文介紹了一個以Altera公司的Cyc
2、loneII可編程邏輯芯片EP2C5T144C8為控制核心、運用VHDL硬件描述語言附加一定外圍電路組成的出租車計費器系統(tǒng)。本設計論文主要介紹了出租車計費器系統(tǒng)的組成及工作原理,簡述了在EDA平臺上用單片FPGA器件構成該數字系統(tǒng)的設計思想和實現過程。同時,詳細論述了人機交互驅動模塊、驅動模塊、計程模塊、計費模塊、譯碼動態(tài)掃描模塊等的設計方法與技巧。利用FPGA芯片實現一些功能較復雜的電子產品設計,不僅可以增加系統(tǒng)設計的靈活性,利用它進
3、行產品開發(fā),不僅成本低、周期短、可靠性高,而且具有完全的知識產權。同時,在進行SOPC設計的時候,我們可以自由調用NIOS資源模塊構建軟核,從而減小了系統(tǒng)的功耗,實現產品的強大功能。關鍵字:FPGA,VHDL,EP2C5T144C8,SOPC</p><p> Abstract:This paper introduces a Altera company to CycloneII programmable l
4、ogic chips EP2C5T144C8 as control core, useing VHDL hardware description language add a certain peripheral circuit of the message accounting device system of a taxi. This design paper mainly introduced the message accoun
5、ting device taxi system composition and working principle, this paper expounds on the platform in EDA using single pill FPGA components, the digital system design thought and the implementation process. At</p><
6、;p> Key words: FPGA,VHDL,EP2C5T144C8,SOPC</p><p><b> 目 錄</b></p><p><b> 前言</b></p><p> 1.系統(tǒng)功能軟件介紹1</p><p> 1.1 QuartusII軟件介紹1<
7、/p><p> 1.2 FPGA芯片介紹1</p><p> 1.3 硬件描述語言介紹2</p><p> 2.總體方案設計3</p><p> 2.1 系統(tǒng)框圖4</p><p> 2.2 基于MCU的出租車計費器4</p><p> 2.3 基于FPGA的出租車計
8、費器5</p><p> 2.4 總體設計方案5</p><p> 3.單個模塊設計6</p><p> 3.1 人機交互驅動模塊6</p><p> 3.1.1人機交互模塊6</p><p> 3.1.2人機交互模塊仿真7</p><p> 3.2 4x4矩陣
9、鍵盤驅動模塊設計7</p><p> 3.2.1 4x4矩陣鍵盤模塊8</p><p> 3.2.2 4x4矩陣鍵盤仿真圖7</p><p> 3.3 二進制BIN轉換成BDC(10進制)模塊9</p><p> 3.4 FILTER驅動模塊設計9</p><p> 3.5 PLS模塊驅動
10、設計10</p><p> 3.5.1 PLS模塊設計10</p><p> 3.5.2 PLS模塊設計仿真圖11</p><p> 3.6 出租車控制驅動模塊設計11</p><p> 3.7 頂層模塊12</p><p><b> 4.系統(tǒng)功能13</b><
11、/p><p> 4.1 計費功能實現13</p><p> 4.2 顯示功能實現13</p><p> 5. 設計總結14</p><p><b> 6.參考文獻14</b></p><p> 附錄(主要底層模塊驅動)16</p><p><b&
12、gt; 前言</b></p><p> 隨著EDA技術的高速發(fā)展,電子系統(tǒng)的設計技術和工具發(fā)生了深刻的變化,大規(guī)??删幊踢壿嬈骷﨏PLD/FPGA的出現,給設計人員帶來了諸多方便。利用它進行產品開發(fā),不僅成本低、周期短、可靠性高,而且具有完全的知識產權。本文介紹了一個以Altera公司可編程邏輯芯片EP2C5T144C8為控制核心、附加一定外圍電路組成的出租車計費器系統(tǒng)。該電子產品在全國有很多出租
13、車公司中得到了使用,因此出租車市場是龐大的。由于受到油價的影響各大城市推出了運價油價聯動機制,所以出租車計價器計價標準的靈活性設定成為未來計費器不可缺少的一部分?,F在的計費器大部分是以單片機為開發(fā)平臺,但是單片機的程序是不通用的,不同的芯片有不同的指令集,因此設計研發(fā)比較困難。而FPGA等數字可編程器件的出現徹底解決了這個問題,而且更穩(wěn)定、設計更靈活、能實現較為復雜的功能,運用EDA軟件可方便在電腦上實現設計和仿真,由于本設計采用的可編
14、程器件ALTERA公司的CYCLONEII系列FPGA( EP2C5T144C8)。QuartusII化和易學易用的可視化設計環(huán)境 ,并具有符合工業(yè)標準的 EDA 工具接口 ,能在各種平臺上運行. 它</p><p> 1.系統(tǒng)功能軟件介紹</p><p> 1.1 QuartusII軟件介紹</p><p> QuartusII是Altera公司的綜合性P
15、LD開發(fā)軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。 </p><p> QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl腳本完成設計流程外,提供了完善的用戶圖形界面設計方式。具有運行速度快,界
16、面統(tǒng)一,功能集中,易學易用等特點。 </p><p> QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三方EDA工具。 </p><p> 此外,QuartusII通過和DSP Builder工具與M
17、atlab/Simulink相結合,可以方便地實現各種DSP應用系統(tǒng);支持Altera的片上可編程系統(tǒng)(SOPC)開發(fā),集系統(tǒng)級設計、嵌入式軟件開發(fā)、可編程邏輯設計于一體,是一種綜合性的開發(fā)平。</p><p> 1.2 FPGA芯片介紹</p><p> 隨著現代芯片工藝的改進,FPGA的等效系統(tǒng)門達到到幾百萬門,而且工作頻率也隨之提高。FPGA也就大量的在電子產品中出現。在通信行
18、業(yè),傳輸網,醫(yī)療儀器,各種電子儀器,安防監(jiān)控,電力系統(tǒng),汽車電子,消費類電子中都大面積的使用。隨產品研發(fā)周期的逐步縮短,定制型產品的開發(fā)使FPGA在后面的應用面越來越廣。例如在2G通信,3G通信,以后的4G通信,wimax等等通信類的設備中它與DSP,MPU一起大量出現在其中。尤其是通信的數字化,軟件無線電等概念涌現到電子行業(yè)的各個領域,芯片設計的工藝的改進,45nm工藝的出現,使得FPGA成為必不可少的流行的實惠的器件。</p&
19、gt;<p> FPGA最大的特點就是靈活,實現你想實現的任何數字電路,可以定制各種電路。減少受制于專用芯片的束縛。真正為自己的產品量身定做。在設計的過程中可以靈活的更改設計。而且它強大的邏輯資源和寄存器資源可以讓你輕松的去發(fā)揮設計理念,其并行執(zhí)行,硬件實現的方式可以應對設計中大量的高速電子線路設計需求。 FPGA比DSP擁有更快的速度,可以實現非常復雜的高速邏輯,FPGA比ASIC(專用芯片)有更短的設計周期和靈活性,
20、免去昂貴的開版費用,而且可以隨時裁減,增加你想要的功能達到規(guī)避設計風險,回避芯片廠商的限制。另外知識產權的概念不斷涌現,仿制別人抄襲,FPGA完全讓設計的智慧得以保護。讓公司的利益在較長時間內得到保證。隨FPGA芯片供應商的重視和第三方公司的重視,現在有非?,F成的IP核被提供,進一步縮短設計周期縮短,減小開發(fā)成本。現在很多免費的軟IP核和硬 IP核的出現更是壓縮了成本。</p><p> 在當前的FPGA器件提
21、供商中XILINX和ALTEAR這兩家公司是份額最大的供應商,估計占90%以上。這兩家都有強大的技術支持,芯片的穩(wěn)定性和產品系列都特別的多。涵蓋了高中低幾個設計層次。如果要追求高可靠比如軍工,航天,強電磁干擾等條件下的設計可以考慮ACTEL公司的 FPGA,不過價格很貴。如果想一味的追求成本可以考慮LATTIC公司的FPGA,就是穩(wěn)定性和相同條件下的布線成功率較差。</p><p> 下面介紹一下FPGA的幾大
22、優(yōu)點:</p><p> ◆FPGA運行速度快:FPGA內部集成鎖項環(huán),可以把外部時鐘倍頻,核心頻率可以到幾百M,而單片機運行速度低的多.在高速場合,單片機無法代替FPGA;</p><p> ◆FPGA易于實現大規(guī)模系統(tǒng):單片機IO口有限,而FPGA動輒數百IO,可以方便連接外設.比如一個系統(tǒng)有多路AD/DA,單片機要進行仔細的資源分配,總線隔離,而FPGA由于豐富的IO資源,可以很
23、容易用不同IO連接各外設;</p><p> ◆FPGA能處理更復雜功能:單片機程序是串行執(zhí)行的,執(zhí)行完一條才能執(zhí)行下一條,在處理突發(fā)事件時只能調用有限的中斷資源;而FPGA不同邏輯可以并行執(zhí)行,可以同時處理不同任務,這就導致了FPGA工作更有效率;</p><p> ◆FPGA大量軟核方便進行二次開發(fā):FPGA甚至包含單片機和DSP軟核,并且IO數僅受FPGA自身IO限制。所以,FP
24、GA又是單片機和DSP的超集,也就是說,單片機和DSP能實現的功能,FPGA一般都能實現。</p><p> 1.3 硬件描述語言介紹</p><p> VHDL語言的優(yōu)點是語法嚴謹,層次結構清晰。缺點是熟悉時間長,不夠靈活。FPGA的優(yōu)點是設計周期短、靈活。適合用于小批量系統(tǒng),提高系統(tǒng)的可靠性和集成度,所以本設計使用了VHDL語言,它的英文全稱是Very_High_Speed In
25、tegrated Circuit Hardwere Description Language 被稱為是最標準的硬件描述語言,有專家認為在以后VHDL和Verilog HDL語言將承擔幾乎全部的數字系統(tǒng)的設計。</p><p> VHDL語言主要用于數字系統(tǒng)的結構|行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風格與語法十分類似于一般的計算機高級語言,VHDL語言的結構程序特點是將一
26、項工程設計,或被稱為設計實體(可以是一個元件、一個電路模板或一個系統(tǒng))分成外部(或稱為可視部分)和內部(或稱不可視部分),即設計實體的內部功能和算法完成部分。在對一個設計實體定義了外部界面后,一旦內部開發(fā)完成后,其他的設計可以直接調用這個實體。這種設計將內外部分的概念是VHDL系統(tǒng)設計的基本點。</p><p> 使用VHDL設計系統(tǒng)方法是自頂向下的系統(tǒng)設計方法,在設計過程中,首先從整體上對系統(tǒng)設計做詳細的規(guī)劃
27、,然后完成電路系統(tǒng)功能行為方面的設計。</p><p> 隨著DEA技術的發(fā)展,使用硬件描述語言設計FPGA成為一種趨勢,使用QuartusII軟件用VHDL語言開發(fā)FPGA的完整流程為:</p><p> ◆文本編輯:用任何的文本編輯器可以,也可以用專用的HDL編輯環(huán)境,通常VHDL保存為.vhd文件;</p><p> ◆功能仿真:將文件調入HDL仿真軟件
28、進行功能仿真,檢查邏輯功能是否正確;</p><p> ◆邏輯綜合:將源文件調入邏輯綜合器進行綜合,即把語言綜合成最簡單的布爾表達式和信號的鏈接關系;</p><p> ◆布局布線:將綜合得到的文件調入軟件中進行布線,把設計好的邏輯安放到FPGA內;</p><p> ◆時序仿真:需要利用在布局布線中獲得的精確參數,用仿真軟件驗證電路的時序;</p>
29、;<p> ◆編程下載:確認仿真沒有錯誤后,將文件下載到芯片中觀察。</p><p><b> 2.總體方案設計</b></p><p><b> 2.1 系統(tǒng)框圖</b></p><p> 圖1 出租車計價器系統(tǒng)框圖</p><p> 2.2 基于MCU的出租車計費器
30、</p><p> 硬件各個模塊的功能:</p><p> ■鍵盤控制功能是啟動出租車的計價器,改變出租車計價器的狀態(tài)如運行、等待計時、不同計費模式的切換;</p><p> ■里程計算單元是通過安裝傳感器檢測到得信號,送到單片機,經處理計算,送給顯示單元;</p><p> ■利用單片機豐富的I/O端口,實現基本的里程計價功能和價格
31、調節(jié)、時鐘顯示功能;</p><p> ■利用單片機實現出租車計價器的開發(fā)。外圍電路較多,試調復雜,抗干擾能力差,特別這種計程車的額計價器需要長時間的不間斷運作的而系統(tǒng),由于主要是軟件運作,容易出錯,造成系統(tǒng)不穩(wěn)定,硬件總原理框圖如圖2所示。</p><p> 圖2 出租車計價器的總原理框圖</p><p> 2.3 基于FPGA的出租車計費器</p
32、><p> 基于FPGA的出租車計費器是由外部輸入模塊、控制模塊和顯示模塊三部分組成??刂颇K是整個系統(tǒng)的核心。它由分頻模塊,控制模塊,計量模塊和譯碼顯示模塊構成。</p><p> ■分頻模塊:是由系統(tǒng)對系統(tǒng)時鐘進行分頻以得到低頻信號;</p><p> ■控制模塊:主要是完成對計費器狀態(tài)的控制;</p><p> ■計量模塊:它完成計
33、價,計時和計程的功能;</p><p> ■譯碼顯示模塊:譯碼顯示模塊完成計價,計時和計程的顯示。計費據送入譯碼顯示模塊譯碼,最后送至以百元、十元、元、角為對應單位的數碼管上顯示。計時數據送入譯碼顯示模塊,最后送至以分為單位對應的數碼管上顯示。計程數據送入譯碼顯示模塊進行譯碼,最后送至以千米為單位的數碼管上顯示。</p><p> 2.4 總體設計方案</p><
34、p> 方案一:它的開發(fā)及制作成本較低,能較大程度的利用資源,但外圍電路較多,試調復雜,抗干擾能力差,特別對這種計程車的計價器需要長時間不間斷運作的系統(tǒng),由于主要是軟件運作,容易出錯,造成系統(tǒng)不穩(wěn)定。</p><p> 方案二:將所有芯片集成在一塊芯片上,體積大大減小的同時提高了穩(wěn)定性,且可以用EDA軟件仿真,試調,易于進行功能擴展,外圍電路較少,采用硬件邏輯電路實現,器最大的優(yōu)點是穩(wěn)定性好,抗干擾能力強
35、,非常適合作為計程車的計價器系統(tǒng)的控制核心。</p><p> 從以上兩種方案的比較可以看出基于FPGA的設計方案要優(yōu)于基于單片機的設計方案,基于FPGA的設計方案穩(wěn)定性相對于單片機的設計方案來說它更易于將來進行功能擴展。因此我們確定采用基于FPGA的出租車計費器的設計方案。</p><p><b> 3.單個模塊設計</b></p><p&g
36、t; 3.1 人機交互驅動模塊</p><p> 本系統(tǒng)當中使用的是以多位數碼管實現的人機交互界面來顯示出租車當前的計價的情況。多位數碼管可以使用動態(tài)掃描的方式來實現數據的顯示,這樣不僅節(jié)約了IO口資源,同時也節(jié)約的系統(tǒng)的成本。具體的硬件連接如圖3所示。</p><p> 圖3 人機交互硬件連接圖</p><p><b> 人機交互模塊<
37、/b></p><p> 人機交互模塊利用Verilog HDL硬件描述語言實現了軟件驅動,在QuartusII平臺下實現了軟件部分,同時將軟件轉換成原理圖的形式顯示。人機交互模塊原理圖如圖4。</p><p> 圖4 人機交互模塊原理圖</p><p><b> 人機交互模塊仿真</b></p><p>
38、 人機交互原理是將FPGA處理后的數據經過3-8譯碼器驅動實現4位LED數碼管,然后將數據送到人機界面進行數據的顯示。仿真圖如圖5所示。</p><p> 圖5 人機交互模塊仿真圖</p><p> 3.2 4x4矩陣鍵盤驅動模塊設計</p><p> 本系統(tǒng)當中使用矩陣鍵盤實現對出租出計價器的一些控制按鍵。如果只用機械按鍵的話,不僅浪費了IO口的資源,
39、同時不利于控制。</p><p> 3.2.1 4x4矩陣鍵盤模塊</p><p> 利用逐行掃描的方法實現對4x4矩陣鍵盤的驅動,利用的是Verilog HDL硬件描述語言實現的矩陣鍵盤的驅動。Verilog HDL寫矩陣鍵盤的驅動,方便易實現,因為Verilog HDL與標準C語法是很相似的,所以寫的矩陣鍵盤的驅動也十分好用,同時也將軟件代碼轉換成了原理圖符號,如圖6。</p
40、><p> 圖6 4x4矩陣鍵盤的原理圖符號</p><p> 3.2.2 4x4矩陣鍵盤仿真圖</p><p> 圖7 4x4矩陣鍵盤的仿真圖</p><p> 3.3 二進制BIN轉換成BDC(10進制)模塊</p><p> 在本系統(tǒng)當中,由于我們計算后的數據是二進制的數據,但是在我們在顯示的時候我們
41、會用到的是BCD碼的十進制數據。所以,如圖8所示為二進制BIN文件到BCD碼的十進制數據的一個轉換模塊。</p><p> 圖8 二進制轉換成BDC(10進制)原理圖符號</p><p> 3.4 FILTER驅動模塊設計</p><p> 本系統(tǒng)當中使用了FILTER模塊,使用的是VHDL實現的該模塊的設計。VHDL語言簡單易用,設計本模塊十分簡單方便。
42、該模塊有兩個驅動脈沖,一個是時鐘脈沖,另一個是10MS的脈沖。同時,在這個模塊里面我們還加入了一個按鍵脈沖輸入,原理圖如圖9所示。</p><p> 圖9 FILTER驅動模塊原理圖符號</p><p> 3.5 PLS模塊驅動設計</p><p> 3.5.1 PLS模塊設計</p><p> 本系統(tǒng)當中使用了一個PLS的模塊,
43、該模塊的驅動使用的是VHDL硬件描述語言來實現的。本系統(tǒng)主要實現的是產生三個時鐘信號,我們板上的使用的是CLOCK是50MHZ,然后進行分頻得到1S的脈沖、1MS的脈沖和10MS的脈沖。如圖10所示。</p><p> 圖10 PLS模塊原理圖符號</p><p> 3.5.2 PLS模塊設計仿真圖</p><p> 圖11 PLS模塊設計仿真圖</
44、p><p> 3.6 出租車控制驅動模塊設計</p><p> 本系統(tǒng)是一個出租車的計價器,那么計價器的控制模塊肯定是不能少的。在計價器控制模塊當中,我們主要利用的是4x4矩陣鍵盤當中相應的按鍵來實現控制,比如說出租車開始計價,停止計價,計價器清零和出租車的速度等控制信號的輸入,具體原理圖如圖12所示:</p><p> 圖12 出租車控制原理圖符號</
45、p><p><b> 3.7 頂層模塊</b></p><p> 本系統(tǒng)的頂層模塊也是利用VHDL硬件描述語言來實現的,同時我們可以由下圖可以看到該系統(tǒng)的頂層模塊十分簡單,各個底層模塊的引腳映射都是在頂層模塊里面實現的,具體的實現如圖13所示。</p><p> 圖13頂層模塊原理圖符號</p><p><b&
46、gt; 4.系統(tǒng)功能</b></p><p> 4.1 計費功能實現</p><p> 費用的計算是按行駛里程收費,設出租車的起步價是5.00元,當里程小于3km里時,按起步價收費;當里程大于3km時每公里按1.3元計費。等待累計時間超過2min,按每分鐘1.5元計費。所以總費用按下式計算:</p><p> 總費用=起步價+(里程-3km)*
47、里程單價+等候時間*等候單價。</p><p> 4.2 顯示功能實現</p><p> 顯示汽車行駛里程:用四位數字顯示,顯示方式為“XXXX”,單價為km。計程范圍為0~99km,計程分辨率為1km。</p><p> 顯示等候時間:用兩位數字顯示分鐘,顯示方式為“XX”。計時范圍為0~59min,計時分辨率為1min。</p><p
48、> 顯示總費用:用四位數字顯示,顯示方式為“XXX.X”,單位為元。計價范圍為999.9元,計價分辨率為0.1元。</p><p><b> 5.設計總結</b></p><p> 基于FPGA的出租車計價器電子產品設計已經廣泛應用到出租車行業(yè),該設計是一種相對比較流行的產品設計。該設計對于里程和等待時間的計數都使用的是計數器的原理,通過fin和stop信
49、號的不同值實現在不同情況下的計數;通過分頻產生的1秒、10毫秒等對應的周期頻率關系,由1HZ的信號控制計量模塊,由控制器選擇產生的信號作為計費模塊的輸入信號,所以計費模塊的輸入信號是13HZ、15HZ的信號之一,計量模塊每完成一次計數,計費模塊完成13次或者15次計數,即為實現1.3元或1.5元的計費。</p><p> VHDL硬件描述語言和EDA基礎實驗教程是設計中對于各個模塊的設計是基礎,首先要分析清楚各
50、個模塊的功能,然后分別進行編程設計、驗證,然后使用VHDL語言中的元件例化語句,將各個模塊組合到一起,實現總的設計功能。在硬件實現過程中,當進行等待計時計費時,發(fā)現計時很慢,初步分析是因為計時的驅動頻率不大,需要選擇256HZ以上的頻率;更改以后,計時正常,但同頻率下行駛計費速度較快,不便觀察,因此要注意觀察的點和頻率的選擇。</p><p> 在本次設計當中,本人成功實現了該設計的各個底層模塊的設計,而各個模
51、塊使用了不同的硬件描述語言,有Verilog HDL和VHDL兩種。同時,與各個組員共同配合完成了設計等文章的書寫。在本次設計當中,我學到了將理論與實踐相結合,同時與團隊的精神才是強大的,只有與各個組員共同配合才可能做出真正的電子設計。</p><p> 在這里,也要感謝××教授和××老師的不斷耐心指導,才得以完成了本次的設計任務。所以,在這里非常感謝兩位老師的嚴謹細致、
52、一絲不茍的作風。老師循循善誘的教導和不拘一格的思路給予我無盡的啟迪,這次課程設計的每個實驗細節(jié)和每個數據,都離不開老師您的細心指導。同時感謝對我?guī)椭^的同學們,謝謝你們對我的幫助和支持,讓我感受到同學的友誼。</p><p><b> 6.參考文獻</b></p><p> [1]譚會生、瞿遂春,《EDA技術綜合應用實例與分析》,西安電子科技大學出版社,2004,
53、P.201-230</p><p> [2]高有堂,《EDA技術及應用實踐》,清華大學出版社,2006,P.201-230</p><p> [3]億特科技,《CPLD/FPGA應用系統(tǒng)設計與產品開發(fā)》,人民郵電出版社,2005,P.201-230</p><p> [4]指導書 劉春陽 趙世彧,《EDA技術實踐》,人民郵電出版社,2003,P.201-230
54、</p><p> [5]潘松 黃繼業(yè),《EDA技術實用教程》,科學出版社,2004,P.201-230</p><p> 附錄(主要底層模塊驅動)</p><p> 多位數據管軟件驅動:</p><p> module seg(</p><p> input i_clk,</p>
55、<p> input i_rst_n,</p><p> input [7:0] i_turn_off, // 熄滅位[2進制</p><p> input [7:0] i_dp, // 小數點位[2進制</p><p> input [31:0] i_dat
56、a, // 欲顯數據[16進制 </p><p> output [7:0] o_seg, // 段腳</p><p> output [2:0] o_sel, // 使用74HC138譯出位腳</p><p> output o_cs
57、 // 74HC138選擇位</p><p><b> );</b></p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 分頻部分 開始</p><p> //++++++++++++++++++++++++++
58、++++++++++++</p><p> reg [15:0] cnt; // 計數子</p><p> always @ (posedge i_clk, negedge i_rst_n)</p><p> if (!i_rst_n)</p><p><b> cnt <
59、;= 0;</b></p><p><b> else</b></p><p> cnt <= cnt + 1'b1;</p><p> wire seg7_clk = cnt[15]; // (2^16/25M = 2.6114)ms </p><p>
60、//--------------------------------------</p><p> // 分頻部分 結束</p><p> //--------------------------------------</p><p> //++++++++++++++++++++++++++++++++++++++</p><p>
61、 // 動態(tài)掃描, 生成seg7_addr 開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg [2:0] seg7_addr; // 第幾個seg7</p><p> always @ (posedge seg7_clk, negedge
62、i_rst_n)</p><p> if (!i_rst_n)</p><p> seg7_addr <= 0;</p><p><b> else</b></p><p> seg7_addr <= seg7_addr + 1'b1; </p><p>
63、//--------------------------------------</p><p> // 動態(tài)掃描, 生成seg7_addr 結束</p><p> //--------------------------------------</p><p> //++++++++++++++++++++++++++++++++++++++</p&g
64、t;<p> // 根據seg7_addr, 譯出位碼 開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg [2:0] o_sel_r; // 位選碼寄存器</p><p> // 開發(fā)板上SEG7的方向是低位在左,高位在右
65、</p><p> // 但是實際上我們看數的方向是高位在左,低位在右</p><p> // 故此處將第0位對應DIG[7],第7位對應DIG[0]</p><p><b> always</b></p><p> case (seg7_addr)</p><p> 0 : o_sel
66、_r = 3'b111; // SEG7[7]</p><p> 1 : o_sel_r = 3'b110; // SEG7[6]</p><p> 2 : o_sel_r = 3'b101; // SEG7[5]</p><p> 3 : o_sel_
67、r = 3'b100; // SEG7[4] </p><p> 4 : o_sel_r = 3'b011; // SEG7[3]</p><p> 5 : o_sel_r = 3'b010; // SEG7[2]</p><p> 6 : o_sel
68、_r = 3'b001; // SEG7[1]</p><p> 7 : o_sel_r = 3'b000; // SEG7[0]</p><p><b> endcase</b></p><p> //--------------------------------
69、------</p><p> // 根據seg7_addr, 譯出位碼 結束</p><p> //--------------------------------------</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 根據seg7_addr, 選擇熄
70、滅碼 開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg turn_off_r; // 熄滅碼</p><p><b> always</b></p><p> case (seg7_a
71、ddr)</p><p> 0 : turn_off_r = i_turn_off[0];</p><p> 1 : turn_off_r = i_turn_off[1];</p><p> 2 : turn_off_r = i_turn_off[2];</p><p> 3 : turn_off_r = i_turn_off[3];
72、</p><p> 4 : turn_off_r = i_turn_off[4];</p><p> 5 : turn_off_r = i_turn_off[5];</p><p> 6 : turn_off_r = i_turn_off[6];</p><p> 7 : turn_off_r = i_turn_off[7];<
73、/p><p><b> endcase</b></p><p> //--------------------------------------</p><p> // 根據seg7_addr, 選擇熄滅碼 結束</p><p> //--------------------------------------&l
74、t;/p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 根據seg7_addr, 選擇小數點碼 開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg dp_r;
75、 // 小數點碼</p><p><b> always</b></p><p> case (seg7_addr)</p><p> 0 : dp_r = i_dp[0];</p><p> 1 : dp_r = i_dp[1];</p><p> 2 :
76、dp_r = i_dp[2];</p><p> 3 : dp_r = i_dp[3];</p><p> 4 : dp_r = i_dp[4];</p><p> 5 : dp_r = i_dp[5];</p><p> 6 : dp_r = i_dp[6];</p><p> 7 : dp_r = i_d
77、p[7];</p><p><b> endcase</b></p><p> //--------------------------------------</p><p> // 根據seg7_addr, 選擇小數點碼 結束</p><p> //------------------------------
78、--------</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 根據seg7_addr, 選擇待譯段碼 開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg [3:0] seg_d
79、ata_r; // 待譯段碼</p><p><b> always</b></p><p> case (seg7_addr)</p><p> 0 : seg_data_r = i_data[3:0];</p><p> 1 : seg_data_r = i_data[7:
80、4];</p><p> 2 : seg_data_r = i_data[11:8];</p><p> 3 : seg_data_r = i_data[15:12];</p><p> 4 : seg_data_r = i_data[19:16];</p><p> 5 : seg_data_r = i_data[23:20];&l
81、t;/p><p> 6 : seg_data_r = i_data[27:24];</p><p> 7 : seg_data_r = i_data[31:28];</p><p><b> endcase</b></p><p> //--------------------------------------&l
82、t;/p><p> // 根據seg7_addr, 選擇待譯段碼 結束</p><p> //--------------------------------------</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 根據熄滅碼/小數點碼/待譯段碼</p&
83、gt;<p> // 譯出段碼,開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg [7:0] o_seg_r; // 段碼寄存器</p><p><b> // 共陰</b></p>&
84、lt;p> always @ (posedge i_clk, negedge i_rst_n)</p><p> if (!i_rst_n)</p><p> o_seg_r <= 8'h00; // 送熄滅碼</p><p><b> else</b></p>&l
85、t;p> if(turn_off_r) // 送熄滅碼</p><p> o_seg_r <= 8'h00;</p><p><b> else</b></p><p><b> if(!dp_r)</b></p><p> c
86、ase(seg_data_r) // 無小數點</p><p> 4'h0 : o_seg_r <= 8'h3f;</p><p> 4'h1 : o_seg_r <= 8'h06;</p><p> 4'h2 : o_seg_r <= 8'h5b;</p&g
87、t;<p> 4'h3 : o_seg_r <= 8'h4f;</p><p> 4'h4 : o_seg_r <= 8'h66;</p><p> 4'h5 : o_seg_r <= 8'h6d;</p><p> 4'h6 : o_seg_r <= 8'
88、h7d;</p><p> 4'h7 : o_seg_r <= 8'h07;</p><p> 4'h8 : o_seg_r <= 8'h7f;</p><p> 4'h9 : o_seg_r <= 8'h6f;</p><p> 4'hA : o_seg_r
89、<= 8'h77;</p><p> 4'hB : o_seg_r <= 8'h7c;</p><p> 4'hC : o_seg_r <= 8'h39;</p><p> 4'hD : o_seg_r <= 8'h5e;</p><p> 4'h
90、E : o_seg_r <= 8'h79;</p><p> 4'hF : o_seg_r <= 8'h71;</p><p><b> endcase</b></p><p><b> else</b></p><p> case(seg_data_r)
91、 // 加小數點</p><p> 4'h0 : o_seg_r <= 8'h3f | 8'h80;</p><p> 4'h1 : o_seg_r <= 8'h06 | 8'h80;</p><p> 4'h2 : o_seg_r <= 8'h5b
92、 | 8'h80;</p><p> 4'h3 : o_seg_r <= 8'h4f | 8'h80;</p><p> 4'h4 : o_seg_r <= 8'h66 | 8'h80;</p><p> 4'h5 : o_seg_r <= 8'h6d | 8'h
93、80;</p><p> 4'h6 : o_seg_r <= 8'h7d | 8'h80;</p><p> 4'h7 : o_seg_r <= 8'h07 | 8'h80;</p><p> 4'h8 : o_seg_r <= 8'h7f | 8'h80;</p&
94、gt;<p> 4'h9 : o_seg_r <= 8'h6f | 8'h80;</p><p> 4'hA : o_seg_r <= 8'h77 | 8'h80;</p><p> 4'hB : o_seg_r <= 8'h7c | 8'h80;</p><p
95、> 4'hC : o_seg_r <= 8'h39 | 8'h80;</p><p> 4'hD : o_seg_r <= 8'h5e | 8'h80;</p><p> 4'hE : o_seg_r <= 8'h79 | 8'h80;</p><p> 4
96、9;hF : o_seg_r <= 8'h71 | 8'h80;</p><p><b> endcase</b></p><p> //--------------------------------------</p><p> // 根據熄滅碼/小數點碼/待譯段碼</p><p> /
97、/ 譯出段碼,結束</p><p> //--------------------------------------</p><p> assign o_sel = o_sel_r; // 寄存器輸出位選碼</p><p> assign o_seg = o_seg_r; // 寄存器輸出段碼&
98、lt;/p><p> assign o_cs = 1; // 寄存器輸出選擇</p><p><b> endmodule</b></p><p> 4x4矩陣鍵盤軟件驅動:</p><p> module matrixKeyboard_drive(</p>&l
99、t;p><b> i_clk,</b></p><p><b> i_rst_n,</b></p><p> row, // 矩陣鍵盤 行</p><p> col, // 矩陣鍵盤 列</p><p> keyboar
100、d_val , // 鍵盤值 </p><p> key_pressed_flag</p><p><b> );</b></p><p> input i_clk;</p><p> input i_rst_n;</p><p
101、> input [3:0] row; // 矩陣鍵盤 行</p><p> output reg [3:0] col; // 矩陣鍵盤 列</p><p> output reg [3:0] keyboard_val ; // 鍵盤值 </p><p> o
102、utput key_pressed_flag ;</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 分頻部分 開始</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> reg
103、[18:0] cnt; // 計數子</p><p> always @ (posedge i_clk, negedge i_rst_n)</p><p> if (!i_rst_n)</p><p><b> cnt <= 0;</b></p><p><
104、;b> else</b></p><p> cnt <= cnt + 1'b1;</p><p> wire key_clk = cnt[18]; // (2^19/25M = 21)ms </p><p> //--------------------------------------<
105、/p><p> // 分頻部分 結束</p><p> //--------------------------------------</p><p> //++++++++++++++++++++++++++++++++++++++</p><p> // 狀態(tài)機部分 開始</p><p> //++++++
106、++++++++++++++++++++++++++++++++</p><p> // 狀態(tài)數較少,獨熱碼編碼</p><p> parameter NO_KEY_PRESSED = 6'b000_001; // 沒有按鍵按下 </p><p> parameter SCAN_COL0 = 6'b000_010; // 掃描第
107、0列 </p><p> parameter SCAN_COL1 = 6'b000_100; // 掃描第1列 </p><p> parameter SCAN_COL2 = 6'b001_000; // 掃描第2列 </p><p> parameter SCAN_COL3 = 6'b010_000;
108、 // 掃描第3列 </p><p> parameter KEY_PRESSED = 6'b100_000; // 有按鍵按下</p><p> reg [5:0] current_state, next_state; // 現態(tài)、次態(tài)</p><p> always @ (posedge key_clk, negedge i_rst
109、_n)</p><p> if (!i_rst_n)</p><p> current_state <= NO_KEY_PRESSED;</p><p><b> else</b></p><p> current_state <= next_state;</p><p>
110、// 根據條件轉移狀態(tài)</p><p> always @ *</p><p> case (current_state)</p><p> NO_KEY_PRESSED : // 沒有按鍵按下</p><p> if (row != 4'hF)</p><p>
111、 next_state = SCAN_COL0;</p><p><b> else</b></p><p> next_state = NO_KEY_PRESSED;</p><p> SCAN_COL0 : // 掃描第0列 </p><p> if (row
112、!= 4'hF)</p><p> next_state = KEY_PRESSED;</p><p><b> else</b></p><p> next_state = SCAN_COL1;</p><p> SCAN_COL1 : // 掃描第1列
113、</p><p> if (row != 4'hF)</p><p> next_state = KEY_PRESSED;</p><p><b> else</b></p><p> next_state = SCAN_COL2; </p><p> SCAN_COL2
114、: // 掃描第2列</p><p> if (row != 4'hF)</p><p> next_state = KEY_PRESSED;</p><p><b> else</b></p><p> next_state = SCAN_COL3;<
115、;/p><p> SCAN_COL3 : // 掃描第3列</p><p> if (row != 4'hF)</p><p> next_state = KEY_PRESSED;</p><p><b> else</b></p><p&g
116、t; next_state = NO_KEY_PRESSED;</p><p> KEY_PRESSED : // 有按鍵按下</p><p> if (row != 4'hF)</p><p> next_state = KEY_PRESSED;</p><p><b>
117、 else</b></p><p> next_state = NO_KEY_PRESSED; </p><p><b> endcase</b></p><p> reg key_pressed_flag; // 鍵盤按下標志</p>
118、<p> reg [3:0] col_val, row_val; // 列值、行值</p><p> // 根據次態(tài),給相應寄存器賦值</p><p> always @ (posedge key_clk, negedge i_rst_n)</p><p> if (!i_rst_n)</p><p&
119、gt;<b> begin</b></p><p> col <= 4'h0;</p><p> key_pressed_flag <= 0;</p><p><b> end</b></p><p><b> else<
120、/b></p><p> case (next_state)</p><p> NO_KEY_PRESSED : // 沒有按鍵按下</p><p><b> begin</b></p><p> col <= 4'h0;</p
121、><p> key_pressed_flag <= 0; // 清鍵盤按下標志</p><p><b> end</b></p><p> SCAN_COL0 : // 掃描第0列</p><p> col <= 4'b1110;<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租車計價器課程設計
- 出租車計價器課程設計
- 出租車計價器課程設計
- 出租車計價器課程設計
- 課程設計--出租車計價器設計
- 出租車計價器設計課程設計
- 課程設計---出租車計價器設計
- 課程設計---出租車計價器設計
- 基于fpga的出租車計價器設計
- 基于fpga設計的出租車計價器
- 課程設計---出租車計價器的設計
- 課程設計--出租車計價器的設計
- 出租車計價器課程設計報告
- 硬件課程設計----出租車計價器
- eda課程設計--出租車計價器
- eda課程設計--出租車計價器
- 接口課程設計---出租車計價器
- 出租車計價器課程設計論文
- 基于multisim的出租車計價器設計課程設計
- 課程設計---出租車計程計價器的設計
評論
0/150
提交評論