




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上基于verilog語言的出租車計費器 院別:_計算機與通信工程學院_專業名稱:_電子信息工程_班級學號:_學生姓名:_指導教師:_陳海宴_隨著出租車行業的發展,對出租車計費器的要求也越來越高。最近幾年出租車行業發展迅速,在全國有幾千家出租車公司。因此出租車計費器市場是龐大的。而出租車計費器成為不可缺少的一部分。信息社會的現代電子產品,性能越來越高,復雜度越來越大,更新步伐也越來越快。實現這種進步的主要原因就是微電子技術和電子技術的發展。而電子技術的發展后者的核心就是電子設計自動化技術。EDA是指以計算機為工作平臺,融合了應用電子技術、計算機技術、智能化技術的最新成果而
2、開發出的電子CAD通用軟件包,它根據硬件描述語言HDL完成的設計文件,自動完成邏輯編譯、化簡、分割、綜合、優化、布局布線及仿真,直至完成對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。沒有EDA技術的支持,想要完成超大規模集成電路的設計制造是不可想象的;反過來,生產制造技術的不斷進步又必將對EDA技術提出新的要求。本文采用verilog語言來設計實現出租車計費系統,經過ModelSim和Quartus仿真將其實例化。如果將該設計再結合到實際應用中,那么,只需改變設計中計費要求,就可以應用到出租車上。另外,如果再任意輸入該出租車計價器的計費標準,那么,它的適用范圍可能就更廣泛了。一、 設計
3、要求 (1) 行程3公里內(包括3公里),且等待累計時間2分鐘內(包括2分鐘),起步費為6.0元;(2)3公里外(不包括3公里)以每公里1.0元,等待累計時間2分鐘外(不包括2分鐘)以每分鐘以1.0元計費。(3)能顯示行駛公里數、等待累計時間和最后的總費用。本計費器的顯示范圍為099元,計價分辨率為1元;計程器顯示范圍為099公里,分辨率為1公里;計時器的顯示范圍是分鐘的顯示范圍是099, 辨率為1分鐘。秒的顯示范圍是059。分辨率為1秒。二 、工作原理 出租車的一般計費過程為:出租車載客后,啟動計費器,整個系統開始運行,里程計數器和時間計數器從0開始計數,費用計數器從6開始計算。再根據行駛里
4、程或停止等待的時間按以上的標準計費。若在行駛狀態,則計程器開始加計數,當路程超過三公里后,計費器以每公里1元累加。若出租車停止等待狀態,則計時器開始加計數,當時間超過兩分鐘后,計費器以每分鐘1元累加。出租車到達目的地停止后,停止計費器,顯示總費用。根據出租車計費器的工作過程,本系統采用分層次、分模塊的方式設計,其本系統組成框圖如下所示。其中行駛路程計數模塊、等待時間計數模塊和計費模塊,用來統計路程、等待時間和總費用,控制模塊是用來控制計費模塊,數碼管顯示模塊用來顯示行駛的公里數、等待累計時間和總費用等信息。系統框圖如下所示:三、各模塊的設計本系統采用層次化、模塊化的設計方法,設計順序為自下向上
5、。首先實現系統框圖中的各子模塊,然后由頂層模塊調用各子模塊來完成整個系統。為了便于顯示,這里的路程、時間和費用計數器均用十六進制表示。3.1分頻模塊:3.1.1計數器的分頻模塊:計數器的分頻模塊具體框圖: 此模塊的功能是對總的時鐘進行分頻,分出的頻率是讓計數器用的,因為總的時鐘是50M的。設計該模塊的時候用了一個32位的計數器,當計數器計到25_的時候產生時鐘。在仿真的時候為了方便觀察設計了一個8分頻的電路。當下載的時候用的是2HZ的時鐘 。計數器的分頻模塊VerilogHDL源代碼:module div(clk_50M,clk,reset);/ 端口的定義input clk_50M,rese
6、t;/ 總的時鐘是50Moutput clk;/分頻后輸的時鐘 reg clk;reg 31:0 count;/32位的計數器always (posedge clk_50M or negedge reset)/異步復位begin if(!reset) begin clk<='d0; count=32'd0;endelse if(count=32'd25_)/ 判斷計時器記到了25_嗎 begin count<=32'd0;/計到25_計數器清零 clk<=clk;/輸出的時鐘取反 end/end begin else count<=cou
7、nt+1'd1;/ 沒計到25_計數器加一end/end alwaysendmodule / 結束分頻模塊仿真的結果: 從波形可以看出當reset為低電平的時候clk為零,當為高電平的時候clk的高電平占了clk_50M的八個周期,低電平也占了clk_50M的八個周期。3.1 .2數碼管的分頻模塊:具體框圖: 此模塊的功能是對總的時鐘進行分頻,分出的頻率是讓數碼管用的,因為總的時鐘是50M的。設計該模塊的時候用了一個32位的計數器,當計數器計到50_000的時候產生時鐘。在仿真的時候為了方便觀察設計了一個8分頻的電路。數碼管的分頻模塊VerilogHDL源代碼:module div1(
8、clk_50M,clk1,reset);/ 端口的定義input clk_50M,reset;/ 總的時鐘是50Moutput clk1;/分頻后輸的時鐘 reg clk1;reg 31:0 count;/32位的計數器always (posedge clk_50M or negedge reset)/異步復位begin if(!reset) begin clk1<='d0; count=32'd0;endelse if(count=32'd50_000)/ 判斷計時器記到了50_000嗎 begin count<=32'd0;/計到50_000計數
9、器清零 clk1<=clk1;/輸出的時鐘取反 end/end begin else count<=count+1'd1;/ 沒計到50_000計數器加一end/end alwaysendmodule / 結束分頻模塊3.2 計程模塊:計程模塊的框圖:此模塊的功能是計算出租車行駛的路程。在出租車啟動并行駛的過程中(即復位/啟動信號reset為1,行駛/停止信號start為1),當時鐘clk是上升沿的時候,系統即對路程計數器distance的里程計數器進行加計數,當路程超過三公里時,系統將輸出標志正脈沖distance_enable。計程模塊的VerilogHDL源代碼:mo
10、dule distancemokuai(clk,start,reset,distance,distance_enable);/端口的定義input clk,start,reset;output 7:0 distance;/ 輸出的公里reg 7:0 distance;output distance_enable;/ 控制計費的公里信號reg distance_enable;always(posedge clk or negedge reset)/異步復位begin if(!reset)/低電平復位 begin distance<=8'd0; end else if(start)/
11、 start 高電平有效 begin if(distance3:0=9)/判斷distance的低四位計到了9沒有 begin distance3:0<=4'd0;/計到9清零 if(distance7:4=9) /判斷distance的高四位計到了9沒有 distance7:4<=4'd0;/計到9清零 else distance7:4<= distance7:4+1'd1;/ distance的高四位沒有計到9的時候加一 end else distance3:0<=distance3:0+1'd1;/ distance的低四位沒有計到
12、9的時候加一 end/end startend/end always/*產生distance_enable信號*/always(posedge clk or negedge reset)beginif(!reset)begin distance_enable<=1'd0;/復位endelse if(distance>8'd2)/ 大于公里三的時候 begin distance_enable<=1'd1;/輸出distance_enable信號 endend/end alwaysendmodule/結束計程模塊計程模塊的仿真結果:從波形圖可以看出在時鐘的
13、控制下,當reset為高電平且start為高電平的時候distance開始計數,當計到大于三的時候輸出了distancedistance_enable為高電平。3.3計時模塊:計時模塊的框圖:此模塊用于計算停車等待的時間。在出租車行進中,如果車輛停止等待,計數器則在1Hz信號clk的上升沿進行加計數,每60次產生進位脈沖使分鐘計數器位進行加計數,當累計等待時間超過2(不包括2分鐘)分鐘時,輸出標志time_enable正脈沖信號。計時模塊的VerilogHDL源代碼:module timemokuai(clk,reset,start,s,m,time_enable);/ 端口的定義input
14、clk,reset,start;output 7:0 s;/輸出的秒output 7:0 m;/輸出的分output time_enable;/輸出的控制計費的信號reg 7:0 s;reg 7:0 m;wire time_enable; always(posedge clk or negedge reset)/異步復位beginif(!reset)/低電平有效begin /復位s<=8'd0;m<=8'd0;endelse if(!start)/start 信號低電平有效beginif(s3:0=9)/ 秒的低四位是9 begin s3:0<=4'd
15、0;/清零 if(s7:4=5) / 秒的高四位是5 begin s7:4<=4'd0; /清零 if(m3:0=9) / 分的低四位是9 begin m3:0<=4'd0; /清零 if(m7:4=9) / 分的高四位是9 m7:4<=4'd0; /清零 else m7:4<=m7:4+1'd1; / 分的高四位不是9加一endelse m3:0<=m3:0+1'd1; /分的低四位不是9加一endelse s7:4<=s7:4+1'd1; / 秒的高四位不是5加一endelse s3:0<=s3:0+
16、1'd1; /秒的低四位不是9加一 end/end alwaysend assign time_enable=(m7:0>8'd2)&&(s7:0=8'd0)?1'd1:1'd0;/產生time_enable信號。endmodule/結束計時模塊計時模塊的仿真結果:兩分鐘之內(包括兩分鐘)的仿真結果如下所示:從波形圖可以看出在clk的控制下當start為低電平reset為高電平的時候時間計數,time_enable為低電平。兩分鐘之外(不包括兩分鐘)的仿真結果如下所示:從波形圖可以看出在clk的控制下當start為低電平reset為
17、高電平的時候時間計數,當時間大于二分鐘的時候,time_enable為輸出高電平。3.4控制模塊:控制模塊的框圖:控制模塊用于為計費模塊提供時鐘,當start高電平的時候選擇公里計費,輸出的時鐘信號為distance_enable,當start低電平的時候選擇時間計費,輸出的時鐘信號為time_enable,控制模塊的VerilogHDL源代碼:module control(start,distance_enable,time_enable,select_clk);input start,distance_enable,time_enable;output select_clk;/輸出選擇的時
18、鐘信號wire select_clk;/*當start高電平的時候選擇公里計費,輸出的時鐘信號為distance_enable,當start低電平的時候選擇時間計費,輸出的時鐘信號為time_enable*/assign select_clk=start?distance_enable:time_enable; endmodule/結束控制模塊控制模塊的仿真結果:(1)公里計費的仿真結果如下所示:從波形圖可以看出當start為高電平的時候輸出的信號是distance_enable。(2)時間計費的仿真結果如下所示:從波形圖可以看出當start為低電平的時候輸出的信號是time_enable。3
19、.5 計費模塊:計費模塊的框圖:費用計數器模塊用于出租車啟動后,根據行駛路程和等待時間計算費用。當出租車停車時,時鐘select_clk用于將費用計數器復位為起步價6.0元;當車處于行駛狀態且滿3公里時,select_clk信號選擇distans_enable,此后路程每滿1公里,費用計數器加1元;當出租車處于停止等待狀態且時鐘滿2分鐘時,select_clk信號選擇time_enable信號,時間每滿1分鐘,費用計數器加1元。 計費模塊的VerilogHDL源代碼如下所示:module feemokuai(select_clk,reset,fee,clk);input select_clk,
20、reset,clk;output7:0 fee; /輸出的費用reg 7:0 fee;always(posedge clk or negedge reset)/異步復位begin if(!reset)/低電平有效 begin fee<=8d6;/起步為六元 end else if(select_clk=1d1) begin if(fee3:0=4'd9)/費用的低四位是不是計到了9 begin fee3:0<=4'd0;/計到9清零 if(fee7:4=4'd9)/ 費用的高四位是不是計到了9fee7:4<=4'd0; /計到9清零 else
21、fee7:4<=fee7:4+1'd1;/ 費用的高四位沒有計到9加1endelse fee3:0<=fee3:0+1'd1;/ 費用的低四位沒有計到9加1end/end beginend/end alwaysendmodule /結束計費模塊計費模塊的仿真結果:3.6 數碼管顯示模塊:3.6.1 數碼管顯示模塊的框圖:數碼管有兩種顯示方式動態顯示與靜態顯示,由于在本文中用到了八個數碼管所以選擇了動態顯示,在時鐘的控制下,當reset為高電平的時候把費用,公里,時間譯碼輸出。3.6.2 數碼管顯示的VerilogHDL源代碼:module scan_led(clk1
22、,dig,seg,distance,s,m,fee);input clk1;input7:0 distance,fee;/輸入的公里,費用。input7:0 s;/輸入的秒input7:0 m; / 輸入的分。output7:0 dig; / 譯碼結果output7:0 seg; / 數碼管的選擇。reg 7:0 r_dig;/ 譯碼結果輸出寄存器reg 7:0 r_seg; /數碼管的選擇寄存器。reg 3:0 disp_dat;reg3:0 a;assign dig=r_dig;assign seg=r_seg;always(posedge clk1)begin a<=a+1'
23、;d1; /數碼管的選擇endalways(posedge clk1)begincase(a) 4'd0: disp_dat=distance7:4;/公里的高四位用第一個數碼管顯示。4'd1: disp_dat=distance3:0;/公里的低四位用第二個數碼管顯示。4'd2: disp_dat=m7:4; /時間分的高四位用第三個數碼管顯示。4'd3: disp_dat=m3:0; /時間分的低四位用第四個數碼管顯示4'd4: disp_dat=s7:4; /時間秒的高四位用第五個數碼管顯示。4'd5: disp_dat=s3:0; /時間
24、秒的低四位用第六個數碼管顯示。4'd6: disp_dat=fee7:4;/費用的高四位用第七個數碼管顯示。4'd7: disp_dat=fee3:0; /費用的低四位用第八個數碼管顯示。default: disp_dat=4'b1010;endcasecase(a)4'd0:r_dig=8'b; / 選擇第一個數碼管4'd1:r_dig=8'b; / 選擇第二個數碼管4'd2:r_dig=8'b; / 選擇第三個數碼管4'd3:r_dig=8'b; / 選擇第四個數碼管4'd4:r_dig=8
25、39;b; / 選擇第五個數碼管4'd5:r_dig=8'b; / 選擇第六個數碼管4'd6:r_dig=8'b; / 選擇第七個數碼管4'd7:r_dig=8'b; / 選擇第八個數碼管default:r_dig=8'b;endcaseend/ *譯碼結果*/always(disp_dat)begin case(disp_dat) 4'h0: r_seg=8'hc0;/ 顯示0 4'h1: r_seg=8'hf9;/ 顯示1 4'h2: r_seg=8'ha4;/ 顯示2 4'h3
26、: r_seg=8'hb0;/ 顯示3 4'h4: r_seg=8'h99;/ 顯示4 4'h5: r_seg=8'h92;/ 顯示5 4'h6: r_seg=8'h82;/ 顯示6 4'h7: r_seg=8'hf8;/ 顯示7 4'h8: r_seg=8'h80;/ 顯示8 4'h9: r_seg=8'h90;/ 顯示9 default: r_seg=8'hbf;endcaseendendmodule/結束譯碼模塊3.7 頂層模塊:各模塊設計仿真實現后,可分別創建成元件符號。頂層
27、就是將各分模塊用Verilog HDL語言或者是圖形方法連接起來,便可實現系統電路。3.7.1 頂層模塊的VerilogHDL源代碼:module taximeter(clk_50M,reset,start,seg,dig);/端口的定義input clk_50M,reset,start;/總的時鐘信號,復位信號,開始信號output7:0 seg,dig;/數碼管的輸出wire 7:0distance;/公里wire 7:0 s;/秒wire 7:0 m;/分wire7:0 fee;/費用wire clk; /計數時鐘wire distance_enable;/公里控制費用的信號wire t
28、ime_enable; /時間控制費用的信號wire select_clk; /控制信號wire clk1; /數碼管顯示的時鐘/*模塊的調用*/div u0(.clk_50M(clk_50M),.clk(clk),.reset(reset);/調用計數分頻模塊div1 u1(.clk_50M(clk_50M),.clk1(clk1),.reset(reset);/調用數碼管顯示分頻模塊Distancemokuai u2(.clk(clk),.start(start),.reset(reset),.distance(distance),.distance_enable(distance_ena
29、ble); /調用計程模塊timemokuai u4(.clk(clk),.reset(reset),.start(start),.s(s),.m(m),.time_enable(time_enable); /調用計時模塊control u3(.start(start),.distance_enable(distance_enable),.time_enable(time_enable),.select_clk(select_clk); /調用控制模塊feemokuai u5(.reset(reset),.fee(fee),.select_clk(select_clk),.clk(clk);
30、/調用計費模塊scan_led U6(.clk1(clk1),.dig(dig),.seg(seg),.distance(distance),.s(s),.m(m),.fee(fee);/調用數碼管顯示模塊endmodule/結束頂層模塊四、測試部分 測試VerilogHDL源代碼:timescale 1ns/100ps/時間的單位與時間的精度module taximeter_tb;/驗證的模塊名字reg clk_50M,reset,start;/輸入wire7:0 distance;/輸出的公里wire 7:0 s;/輸出的秒wire 7:0 m;/輸出的分wire 7:0 fee;/輸出的費用always #10 clk_50M=clk_50M;/時鐘的周期是20nsinitial /激勵設定begin reset=0; clk_50M=0; #1000 reset=1; start=1; #10000 start=0; # $finish;/結束仿真end initial/實施監控 begin $monitor($time,"clk_50M=%d,reset=%d,start=%d,distance=%d,s=%d, fee=%d,m=%d,n" ,clk_50M,reset,start
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會議活動管理制度
- 會議閉環管理制度
- 傳統氣道管理制度
- 桂林生命與健康職業技術學院《醫學微生物學基礎與進展》2023-2024學年第二學期期末試卷
- 大連航運職業技術學院《熱力渦輪機械原理》2023-2024學年第二學期期末試卷
- 體育科普管理制度
- 作業課堂管理制度
- 傭金獎金管理制度
- 供應鏈公司管理制度
- 供氣供熱管理制度
- 四川省綿陽市2021年中考生物考試真題與答案解析
- 世界史階段特征課件
- 山東開放大學公共部門人力資源管理期末復習題
- 《園林植物識別與應用》項目七:綜合課業題庫及答案
- 人民醫院腫瘤科臨床技術操作規范2023版
- 物業承接查驗辦法培訓
- 《大數據財務分析-基于Python》課后習題答案
- 動物病理(學)理論知識考核試題題庫及答案
- 管理人員信息表-模板
- 人工挖孔樁 安全技術交底
- (新版)供電可靠性理論考試題庫大全-下(填空題)
評論
0/150
提交評論