sopceda綜合課程設計---出租車計費系統(tǒng)設計_第1頁
已閱讀1頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  SOPC/EDA綜合課程設計報告設計題目:出租車計費系統(tǒng)設計設計者: 學號: </p><p><b>  班級: </b></p><p>  指導老師時間 : </p><p><b>  目 錄</b></p><p><b&g

2、t;  摘要1</b></p><p>  Abstract1</p><p><b>  第一章 引言2</b></p><p><b>  1.1課題背景2</b></p><p>  1.2本文的主要工作2</p><p>  第二章 FPGA、V

3、HDL介紹4</p><p>  2.1 FPGA現(xiàn)狀及發(fā)展4</p><p>  2.2 FPGA的結構與特點4</p><p>  2.2.1 FPGA基本結構5</p><p>  2.2.2 FPGA的特點6</p><p>  2.3 VHDL設計優(yōu)點6</p><p> 

4、 第三章 出租車計費器的設計7</p><p>  3.1出租車計費器的總體設計7</p><p>  3.1.1出租車計費標準7</p><p>  3.1.2 總體框架設計7</p><p>  3.2出租車計費器主要模塊設計8</p><p>  3.2.1 速度模塊9</p><

5、p>  3.2.2 計程模塊9</p><p>  3.2.3 計時模塊10</p><p>  3.2.4 計費模塊10</p><p>  第四章 整體電路設計11</p><p>  4.1 整體電路圖11</p><p>  4.2 電源電路12</p><p>  4

6、.3 啟動/停止按鍵電路12</p><p>  4.4 自動清零部分13</p><p>  第五章 系統(tǒng)仿真與下載實現(xiàn)13</p><p>  5.1 QuartusⅡ軟件介紹14</p><p>  5.1.1軟件特點14</p><p>  5.1.2 QuartusⅡ設計流程:14</p&g

7、t;<p>  5.2仿真結果15</p><p>  5.2.1整體仿真15</p><p>  5.2.2速度模塊仿真15</p><p>  5.2.3計程模塊仿真16</p><p>  5.2.4計時模塊仿真16</p><p>  5.2.5 計費模塊仿真17</p>

8、<p>  5.3設計測試17</p><p>  第六章 總結及展望18</p><p><b>  ·致謝19</b></p><p>  ·主要參考文獻19</p><p>  基于FPGA的出租車計費器設計</p><p>  摘要:隨著EDA技術

9、的高速發(fā)展,電子系統(tǒng)的設計技術和工具發(fā)生了深刻的變化,大規(guī)??删幊踢壿嬈骷﨏PLD/FPGA的出現(xiàn),給設計人員帶來了很多方便。利用它進行產品開發(fā),可以降低研發(fā)成本,縮短研發(fā)周期。本文介紹了一種采用FPGA芯片進行出租車計費器的設計方法,描述了研究該課題的意義和應用價值;說明了Altera公司的FPGA結構原理及其主要運用;介紹了超高速集成電路硬件描述語言的主要功能和設計;講解了出租車計費器的系統(tǒng)原理和功能。本文主要采用了Altera公司

10、的可編程邏輯芯片EPC2C35F672C8為核心控制,并附加一定外圍電路組成出租車計費器,使用目前流行的VHDL語言進行設計,具有移植性強的特點,便于升級及可重復使用。利用QuartusⅡ6.0對所設計的出租車計費器的VHDL代碼進行仿真,并在FPGA數(shù)字實驗系統(tǒng)上實現(xiàn)了該控制。</p><p>  關鍵字: FPGA, VHDL, QuartusⅡ, 出租車計費器</p>&

11、lt;p><b>  出租車計費器的設計</b></p><p>  1出租車計費器的總體設計</p><p>  1.1出租車計費標準</p><p>  車起步開始計費,首先顯示起步價,起步費為3.00元,車在行駛3km以內,只收起步價。車行駛超過3km后,每公里2元,車費依次累加。當總費用達到或超過40元時,每公里收費4元。當遇到紅

12、燈或客戶需要停車等待時,則按時間計費,計費單價為每20秒收費1元。</p><p>  1.2 總體框架設計</p><p>  系統(tǒng)流程介紹:分析系統(tǒng)設計要求不難得知,整個出租車計費系統(tǒng)按功能主要分為速度模塊、計程模塊、計時模塊和計費模塊,其系統(tǒng)結構圖如圖3-1所示。</p><p>  圖3-1 出租車計費器系統(tǒng)結構圖</p><p> 

13、 系統(tǒng)接收到reset信號后,總費用變?yōu)?元,同時其他計數(shù)器、寄存器等全部清零。</p><p>  系統(tǒng)接收到start信號后,首先把部分寄存器賦值,總費用不變,單價price寄存器通過對總費用的判斷后賦為2元。其他寄存器和計數(shù)器等繼續(xù)保持為0。</p><p>  速度模塊:通過對速度信號sp的判斷,決定變量kinside的值。Kinside即是行進100m所需要的時鐘周期數(shù),然后每行

14、進100m,則產生一個脈沖clkout。</p><p>  計程模塊:由于一個clkout信號代表行進100m,故通過對clkout計數(shù),可以獲得共行進的距離kmcount。</p><p>  計時模塊:在汽車啟動后,當遇到顧客等人或紅燈時,出租車采用計時收費的方式。通過對速度信號sp的判斷決定是否開始記錄時間。當sp=0時,開始記錄時間。當時間達到足夠長時產生timecount脈沖,

15、并重新計時。一個timecount脈沖相當于等待的時間達到了時間計費的長度。這里選擇系統(tǒng)時鐘頻率為500Hz,20s即計數(shù)值為1000。</p><p>  計費模塊由兩個進程組成。其中,一個進程根據(jù)條件對enable和price賦值:當記錄的距離達到3公里后enable變?yōu)?,開始進行每公里收費,當總費用大于40元后,則單價price由原來的2元每公里編程4元每公里;第二個進程在每個時鐘周期判斷timeout和

16、clkout的值。當其為1時,則在總費用上加上相應的費用。</p><p>  2出租車計費器主要模塊設計</p><p>  從上述設計方案中我們可以大致得到出租車計費器的系統(tǒng)框圖,如圖3-2所示。其中clk為輸入時鐘脈沖,時鐘上升沿有效;reset為復位信號,start為開始計費信號,stop為停止計費信號,均高電平有效;SP[2..0]表示出租車狀態(tài)(停止或不同形式速度);kmcnt

17、和count信號則分別輸出出租車行駛的里程和花費。</p><p>  圖3-2 出租車計費器系統(tǒng)框圖</p><p><b>  2.1 速度模塊</b></p><p>  速度模塊首先根據(jù)start信號判斷是否開始計費,然后根據(jù)輸入的速度檔位sp[2..0]的判斷,確定行駛100m所需要的時鐘數(shù),每前進100m,輸出一個clkout信號。

18、同時由cnt對clk進行計數(shù),當cnt等于kinside時,把clkout信號置1,cnt清0。其模塊框圖如圖3-3。</p><p>  圖3-3 速度模塊框圖</p><p><b>  2.2 計程模塊</b></p><p>  此模塊主要用于記錄行進的距離,其模塊框圖如圖3-4所示。通過對clkout信號的計數(shù),可以計算行駛的距離km

19、count。一個clkout脈沖相當于行進100m所以只要記錄clkout的脈沖數(shù)目即可確定共行進的距離。Kmcount1為十分位,kmcount2為個位,kmcount3為十位,分別為十進制數(shù)。</p><p>  圖3-4 計程模塊框圖</p><p><b>  2.3 計時模塊</b></p><p>  速度模塊主要用于計時收費,記錄

20、計程車速度為0的時間(如等待紅燈),其模塊框圖如圖3-5所示。通過對sp信號的判斷,當sp=0,開始記錄時間。當時間達到足夠長時,產生timecount脈沖,并重新計時。</p><p>  圖3-5 計時模塊框圖</p><p><b>  2.4 計費模塊</b></p><p>  計費模塊如圖3-6所示,可分為kmmoney1和kmmo

21、ney2兩個進程。</p><p>  Kmmoney1用于產生enable和price信號。當記錄距離達到3km后,enable信號為1,開始進行每公里收費。當總費用大于40元后,單價price由原來的2元變成4元,用作計時收費。通過對sp信號的判斷,當sp=0,開始記錄時間。當時間達到足夠長時,產生timecount脈沖,并重新計時。</p><p>  Kmmoney2用于判斷tim

22、ecount和clkout的值,當其為1時,總費用加1。最終輸出為總費用。</p><p>  圖3-6 計費模塊框圖</p><p><b>  整體電路設計</b></p><p><b>  1 整體電路圖</b></p><p>  整體RTL電路如圖4-1。硬件電路由CycloneⅡ電路板

23、組成,clk為時鐘周期信號,由試驗箱產生,start/stop是啟動停止按鍵電路,reset為自動清零電路。電源又AD-DC開關電源供電。</p><p>  圖4-1 整體RTL門電路</p><p><b>  2 電源電路</b></p><p>  電源采用了是比較流行的開關電源,AD-DC開關電源,輸入115VAC到230VAC,輸出

24、+5V(4A)。使用開關電源的好處就是比較節(jié)省能源,它的轉換效率很高,可達85%以上,穩(wěn)壓范圍寬,除此之外,還具有穩(wěn)壓精度高、不使用電源變壓器等特點。</p><p>  3 啟動/停止按鍵電路</p><p>  如圖4-2所示,采用雙刀雙路開關,一路開關用于清零部分,由于顯示部分特殊要求,即計費停止后屏幕上荏苒要保持計費的所有信息,只有當下次計費啟動時才清零從新開始計費。另外兩路開關,

25、其中一路用于啟動指示和啟動/停止輸出信號給FPGA芯片的I/O口。當按下鍵后,清零部分和啟動計費部分同時進行,但清零只是瞬間的,計費指示燈兩起。再次按下鍵后,開關換到另外的兩路,空車指示燈亮起。</p><p>  圖4-2啟動/停止按鍵電路</p><p><b>  4 自動清零部分</b></p><p>  由于顯示部分的特殊要求,即計

26、費停止后屏幕上仍然要保持計費的所有信息,只有當下次計費啟動時才清零從新開始計費。VHDL語言的特殊性,不能在一個結構中用兩個不同的動作使其賦值。所以必須要有一個瞬間清零的信號,當FPGA的清零I/O端口為“1”時就自動清零。使用電容的充放電功能來實現(xiàn),按鍵斷開時清零輸出端為接地,按鍵閉合時電容充電清零端為高電平,充完電后清零端輸出又為低電平,當按鍵斷開后,通過一個2k歐姆的電阻放電,為下次充電做好準備。如圖4-3所示。</p>

27、;<p>  圖4-3 自動清零電路</p><p><b>  系統(tǒng)仿真與下載實現(xiàn)</b></p><p>  1 QuartusⅡ軟件介紹</p><p><b>  5.1.1軟件特點</b></p><p>  QuartusⅡ是Altera公司自行設計的一個完全集成化、易學易

28、用的可編程邏輯設計環(huán)境,它提供了完全集成且與電路結構無關的開發(fā)包環(huán)境,具有數(shù)字邏輯設計的全部特性,包括:</p><p>  可利用原理圖、結構框圖、VerilogHDL、AHDL和VHDL完成電路描述,并將其保存為設計實體文件;</p><p>  芯片(電路)平面布局連線編輯;</p><p>  LogicLock增量設計方法,用戶可建立并優(yōu)化系統(tǒng),然后添加對

29、原始系統(tǒng)的性能影響較小或無影響的后續(xù)模塊;</p><p>  功能強大的邏輯綜合工具;</p><p>  完備的電路功能仿真與時序邏輯仿真工具;</p><p>  定時/時序分析與關鍵路徑延時分析;</p><p>  可使用SignalTapⅡ邏輯分析工具進行嵌入式的邏輯分析;</p><p>  支持軟件源文

30、件的添加和創(chuàng)建,并將它們連接起來生成編程文件;</p><p>  使用組合編譯方法可一次完成整體設計流程;</p><p><b>  自動定位編譯錯誤;</b></p><p>  高效的期間編程與驗證工具;</p><p>  可讀入標準的EDIF網表文件、VHDL網表文件、和Verilog網表文件;</p&

31、gt;<p>  能生成第三方EDA軟件使用的VHDL網表文件和Verilog網表文件;</p><p>  5.1.2 QuartusⅡ設計流程:</p><p>  設計輸入:完成器件的硬件描述,包括文本編輯器、塊與符號編輯器、MegaWizard插件管理器、約束編輯器和布局編輯器等工具;</p><p>  綜合:包括分析和綜合器、輔助工具和RT

32、L查看器等工具;</p><p>  不懼連線:將設計綜合后的網表文件映射到實體器件的過程,包括Fitter工具、約束編輯器、布局圖編輯器、芯片編輯器和增量布局連線工具;</p><p><b>  時序分析;</b></p><p><b>  2仿真結果</b></p><p><b>

33、;  2.1整體仿真</b></p><p>  對電路整體進行仿真,得出如下仿真波形圖5-1。圖中,當復位信號reset為高電平時,系統(tǒng)所有寄存器、計數(shù)器都清零;當開始計費信號start信號有效時,計費器開始計費,根據(jù)出租車行駛的速度sp[2..0]的取值計算所用花費和行駛里程;當停止計費信號有效時,計費器停止工作。 </p><p>  圖5-1 出租車計費器仿真波形圖&

34、lt;/p><p><b>  2.2速度模塊仿真</b></p><p>  速度模塊的仿真波形圖如圖5-2所示。該模塊根據(jù)出租車所處的運行狀態(tài)和不同的形式速度,對相應數(shù)目的時鐘周期進行計數(shù),車每行駛100m時輸出信號clkout輸出高電平。</p><p>  圖5-2 速度模塊仿真波形圖</p><p><b&g

35、t;  2.3計程模塊仿真</b></p><p>  計程模塊的仿真波形如圖5-3所示。圖中,當reset信號有效時,系統(tǒng)復位清零;否則,對輸入信號clkout進行十進制計數(shù)。</p><p>  圖5—3計程模塊仿真波形圖</p><p><b>  2.4計時模塊仿真</b></p><p>  計時模

36、塊的仿真波形圖如圖5-4所示。預設1000個時鐘周期為20s,對時鐘周期進行計數(shù),每計1000個時鐘周期輸出高電平,指示計時20秒。</p><p>  圖5-4 計時模塊仿真波形圖</p><p>  2.5 計費模塊仿真</p><p>  計費模塊的仿真波形圖如圖5-5所示。當reset信號有效時,系統(tǒng)復位清零;否則,當計時計費信號timecount和計程計

37、費信號clkout為高電平時,按照一定計費規(guī)則進行計費。</p><p>  圖5-5計費模塊仿真功能圖</p><p>  綜上所述,本設計的出租車計費器完全符合系統(tǒng)設計的要求,實現(xiàn)了出租車計費器所需的各項基本功能。</p><p><b>  5.3設計測試</b></p><p>  利用QuartusⅡ6.0對所

38、設計出租車計費器的VHDL代碼進行了仿真,并在CycloneⅡ型可編程數(shù)字實現(xiàn)系統(tǒng)上實現(xiàn)了該控制。該數(shù)字實現(xiàn)系統(tǒng)分成兩部分,一是FPGA的下載板,它主要包括所使用的芯片、RS-232接頭、接腳轉換插槽等;另一部分是I/O實驗板,它主要包括顯示、脈沖輸出等。出租車計費器的各部分利用數(shù)字實驗系統(tǒng)所附的RS-232連接線將計算機中的VHDL代碼設計的內容燒錄到該實驗系統(tǒng)的EPC2C35F672C8芯片中進行測試,測試結果基本實現(xiàn)了總費用=起費

39、用+(里程-3km)×里程單價+等待時間×等待單價的出租車計費模式。</p><p><b>  第六章 總結及展望</b></p><p>  本文論述了基于FPGA的出租車計費器設計,分別介紹了整個系統(tǒng)和各個模塊的設計,使用FPGA芯片、VHDL硬件描述語言作為設計手段,利用自頂向下的模塊化設計思路,通過在QuartusⅡ軟件下進行的模擬仿真,

40、并進行相應的硬件下載調試,證明所設計的系統(tǒng)完成了出租車計費器的功能,各項技術指標符合預定標準,具有一定實用性。由于本人在經驗水平上的欠缺,設計中可能存在很多不足,請各位老師予以指證!</p><p>  近年來,F(xiàn)PGA在通信、控制、數(shù)據(jù)計算等領域得到了廣泛的應用,利用FPGA來設計電子產品可減少電子系統(tǒng)的開發(fā)風險和開發(fā)成本;縮短了上市時間;通過在系統(tǒng)編程、遠程在線重構等技術降低維護升級成本。并且,F(xiàn)PGA器件的

41、成本越來越低,Actel公司發(fā)布第三代的基于Flash的可編程邏輯方案,這些新的FPGA芯片最低價將達到1.5美元,代表全球最低成本的FPGA。這些都說明可編程器件已成為現(xiàn)在及未來很長一段時間的主流,用它來實現(xiàn)的出租車計費器省去很多外圍電路,穩(wěn)定,簡單有效,將來必然可以設計出更多更強大的功能,提高產品競爭力。未來基于FPGA平臺的出租車計費器將會有更低的成本、更小的體積、更安全、更精確和更多功能。</p><p>

42、;<b>  ·致謝</b></p><p>  本次設計從選題到最后完成,都得到了指導老師付敏老師的悉心指導。付老師淵博的知識、嚴謹?shù)闹螌W態(tài)度和誨人不倦的精神永遠是我學習的榜樣。同時,感謝論文指導組的劉海力老師和郭仟老師對選題的分析。在系統(tǒng)設計過程中,我也遇到了較多的困難,我十分感謝我的朋友和老師給與我的幫助和支持,使我能順利完成本系統(tǒng)的設計與實現(xiàn)。</p><

43、;p><b>  ·主要參考文獻</b></p><p>  [1] 劉韜,樓興華. 《FPGA數(shù)字電子系統(tǒng)設計與開發(fā)實例導航》[M]. 北京:人民郵電出版社,2005.6, 27~36.</p><p>  [2] 王輝,殷穎,陳婷,俞一鳴. MAX+plusⅡ和QuartusⅡ應用于開發(fā)技巧[M]. 北京:機械工業(yè)出版社,2007.1,293~31

44、6.</p><p>  [3] 焦敏. FPGA 在出租車計費器上的應用研究[J];中國科技信息,2009(9):145~146.</p><p>  [4] 茅豐. 基于FPGA 的出租車計費器[J];電子技術應用,2007.3.</p><p>  [5] 廖艷秋. FPGA 的出租車計費器[J];電子科技大學,2008.10.</p><

45、p>  [6] 吳冬梅,吳延海,鄧玉玖. 基于CPLD/FPGA 的出租車計費器[J];電子技術應用,2004(11):71~73.</p><p>  [7] 黃智偉. FPGA 系統(tǒng)設計與實踐[M].,北京:電子工業(yè)出版社,2005,200~217.</p><p>  [8] 黃建新,劉邁,譚克俊. 基于FPGA芯片設計出租車計費器的研究[J]. 吉林化工學院學報,2003(0

46、3):52~55.</p><p>  [9] 候伯亨,顧新. VHDL 硬件描述語言與數(shù)字邏輯電路設計[M]. 西安:西安電子科技大學出版社,2000.</p><p>  [10] 姜雪松,VHDL設計實例與仿真[M].北京:機械工業(yè)出版社,2007.1,91~103.</p><p>  [11] 王彥芳,王小平,王彥永等.用可編程邏輯器件實現(xiàn)專用數(shù)字集成電路

47、的功能設計[J].半導體情報,2000,37(5)48~51.</p><p>  [12] 張立,張光新,柴磊等. FPGA 在多功能計費器系統(tǒng)中的應用[J]. 儀器儀表學報,2005,26(8):7352737.</p><p>  [13] 林愿. 基于CPLD/FPGA 的出租車計費器系統(tǒng)的設計實現(xiàn)[J]. 國外電子元器件,2007(07):26~29.</p>&l

48、t;p>  [14] 周潤景,圖雅,張麗敏. 基于Quartus II 的FPGA/CPLD 數(shù)字系統(tǒng)設計實例[J]. 北京:電子工業(yè)出版社,2007.</p><p>  [15] 劉欲曉,方強,黃宛寧.EDA技術與VHDL電路開發(fā)應用實踐[M];北京:電子工業(yè)出版社,2009(4),175~186.</p><p>  [16] [英]Jone Wulenskl. VHDL Di

49、gtal System Design[M],北京:電子工業(yè)出版社,2004,10~105.</p><p>  [17] San Jose. MAX+PLUS II Introduction USA[M]:Altera Corporation,2004,52~69.</p><p><b>  附錄</b></p><p><b> 

50、 VHDL程序</b></p><p><b>  Speed模塊</b></p><p>  library ieee; --加載庫文件</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_unsigned.a

51、ll;</p><p>  entity speed is</p><p>  port( --定義輸入輸出端口</p><p>  clk :in std_logic;</p><p>  reset:in std_logic;</p><p>  start:in std_log

52、ic;</p><p>  stop :in std_logic;</p><p>  sp :in std_logic_vector(2 downto 0);</p><p>  clkout:out std_logic</p><p><b>  );</b></p><p>  end

53、speed;</p><p>  architecture rtl of speed is</p><p><b>  begin</b></p><p>  process(clk,reset,start,stop,sp) --敏感信號發(fā)生變化時,啟動進程</p><p>  type state_type is

54、(s0,s1); --枚舉類型;</p><p>  variable s_state:state_type; </p><p>  variable cnt:integer range 0 to 28;</p><p>  variable kinside:integer range 0 to 30;</p><p>&l

55、t;b>  begin</b></p><p>  case sp is --速度選擇</p><p>  when"000"=>kinside:=0; --停止狀態(tài)或空檔</p><p>  when"001"=>kinside:=28; --第一檔<

56、/p><p>  when"010"=>kinside:=24; --第二檔</p><p>  when"011"=>kinside:=20;--第三檔</p><p>  when"100"=>kinside:=16;--第四檔</p><p>

57、;  when"101"=>kinside:=12;--第五檔</p><p>  when"110"=>kinside:=8;--第六檔</p><p>  when"111"=>kinside:=4;--第七檔</p><p><b>  end case;

58、</b></p><p>  if reset='1'then--復位清零</p><p>  s_state:=s0;</p><p>  elsif clk'event and clk='1'then--時鐘上升沿到達時,狀態(tài)轉換</p><p>  case s_stat

59、e is</p><p><b>  when s0=></b></p><p><b>  cnt:=0;</b></p><p>  clkout<='0';</p><p>  if start='1'then</p><p>

60、;  s_state:=s1;</p><p><b>  else</b></p><p>  s_state:=s0;</p><p><b>  end if;</b></p><p><b>  when s1=></b></p><p>

61、  clkout<='0';</p><p>  if stop='1'then</p><p>  s_state:=s0;--相當于無客上車</p><p>  elsif sp="000"then</p><p>  s_state:=s1;--有客上車但車速為0,即剛上

62、車還未起步</p><p>  elsif cnt=kinside then</p><p><b>  cnt:=0;</b></p><p>  clkout<='1';</p><p>  s_state:=s1;</p><p><b>  else<

63、/b></p><p>  cnt:=cnt+1;</p><p>  s_state:=s1;</p><p><b>  end if;</b></p><p><b>  end case;</b></p><p><b>  end if;</b

64、></p><p>  end process;</p><p><b>  end rtl;</b></p><p><b>  Times模塊</b></p><p>  library ieee; --加載庫文件</p><p>  use ie

65、ee.std_logic_1164.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  entity times is</p><p>  port( --定義輸入輸出端口</p><p>  clk :in std_logic;</

66、p><p>  reset:in std_logic;</p><p>  start:in std_logic;</p><p>  stop :in std_logic;</p><p>  sp :in std_logic_vector(2 downto 0);</p><p>  timecount:out s

67、td_logic</p><p><b>  );</b></p><p>  end times;</p><p>  architecture rtl of times is</p><p><b>  begin</b></p><p>  process(reset,

68、clk,sp,stop,start)--啟動進程</p><p>  type state_type is(t0,t1,t2);</p><p>  variable t_state:state_type;</p><p>  variable waittime:integer range 0 to 1000;</p><p>&l

69、t;b>  begin</b></p><p>  if reset='1'then--復位清零</p><p>  t_state:=t0;</p><p>  elsif(clk'event and clk='1')then--時鐘上升沿到達</p><p>  

70、case t_state is</p><p>  --根據(jù)條件完成狀態(tài)轉換</p><p><b>  when t0=></b></p><p>  waittime:=0;</p><p>  timecount<='0';</p><p>  if

71、start='1'then</p><p>  t_state:=t1;</p><p><b>  else</b></p><p>  t_state:=t0;</p><p><b>  end if;</b></p><p><b>  wh

72、en t1=></b></p><p>  if sp="000"then</p><p>  t_state:=t2;</p><p><b>  else</b></p><p>  waittime:=0;</p><p>  t_state:=t1;&

73、lt;/p><p><b>  end if;</b></p><p><b>  when t2=></b></p><p>  waittime:=waittime+1;--等待時間加1</p><p>  timecount<='0';</p><

74、;p>  if waittime=1000 then</p><p>  timecount<='1';--產生一個時間計費脈沖</p><p>  waittime:=0;</p><p>  elsif stop='1'then</p><p>  t_state:=t0;</p&g

75、t;<p>  elsif sp="000"then</p><p>  t_state:=t2;</p><p><b>  else</b></p><p>  timecount<='0';</p><p>  t_state:=t1;</p>

76、<p><b>  end if;</b></p><p><b>  end case;</b></p><p><b>  end if;</b></p><p>  end process;</p><p><b>  end rtl;</b&g

77、t;</p><p>  Kilometers模塊</p><p>  library ieee; --加載庫文件</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  e

78、ntity kilometers is</p><p>  port(--定義輸入輸出端口</p><p>  clkout,reset:in std_logic;</p><p>  kmcnt1:out std_logic_vector(3 downto 0);</p><p>  kmcnt2:out std_log

79、ic_vector(3 downto 0);</p><p>  kmcnt3:out std_logic_vector(3 downto 0)</p><p><b>  );</b></p><p>  end kilometers;</p><p>  architecture rtl of kilometers

80、is</p><p><b>  begin</b></p><p>  process(clkout,reset)--啟動進程</p><p>  variablekm_reg:std_logic_vector(11 downto 0);</p><p><b>  begin</b>

81、;</p><p>  if reset='1'then--復位清零</p><p>  km_reg:="000000000000";</p><p>  elsif clkout'event and clkout='1'then--時鐘上升沿到達時進行計程</p><

82、;p>  if km_reg(3 downto 0)="1001"then--對應里程十分位</p><p>  km_reg:=km_reg+"0111";--十分位向個分位進位</p><p><b>  else</b></p><p>  km_reg(3 downto 0):=

83、km_reg(3 downto 0)+"0001";</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  kmcnt1<=km_reg(3 downto 0);</p><p>  kmcnt2<

84、=km_reg(7 downto 4);</p><p>  kmcnt3<=km_reg(11 downto 8);</p><p>  end process;</p><p><b>  end rtl;</b></p><p><b>  Kmmoney模塊</b></p>

85、<p>  library ieee; --加載庫文件</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  entity kmmoney is</p><p>  port(

86、 --定義輸入輸出端口</p><p>  clk :in std_logic;</p><p>  reset :in std_logic;</p><p>  timecount:in std_logic;</p><p>  clkout :in std_logic;</p><

87、;p>  kmcnt2 :in std_logic_vector(3 downto 0);</p><p>  kmcnt3 :in std_logic_vector(3 downto 0);</p><p>  count1 :out std_logic_vector(3 downto 0);</p><p>  count2 :out std_lo

88、gic_vector(3 downto 0);</p><p>  count3 :out std_logic_vector(3 downto 0)</p><p><b>  );</b></p><p>  end kmmoney;</p><p>  architecture rtl of kmmoney is&

89、lt;/p><p>  signal cash:std_logic_vector(11 downto 0);</p><p>  signal price:std_logic_vector(3 downto 0);</p><p>  signal enable:std_logic;</p><p><b>  begin</b&

90、gt;</p><p>  kmmoney1:PROCESS(cash,kmcnt2)--此進程產生下一進程的敏感信號</p><p><b>  begin</b></p><p>  if cash>="000001000000"then</p><p>  price<=&q

91、uot;0100";</p><p><b>  else</b></p><p>  price<="0100";</p><p><b>  end if;</b></p><p>  if(kmcnt2>="0011")OR(kmc

92、nt3>="0001")then</p><p>  enable<='1';</p><p><b>  else</b></p><p>  enable<='0';</p><p><b>  end if;</b><

93、/p><p>  end process;</p><p>  kmmoney2:process(reset,clkout,clk,enable,price,kmcnt2)</p><p>  variable reg2:std_logic_vector(11 downto 0);</p><p>  variable clkout_cnt:in

94、teger range 0 to 10;</p><p><b>  begin</b></p><p>  ifreset='1'then</p><p>  cash<="000000000011";--起步費用設為3元</p><p>  elsif clk&#

95、39;event and clk='1'then</p><p>  --判斷是否需要時間計費,每20s加一元</p><p>  if timecount='1'then</p><p>  reg2:=cash;</p><p>  if reg2(3 downto 0)+"0001&q

96、uot;>"1001"then--產生進位</p><p>  reg2(7 downto 0):=reg2(7 downto 0)+"00000111";</p><p>  if reg2(7 downto 4)>"1001"then</p><p>  cash<=reg2+&qu

97、ot;000001100000";</p><p><b>  else</b></p><p>  cash<=reg2;</p><p><b>  end if;</b></p><p><b>  else</b></p><p>

98、;  cash<=reg2+"0001";</p><p><b>  end if;</b></p><p><b>  --里程計費</b></p><p>  elsif clkout='1' and enable='1'then</p><

99、;p>  if clkout_cnt=9 then</p><p>  clkout_cnt:=0;</p><p>  reg2:=cash;</p><p>  if "0000"&reg2(3 downto 0)+price(3 downto 0)>"00001001"then</p>

100、<p>  reg2(7 downto 0):=--十位進位</p><p>  reg2(7 downto 0)+"00000110"+price;</p><p>  if reg2(7 downto 4)>"1001"then--百位進位</p><p>  cash<=reg2+&q

101、uot;000001100000";</p><p><b>  else</b></p><p>  cash<=reg2;</p><p><b>  end if;</b></p><p><b>  else</b></p><p&g

102、t;  cash<=reg2+price;</p><p><b>  end if;</b></p><p>  else--對時鐘計數(shù)</p><p>  clkout_cnt:=clkout_cnt+1;</p><p><b>  end if;</b></p><

103、;p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;</p><p>  count1<=cash(3 downto 0);--總費用的個位</p><p>  count2<=cash(7

104、downto 4);--總費用的十位</p><p>  count3<=cash(11 downto 8);--總費用的百位</p><p>  end rtl;</p><p><b>  TOP模塊</b></p><p>  library ieee;</p><p>

105、;  use ieee.std_logic_1164.all;</p><p>  entity top is</p><p>  port(--定義整個系統(tǒng)的輸入輸出端口</p><p>  clk :in std_logic;</p><p>  reset :in std_logic;</p><p>

106、  start :in std_logic;</p><p>  stop :in std_logic;</p><p>  sp :in std_logic_vector(2 downto 0);</p><p>  kmcnt1:out std_logic_vector(3 downto 0);</p><p>  kmcnt2:o

107、ut std_logic_vector(3 downto 0);</p><p>  kmcnt3:out std_logic_vector(3 downto 0);</p><p>  count1:out std_logic_vector(3 downto 0);</p><p>  count2:out std_logic_vector(3 downto 0)

108、;</p><p>  count3:out std_logic_vector(3 downto 0)</p><p><b>  );</b></p><p><b>  end top;</b></p><p>  architecture rtl of top is</p>&l

109、t;p>  --對上述電路模塊進行元件定義</p><p>  component speed is--定義速度模塊</p><p><b>  port(</b></p><p>  clk :in std_logic;</p><p>  reset:in std_logic;</p>&

110、lt;p>  start:in std_logic;</p><p>  stop :in std_logic;</p><p>  sp :in std_logic_vector(2 downto 0);</p><p>  clkout:out std_logic</p><p><b>  );</b>&

111、lt;/p><p>  end component speed;</p><p>  component times is --定義計時模塊</p><p><b>  port(</b></p><p>  clk :in std_logic;</p><p>  reset:in std_

112、logic;</p><p>  start:in std_logic;</p><p>  stop :in std_logic;</p><p>  sp :in std_logic_vector(2 downto 0);</p><p>  timecount:out std_logic</p><p>&l

113、t;b>  );</b></p><p>  end component times;</p><p>  component kilometers is--定義計程模塊</p><p><b>  port(</b></p><p>  clkout,reset:in std_logic;<

114、/p><p>  kmcnt1:out std_logic_vector(3 downto 0);</p><p>  kmcnt2:out std_logic_vector(3 downto 0);</p><p>  kmcnt3:out std_logic_vector(3 downto 0)</p><p><b>  );&l

115、t;/b></p><p>  end component kilometers;</p><p>  component kmmoney is--定義計費模塊</p><p><b>  port(</b></p><p>  clk :in std_logic;</p><p>

116、;  reset :in std_logic;</p><p>  timecount:in std_logic;</p><p>  clkout :in std_logic;</p><p>  kmcnt2 :in std_logic_vector(3 downto 0);</p><p>  kmcnt3 :in std_l

117、ogic_vector(3 downto 0);</p><p>  count1 :out std_logic_vector(3 downto 0);</p><p>  count2 :out std_logic_vector(3 downto 0);</p><p>  count3 :out std_logic_vector(3 downto 0)&l

118、t;/p><p><b>  );</b></p><p>  end component kmmoney;</p><p>  signal clktmp :std_logic;</p><p>  signal timetmp:std_logic;</p><p>  signal kmtmp2

119、:std_logic_vector(3 downto 0);</p><p>  signal kmtmp3 :std_logic_vector(3 downto 0);</p><p><b>  begin</b></p><p>  --使用定義的例化模塊</p><p>  U1:speed PORT MAP(c

120、lk,reset,start,stop,sp,clktmp);</p><p>  U2:times PORT MAP(clk,reset,start,stop,sp,timetmp);</p><p>  U3:kilometers PORT MAP(clktmp,reset,kmcnt1,kmtmp2,kmtmp3);</p><p>  U4:kmmoney

溫馨提示

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

評論

0/150

提交評論