基于verilog語言的出租車計費(fèi)器_第1頁
基于verilog語言的出租車計費(fèi)器_第2頁
基于verilog語言的出租車計費(fèi)器_第3頁
基于verilog語言的出租車計費(fèi)器_第4頁
基于verilog語言的出租車計費(fèi)器_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

可編輯版10/10基于verilog語言的出租車計費(fèi)器院別:___計算機(jī)與通信工程學(xué)院___專業(yè)名稱:_______電子信息工程________班級學(xué)號:________________學(xué)生姓名:_______________指導(dǎo)教師:________陳海宴_____________隨著出租車行業(yè)的發(fā)展,對出租車計費(fèi)器的要求也越來越高。最近幾年出租車行業(yè)發(fā)展迅速,在全國有幾千家出租車公司。因此出租車計費(fèi)器市場是龐大的。而出租車計費(fèi)器成為不可缺少的一部分。信息社會的現(xiàn)代電子產(chǎn)品,性能越來越高,復(fù)雜度越來越大,更新步伐也越來越快。實(shí)現(xiàn)這種進(jìn)步的主要原因就是微電子技術(shù)和電子技術(shù)的發(fā)展。而電子技術(shù)的發(fā)展后者的核心就是電子設(shè)計自動化技術(shù)。EDA是指以計算機(jī)為工作平臺,融合了應(yīng)用電子技術(shù)、計算機(jī)技術(shù)、智能化技術(shù)的最新成果而開發(fā)出的電子CAD通用軟件包,它根據(jù)硬件描述語言HDL完成的設(shè)計文件,自動完成邏輯編譯、化簡、分割、綜合、優(yōu)化、布局布線及仿真,直至完成對于特定目標(biāo)芯片的適配編譯、邏輯映射和編程下載等工作。沒有EDA技術(shù)的支持,想要完成超大規(guī)模集成電路的設(shè)計制造是不可想象的;反過來,生產(chǎn)制造技術(shù)的不斷進(jìn)步又必將對EDA技術(shù)提出新的要求。本文采用verilog語言來設(shè)計實(shí)現(xiàn)出租車計費(fèi)系統(tǒng),經(jīng)過ModelSim和Quartus仿真將其實(shí)例化。如果將該設(shè)計再結(jié)合到實(shí)際應(yīng)用中,那么,只需改變設(shè)計中計費(fèi)要求,就可以應(yīng)用到出租車上。另外,如果再任意輸入該出租車計價器的計費(fèi)標(biāo)準(zhǔn),那么,它的適用范圍可能就更廣泛了。一、設(shè)計要求〔1行程3公里內(nèi)〔包括3公里,且等待累計時間2分鐘內(nèi)〔包括2分鐘,起步費(fèi)為6.0〔23公里外〔不包括3公里以每公里1.0元,等待累計時間2分鐘外〔不包括2分鐘以每分鐘以1.0元計費(fèi)。〔3能顯示行駛公里數(shù)、等待累計時間和最后的總費(fèi)用。本計費(fèi)器的顯示范圍為0~99元,計價分辨率為1元;計程器顯示范圍為0~99公里,分辨率為1公里;計時器的顯示范圍是分鐘的顯示范圍是0—99,辨率為1分鐘。秒的顯示范圍是0—59。分辨率為1二、工作原理出租車的一般計費(fèi)過程為:出租車載客后,啟動計費(fèi)器,整個系統(tǒng)開始運(yùn)行,里程計數(shù)器和時間計數(shù)器從0開始計數(shù),費(fèi)用計數(shù)器從6開始計算。再根據(jù)行駛里程或停止等待的時間按以上的標(biāo)準(zhǔn)計費(fèi)。若在行駛狀態(tài),則計程器開始加計數(shù),當(dāng)路程超過三公里后,計費(fèi)器以每公里1元累加。若出租車停止等待狀態(tài),則計時器開始加計數(shù),當(dāng)時間超過兩分鐘后,計費(fèi)器以每分鐘1元累加。出租車到達(dá)目的地停止后,停止計費(fèi)器,顯示總費(fèi)用。根據(jù)出租車計費(fèi)器的工作過程,本系統(tǒng)采用分層次、分模塊的方式設(shè)計,其本系統(tǒng)組成框圖如下所示。其中行駛路程計數(shù)模塊、等待時間計數(shù)模塊和計費(fèi)模塊,用來統(tǒng)計路程、等待時間和總費(fèi)用,控制模塊是用來控制計費(fèi)模塊,數(shù)碼管顯示模塊用來顯示行駛的公里數(shù)、等待累計時間和總費(fèi)用等信息。系統(tǒng)框圖如下所示:三、各模塊的設(shè)計本系統(tǒng)采用層次化、模塊化的設(shè)計方法,設(shè)計順序?yàn)樽韵孪蛏?。首先?shí)現(xiàn)系統(tǒng)框圖中的各子模塊,然后由頂層模塊調(diào)用各子模塊來完成整個系統(tǒng)。為了便于顯示,這里的路程、時間和費(fèi)用計數(shù)器均用十六進(jìn)制表示。3.1分頻模塊:計數(shù)器的分頻模塊:計數(shù)器的分頻模塊具體框圖:此模塊的功能是對總的時鐘進(jìn)行分頻,分出的頻率是讓計數(shù)器用的,因?yàn)榭偟臅r鐘是50M的。設(shè)計該模塊的時候用了一個32位的計數(shù)器,當(dāng)計數(shù)器計到25_000000的時候產(chǎn)生時鐘。在仿真的時候?yàn)榱朔奖阌^察設(shè)計了一個8分頻的電路。當(dāng)下載的時候用的是2HZ的時鐘。計數(shù)器的分頻模塊VerilogHDL源代碼:modulediv<clk_50M,clk,reset>;//端口的定義inputclk_50M,reset;//總的時鐘是50Moutputclk;//分頻后輸?shù)臅r鐘regclk;reg[31:0]count;//32位的計數(shù)器always@<posedgeclk_50Mornegedgereset>//異步復(fù)位beginif<!reset>beginclk<='d0;count=32'd0;endelseif<count==32'd25_000000>//判斷計時器記到了25_000000嗎begincount<=32'd0;//計到25_000000計數(shù)器清零clk<=~clk;//輸出的時鐘取反end//endbeginelsecount<=count+1'd1;//沒計到25_000000計數(shù)器加一end//endalwaysendmodule//結(jié)束分頻模塊仿真的結(jié)果:從波形可以看出當(dāng)reset為低電平的時候clk為零,當(dāng)為高電平的時候clk的高電平占了clk_50M的八個周期,低電平也占了clk_50M的八個周期。3.1.2數(shù)碼管的分頻模塊:具體框圖:此模塊的功能是對總的時鐘進(jìn)行分頻,分出的頻率是讓數(shù)碼管用的,因?yàn)榭偟臅r鐘是50M的。設(shè)計該模塊的時候用了一個32位的計數(shù)器,當(dāng)計數(shù)器計到50_000的時候產(chǎn)生時鐘。在仿真的時候?yàn)榱朔奖阌^察設(shè)計了一個8分頻的電路。數(shù)碼管的分頻模塊VerilogHDL源代碼:modulediv1<clk_50M,clk1,reset>;//端口的定義inputclk_50M,reset;//總的時鐘是50Moutputclk1;//分頻后輸?shù)臅r鐘regclk1;reg[31:0]count;//32位的計數(shù)器always@<posedgeclk_50Mornegedgereset>//異步復(fù)位beginif<!reset>beginclk1<='d0;count=32'd0;endelseif<count==32'd50_000>//判斷計時器記到了50_000嗎begincount<=32'd0;//計到50_000計數(shù)器清零clk1<=~clk1;//輸出的時鐘取反end//endbeginelsecount<=count+1'd1;//沒計到50_000計數(shù)器加一end//endalwaysendmodule//結(jié)束分頻模塊3.2計程模塊:計程模塊的框圖:此模塊的功能是計算出租車行駛的路程。在出租車啟動并行駛的過程中<即復(fù)位/啟動信號reset為1,行駛/停止信號start為1>,當(dāng)時鐘clk是上升沿的時候,系統(tǒng)即對路程計數(shù)器distance的里程計數(shù)器進(jìn)行加計數(shù),當(dāng)路程超過三公里時,系統(tǒng)將輸出標(biāo)志正脈沖distance_enable。計程模塊的VerilogHDL源代碼:moduledistancemokuai<clk,start,reset,distance,distance_enable>;//端口的定義inputclk,start,reset;output[7:0]distance;//輸出的公里reg[7:0]distance;outputdistance_enable;//控制計費(fèi)的公里信號regdistance_enable;always@<posedgeclkornegedgereset>//異步復(fù)位beginif<!reset>//低電平復(fù)位begindistance<=8'd0;endelseif<start>//start高電平有效beginif<distance[3:0]==9>//判斷distance的低四位計到了9沒有begindistance[3:0]<=4'd0;//計到9清零if<distance[7:4]==9>//判斷distance的高四位計到了9沒有distance[7:4]<=4'd0;//計到9清零elsedistance[7:4]<=distance[7:4]+1'd1;//distance的高四位沒有計到9的時候加一endelsedistance[3:0]<=distance[3:0]+1'd1;//distance的低四位沒有計到9的時候加一end//endstartend//endalways//*產(chǎn)生distance_enable信號*//always@<posedgeclkornegedgereset>beginif<!reset>begindistance_enable<=1'd0;//復(fù)位endelseif<distance>8'd2>//大于公里三的時候begindistance_enable<=1'd1;//輸出distance_enable信號endend//endalwaysendmodule//結(jié)束計程模塊計程模塊的仿真結(jié)果:從波形圖可以看出在時鐘的控制下,當(dāng)reset為高電平且start為高電平的時候distance開始計數(shù),當(dāng)計到大于三的時候輸出了distancedistance_enable為高電平。3.3計時模塊:計時模塊的框圖:此模塊用于計算停車等待的時間。在出租車行進(jìn)中,如果車輛停止等待,計數(shù)器則在1Hz信號clk的上升沿進(jìn)行加計數(shù),每60次產(chǎn)生進(jìn)位脈沖使分鐘計數(shù)器位進(jìn)行加計數(shù),當(dāng)累計等待時間超過2〔不包括2分鐘分鐘時,輸出標(biāo)志time_enable正脈沖信號。計時模塊的VerilogHDL源代碼:moduletimemokuai<clk,reset,start,s,m,time_enable>;//端口的定義inputclk,reset,start;output[7:0]s;//輸出的秒output[7:0]m;//輸出的分outputtime_enable;//輸出的控制計費(fèi)的信號reg[7:0]s;reg[7:0]m;wiretime_enable;always@<posedgeclkornegedgereset>//異步復(fù)位beginif<!reset>//低電平有效begin//復(fù)位s<=8'd0;m<=8'd0;endelseif<!start>//start信號低電平有效beginif<s[3:0]==9>//秒的低四位是9begins[3:0]<=4'd0;//清零if<s[7:4]==5>//秒的高四位是5begins[7:4]<=4'd0;//清零if<m[3:0]==9>//分的低四位是9beginm[3:0]<=4'd0;//清零if<m[7:4]==9>//分的高四位是9m[7:4]<=4'd0;//清零elsem[7:4]<=m[7:4]+1'd1;//分的高四位不是9加一endelsem[3:0]<=m[3:0]+1'd1;//分的低四位不是9加一endelses[7:4]<=s[7:4]+1'd1;//秒的高四位不是5加一endelses[3:0]<=s[3:0]+1'd1;//秒的低四位不是9加一end//endalwaysendassigntime_enable=<<m[7:0]>8'd2>&&<s[7:0]==8'd0>>?1'd1:1'd0;//產(chǎn)生time_enable信號。endmodule//結(jié)束計時模塊計時模塊的仿真結(jié)果:兩分鐘之內(nèi)〔包括兩分鐘的仿真結(jié)果如下所示:從波形圖可以看出在clk的控制下當(dāng)start為低電平reset為高電平的時候時間計數(shù),time_enable為低電平。兩分鐘之外〔不包括兩分鐘的仿真結(jié)果如下所示:從波形圖可以看出在clk的控制下當(dāng)start為低電平reset為高電平的時候時間計數(shù),當(dāng)時間大于二分鐘的時候,time_enable為輸出高電平。3.4控制模塊:控制模塊的框圖:控制模塊用于為計費(fèi)模塊提供時鐘,當(dāng)start高電平的時候選擇公里計費(fèi),輸出的時鐘信號為distance_enable,當(dāng)start低電平的時候選擇時間計費(fèi),輸出的時鐘信號為time_enable,控制模塊的VerilogHDL源代碼:modulecontrol<start,distance_enable,time_enable,select_clk>;inputstart,distance_enable,time_enable;outputselect_clk;//輸出選擇的時鐘信號wireselect_clk;//*當(dāng)start高電平的時候選擇公里計費(fèi),輸出的時鐘信號為distance_enable,當(dāng)start低電平的時候選擇時間計費(fèi),輸出的時鐘信號為time_enable*//assignselect_clk=start?distance_enable:time_enable;endmodule//結(jié)束控制模塊控制模塊的仿真結(jié)果:〔1公里計費(fèi)的仿真結(jié)果如下所示:從波形圖可以看出當(dāng)start為高電平的時候輸出的信號是distance_enable?!?時間計費(fèi)的仿真結(jié)果如下所示:從波形圖可以看出當(dāng)start為低電平的時候輸出的信號是time_enable。3.5計費(fèi)模塊:計費(fèi)模塊的框圖:費(fèi)用計數(shù)器模塊用于出租車啟動后,根據(jù)行駛路程和等待時間計算費(fèi)用。當(dāng)出租車停車時,時鐘select_clk用于將費(fèi)用計數(shù)器復(fù)位為起步價6.0元;當(dāng)車處于行駛狀態(tài)且滿3公里時,select_clk信號選擇distans_enable,此后路程每滿1公里,費(fèi)用計數(shù)器加1元;當(dāng)出租車處于停止等待狀態(tài)且時鐘滿2分鐘時,select_clk信號選擇time_enable信號,時間每滿1分鐘,費(fèi)用計數(shù)器加計費(fèi)模塊的VerilogHDL源代碼如下所示:modulefeemokuai<select_clk,reset,fee,clk>;inputselect_clk,reset,clk;output[7:0]fee;//輸出的費(fèi)用reg[7:0]fee;always@<posedgeclkornegedgereset>//異步復(fù)位beginif<!reset>//低電平有效beginfee<=8’d6;//起步為六元endelseif<select_clk==1’beginif<fee[3:0]==4'd9>//費(fèi)用的低四位是不是計到了9beginfee[3:0]<=4'd0;//計到9清零if<fee[7:4]==4'd9>//費(fèi)用的高四位是不是計到了9fee[7:4]<=4'd0;//計到9清零elsefee[7:4]<=fee[7:4]+1'd1;//費(fèi)用的高四位沒有計到9加1endelsefee[3:0]<=fee[3:0]+1'd1;//費(fèi)用的低四位沒有計到9加1end//endbeginend//endalwaysendmodule//結(jié)束計費(fèi)模塊計費(fèi)模塊的仿真結(jié)果:3.6數(shù)碼管顯示模塊:數(shù)碼管顯示模塊的框圖:數(shù)碼管有兩種顯示方式動態(tài)顯示與靜態(tài)顯示,由于在本文中用到了八個數(shù)碼管所以選擇了動態(tài)顯示,在時鐘的控制下,當(dāng)reset為高電平的時候把費(fèi)用,公里,時間譯碼輸出。數(shù)碼管顯示的VerilogHDL源代碼:modulescan_led<clk1,dig,seg,distance,s,m,fee>;inputclk1;input[7:0]distance,fee;//輸入的公里,費(fèi)用。input[7:0]s;//輸入的秒input[7:0]m;//輸入的分。output[7:0]dig;//譯碼結(jié)果output[7:0]seg;//數(shù)碼管的選擇。reg[7:0]r_dig;//譯碼結(jié)果輸出寄存器reg[7:0]r_seg;//數(shù)碼管的選擇寄存器。reg[3:0]disp_dat;reg[3:0]a;assigndig=r_dig;assignseg=r_seg;always@<posedgeclk1>begina<=a+1'd1;//數(shù)碼管的選擇endalways@<posedgeclk1>begincase<a>4'd0:disp_dat=distance[7:4];//公里的高四位用第一個數(shù)碼管顯示。4'd1:disp_dat=distance[3:0];//公里的低四位用第二個數(shù)碼管顯示。4'd2:disp_dat=m[7:4];//時間分的高四位用第三個數(shù)碼管顯示。4'd3:disp_dat=m[3:0];//時間分的低四位用第四個數(shù)碼管顯示4'd4:disp_dat=s[7:4];//時間秒的高四位用第五個數(shù)碼管顯示。4'd5:disp_dat=s[3:0];//時間秒的低四位用第六個數(shù)碼管顯示。4'd6:disp_dat=fee[7:4];//費(fèi)用的高四位用第七個數(shù)碼管顯示。4'd7:disp_dat=fee[3:0];//費(fèi)用的低四位用第八個數(shù)碼管顯示。default:disp_dat=4'b1010;endcasecase<a>4'd0:r_dig=8'b01111111;//選擇第一個數(shù)碼管4'd1:r_dig=8'b10111111;//選擇第二個數(shù)碼管4'd2:r_dig=8'b11011111;//選擇第三個數(shù)碼管4'd3:r_dig=8'b11101111;//選擇第四個數(shù)碼管4'd4:r_dig=8'b11110111;//選擇第五個數(shù)碼管4'd5:r_dig=8'b11111011;//選擇第六個數(shù)碼管4'd6:r_dig=8'b11111101;//選擇第七個數(shù)碼管4'd7:r_dig=8'b11111110;//選擇第八個數(shù)碼管default:r_dig=8'b11111111;endcaseend//*譯碼結(jié)果*//always@<disp_dat>begincase<disp_dat>4'h0:r_seg=8'hc0;//顯示04'h1:r_seg=8'hf9;//顯示14'h2:r_seg=8'ha4;//顯示24'h3:r_seg=8'hb0;//顯示34'h4:r_seg=8'h99;//顯示44'h5:r_seg=8'h92;//顯示54'h6:r_seg=8'h82;//顯示64'h7:r_seg=8'hf8;//顯示74'h8:r_seg=8'h80;//顯示84'h9:r_seg=8'h90;//顯示9default:r_seg=8'hbf;endcaseendendmodule//結(jié)束譯碼模塊3.7頂層模塊:各模塊設(shè)計仿真實(shí)現(xiàn)后,可分別創(chuàng)建成元件符號。頂層就是將各分模塊用VerilogHDL語言或者是圖形方法連接起來,便可實(shí)現(xiàn)系統(tǒng)電路。頂層模塊的VerilogHDL源代碼:moduletaximeter<clk_50M,reset,start,seg,dig>;//端口的定義inputclk_50M,reset,start;//總的時鐘信號,復(fù)位信號,開始信號output[7:0]seg,dig;//數(shù)碼管的輸出wire[7:0]distance;//公里wire[7:0]s;//秒wire[7:0]m;//分wire[7:0]fee;//費(fèi)用wireclk;//計數(shù)時鐘wiredistance_enable;//公里控制費(fèi)用的信號wiretime_enable;//時間控制費(fèi)用的信號wireselect_clk;//控制信號wireclk1;//數(shù)碼管顯示的時鐘//*模塊的調(diào)用*//divu0<.clk_50M<clk_50M>,.clk<clk>,.reset<reset>>;//調(diào)用計數(shù)分頻模塊div1u1<.clk_50M<clk_50M>,.clk1<clk1>,.reset<reset>>;//調(diào)用數(shù)碼管顯示分頻模塊Distancemokuaiu2<.clk<clk>,.start<start>,.reset<reset>,.distance<distance>,.distance_enable<distance_enable>>;//調(diào)用計程模塊timemokuaiu4<.clk<clk>,.reset<reset>,.start<start>,.s<s>,.m<m>,.time_enable<time_enable>>;//調(diào)用計時模塊controlu3<.start<start>,.distance_enable<distance_enable>,.time_enable<time_enable>,.select_clk<select_clk>>;//調(diào)用控制模塊feemokuaiu5<.reset<reset>,.fee<fee>,.select_clk<select_clk>,.clk<clk>>;//調(diào)用計費(fèi)模塊scan_ledU6<.clk1<clk1>,.dig<dig>,.seg<seg>,.distance<distance>,.s<s>,.m<m>,.fee<fee>>;//調(diào)用數(shù)碼管顯示模塊endmodule//結(jié)束頂層模塊四、測試部分測試VerilogHDL源代碼:`timescale1ns/100ps//時間的單位與時間的精度moduletaximeter_tb;//驗(yàn)證的模塊名字regclk_50M,reset,start;//輸入wire[7:0]distance;//輸出的公里wire[7:0]s;//輸出的秒wire[7:0]m;//輸出的分wire[7:0]fee;//輸出的費(fèi)用always#10clk_50M=~clk_50M;//時鐘的周期是20nsinitial//激勵設(shè)定beginreset=0;clk_50M=0;#1000reset=1;start=1;#10000start=0;#1000000$finish;//結(jié)束仿真endinitial//實(shí)施監(jiān)控begin$monitor<$time,,,"clk_50M=%d,reset=%d,start=%d,distance=%d,s=%d,fee=%d,m=%d,\n",clk_50M,reset,

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論