找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 14573|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

基于FPGA的出租車(chē)計(jì)費(fèi)器的設(shè)計(jì)Verilog源碼+報(bào)告

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:114903 發(fā)表于 2018-11-17 10:56 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
課  程    FPGA技術(shù)綜合設(shè)計(jì)實(shí)訓(xùn)  
目錄
1  概述
1.1 設(shè)計(jì)要求
1.1.1 設(shè)計(jì)任務(wù)
1.1.2 性能指標(biāo)要求
1.2 總體設(shè)計(jì)基本原理及框圖
1.2.1 基本原理
1.2.2 總體框圖
2 系統(tǒng)軟件設(shè)計(jì)分析
2.1時(shí)鐘模塊
2.2控制模塊
2.3計(jì)程模塊
2.4音樂(lè)模塊
2.5 LCD顯示模塊
2.6計(jì)費(fèi)模塊
3  系統(tǒng)測(cè)試(調(diào)試)
3.1 測(cè)試儀器與設(shè)備
3.2 性能指標(biāo)測(cè)試
3.3 結(jié)果分析
4  波形發(fā)生器設(shè)計(jì)
5  實(shí)訓(xùn)總結(jié)
6  參考文獻(xiàn)
附錄
出租車(chē)計(jì)費(fèi)器的設(shè)計(jì)
1  概述
EDA(Electronic Design Automation)即電子設(shè)計(jì)自動(dòng)化,是電子設(shè)計(jì)技術(shù)的核心,它的系統(tǒng)級(jí)高層次電子設(shè)計(jì)方法,對(duì)整個(gè)系統(tǒng)進(jìn)行方案設(shè)計(jì)和功能劃分,無(wú)須通過(guò)門(mén)級(jí)原理圖描述電路,而是針對(duì)設(shè)計(jì)目標(biāo)進(jìn)行功能描述,。
FPGA 是現(xiàn)場(chǎng)可編程門(mén)陣列的簡(jiǎn)稱(chēng)。它結(jié)合了微電子技術(shù)、電路技術(shù)和EDA技術(shù),使設(shè)計(jì)者可以集中精力進(jìn)行所需邏輯功能的設(shè)計(jì),縮短設(shè)計(jì)周期,提高設(shè)計(jì)質(zhì)量。FPGA的開(kāi)發(fā)系統(tǒng)包括軟件和硬件兩個(gè)部分,開(kāi)發(fā)系統(tǒng)軟件指專(zhuān)用的編程語(yǔ)言和相應(yīng)的匯編程序或編譯程序。開(kāi)發(fā)系統(tǒng)硬件部分包括計(jì)算機(jī)和編程器。編程器是對(duì)FPGA進(jìn)行寫(xiě)入和擦除的專(zhuān)用裝置,能夠供寫(xiě)入或擦除操作所需要的電源電壓和控制信號(hào),并通過(guò)串行接口從計(jì)算機(jī)接收編程數(shù)據(jù),最終寫(xiě)進(jìn)FPGA之中。
基于FPGA的計(jì)費(fèi)器系統(tǒng)利用Verilog HDL語(yǔ)言,采用模塊化程序設(shè)計(jì),自頂向下、由粗到細(xì)、逐步求精的方法,將基于FPGA的計(jì)費(fèi)器系統(tǒng)的整體逐步分解各個(gè)模塊。它不需要專(zhuān)門(mén)的硬件,只通過(guò)軟件編程即可實(shí)現(xiàn)計(jì)費(fèi)器系統(tǒng)的邏輯功能、電路結(jié)構(gòu)和連接形式。Verilog HDL語(yǔ)言類(lèi)似C語(yǔ)言,可讀性強(qiáng)、更易理解,這種語(yǔ)言幾乎覆蓋了以往各種硬件描述語(yǔ)言的功能,在編程的過(guò)程中一般采用自頂向下的電路設(shè)計(jì)過(guò)程。
本設(shè)計(jì)利用Verilog HDL語(yǔ)言,在QuartusⅡ13.0軟件中將出租車(chē)計(jì)費(fèi)器基本結(jié)構(gòu)分成6個(gè)模塊對(duì)其進(jìn)行程序匯編。將各塊程序生成的.v文件組合在一起,生成數(shù)字鐘源代碼的.bdf 圖形文件,最后下載到CycloneⅡ系列芯片EP20C8Q208C8N中,驗(yàn)證試驗(yàn)結(jié)果。
1.1 設(shè)計(jì)要求1.1.1 設(shè)計(jì)任務(wù)
設(shè)計(jì)并制作一臺(tái)出租車(chē)計(jì)費(fèi)器。
1.1.2 性能指標(biāo)要求
① 用EDA實(shí)訓(xùn)儀的I/O設(shè)備和PLD芯片實(shí)現(xiàn)出租車(chē)計(jì)費(fèi)器的設(shè)計(jì)。
② 出租車(chē)起步開(kāi)始計(jì)程和計(jì)費(fèi),計(jì)程系統(tǒng)按實(shí)際公里數(shù)計(jì)程,計(jì)費(fèi)系統(tǒng)首先顯示起步價(jià)(如7.0),車(chē)行駛2km以?xún)?nèi),只收起步價(jià)7元。
③ 出租車(chē)行駛超過(guò)2km后,按每公里1.6元在7.0元的基礎(chǔ)上增加。
④ 出租車(chē)行駛超過(guò)10km后(或超過(guò)20元路費(fèi)),每公里加收50%的車(chē)費(fèi),即車(chē)費(fèi)變?yōu)槊抗?.4元。
⑤ 出租車(chē)達(dá)到目的地后,(用一個(gè)按鈕)計(jì)程和計(jì)費(fèi)數(shù)據(jù)清零,為下一次計(jì)費(fèi)開(kāi)始。
1.2 總體設(shè)計(jì)基本原理及框圖1.2.1 基本原理
該出租車(chē)計(jì)費(fèi)器的基本原理方框圖如圖1所示,由時(shí)鐘模塊、控制模塊、計(jì)程模塊、音樂(lè)模塊、LCD顯示模塊、計(jì)費(fèi)模塊6部分組成。該計(jì)費(fèi)系統(tǒng)通過(guò)分頻模塊將20MHz的時(shí)鐘信號(hào)通過(guò)分頻器變成1Hz的時(shí)鐘信號(hào)和50Hz的顯示輸出信號(hào)。該出租車(chē)計(jì)費(fèi)的標(biāo)準(zhǔn)是起步價(jià)是6元,2公里之內(nèi)費(fèi)用不變,當(dāng)超過(guò)2公里時(shí),每行駛1公里,費(fèi)用加收50%元;由peo信號(hào)來(lái)控制有人或者沒(méi)人,高電平有人,低電平顯示空車(chē),出租車(chē)計(jì)費(fèi)顯示模塊顯示相應(yīng)的費(fèi)用和行駛的里程。當(dāng)res為低電平時(shí),計(jì)費(fèi)系統(tǒng)復(fù)位。該計(jì)費(fèi)系統(tǒng)的顯示費(fèi)用是0~999.9元
1.2.2 總體框圖
圖1                            總體框圖
2 系統(tǒng)軟件設(shè)計(jì)分析
整個(gè)系統(tǒng)由6個(gè)模塊組成:
2.1時(shí)鐘模塊
時(shí)鐘模塊,提供實(shí)時(shí)時(shí)間,并可以通過(guò)按鍵調(diào)節(jié)分鐘和小時(shí)并由其qs、qm、qh分別輸出秒、分、時(shí),clk20m輸入20Mhz,clrn清零,fj和hj為調(diào)分和調(diào)時(shí)。用于區(qū)分白天與夜間計(jì)費(fèi),白天時(shí)間6:00~00:00、夜間時(shí)間00:00~6:00,由兩個(gè)60進(jìn)制計(jì)數(shù)器和一個(gè)24進(jìn)制計(jì)數(shù)器組成,生成一個(gè)元件符號(hào)。
圖2-1                            時(shí)鐘模塊元件符號(hào)圖
60進(jìn)制計(jì)數(shù)器程序:
  1. module cont60(clk,clrn,q,cout,j);
  2.                             input j,clrn,clk;
  3.                             output reg [7:0] q;
  4.                             output reg cout;
  5.                                           always @(  posedge clk^j or posedge clrn  )
  6.                                                         begin
  7.                                                         if(clrn) q=0;
  8.                                                         else
  9.                                                         begin
  10.                                                                                     q = q+1; if(q[3:0] >= 10)
  11.                                                                                     begin q[3:0] = 0;q[7:4] = q[7:4]+1;
  12.                                                                                          if(q[7:4] >= 6) q[7:4] = 0;
  13.                                                                                     end            
  14.                                                                                     if( q == 'h00 ) cout = 1;else  cout = 0;
  15.                                                         end
  16.                                           end
  17.               endmodule
  18. 24進(jìn)制計(jì)數(shù)器程序:
  19. module cont24(clk,clrn,q,cout,j);
  20.                  input j,clk,clrn;
  21.                             output reg [7:0] q;
  22.                  output reg cout;
  23.                                           always@(  posedge clk^j or posedge clrn  )
  24.                                                         begin
  25.                                                         if(clrn)begin q=0;cout = 0;end
  26.                                                         else
  27.                                                         begin
  28.                                                                       q = q+1; if(q[3:0] >= 10)
  29.                                                                       begin q[3:0] = 0; q[7:4] = q[7:4]+1;            
  30.                                                                       end            
  31.                                                                       if( q >= 'h24 )
  32.                                                                       begin q = 0; cout = 1; end
  33.                                                                       else  cout = 0; end                end               endmodule
復(fù)制代碼

圖2-2                            時(shí)鐘仿真圖
2.2控制模塊
控制模塊是用于控制車(chē)速的模塊clk輸入20Mhz,res清零作用,key_up是加速、key_down是減速,對(duì)應(yīng)速度有0km/h、20km/h、40km/h——260km/h、280km/h、300km/h共15個(gè)速度調(diào)節(jié)來(lái)產(chǎn)生不同的頻率由clk_speed輸出,20km/h即11.1m每秒,所以20km/h要產(chǎn)生一秒為11100個(gè)上升沿,20Mhz/(2*11100),而gear輸出不同的檔位,通過(guò)對(duì)20MHz分頻來(lái)產(chǎn)生不同的頻率對(duì)應(yīng)不同的速度,1秒內(nèi)10000個(gè)上升沿表示1秒行駛了1m,改變頻率即改變了1秒內(nèi)上升沿的個(gè)數(shù),就改變了速度。
圖2-3                            按鍵控制模塊元件符號(hào)圖
控制模塊程序:
  1. module key(clk,
  2.           key_up,
  3.                                           gear,
  4.                                           res,
  5.                                           key_down,
  6.                                           clk_speed,
  7.                                           people);
  8. input res,people;
  9. input key_up,clk,key_down;
  10. output reg clk_speed;
  11. reg [29:0] clk_sp_reg;
  12. output reg[3:0]gear;
  13. reg [29:0]up_c,down_c,n;
  14. initial begin
  15. gear='b1000;up_c=0;down_c=0;n=0;
  16. clk_sp_reg=0;
  17. end
  18. always@( posedge clk or posedge res)//加速減速控制
  19. begin
  20.   if(res) begin  down_c=0;up_c=0;end
  21.   else if(!people)begin  up_c=0;  down_c =0;   end else
  22.   begin
  23.                                           if(key_up)
  24.                                                         begin
  25.                                                                       up_c=up_c+1'b1;
  26.                                                         end
  27.                                                         else
  28.                                                         begin
  29.                                                                       up_c=0;
  30.                                                         end
  31.                                           if(key_down)
  32.                                                         begin
  33.                                                                       down_c=down_c+1'b1;
  34.                                                         end
  35.                                                         else
  36.                                                         begin
  37.                                                                       down_c=0;
  38.                                                         end
  39.   end
  40. end
  41. always @(posedge clk or posedge res)//速度對(duì)應(yīng)的分頻數(shù),
  42. begin
  43.     if(res) begin  gear=0;  end
  44.               else if(!people)begin  gear=0; clk_sp_reg=0;  end else
  45.               begin
  46.                   if(key_up ^ key_down )
  47.                             begin
  48.                                 if(key_up==1)
  49.                                 begin
  50.                                              if(up_c==5 && gear<='b1110)//200000)
  51.                                                         gear=gear+1;
  52.                                                         if(gear>='b1111)
  53.                                                         gear='b1111;
  54.                                           end
  55.                                           if(key_down==1)
  56.                                 begin
  57.                                              if(down_c==5)//200000)
  58.                                                         if(gear=='b0)
  59.                                                         gear='b0;else gear=gear-1;
  60.                                           end
  61.        end            
  62.         case (gear)
  63.                                           0 :  ;                                                                                                                              //速度為0
  64.                                           1       :       clk_sp_reg=909;
  65.                                           2       :       clk_sp_reg=454;
  66.                                           3       :       clk_sp_reg=303;
  67.                                           4       :       clk_sp_reg=227;
  68.                                           5       :       clk_sp_reg=181;
  69.                                           6       :       clk_sp_reg=151;
  70.                                           7       :       clk_sp_reg=129;
  71.                                           8       :       clk_sp_reg=113;
  72.                                           9       :       clk_sp_reg=101;
  73.                                           10      :       clk_sp_reg=90;
  74.                                           11      :       clk_sp_reg=82;
  75.                                           12      :       clk_sp_reg=75;
  76.                                           13      :       clk_sp_reg=69;
  77.                                           14      :       clk_sp_reg=64;
  78.                                           15      :       clk_sp_reg=60;
  79.           endcase
  80.               end
  81. end
  82. always @( posedge  clk  or  posedge res) //把20MHz分頻,產(chǎn)生相對(duì)應(yīng)速度的頻率
  83. begin
  84.                                           if(res)begin n<=0;clk_speed<=0;end
  85.                                           else  if(!people)begin  n<=0;clk_speed<=0;  end else
  86.                                           begin
  87.                                                         if (n>=clk_sp_reg && gear!=0)            
  88.                                                         begin n<=0;clk_speed<=~clk_speed; end
  89.                                              else
  90.                                                         begin              n<=n+1; clk_speed<=clk_speed;end
  91.                                           end
  92. end  
  93. endmodule
復(fù)制代碼

圖2-4                            控制模塊仿真圖

2.3計(jì)程模塊
計(jì)程模塊由五個(gè)100進(jìn)制的計(jì)數(shù)器組成,clk輸入控制模塊分頻出來(lái)的頻率,然后在計(jì)程模塊進(jìn)行計(jì)數(shù),只顯示qshiwan到qshiyi的計(jì)程其中qshiwan[7:4]是百米計(jì)程,這樣能使計(jì)費(fèi)精確到分以下,所以計(jì)程用1000個(gè)上升沿記為1米,
圖2-5                            計(jì)程模塊元件符號(hào)圖
計(jì)程模塊程序:
  1. module counter0_99(clk,clr,q,cout,people);
  2.                             input clk,clr,people;
  3.                             output reg [7:0] q;
  4.                             output reg cout;
  5.                             reg one='b1;
  6.                             initial q='h99;
  7.                                           always@(  posedge clk or posedge clr or  negedge people )
  8.                                                         begin
  9.                                                         if(clr ) q=0;
  10.                                                         else
  11.                                                         begin    if(!people) q=0;
  12.                                                                     else
  13.                                                                                                                 begin
  14.                                                                                                                 q = q+1;
  15.                                                                                                                 if(q[3:0] >= 10)
  16.                                                                                                                 begin
  17.                                                                                                                               q[3:0] = 0;
  18.                                                                                                                               q[7:4] = q[7:4]+one;
  19.                                                                                                                               if(q[7:4] >= 10)
  20.                                                                                                                               q[7:4] = 0;
  21.                                                                                                                 end            
  22.                                                                                                                 if( q == 0 )
  23.                                                                                                                 cout = 1;
  24.                                                                                                                 else
  25.                                                                                                                 cout = 0;
  26.                                                                                                                 end                end                                          end              endmodule
復(fù)制代碼

圖2-6                            計(jì)程模塊仿真圖
2.4音樂(lè)模塊
音樂(lè)模塊的clk是時(shí)鐘輸入,people是有人和沒(méi)人的狀態(tài)標(biāo)志,beep外接蜂鳴器,并設(shè)定了兩個(gè)音樂(lè)《送別》和《起風(fēng)了》,作為乘客上車(chē)下車(chē)時(shí)播放的音樂(lè),播放音樂(lè)的原理是通過(guò)改變頻率來(lái)改變音高,改變延時(shí)時(shí)間來(lái)確定一小節(jié)拍的時(shí)間是240ms,通過(guò)分頻產(chǎn)生。
//音高與頻率的對(duì)應(yīng)關(guān)系
//| | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
//|低音 |261.6Hz |293.7Hz |329.6Hz |349.2Hz | 392Hz | 440Hz |493.9Hz |
//|中音 |523.3Hz |587.3Hz |659.3Hz |698.5Hz | 784Hz | 880Hz |987.8Hz |
//|高音 |1045.5Hz|1174.7Hz|1318.5Hz|1396.9Hz| 1568Hz | 1760Hz |1975.5Hz|
//樂(lè)譜參數(shù):D=F/2K (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率)
圖2-7                            音樂(lè)模塊元件符號(hào)圖
音樂(lè)模塊程序:
  1. module music( clk,people,  beep);
  2. input clk,people;
  3. output reg  beep;
  4. reg flag ,flag1;
  5. reg[7:0] state,state1; //樂(lè)譜狀態(tài)機(jī)
  6. reg[16:0]count,count_end;
  7. reg[23:0]count1,count2;  //樂(lè)譜參數(shù):D=F/2K (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率)
  8. parameter   S_0=8'd20000000,   
  9.             L_1 = 17'd38226, M_1 = 17'd19109, H_1 = 17'd09564, //音1
  10.                                                         L_2 = 17'd34048, M_2 = 17'd17027, H_2 = 17'd08512, //音2
  11.                                                         L_3 = 17'd30339, M_3 = 17'd15167, H_3 = 17'd07584, //音3
  12.                                                         L_4 = 17'd28636, M_4 = 17'd14316, H_4 = 17'd07158, //音4
  13.                                                         L_5 = 17'd25510, M_5 = 17'd13368, H_5 = 17'd06377, //音5
  14.                                                         L_6 = 17'd22727, M_6 = 17'd11363, H_6 = 17'd05681, //音6
  15.                                                         L_7 = 17'd20247, M_7 = 17'd10123, H_7 = 17'd05062; //音7
  16. parameter TIME = 2400000; //控制每一個(gè)音的長(zhǎng)短(480ms)
  17. parameter TIME1 = 4800000; //控制每一個(gè)音的長(zhǎng)短(240ms)
  18.                                                         always @(posedge clk)
  19.                                                         begin
  20.                                                         if(people==0)
  21.                                                         begin
  22.                                                               flag=1; state1 =0;count2=0;
  23.                                                              if(flag1==1)
  24.                                                               begin
  25.                                                                                         count = count + 1'b1; //計(jì)數(shù)器加1
  26.                                                                                         if(count == count_end && count_end!=S_0)
  27.                                                                                                   begin count = 17'h0; //計(jì)數(shù)器清零
  28.                                                                                                                     beep = !beep;end  //輸出取反                  
  29.                                                                                                   if(count1 < TIME) count1 = count1 + 1'b1;
  30.                                                                                                   //一個(gè)節(jié)拍240mS  data=F/2/ms   T=2*N*Tc        
  31.                                                                                                   else  begin  count1 = 24'd0;
  32.                                                                                                                   if(state == 8'd127)
  33.                                                                                                                   begin flag = 0;state=8'd0;  end
  34.                                                                                                                   else  state = state + 1'b1;
  35.                                                                                                                   case(state)
  36.                                                                                                                   8'd0,8'd1,8'd2,8'd3: count_end = M_5;//低音"3",4個(gè)節(jié)拍
  37.                                                                                                                   8'd4,8'd5: count_end = M_3;//低音"5",持續(xù)2個(gè)節(jié)拍
  38.                                                                                                                   8'd6,8'd7: count_end = M_5;//低音"6",持續(xù)2個(gè)節(jié)拍
  39.                                                                                                                   8'd8,8'd9,8'd10,8'd11,
  40.                                                                                                                   8'd12,8'd13,8'd14,8'd15: count_end = H_1;//高音"1",8拍
  41.                                                                                                                   8'd16,8'd17,8'd18,8'd19: count_end = M_6;//中音"6",4拍
  42.                                                                                                                   8'd20,8'd21,8'd22,8'd23: count_end = H_1;//高音"1",4拍
  43.                                                                                                                   8'd24,8'd25,8'd26,8'd27,
  44.                                                                                                                   8'd28,8'd29,8'd30,8'd31,
  45.                                                                                                                   8'd32,8'd33,8'd34,8'd35: count_end = M_5;//中音"5",8拍
  46.                                                                                                                   8'd36,8'd37: flag1=0;//count_end = M_1;//低音"5",2拍
  47.                                                                                                                   endcase
  48.                                                                                                                               end
  49.                                                                                                   end
  50.                                                                       end
  51.                                                                       else
  52.                                                                       if(people==1)
  53.                                                                       begin
  54.                                                               flag1=1; state =0;count1=0;
  55.                                                               if(flag==1)
  56.                                                               begin
  57.                                                                                         count = count + 1'b1; //計(jì)數(shù)器加1
  58.                                                                                         if(count == count_end)
  59.                                                                                                   begin count = 17'h0; //計(jì)數(shù)器清零
  60.                                                                                                                 beep = !beep;end  //輸出取反                  
  61.                                                                                                   if(count2 < TIME1) count2 = count2 + 1'b1;
  62.                                                                                                   //一個(gè)節(jié)拍240mS  data=F/2/ms   T=2*N*Tc        
  63.                                                                                                   else  begin  count2 = 24'd0;
  64.                                                                                                                   if(state1 == 8'd229)
  65.                                                                                                                   begin flag = 0;state1=8'd0;  end
  66.                                                                                                                   else  state1 = state1 + 1'b1;
  67.                                                                                                                   case(state1)
  68.                                                                                                                               8'd0,8'd1 : count_end = M_1;
  69.                                                                                                                               8'd2,8'd3 : count_end = M_2;
  70.                                                                                                                               8'd4,8'd5 : count_end = M_3;
  71.                                                                                                                               8'd6,8'd7 : count_end = M_1;//
  72.                                                                                                                               8'd8,8'd9 : count_end = M_6;
  73.                                                                                                                               8'd10 : count_end = M_5;
  74.                                                                                                                               8'd11 : count_end = M_6;
  75.                                                                                                                               8'd12 : count_end = M_6;
  76.                                                                                                                               8'd13,8'd14 : flag=0;//count_end = S_0;
  77.                                                                                                                   endcase
  78.                                                                                                                               end
  79.                                                                                                   end
  80.                                                                       end              
  81.                                           end
  82. endmodul
復(fù)制代碼

2.5 LCD顯示模塊
顯示模塊是使用LCD1602液晶屏,其中clk是時(shí)鐘,people是有人和沒(méi)人的狀態(tài)為rstn是清零,in_data是檔位輸入,q0到q4是公里數(shù)輸入,qs、qm、qh是時(shí)鐘輸入,cost_lcd_in是費(fèi)用輸入,顯示界面可以顯示時(shí)間、行駛路程、速度、費(fèi)用,由于程序數(shù)據(jù)轉(zhuǎn)換太多,這里只給出一部分程序,后面的程序在附錄。
LCD1602主要技術(shù)參數(shù):顯示容量:16×2個(gè)字符、芯片工作電壓:4.5—5.5V、工作電流:2.0mA(5.0V)、模塊最佳工作電壓:5.0V、字符尺寸:2.95×4.35(W×H)mm。
圖2-8                            LCD1602模型圖

編號(hào)
符號(hào)
引腳說(shuō)明
編號(hào)
符號(hào)
引腳說(shuō)明
1
VSS
電源地
9
D2
數(shù)據(jù)
2
VDD
電源正極
10
D3
數(shù)據(jù)
3
VL
液晶顯示偏壓
11
D4
數(shù)據(jù)
4
RS
數(shù)據(jù)/命令選擇
12
D5
數(shù)據(jù)
5
R/W
讀/寫(xiě)選擇
13
D6
數(shù)據(jù)
6
E
使能信號(hào)
14
D7
數(shù)據(jù)
7
D0
數(shù)據(jù)
15
BLA
背光源正極
8
D1
數(shù)據(jù)
16
BLK
背光源負(fù)極

表1                            引腳接口說(shuō)明表

序號(hào)
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清顯示
0
0
0
0
0
0
0
0
0
1
2
光標(biāo)返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開(kāi)/關(guān)控制
0
0
0
0
0
0
1
D
C
B
5
光標(biāo)或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發(fā)生存貯器地址
0
0
0
1
字符發(fā)生存貯器地址
8
置數(shù)據(jù)存貯器地址
0
0
1
顯示數(shù)據(jù)存貯器地址
9
讀忙標(biāo)志或地址
0
1
BF
計(jì)數(shù)器地址
10
寫(xiě)數(shù)到CGRAM或DDRAM)
1
0
要寫(xiě)的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容

表2                            控制指令表
1602液晶模塊的讀寫(xiě)操作,屏幕和光標(biāo)的操作都是通過(guò)指令編程來(lái)實(shí)現(xiàn)的。(說(shuō)明1為高電平,0為低電平)
指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置
指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H
指令3:光標(biāo)和顯示位置設(shè)置I/D,光標(biāo)移動(dòng)方向,高電平右移,低電平左移,S:屏幕上所有文字是否左移或右移,高電平表示有效,低電平表示無(wú)效。
指令4:顯示開(kāi)關(guān)控制。D:控制整體的顯示開(kāi)與關(guān),高電平表示開(kāi)顯示,低電平表示關(guān)顯示。C:控制光標(biāo)的開(kāi)與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標(biāo)或顯示移位 S/C :高電平時(shí)顯示移動(dòng)的文字,低電平時(shí)移動(dòng)光標(biāo)
指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)為雙行顯示,F(xiàn):低電平時(shí)顯示5X7的點(diǎn)陣字符,高電平時(shí)顯示5X10的顯示字符。
指令7:字符發(fā)生器RAM地址設(shè)置。
指令8:DDRAM地址設(shè)置。
指令9:讀忙信號(hào)和光標(biāo)地址 BF:忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或數(shù)據(jù),如果為低電平表示不忙。
圖2-9                            LCD顯示模塊元件符號(hào)圖
LCD顯示模塊程序:
  1. module lcd1602(sys_clk    ,
  2.       sys_rstn   ,     
  3.                             lcd_rs     ,   
  4.                             lcd_rw     ,   
  5.                             lcd_en     ,
  6.                             lcd_data   ,  
  7.                  in_data,
  8.       q0,q1,q2,q3,q4,qs,qm,qh,people,
  9.                             cost_lcd_in
  10.               ); //輸入輸出信號(hào)定義
  11.                             input               [31:0]              cost_lcd_in;
  12.                             input  [7:0]  q0,q1,q2,q3,q4,qs,qm,qh;
  13.                             input  sys_clk    ;//系統(tǒng)時(shí)鐘輸入
  14.                             input    people,      sys_rstn   ;//系統(tǒng)復(fù)位信號(hào),低電平有效
  15.                             input   [3:0] in_data;
  16.                             output         lcd_rs     ;//lcd的寄存器選擇輸出信號(hào)
  17.                             output         lcd_rw     ;//lcd的讀、寫(xiě)操作選擇輸出信號(hào)
  18.                             output         lcd_en     ;//lcd使能信號(hào)
  19.                             output  [7:0]  lcd_data   ;//lcd的數(shù)據(jù)總線(不進(jìn)行讀操作,故為輸出)
  20.                             reg            lcd_rs     ;
  21.                             reg            clk_div    ;
  22.                             reg [7:0]  q1h,q1l,q2h,q2l,q3h,q3l,q4l;
  23.                             reg [7:0]              sp_reg1,sp_reg2,sp_reg3;
  24.                             reg [7:0]              qsl,qsh,qml,qmh,qhl,qhh;
  25.                             reg [7:0] in_data_reg;
  26.                             reg [7:0]              cost_reg0,cost_reg1,cost_reg2,cost_reg3;
  27.                             reg     [17:0] delay_cnt  ;
  28.                             reg     [7:0]  lcd_data   ;
  29.                             reg     [4:0]  char_cnt   ;
  30.                             reg     [7:0]  data_disp  ;
  31.                             reg     [9:0]  state      ;
  32.                             parameter   
  33.                             idle                                                                         = 10'b000000000, //初始狀態(tài),下一個(gè)狀態(tài)為CLEAR   
  34.                             clear                                                                        = 10'b000000001,  //清屏   
  35.                             set_function                                           = 10'b000000010,
  36.                             switch_mode                                           = 10'b000000100,
  37.                             set_mode                                              = 10'b000001000,
  38.                             shift                                                            = 10'b000010000,
  39.                             //光標(biāo)、畫(huà)面位移設(shè)置:光標(biāo)向左平移一個(gè)字符位
  40.                             set_ddram1                                             = 10'b000100000,
  41.                             //設(shè)置DDRAM的地址:第一行起始為0x00(注意輸出時(shí)DB7一定要為1)     
  42.                             set_ddram2                                             = 10'b001000000,  //設(shè)置DDRAM的地址:第二行為0x40                            write_ram1                                             = 10'b010000000,  //數(shù)據(jù)寫(xiě)入DDRAM相應(yīng)的地址   
  43.                             write_ram2                                            = 10'b100000000;  //數(shù)據(jù)寫(xiě)入DDRAM相應(yīng)的地址
  44.                             assign lcd_rw = 1'b0;      //沒(méi)有讀操作,R/W信號(hào)始終為低電平
  45.                             assign lcd_en = clk_div; //E信號(hào)出現(xiàn)高電平以及下降沿的時(shí)刻與LCD時(shí)鐘相同              always@(posedge sys_clk or posedge sys_rstn) /////分頻
  46.               begin   if(sys_rstn)   begin    delay_cnt<=18'd0;    clk_div<=1'b0;
  47.               end  else if(delay_cnt==18'd200000)
  48.               begin
  49.               delay_cnt<=18'd0;    clk_div<=~clk_div;   end  else
  50.               begin    delay_cnt<=delay_cnt+1'b1;    clk_div<=clk_div;
  51.               end end
  52.               always@(posedge clk_div or posedge sys_rstn) //State Machine
  53.               begin  if(sys_rstn)
  54.               begin    state   <= idle;    lcd_data <= 8'b0;    char_cnt <= 5'd0;      
  55.               lcd_rs<=1'b0;//地址\數(shù)據(jù)
  56.    end  else   begin
  57.               case(state)
  58.               idle: begin      //初始狀態(tài)     
  59.                          state <= clear;      lcd_data <= 8'b0;     end
  60.               clear: begin      //清屏   
  61.                                                         state <= set_function;   
  62.                                                         lcd_rs<=1'b0;   
  63.                                                         lcd_data <= 8'b00000001;     
  64.                                                         end  
  65.               set_function:      //功能設(shè)置(38H):8位數(shù)據(jù)接口/2行顯示/5*8點(diǎn)陣字符  
  66.                                                                       begin      state <= switch_mode;      lcd_rs<=1'b0;
  67.                                                                       lcd_data <= 8'b00111000;         end  
  68.               switch_mode:       //顯示開(kāi)關(guān)控制(0CH):開(kāi)顯示,光標(biāo)和閃爍關(guān)閉   
  69.                                                                       begin      state <= set_mode;      lcd_rs<=1'b0;   
  70.                                                                       lcd_data <= 8'b00001110;     end  
  71.               set_mode:begin   //輸入方式設(shè)置(06H):數(shù)據(jù)讀寫(xiě)操作后,地址自動(dòng)加一/畫(huà)面不動(dòng)
  72.                            state <= shift;       lcd_rs<=1'b0;   
  73.                                                                       lcd_data <= 8'b00000110;     end
  74.               shift: begin      //光標(biāo)、畫(huà)面位移設(shè)置(10H):光標(biāo)向左平移一個(gè)字符位
  75.                                                                       //(光標(biāo)顯示是關(guān)閉的,所以實(shí)際上設(shè)置是看不出效果的)  
  76.            state <= set_ddram1;      lcd_rs<=1'b0;   
  77.                                             lcd_data <= 8'b0001_0000;        end   
  78. set_ddram1: //設(shè)置DDRAM的地址:第一行起始為00H(注意輸出時(shí)DB7一定要為1)     
  79.           begin      state <= write_ram1;   
  80.                                                                                     lcd_rs<=1'b0;      lcd_data <= 8'b1000_0000;//Line1
  81.                                           end
  82. set_ddram2:       //設(shè)置DDRAM的地址:第二行為40H(DB7一定要為1)
  83.                                                                       begin      state <= write_ram2;   
  84.                                                                       lcd_rs<=1'b0;      lcd_data <= 8'b1100_0000;//Line2   
  85.                                                                       end  
  86. write_ram1:        
  87.            begin              
  88.                                                                         if(char_cnt <=5'd15)
  89.                                                                         begin   char_cnt <= char_cnt + 1'b1;   
  90.                                                                                                     lcd_rs<=1'b1;  lcd_data <= data_disp;
  91.                                                                                                     state <= write_ram1;  end   
  92.                                                                         else   begin   state <= set_ddram2; end        
  93.                                             end
  94. write_ram2:
  95.             begin      
  96.                                                                                     if(char_cnt <=5'd30)
  97.                                                                                     begin char_cnt <= char_cnt + 1'b1;
  98.                                                                                                                 lcd_rs<=1'b1;   lcd_data <= data_disp;
  99.                                                                                                                 state <= write_ram2;    end     
  100.                                                                                     else   begin  char_cnt <=5'd0; state <= shift;     end      
  101.                                                         end
  102. default:  state <= idle;
  103. endcase  
  104. end
  105. end
復(fù)制代碼

2.6計(jì)費(fèi)模塊
計(jì)費(fèi)模塊其中clk是20MHz輸入,clrn清零,people是有人沒(méi)人的狀態(tài)位,q0到q4為里程輸入,qh為小時(shí)輸入,用于判斷白天計(jì)程和夜間計(jì)費(fèi),其中又分0~2km不計(jì)程,2~10km加20%費(fèi)用,且白天和夜間的四個(gè)計(jì)費(fèi)階段都有相對(duì)應(yīng)的指示燈閃爍(L12到L15),白天:7元2km內(nèi)7元,2km-10km每公里收費(fèi)1.6元,10km以上每公里收費(fèi)2.4元;夜間:起步價(jià)8元2km內(nèi)8元,2km-10km每公里收費(fèi)2元,10km以上每公里收費(fèi)3元。cost_q輸出費(fèi)用。10km以上加收費(fèi)用,1000個(gè)上升沿即為1米,則1km——1.6元,1000000個(gè)上升沿對(duì)應(yīng)160分,1分即6250個(gè)上升沿,由于程序數(shù)據(jù)轉(zhuǎn)換太多,這里只給出一部分程序,后面的程序在附錄。
圖2-10                            計(jì)費(fèi)模塊元件符號(hào)圖
              計(jì)費(fèi)模塊程序:
  1.               module counter0_99_16(
  2.               clk,clr,cost_q,people,
  3.               q0,q1,q2,q3,q4,qh,
  4.               l12,l13,l14,l15
  5.               );
  6.                             input clk,clr,people;
  7.                             output              reg l12,l13,l14,l15;
  8.                             input [7:0] q0,q1,q2,q3,q4,qh;
  9.                             output reg [31:0] cost_q;
  10.                             reg [13:0] n;
  11.                             reg one='b1;
  12.                             initial              n=0;
  13.                             initial              cost_q='b0000_0000_0000_0000_0000_1000_0000_0000;
  14.                                           always@(  posedge clk or posedge clr or  negedge people )
  15.                                                         begin
  16.                                                         if(clr ) begin              l12=0;l13=0;l14=0;l15=0;cost_q=0;end
  17.                                                         else
  18.                                                         begin  if(!people)              begin l12=0;l13=0;l14=0;l15=0;
  19.               if(qh>'b00000110)cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;
  20.                                                                                                   else              if(qh<='b00000110)cost_q='b0000_0000_0000_0000_0000_1000_0000_0000;              end
  21.                                                                     else
  22.                                                                                                   begin            
  23.                                                                                                   if(qh>8'b00000110)
  24.                                                                                                   begin
  25. if({q4,q3,q2,q0}<=32'b0000_0000_0001_0000_0000_0000_0000_0000
  26.                                                                                                   &&              {q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000              ) begin
  27.                                                                                                   //1000000電平除以160分,得出一分6250個(gè)上升沿
  28.                                                                                                                                             if(n              <              'd6250)              //1.6元
  29.                                                                                                                                             begin              n=n+'d1;              end            
  30.                                                                                                                                             if(n              >=              'd6250)
  31.                                                                                                                                             begin
  32.                                                                                                                                                           n<=0;            
  33.                                                                                                                                                           begin
  34.                                                                                                                                                           l12=~l12;l13=0;l14=0;l15=0;
  35.                                                                                                                                                           cost_q = cost_q+1;
  36.                                                                                                                                                           if(cost_q[3:0] >= 10)
  37.                                                                                                                                                           begin              cost_q[3:0] = 0;
  38.                                                                                                                                                           cost_q[7:4] = cost_q[7:4]+one;end            
  39.                                                                                                                                                           if(cost_q[7:4] >= 10)
  40.                                                                                                                                                           begin              cost_q[7:4] = 0;
  41.                                                                                                                                                           cost_q[11:8] = cost_q[11:8]+one;end            
  42.                                                                                                                                                           if(cost_q[11:8] >= 10)
  43.                                                                                                                                                           begin              cost_q[11:8] = 0;
  44.                                                                                                                                                           cost_q[15:12] = cost_q[15:12]+one;end
  45.                                                                                                                                                           if(cost_q[15:12] >= 10)
  46.                                                                                                                                                           begin              cost_q[15:12] = 0;
  47.                                                                                                                                                           cost_q[19:16] = cost_q[19:16]+one;end
  48.                                                                                                                                                           if(cost_q[19:16] >= 10)
  49.                                                                                                                                                           begin              cost_q[19:16] = 0;
  50.                                                                                                                                                           cost_q[23:20] = cost_q[23:20]+one;end
  51.                                                                                                                                                           if(cost_q[23:20] >= 10)
  52.                                                                                                                                                           begin              cost_q[23:20] = 0;
  53.                                                                                                                                                           cost_q[27:24] = cost_q[27:24]+one;end
  54.                                                                                                                                                           if(cost_q[27:24] >= 10)
  55.                                                                                                                                                           begin              cost_q[27:24] = 0;
  56.                                                                                                                                                           cost_q[31:28] = cost_q[31:28]+one;end
  57.                                                                                                                                                           end
  58.                                                                                                                                             end
  59.                                                                                                                               end else
  60.                                                                                     end
  61.                                                           end
  62.                         end                                                                                                  
  63.               end
  64.               endmodule
復(fù)制代碼

圖2-11                                          計(jì)費(fèi)模塊仿真圖
3  系統(tǒng)測(cè)試(調(diào)試)3.1 測(cè)試儀器與設(shè)備
① EDA實(shí)驗(yàn)儀一臺(tái)。
② 計(jì)算機(jī)一臺(tái)(裝有Quartus Ⅱ軟件)
3.2 性能指標(biāo)測(cè)試
把程序下載進(jìn)實(shí)驗(yàn)箱,按鍵控制有人和沒(méi)人的狀態(tài),蜂鳴器能正常播放音樂(lè),然后運(yùn)行計(jì)費(fèi)器,通過(guò)計(jì)算的出的費(fèi)用和路程相符合,白天和夜間的起步價(jià)、2km到10km計(jì)費(fèi)標(biāo)準(zhǔn)和10km以上的計(jì)費(fèi)標(biāo)準(zhǔn)都正確,且能顯示正確的速度,時(shí)間,路程,四個(gè)收費(fèi)階段都有相對(duì)應(yīng)的指示燈閃爍提示,速度的各檔速也有相對(duì)應(yīng)的燈點(diǎn)亮。
圖3-1                            引腳鎖定

圖3-2                            白天計(jì)費(fèi)測(cè)試圖
圖3-3                            夜間計(jì)費(fèi)測(cè)試圖
3.3 結(jié)果分析
達(dá)到了所要完成的基本功能,并在此功能上擴(kuò)展出來(lái),一些額外功能,在顯示方面使用了LCD1602的液晶顯示屏顯示時(shí)間、速度、里程和費(fèi)用,并有一個(gè)一天的計(jì)時(shí)器,且能夠分為白天和夜間計(jì)費(fèi),并在人上車(chē)下車(chē)的時(shí)候能夠用蜂鳴器播放音樂(lè)。
4  波形發(fā)生器設(shè)計(jì)
波形發(fā)生器設(shè)計(jì),能夠產(chǎn)生鋸齒波、三角波、方波和正弦波,采用LPM_ROM,儲(chǔ)存四個(gè)波形的數(shù)字,然后直接輸出波形的數(shù)據(jù)即可,并在此基礎(chǔ)上采用兩個(gè)按鍵控制四個(gè)頻率的轉(zhuǎn)換。
鋸齒波ROM數(shù)據(jù),從0自加到255。
三角波ROM數(shù)據(jù):從0到127自加,每次加2,從128到255自減每次減2。
正弦波ROM數(shù)據(jù):用正弦波發(fā)生函數(shù)。
正弦波數(shù)據(jù)C語(yǔ)言程序:
#include <stdio.h>
#include "math.h"
main()
{
   int i,k;
   for(i=0;i<256;i++)
   {
    k=128+128*sin(360.0*i/256.0*3.1415926/180);
              printf("%d              :              %d\n",i,k);
   }
   return 0;
}
方波ROM數(shù)據(jù):從0到127自加,為255,從128到255為0。
計(jì)數(shù)模塊:
圖4-1                            計(jì)數(shù)器元件符號(hào)圖
  LPM_ROM模塊:
圖4-2                            數(shù)據(jù)存儲(chǔ)模塊元件符號(hào)圖

選擇波形部分:
圖4-3                            選擇波形元件符號(hào)圖
選擇波形的程序:
  module data_selector4_1  (A,B,C,D,s0,s1,z);
                              input  s0;
                              input s1;
                              input   [7:0]   A;
                              input   [7:0]   B;
                              input   [7:0]   C;
                              input   [7:0]   D;
                              output  reg [7:0] z;
                              always@( s0 or s1 or A or B or C or D)
                                          begin
                                             case ( {s1,s0} )
                                                        'b00   :  z=A;
                                                        'b01   :  z=B;
                                                        'b10   :  z=C;
                                                        'b11   :  z=D;
            default :  z='bz;
                                                        endcase
                                          end
  endmodule
分頻選擇部分:
圖4-4                            選擇頻率元件符號(hào)圖
分頻選擇程序:
                  module clk_ch  (key1,key2,clk,clk_c);
                              input  clk;
                              input   key1;
                              input  key2;
       output reg clk_c;
                              reg [7:0]h;            
                              reg  [7:0]y;
                              always@(  posedge clk  )
                                          begin
                                                                                    case ({key2,key1})
                                                                                    'b00:y=0;
                                                                                    'b01:y=2;
                                                                                    'b10:y=4;
                                                                                    'b11:y=6;
                                                                                    endcase
                                                                                    if(h == y)
                                                                                    begin  h<=0;clk_c<=~clk_c; end
                                                                                    else  begin h<=h+1;clk_c<=clk_c;end
                                          end                            endmodule
圖4-5                            波形發(fā)生器原理圖
圖4-6                            Simulation的波形仿真圖

方波
三角波
    正弦波
    鋸齒波
圖4-7                            各波形圖的嵌入式邏輯分析儀結(jié)果
圖4-8                            頻率轉(zhuǎn)換結(jié)果圖
5  實(shí)訓(xùn)總結(jié)
在做本次課程設(shè)計(jì)的過(guò)程中,我感觸最深的當(dāng)屬查閱大量的設(shè)計(jì)資料了。為了讓自己的設(shè)計(jì)更加完善,查閱這方面的設(shè)計(jì)資料是十分必要的,同時(shí)也是必不可少的。另外,這次課程設(shè)計(jì)讓我感到了團(tuán)隊(duì)合作的重要性。在團(tuán)隊(duì)中,我們互幫互助,對(duì)整個(gè)課程設(shè)計(jì)來(lái)說(shuō),這是至關(guān)重要的,缺少每一個(gè)人都會(huì)對(duì)我們的設(shè)計(jì)產(chǎn)生影響。還有要感謝指導(dǎo)老師在我們遇到困難時(shí),給予我們的建議與鼓勵(lì)。一周的課程設(shè)計(jì)結(jié)束了,但是從中學(xué)到的知識(shí)會(huì)讓我受益終身。發(fā)現(xiàn)、提出、分析、解決問(wèn)題和實(shí)踐能力的提高都會(huì)受益于我在以后的學(xué)習(xí)、工作和生活中。 為期一個(gè)星期的課程實(shí)訓(xùn),在覃老師的親切指導(dǎo)和同學(xué)的幫助下,此次設(shè)計(jì)才得以完成,在此向所有給予我此次課程設(shè)計(jì)指導(dǎo)和幫助的老師和同學(xué)表示最誠(chéng)摯的感謝!
6  參考文獻(xiàn)
[1] 江國(guó)強(qiáng),覃琴.EDA技術(shù)與應(yīng)用(第5版):電子工業(yè)出版社,2017
[2]趙倩,葉波,林麗萍,周多,王曉華.Verilog數(shù)字系統(tǒng)設(shè)計(jì)與FPGA應(yīng)用[M].北京:清華大學(xué)出版社,2012
[3]吳迪,楊梅,嚴(yán)飛.EDA與數(shù)字系統(tǒng)實(shí)驗(yàn)教程[M].大連:大連海事大學(xué)出版社,2011
學(xué)號(hào)
姓名
工作量(%)
1516030514
梁新堅(jiān)
60%
1516030515
汪昱昇
40%



附錄
總體原理圖

總仿真圖

LCD顯示模塊程序:
  1. module counter0_99_16(
  2.               clk,clr,cost_q,people,
  3.               q0,q1,q2,q3,q4,qh,
  4.               l12,l13,l14,l15
  5.               );
  6.                             input clk,clr,people;
  7.                             output              reg l12,l13,l14,l15;
  8.                             input [7:0] q0,q1,q2,q3,q4,qh;
  9.                             output reg [31:0] cost_q;
  10.                             reg [13:0] n;
  11.                             reg one='b1;
  12.                             initial              n=0;
  13.                             initial              cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;
  14.                                           always@(  posedge clk or posedge clr or  negedge people )
  15.                                                         begin
  16.                                                         if(clr ) begin              l12=0;l13=0;l14=0;l15=0;cost_q=0;cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;end
  17.                                                         else
  18.                                                         begin  if(!people)              begin l12=0;l13=0;l14=0;l15=0;
  19.                                                                                                                               if(qh>'b00000110)cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;
  20.                                                                                                   else              if(qh<='b00000110)cost_q='b0000_0000_0000_0000_0000_1000_0000_0000;              end
  21.                                                                     else
  22.                                                                                                   begin            
  23.                                                                                                   if(qh>8'b00000110)
  24.                                                                                                   begin
  25.                                                                                                   if({q4,q3,q2,q0}<=32'b0000_0000_0001_0000_0000_0000_0000_0000
  26.                                                                                                   &&              {q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000              ) begin//1000000電平除以160分,得出一分6250個(gè)上升沿
  27.                                                                                                                                             if(n              <              'd6250)              //1.6元
  28.                                                                                                                                             begin              n=n+'d1;              end            
  29.                                                                                                                                             if(n              >=              'd6250)
  30.                                                                                                                                             begin
  31.                                                                                                                                                           n<=0;            
  32.                                                                                                                                                           begin
  33.                                                                                                                                                           l12=~l12;l13=0;l14=0;l15=0;
  34.                                                                                                                                                           cost_q = cost_q+1;
  35.                                                                                                                                                           if(cost_q[3:0] >= 10)
  36.                                                                                                                                                           begin              cost_q[3:0] = 0;
  37.                                                                                                                                                           cost_q[7:4] = cost_q[7:4]+one;end            
  38.                                                                                                                                                          
  39.                                                                                                                                                           if(cost_q[7:4] >= 10)
  40.                                                                                                                                                           begin              cost_q[7:4] = 0;
  41.                                                                                                                                                           cost_q[11:8] = cost_q[11:8]+one;end            
  42.                                                                                                                                                           if(cost_q[11:8] >= 10)
  43.                                                                                                                                                           begin              cost_q[11:8] = 0;
  44.                                                                                                                                                           cost_q[15:12] = cost_q[15:12]+one;end
  45.                                                                                                                                                          
  46.                                                                                                                                                           if(cost_q[15:12] >= 10)
  47.                                                                                                                                                           begin              cost_q[15:12] = 0;
  48.                                                                                                                                                           cost_q[19:16] = cost_q[19:16]+one;end
  49.                                                                                                                                                           if(cost_q[19:16] >= 10)
  50.                                                                                                                                                           begin              cost_q[19:16] = 0;
  51.                                                                                                                                                           cost_q[23:20] = cost_q[23:20]+one;end
  52.                                                                                                                                                          
  53.                                                                                                                                                           if(cost_q[23:20] >= 10)
  54.                                                                                                                                                           begin              cost_q[23:20] = 0;
  55.                                                                                                                                                           cost_q[27:24] = cost_q[27:24]+one;end
  56.                                                                                                                                                           if(cost_q[27:24] >= 10)
  57.                                                                                                                                                           begin              cost_q[27:24] = 0;
  58.                                                                                                                                                           cost_q[31:28] = cost_q[31:28]+one;end
  59.                                                                                                                                                           end
  60.                                                                                                                                             end
  61.                                                                                                                               end else
  62.                                                                                                                 if({q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000)
  63.                                                                                                                 begin//////////////2.4元
  64.                                                                                                                                             if(n              <              'd4166)
  65.                                                                                                                                             begin              n=n+'d1;              end            
  66.                                                                                                                                             if(n              >=              'd4166)
  67.                                                                                                                                             begin
  68.                                                                                                                                                           n<=0;            
  69.                                                                                                                                                           begin
  70.                                                                                                                                                           l12=0;l13=~l13;l14=0;l15=0;
  71.                                                                                                                                                           cost_q = cost_q+1;
  72.                                                                                                                                                           if(cost_q[3:0] >= 10)
  73.                                                                                                                                                           begin              cost_q[3:0] = 0;
  74.                                                                                                                                                           cost_q[7:4] = cost_q[7:4]+one;end            
  75.                                                                                                                                                          
  76.                                                                                                                                                           if(cost_q[7:4] >= 10)
  77.                                                                                                                                                           begin              cost_q[7:4] = 0;
  78.                                                                                                                                                           cost_q[11:8] = cost_q[11:8]+one;end            
  79.                                                                                                                                                           if(cost_q[11:8] >= 10)
  80.                                                                                                                                                           begin              cost_q[11:8] = 0;
  81.                                                                                                                                                           cost_q[15:12] = cost_q[15:12]+one;end
  82.                                                                                                                                                          
  83.                                                                                                                                                           if(cost_q[15:12] >= 10)
  84.                                                                                                                                                           begin              cost_q[15:12] = 0;
  85.                                                                                                                                                           cost_q[19:16] = cost_q[19:16]+one;end
  86.                                                                                                                                                           if(cost_q[19:16] >= 10)
  87.                                                                                                                                                           begin              cost_q[19:16] = 0;
  88.                                                                                                                                                           cost_q[23:20] = cost_q[23:20]+one;end
  89.                                                                                                                                                end
  90.                                                                                                                                             end
  91.                                                                                                                               end
  92.                                                                                                                               else;
  93.                                                                                                                 end              else
  94.                                                                                                                 if(qh<=8'b00000110)
  95.                                                                                                                 begin
  96.                                                                                                                 if({q4,q3,q2,q0}<=32'b0000_0000_0001_0000_0000_0000_0000_0000
  97.                                                                                                   &&              {q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000)
  98.                                                                                                                 begin//////////////20
  99.                                                                                                                                             if(n              <              'd5000)            
  100.                                                                                                                                             begin              n=n+'d1;              end            
  101.                                                                                                                                             if(n>=              'd5000)
  102.                                                                                                                                             begin
  103.                                                                                                                                                           n<=0;            
  104.                                                                                                                                                           begin
  105.                                                                                                                                                           l12=0;l13=0;l14=~l14;l15=0;
  106.                                                                                                                                                           cost_q = cost_q+1;
  107.                                                                                                                                                           if(cost_q[3:0] >= 10)
  108.                                                                                                                                                           begin              cost_q[3:0] = 0;
  109.                                                                                                                                                           cost_q[7:4] = cost_q[7:4]+one;end            
  110.                                                                                                                                                          
  111.                                                                                                                                                           if(cost_q[7:4] >= 10)
  112.                                                                                                                                                           begin              cost_q[7:4] = 0;
  113.                                                                                                                                                           cost_q[11:8] = cost_q[11:8]+one;end            
  114.                                                                                                                                                           if(cost_q[11:8] >= 10)
  115.                                                                                                                                                           begin              cost_q[11:8] = 0;
  116.                                                                                                                                                           cost_q[15:12] = cost_q[15:12]+one;end
  117.                                                                                                                                                          
  118.                                                                                                                                                           if(cost_q[15:12] >= 10)
  119.                                                                                                                                                           begin              cost_q[15:12] = 0;
  120.                                                                                                                                                           cost_q[19:16] = cost_q[19:16]+one;end
  121.                                                                                                                                                           if(cost_q[19:16] >= 10)
  122.                                                                                                                                                           begin              cost_q[19:16] = 0;
  123.                                                                                                                                                           cost_q[23:20] = cost_q[23:20]+one;end
  124.                                                                                                                                                           end
  125.                                                                                                                                             end
  126.                                                                                                                               end              else
  127.                                                                                                                 if({q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000)
  128.                                                                                                   begin//////////////30
  129.                                                                                                                                             if(n              <              'd3333)            
  130.                                                                                                                                             begin              n=n+'d1;              end            
  131.                                                                                                                                             if(n              >=              'd3333)
  132.                                                                                                                                             begin
  133.                                                                                                                                                           n<=0;            
  134.                                                                                                                                                           begin
  135.                                                                                                                                                           l12=0;l13=0;l14=0;l15=~l15;
  136.                                                                                                                                                           cost_q = cost_q+1;
  137.                                                                                                                                                           if(cost_q[3:0] >= 10)
  138.                                                                                                                                                           begin              cost_q[3:0] = 0;
  139.                                                                                                                                                           cost_q[7:4] = cost_q[7:4]+one;end            
  140.                                                                                                                                                          
  141.                                                                                                                                                           if(cost_q[7:4] >= 10)
  142.                                                                                                                                                           begin              cost_q[7:4] = 0;
  143.                                                                                                                                                           cost_q[11:8] = cost_q[11:8]+one;end            
  144.                                                                                                                                                           if(cost_q[11:8] >= 10)
  145.                                                                                                                                                           begin              cost_q[11:8] = 0;
  146.                                                                                                                                                           cost_q[15:12] = cost_q[15:12]+one;end
  147.                                                                                                                                                          
  148.                                                                                                                                                           if(cost_q[15:12] >= 10)
  149.                                                                                                                                                           begin              cost_q[15:12] = 0;
  150.                                                                                                                                                           cost_q[19:16] = cost_q[19:16]+one;end
  151.                                                                                                                                                           if(cost_q[19:16] >= 10)
  152.                                                                                                                                                           begin              cost_q[19:16] = 0;
  153.                                                                                                                                                           cost_q[23:20] = cost_q[23:20]+one;end
  154.                                                                                                                                                           end
  155.                                                                                                                               end
  156.                                                                                                   end
  157.                                                                                                   else;
  158.                                                                                     end
  159.                                                                                                     end
  160.                         end                                                                                                  
  161.               end
  162.               endmodule

  163. 計(jì)費(fèi)器模塊程序:
  164. module lcd1602(sys_clk    ,
  165.       sys_rstn   ,     
  166.                             lcd_rs     ,   
  167.                             lcd_rw     ,   
  168.                             lcd_en     ,
  169.                             lcd_data   ,  
  170.                  in_data,
  171.       q0,q1,q2,q3,q4,qs,qm,qh,people,
  172.                             cost_lcd_in
  173.               );
  174.                             input               [31:0]              cost_lcd_in;
  175.                             input  [7:0]  q0,q1,q2,q3,q4,qs,qm,qh;
  176.                             input  sys_clk    ;
  177.                             input    people,      sys_rstn   ;
  178.                             input   [3:0] in_data;
  179.                             output         lcd_rs     ;
  180.                             output         lcd_rw     ;
  181.                             output         lcd_en     ;
  182.                             output  [7:0]  lcd_data   ;
  183.                             reg            lcd_rs     ;
  184.                             reg            clk_div    ;
  185.                             reg [7:0]  q1h,q1l,q2h,q3h,q3l,q4l;
  186.                             reg [7:0]              sp_reg1,sp_reg2,sp_reg3;
  187.                             reg [7:0]              qsl,qsh,qml,qmh,qhl,qhh;
  188.                             reg [7:0] in_data_reg;
  189.                             reg [7:0]              cost_reg0,cost_reg1,cost_reg2,cost_reg3;
  190.                             reg     [17:0] delay_cnt  ;
  191.                             reg     [7:0]  lcd_data   ;
  192.                             reg     [4:0]  char_cnt   ;
  193.                             reg     [7:0]  data_disp  ;
  194.                             reg     [9:0]  state      ;
  195.                             parameter   
  196.                             idle                                                                         = 10'b000000000,   
  197.                             clear                                                                        = 10'b000000001,  
  198.                             set_function                                           = 10'b000000010,     
  199.                             switch_mode                                           = 10'b000000100,   
  200.                             set_mode                                              = 10'b000001000,   
  201.                             shift                                                            = 10'b000010000,
  202.                  
  203.                             set_ddram1                                             = 10'b000100000,
  204.                   
  205.                             set_ddram2                                             = 10'b001000000,      
  206.                             write_ram1                                             = 10'b010000000,     
  207.                             write_ram2                                            = 10'b100000000;
  208.                             assign lcd_rw = 1'b0;     
  209.                             assign lcd_en = clk_div;
  210.               always@(posedge sys_clk or posedge sys_rstn)
  211.               begin   if(sys_rstn)   begin    delay_cnt<=18'd0;    clk_div<=1'b0;
  212.               end  else if(delay_cnt==18'd200000)
  213.               begin
  214.               delay_cnt<=18'd0;    clk_div<=~clk_div;   end  else
  215.               begin    delay_cnt<=delay_cnt+1'b1;    clk_div<=clk_div;
  216.               end end
  217.             
  218.             
  219.               always@(posedge clk_div or posedge sys_rstn)
  220.               begin  if(sys_rstn)
  221.               begin    state   <= idle;    lcd_data <= 8'b0;    char_cnt <= 5'd0;      
  222.               lcd_rs<=1'b0;
  223.    end  else   begin

  224.               case(state)

  225.               idle: begin        
  226.                          state <= clear;      lcd_data <= 8'b0;     end

  227.               clear: begin         
  228.                                                         state <= set_function;   
  229.                                                         lcd_rs<=1'b0;   
  230.                                                         lcd_data <= 8'b00000001;     
  231.                                                         end  
  232.               set_function:     
  233.                                                                       begin      state <= switch_mode;      lcd_rs<=1'b0;
  234.                                                                       lcd_data <= 8'b00111000;         end  
  235.             
  236.               switch_mode:         
  237.                                                                       begin      state <= set_mode;      lcd_rs<=1'b0;   
  238.                                                                       lcd_data <= 8'b00001110;     end  
  239.               set_mode:begin     
  240.                            state <= shift;       lcd_rs<=1'b0;   
  241.                                                                       lcd_data <= 8'b00000110;     end
  242.               shift: begin   
  243.                                                                        
  244.            state <= set_ddram1;      lcd_rs<=1'b0;   
  245.                                             lcd_data <= 8'b0001_0000;        end   
  246. set_ddram1:              
  247.           begin      state <= write_ram1;   
  248.                                                                                     lcd_rs<=1'b0;      lcd_data <= 8'b1000_0000;
  249.                                           end
  250. set_ddram2:     
  251.                                                                       begin      state <= write_ram2;   
  252.                                                                       lcd_rs<=1'b0;      lcd_data <= 8'b1100_0000;   
  253.                                                                       end  
  254. write_ram1:        
  255.            begin              
  256.                                                                         if(char_cnt <=5'd15)
  257.                                                                         begin   char_cnt <= char_cnt + 1'b1;   
  258.                                                                                                     lcd_rs<=1'b1;  lcd_data <= data_disp;
  259.                                                                                                     state <= write_ram1;  end   
  260.                                                                         else   begin   state <= set_ddram2; end        
  261.                                             end
  262. write_ram2:
  263.             begin      
  264.                                                                                     if(char_cnt <=5'd30)
  265.                                                                                     begin char_cnt <= char_cnt + 1'b1;
  266.                                                                                                                 lcd_rs<=1'b1;   lcd_data <= data_disp;
  267.                                                                                                                 state <= write_ram2;    end     
  268.                                                                                     else   begin  char_cnt <=5'd0; state <= shift;     end      
  269.                                                         end
  270. default:  state <= idle;
  271. endcase  
  272. end
  273. end
  274. always              @              (cost_lcd_in)
  275. begin
  276.                             if(              people ==              0)              begin   cost_reg0="0";
  277.                             cost_reg1="0";cost_reg2="0";cost_reg3="0"; end
  278.                                           else
  279.                             case(cost_lcd_in[7:4])//顯示金錢(qián)
  280.                                                         'd0              :              cost_reg0="0";
  281.                                                         'd1              :              cost_reg0="1";
  282.                                                         'd2              :              cost_reg0="2";
  283.                                                         'd3              :              cost_reg0="3";
  284.                                                         'd4              :              cost_reg0="4";
  285.                                                         'd5              :              cost_reg0="5";
  286.                                                         'd6              :              cost_reg0="6";
  287.                                                         'd7              :              cost_reg0="7";
  288.                                                         'd8              :              cost_reg0="8";
  289.                                                         'd9              :              cost_reg0="9";                                                      
  290.                             endcase
  291.                             case(cost_lcd_in[11:8])
  292.                                                         'd0              :              cost_reg1="0";
  293.                                                         'd1              :              cost_reg1="1";
  294.                                                         'd2              :              cost_reg1="2";
  295.                                                         'd3              :              cost_reg1="3";
  296.                                                         'd4              :              cost_reg1="4";
  297.                                                         'd5              :              cost_reg1="5";
  298.                                                         'd6              :              cost_reg1="6";
  299.                                                         'd7              :              cost_reg1="7";
  300.                                                         'd8              :              cost_reg1="8";
  301.                                                         'd9              :              cost_reg1="9";
  302.                                                       
  303.                             endcase
  304.                             case(cost_lcd_in[15:12])
  305.                                                         'd0              :              cost_reg2="0";
  306.                                                         'd1              :              cost_reg2="1";
  307.                                                         'd2              :              cost_reg2="2";
  308.                                                         'd3              :              cost_reg2="3";
  309.                                                         'd4              :              cost_reg2="4";
  310.                                                         'd5              :              cost_reg2="5";
  311.                                                         'd6              :              cost_reg2="6";
  312.                                                         'd7              :              cost_reg2="7";
  313.                                                         'd8              :              cost_reg2="8";
  314.                                                         'd9              :              cost_reg2="9";
  315.                                                       
  316.                             endcase
  317.                             case(cost_lcd_in[19:16])
  318.                                                         'd0              :              cost_reg3="0";
  319.                                                         'd1              :              cost_reg3="1";
  320.                                                         'd2              :              cost_reg3="2";
  321.                                                         'd3              :              cost_reg3="3";
  322.                                                         'd4              :              cost_reg3="4";
  323.                                                         'd5              :              cost_reg3="5";
  324.                                                         'd6              :              cost_reg3="6";
  325.                                                         'd7              :              cost_reg3="7";
  326.                                                         'd8              :              cost_reg3="8";
  327.                                                         'd9              :              cost_reg3="9";
  328.                                                       
  329.                             endcase
  330. end
  331. always @(qs or qm or qh )//實(shí)時(shí)時(shí)間
  332. begin                                         
  333.                                           case(qs[3:0])
  334.                                                         'd0              :              qsl="0";
  335.                                                         'd1              :              qsl="1";
  336.                                                         'd2              :              qsl="2";
  337.                                                         'd3              :              qsl="3";
  338.                                                         'd4              :              qsl="4";
  339.                                                         'd5              :              qsl="5";
  340.                                                         'd6              :              qsl="6";
  341.                                                         'd7              :              qsl="7";
  342.                                                         'd8              :              qsl="8";
  343.                                                         'd9              :              qsl="9";
  344.                                           endcase
  345.                                           case(qs[7:4])
  346.                                                         'd0              :              qsh="0";
  347.                                                         'd1              :              qsh="1";
  348.                                                         'd2              :              qsh="2";
  349.                                                         'd3              :              qsh="3";
  350.                                                         'd4              :              qsh="4";
  351.                                                         'd5              :              qsh="5";
  352.                                           endcase
  353.                                           case(qm[3:0])
  354.                                                         'd0              :              qml="0";
  355.                                                         'd1              :              qml="1";
  356.                                                         'd2              :              qml="2";
  357.                                                         'd3              :              qml="3";
  358.                                                         'd4              :              qml="4";
  359.                                                         'd5              :              qml="5";
  360.                                                         'd6              :              qml="6";
  361.                                                         'd7              :              qml="7";
  362.                                                         'd8              :              qml="8";
  363.                                                         'd9              :              qml="9";
  364.                                           endcase
  365.                                           case(qm[7:4])
  366.                                                         'd0              :              qmh="0";
  367.                                                         'd1              :              qmh="1";
  368.                                                         'd2              :              qmh="2";
  369.                                                         'd3              :              qmh="3";
  370.                                                         'd4              :              qmh="4";
  371.                                                         'd5              :              qmh="5";
  372.                                           endcase
  373.                                           case(qh[3:0])
  374.                                                         'd0              :              qhl="0";
  375.                                                         'd1              :              qhl="1";
  376.                                                         'd2              :              qhl="2";
  377.                                                         'd4              :              qhl="4";
  378.                                                         'd5              :              qhl="5";
  379.                                                         'd6              :              qhl="6";
  380.                                                         'd7              :              qhl="7";
  381.                                                         'd8              :              qhl="8";
  382.                                                         'd9              :              qhl="9";
  383.                                           endcase
  384.                                           case(qh[7:4])
  385.                                                         'd0              :              qhh="0";
  386.                                                         'd1              :              qhh="1";
  387.                                                         'd2              :              qhh="2";
  388.                                                         'd3              :              qhh="3";                           
  389.                                           endcase
  390. end



  391. always@( people or q2 or q3              or              q4)//公里顯示寄存
  392. begin                           
  393.          if(              people ==              0)              begin   q3l="0";q2h="0";q3h="0";q4l="00"; end
  394.                                           else
  395.                                           begin
  396.                                           case(q2[7:4])
  397.                                                         'd0              :              q2h="0";
  398.                                                         'd1              :              q2h="1";
  399.                                                         'd2              :              q2h="2";
  400.                                                         'd3              :              q2h="3";
  401.                                                         'd4              :              q2h="4";
  402.                                                         'd5              :              q2h="5";
  403.                                                         'd6              :              q2h="6";
  404.                                                         'd7              :              q2h="7";
  405.                                                         'd8              :              q2h="8";
  406.                                                         'd9              :              q2h="9";
  407.                                           endcase
  408.                                           case(q3[3:0])
  409.                                                         'd0              :              q3l="0";
  410.                                                         'd1              :              q3l="1";
  411.                                                         'd2              :              q3l="2";
  412.                                                         'd3              :              q3l="3";
  413.                                                         'd4              :              q3l="4";
  414.                                                         'd5              :              q3l="5";
  415.                                                         'd6              :              q3l="6";
  416.                                                         'd7              :              q3l="7";
  417.                                                         'd8              :              q3l="8";
  418.                                                         'd9              :              q3l="9";
  419.                                           endcase
  420.                                           case(q3[7:4])
  421.                                                         'd0              :              q3h="0";
  422.                                                         'd1              :              q3h="1";
  423.                                                         'd2              :              q3h="2";
  424.                                                         'd3              :              q3h="3";
  425.                                                         'd4              :              q3h="4";
  426.                                                         'd5              :              q3h="5";
  427.                                                         'd6              :              q3h="6";
  428.                                                         'd7              :              q3h="7";
  429.                                                         'd8              :              q3h="8";
  430.                                                         'd9              :              q3h="9";
  431.                                           endcase
  432.                                           case(q4[3:0])
  433.                                                         'd0              :              q4l="0";
  434.                                                         'd1              :              q4l="1";
  435.                                                         'd2              :              q4l="2";
  436.                                                         'd3              :              q4l="3";
  437.                                                         'd4              :              q4l="4";
  438.                                                         'd5              :              q4l="5";
  439.                                                         'd6              :              q4l="6";
  440.                                                         'd7              :              q4l="7";
  441.                                                         'd8              :              q4l="8";
  442.                                                         'd9              :              q4l="9";
  443.                                           endcase
  444.                             end
  445. end
  446. always @(in_data)//速度寄存
  447. begin            
  448.                             if(people ==              0)begin  sp_reg2 ="0";sp_reg1="0"; end
  449.                             else
  450.                             begin
  451.                             case              (in_data)                           
  452.                             4'd0 : begin  sp_reg2="0";sp_reg1="0";end
  453.                             4'd1 : begin  sp_reg2="0";sp_reg1="2";end
  454.                             4'd2 : begin  sp_reg2="0";sp_reg1="4";end
  455.                             4'd3 : begin  sp_reg2="0";sp_reg1="6";end
  456.                             4'd4 : begin  sp_reg2="0";sp_reg1="8";end
  457.                            
  458.                             4'd5 : begin  sp_reg2="1";sp_reg1="0";end
  459.                             4'd6 : begin  sp_reg2="1";sp_reg1="2";end
  460.                             4'd7 : begin  sp_reg2="1";sp_reg1="4";end
  461.                             4'd8 : begin  sp_reg2="1";sp_reg1="6";end
  462.                             4'd9 : begin  sp_reg2="1";sp_reg1="8";end
  463.                             4'd10: begin  sp_reg2="2";sp_reg1="0";end
  464.                             4'd11: begin  sp_reg2="2";sp_reg1="2";end
  465.                             4'd12: begin  sp_reg2="2";sp_reg1="4";end
  466.                             4'd13: begin  sp_reg2="2";sp_reg1="6";end
  467.                             4'd14: begin  sp_reg2="2";sp_reg1="8";end
  468.                             4'd15: begin  sp_reg2="3";sp_reg1="0";end
  469.                            
  470.                             endcase
  471.                             end

  472. end

  473. always @(char_cnt  )   //輸出的字符 有人坐車(chē)界面
  474. begin
  475. if(people)
  476.                             begin
  477.                             case (char_cnt)
  478.                             5'd0: data_disp  = qhh;
  479.                             5'd1: data_disp  = qhl;  
  480.                             5'd2: data_disp  = ":";  
  481.                             5'd3: data_disp  = qmh;  
  482.                             5'd4: data_disp  = qml;  
  483.                             5'd5: data_disp  = ":";  
  484.                             5'd6: data_disp  = qsh;  
  485.                             5'd7: data_disp  = qsl;  
  486.                             5'd8: data_disp  = " ";  
  487.                             5'd9: data_disp  = q4l;  
  488.                             5'd10: data_disp = q3h;  
  489.                             5'd11: data_disp = q3l;  
  490.                             5'd12: data_disp = ".";  
  491.                             5'd13: data_disp = q2h;  
  492.                             5'd14: data_disp = "k";  
  493.                             5'd15: data_disp = "m";
  494.                              
  495.                             5'd16: data_disp = sp_reg2;  
  496.                             5'd17: data_disp = sp_reg1;  
  497.                             5'd18: data_disp = "0";  
  498.                             5'd19: data_disp = "k";  
  499.                             5'd20: data_disp = "m";  
  500.                             5'd21: data_disp = "/";  
  501.                             5'd22: data_disp = "h";  
  502.                             5'd23: data_disp = " ";  
  503.                             5'd24: data_disp = " ";
  504.                             5'd25: data_disp = cost_reg3;
  505.                             5'd26: data_disp = cost_reg2;
  506.                             5'd27: data_disp = cost_reg1;
  507.                             5'd28: data_disp = ".";
  508.                             5'd29: data_disp = cost_reg0;
  509.                             5'd30: data_disp = "[        DISCUZ_CODE_13        ]quot;;
  510.                             5'd31: data_disp = "[        DISCUZ_CODE_13        ]quot;;
  511.                             default :   data_disp =" ";
  512.                             endcase
  513.                             end
  514.                             else    //沒(méi)人坐車(chē)
  515.                             begin
  516.                             case (char_cnt)
  517.                             5'd0: data_disp  = qhh;
  518.                             5'd1: data_disp  = qhl;  
  519.                             5'd2: data_disp  = ":";  
  520.                             5'd3: data_disp  = qmh;  
  521.                             5'd4: data_disp  = qml;  
  522.                             5'd5: data_disp  = ":";  
  523.                             5'd6: data_disp  = qsh;  
  524.                             5'd7: data_disp  = qsl;  
  525.                             5'd8: data_disp  = " ";  
  526.                             5'd9: data_disp  = " ";  
  527.                             5'd10: data_disp = " ";  
  528.                             5'd11: data_disp = " ";  
  529.                             5'd12: data_disp = " ";  
  530.                             5'd13: data_disp = " ";  
  531.                             5'd14: data_disp = " ";  
  532.                             5'd15: data_disp = " ";
  533.                              
  534.                             5'd16: data_disp = " ";  
  535.                             5'd17: data_disp = " ";  
  536.                             5'd18: data_disp = "E";  
  537.                             5'd19: data_disp = "m";  
  538.                             5'd20: data_disp = "p";  
  539.                             5'd21: data_disp = "t";  
  540.                             5'd22: data_disp = "y";  
  541.                             5'd23: data_disp = " ";  
  542.                             5'd24: data_disp = " ";
  543.                             5'd25: data_disp = "c";
  544.                             5'd26: data_disp = "a";
  545.                             5'd27: data_disp = "r";
  546.                             5'd28: data_disp = " ";
  547.                             5'd29: data_disp = " ";
  548.                             5'd30: data_disp = " ";
  549.                             5'd31: data_disp = " ";
  550.                             default :   data_disp =" ";
  551.                             endcase
  552.                             end
  553. end
  554. endmodule
復(fù)制代碼


全部資料51hei下載地址(源碼+word格式完整的設(shè)計(jì)報(bào)告):
taxi_billing.zip (9.77 MB, 下載次數(shù): 244)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:516543 發(fā)表于 2019-4-24 15:54 | 只看該作者
您好,您這有EP4CE10F17C8芯片的出租車(chē)計(jì)費(fèi)電路的設(shè)計(jì)嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:516543 發(fā)表于 2019-4-25 15:27 | 只看該作者
你好,方便告訴我一下您用的FPGA芯片是哪個(gè)嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:650653 發(fā)表于 2019-11-27 12:43 | 只看該作者
學(xué)長(zhǎng)你好,下載到實(shí)驗(yàn)箱的時(shí)候不行,需要在實(shí)驗(yàn)箱設(shè)置什么東西嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:643646 發(fā)表于 2019-11-28 12:12 | 只看該作者

老學(xué)長(zhǎng),這蜂鳴器電路是怎么實(shí)現(xiàn)的,寫(xiě)一個(gè)verilog hdl 就行了嗎,還是需要哪方面的設(shè)置呢
回復(fù)

使用道具 舉報(bào)

6#
ID:652963 發(fā)表于 2019-11-30 14:04 | 只看該作者
為什么下載到試驗(yàn)箱不行呀
回復(fù)

使用道具 舉報(bào)

7#
ID:750963 發(fā)表于 2020-5-21 22:22 | 只看該作者
大佬,仿真的tb文件是哪個(gè)啊
回復(fù)

使用道具 舉報(bào)

8#
ID:323102 發(fā)表于 2021-5-25 22:17 | 只看該作者
代碼還故意搞錯(cuò)的嗎?寫(xiě)這種代碼效率很低的代碼工作會(huì)被開(kāi)除!!硬件描述語(yǔ)言怎么能用軟件的思維來(lái)寫(xiě)?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表