【正文】
設(shè)計 : : 1) 行程 3公里內(nèi)(包括 3公里),且等待累計時間 2分鐘內(nèi)(包括 2分鐘),起步費為 ; 2) 3公里外(不包括 3公里)以每公里 ,等待累計時間 2分鐘外(不包括 2分鐘)以每分鐘以 。 3) 能顯示行駛公里數(shù)、等待累計時間和最后的總費用。 本計費器的顯示范圍為 0~ 99元,計價分辨率為 1元;計程器顯示范圍為 0~99公里,分辨率為 1公里; 計時器的顯示范圍是分鐘的顯示范圍是 0— 99, 辨率為 1 分鐘。 秒的顯示范圍是 0— 59。分 辨率為 1秒。 系統(tǒng) 原理 圖: 出租車的一般計費過程為:出租車載客后,啟動計費器,整個系統(tǒng)開始運行,里程計數(shù)器和時間計數(shù)器從 0開始計數(shù),費用計數(shù)器從 6開始計算。再根據(jù)行駛里程或停止等待的時間按以上的標(biāo)準(zhǔn)計費。若在行駛狀態(tài),則計程器開始 累 加計數(shù),當(dāng)路程超過 3公里后,計費器以每公里 1元累加。若出租車停止等待狀態(tài),則計時器開始 累 加計數(shù),當(dāng)時間超過 2分鐘后,計費器以每分鐘 1元累加。出租車到達(dá)目的地停止后,停止計費器,顯示總費用。 根據(jù)出租車計費器的工作過程,本系統(tǒng)采用分層次、分模塊的方式設(shè)計 ,其 系統(tǒng) 原理圖 如下所示。其中行駛路程計數(shù)模塊、等待時間計數(shù)模塊和計費模塊,用來統(tǒng)計路程、等待時間和總費用,控制模塊是用來控制計費模塊,數(shù)碼管顯示模塊用來顯示行駛的公里數(shù)、等待累計時間和總費用等信息。系統(tǒng) 原理圖 如下所示: V C Cres et IN P U TV C Cs t art IN P U Tdig[ 7. . 0]O U T P U Ts eg [ 7. . 0]O U T P U Tc lk _5 0Mres etc lk 0div 0ins tc lk _50Mres etc lk 1div 1ins t 1c lk 0s t artres etdis t anc e[ 7. . 0]dis t anc e_en abledis t anc eins t 2c lk 0res ets t arts [ 7. . 0]m [ 7. . 0]t im e_en abletmins t 3s t artdis t an c e_ en ab let im e_ en ab les ele c t _c lkc on t rolins t 4s elec t _c lkres etc lk 0m oney [ 7. . 0]m oneyins t 5c lk 1dis t an c e[ 7. . 0]s [ 7. . 0]m [ 7. . 0]m on ey [ 7. . 0]dig [ 7. . 0]s eg [ 7. . 0]ledins t 6V C CC LK _5 0M IN P U T 3 .各模塊設(shè)計: 本系統(tǒng)采用層次化、模塊化的設(shè)計方法,設(shè)計順序為自下向上。首先實現(xiàn)系統(tǒng)框圖中的各子模塊,然后由頂層模塊調(diào)用各子模塊來完成整個系統(tǒng)。為了便于顯示,這里的路程、時間和費用計數(shù)器均用十六進制表示。 分頻模塊: 計數(shù)器的分頻模塊 : 計數(shù)器的分頻模塊 具體框圖: cl k _ 5 0 Mr e se tcl k 0d i v 0 :u 0 此模塊的功能是對總的時鐘進行分頻,分出的頻率是讓計數(shù)器用的,因為總的時鐘是 50M的。設(shè)計該模塊的時候用了一個 32位的計數(shù)器,當(dāng)計數(shù)器計到。 計數(shù)器的 分頻模塊 VerilogHDL源代碼: module div0(clk_50M,clk0,reset)。// 端口的定義 input clk_50M,reset。// 總的時鐘是 50M output clk0。//分頻后輸出的時鐘 reg clk0。 reg [31:0] count。//32位的計數(shù)器 always@ (posedge clk_50M or negedge reset)//異步復(fù)位 begin if(!reset) begin clk0=39。d0。 count=3239。d0。 end else if(count==3239。d25_000000)//判斷計時器記到了 25000000嗎 ? begin count=3239。d0。//計到 25_000000計數(shù)器清零 clk0=~clk0。//輸出的時鐘取反 end//end begin else count=count+139。d1。// 沒計到 25000000計數(shù)器加一 end//end always endmodule // 結(jié)束分頻模塊 數(shù)碼管 的分頻模塊: 具體框圖: c l k _ 5 0 Mr e s e tc l k 1d i v 1 :u 1 此模塊的功能是對總的時鐘進行分頻,分出的頻率是讓數(shù)碼管用的,因為總的時鐘是 50M的。設(shè)計該模塊的 時候用了一個 32位的計數(shù)器,當(dāng)計數(shù)器計到 的時候產(chǎn)生時鐘。 數(shù)碼管 的 分頻模塊 VerilogHDL源代碼: module div1(clk_50M,clk1,reset)。// 端口的定義 input clk_50M,reset。// 總的時鐘是 50M output clk1。//分頻后輸出的時鐘 1KHZ reg clk1。 reg [31:0] count。//32位的計數(shù)器 always@ (posedge clk_50M or negedge reset)//異步復(fù)位 begin if(!reset) begin clk1=39。d0。 count=3239。d0。 end else if(count==3239。d50_000)// 判斷計時器記到了 50_000嗎 begin count=3239。d0。//計到 50_000計數(shù)器清零 clk1=~clk1。//輸出的時鐘取反 end//end begin else count=count+139。d1。// 沒計到 50_000計數(shù)器加一 end//end always endmodule // 結(jié)束分頻模塊 數(shù)碼管 的 分頻模塊 的 仿真結(jié)果: 計程模塊: 計程模塊的框圖: c l k 0r e s e ts ta r td i s ta n c e _ e n a b l ed i s ta n c e [7 ..0 ]d i s ta n ce :u 2 此模塊的功能是計算出租車行駛的路程。在出租車啟動并行駛的過程中 (即復(fù)位 /啟動信號 reset為 1,行駛 /停止信號 start為 1),當(dāng)時鐘 clk是上升沿的時候,系統(tǒng)即對路程計數(shù)器 distance的里程計數(shù)器進行加計數(shù),當(dāng)路程超 過 3公里時,系統(tǒng)將輸出標(biāo)志正脈沖 distance_enable。 計程模塊的 VerilogHDL源代碼: module distance(clk0,start,reset,distance,distance_enable)。//端口定義 input clk0 ,start,reset。 output [7:0] distance。// 輸出的公里 reg [7:0] distance。 output distance_enable。// 控制計費的公里信號 reg distance_enable。 always@(posedge clk0 or negedge reset)//異步復(fù)位 begin if(!reset)//低電平復(fù)位 begin distance=839。d0。 end else if(start)// start 高電平有效