課 程 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ù)器程序: - module cont60(clk,clrn,q,cout,j);
- input j,clrn,clk;
- output reg [7:0] q;
- output reg cout;
- always @( posedge clk^j or posedge clrn )
- begin
- if(clrn) q=0;
- else
- begin
- q = q+1; if(q[3:0] >= 10)
- begin q[3:0] = 0;q[7:4] = q[7:4]+1;
- if(q[7:4] >= 6) q[7:4] = 0;
- end
- if( q == 'h00 ) cout = 1;else cout = 0;
- end
- end
- endmodule
- 24進(jìn)制計(jì)數(shù)器程序:
- module cont24(clk,clrn,q,cout,j);
- input j,clk,clrn;
- output reg [7:0] q;
- output reg cout;
- always@( posedge clk^j or posedge clrn )
- begin
- if(clrn)begin q=0;cout = 0;end
- else
- begin
- q = q+1; if(q[3:0] >= 10)
- begin q[3:0] = 0; q[7:4] = q[7:4]+1;
- end
- if( q >= 'h24 )
- begin q = 0; cout = 1; end
- 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)圖 控制模塊程序: - module key(clk,
- key_up,
- gear,
- res,
- key_down,
- clk_speed,
- people);
- input res,people;
- input key_up,clk,key_down;
- output reg clk_speed;
- reg [29:0] clk_sp_reg;
- output reg[3:0]gear;
- reg [29:0]up_c,down_c,n;
- initial begin
- gear='b1000;up_c=0;down_c=0;n=0;
- clk_sp_reg=0;
- end
- always@( posedge clk or posedge res)//加速減速控制
- begin
- if(res) begin down_c=0;up_c=0;end
- else if(!people)begin up_c=0; down_c =0; end else
- begin
- if(key_up)
- begin
- up_c=up_c+1'b1;
- end
- else
- begin
- up_c=0;
- end
- if(key_down)
- begin
- down_c=down_c+1'b1;
- end
- else
- begin
- down_c=0;
- end
- end
- end
- always @(posedge clk or posedge res)//速度對(duì)應(yīng)的分頻數(shù),
- begin
- if(res) begin gear=0; end
- else if(!people)begin gear=0; clk_sp_reg=0; end else
- begin
- if(key_up ^ key_down )
- begin
- if(key_up==1)
- begin
- if(up_c==5 && gear<='b1110)//200000)
- gear=gear+1;
- if(gear>='b1111)
- gear='b1111;
- end
- if(key_down==1)
- begin
- if(down_c==5)//200000)
- if(gear=='b0)
- gear='b0;else gear=gear-1;
- end
- end
- case (gear)
- 0 : ; //速度為0
- 1 : clk_sp_reg=909;
- 2 : clk_sp_reg=454;
- 3 : clk_sp_reg=303;
- 4 : clk_sp_reg=227;
- 5 : clk_sp_reg=181;
- 6 : clk_sp_reg=151;
- 7 : clk_sp_reg=129;
- 8 : clk_sp_reg=113;
- 9 : clk_sp_reg=101;
- 10 : clk_sp_reg=90;
- 11 : clk_sp_reg=82;
- 12 : clk_sp_reg=75;
- 13 : clk_sp_reg=69;
- 14 : clk_sp_reg=64;
- 15 : clk_sp_reg=60;
- endcase
- end
- end
- always @( posedge clk or posedge res) //把20MHz分頻,產(chǎn)生相對(duì)應(yīng)速度的頻率
- begin
- if(res)begin n<=0;clk_speed<=0;end
- else if(!people)begin n<=0;clk_speed<=0; end else
- begin
- if (n>=clk_sp_reg && gear!=0)
- begin n<=0;clk_speed<=~clk_speed; end
- else
- begin n<=n+1; clk_speed<=clk_speed;end
- end
- end
- 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ì)程模塊程序: - module counter0_99(clk,clr,q,cout,people);
- input clk,clr,people;
- output reg [7:0] q;
- output reg cout;
- reg one='b1;
- initial q='h99;
- always@( posedge clk or posedge clr or negedge people )
- begin
- if(clr ) q=0;
- else
- begin if(!people) q=0;
- else
- begin
- q = q+1;
- if(q[3:0] >= 10)
- begin
- q[3:0] = 0;
- q[7:4] = q[7:4]+one;
- if(q[7:4] >= 10)
- q[7:4] = 0;
- end
- if( q == 0 )
- cout = 1;
- else
- cout = 0;
- 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è)模塊程序: - module music( clk,people, beep);
- input clk,people;
- output reg beep;
- reg flag ,flag1;
- reg[7:0] state,state1; //樂(lè)譜狀態(tài)機(jī)
- reg[16:0]count,count_end;
- reg[23:0]count1,count2; //樂(lè)譜參數(shù):D=F/2K (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率)
- parameter S_0=8'd20000000,
- L_1 = 17'd38226, M_1 = 17'd19109, H_1 = 17'd09564, //音1
- L_2 = 17'd34048, M_2 = 17'd17027, H_2 = 17'd08512, //音2
- L_3 = 17'd30339, M_3 = 17'd15167, H_3 = 17'd07584, //音3
- L_4 = 17'd28636, M_4 = 17'd14316, H_4 = 17'd07158, //音4
- L_5 = 17'd25510, M_5 = 17'd13368, H_5 = 17'd06377, //音5
- L_6 = 17'd22727, M_6 = 17'd11363, H_6 = 17'd05681, //音6
- L_7 = 17'd20247, M_7 = 17'd10123, H_7 = 17'd05062; //音7
- parameter TIME = 2400000; //控制每一個(gè)音的長(zhǎng)短(480ms)
- parameter TIME1 = 4800000; //控制每一個(gè)音的長(zhǎng)短(240ms)
- always @(posedge clk)
- begin
- if(people==0)
- begin
- flag=1; state1 =0;count2=0;
- if(flag1==1)
- begin
- count = count + 1'b1; //計(jì)數(shù)器加1
- if(count == count_end && count_end!=S_0)
- begin count = 17'h0; //計(jì)數(shù)器清零
- beep = !beep;end //輸出取反
- if(count1 < TIME) count1 = count1 + 1'b1;
- //一個(gè)節(jié)拍240mS data=F/2/ms T=2*N*Tc
- else begin count1 = 24'd0;
- if(state == 8'd127)
- begin flag = 0;state=8'd0; end
- else state = state + 1'b1;
- case(state)
- 8'd0,8'd1,8'd2,8'd3: count_end = M_5;//低音"3",4個(gè)節(jié)拍
- 8'd4,8'd5: count_end = M_3;//低音"5",持續(xù)2個(gè)節(jié)拍
- 8'd6,8'd7: count_end = M_5;//低音"6",持續(xù)2個(gè)節(jié)拍
- 8'd8,8'd9,8'd10,8'd11,
- 8'd12,8'd13,8'd14,8'd15: count_end = H_1;//高音"1",8拍
- 8'd16,8'd17,8'd18,8'd19: count_end = M_6;//中音"6",4拍
- 8'd20,8'd21,8'd22,8'd23: count_end = H_1;//高音"1",4拍
- 8'd24,8'd25,8'd26,8'd27,
- 8'd28,8'd29,8'd30,8'd31,
- 8'd32,8'd33,8'd34,8'd35: count_end = M_5;//中音"5",8拍
- 8'd36,8'd37: flag1=0;//count_end = M_1;//低音"5",2拍
- endcase
- end
- end
- end
- else
- if(people==1)
- begin
- flag1=1; state =0;count1=0;
- if(flag==1)
- begin
- count = count + 1'b1; //計(jì)數(shù)器加1
- if(count == count_end)
- begin count = 17'h0; //計(jì)數(shù)器清零
- beep = !beep;end //輸出取反
- if(count2 < TIME1) count2 = count2 + 1'b1;
- //一個(gè)節(jié)拍240mS data=F/2/ms T=2*N*Tc
- else begin count2 = 24'd0;
- if(state1 == 8'd229)
- begin flag = 0;state1=8'd0; end
- else state1 = state1 + 1'b1;
- case(state1)
- 8'd0,8'd1 : count_end = M_1;
- 8'd2,8'd3 : count_end = M_2;
- 8'd4,8'd5 : count_end = M_3;
- 8'd6,8'd7 : count_end = M_1;//
- 8'd8,8'd9 : count_end = M_6;
- 8'd10 : count_end = M_5;
- 8'd11 : count_end = M_6;
- 8'd12 : count_end = M_6;
- 8'd13,8'd14 : flag=0;//count_end = S_0;
- endcase
- end
- end
- end
- end
- 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顯示模塊程序: - module lcd1602(sys_clk ,
- sys_rstn ,
- lcd_rs ,
- lcd_rw ,
- lcd_en ,
- lcd_data ,
- in_data,
- q0,q1,q2,q3,q4,qs,qm,qh,people,
- cost_lcd_in
- ); //輸入輸出信號(hào)定義
- input [31:0] cost_lcd_in;
- input [7:0] q0,q1,q2,q3,q4,qs,qm,qh;
- input sys_clk ;//系統(tǒng)時(shí)鐘輸入
- input people, sys_rstn ;//系統(tǒng)復(fù)位信號(hào),低電平有效
- input [3:0] in_data;
- output lcd_rs ;//lcd的寄存器選擇輸出信號(hào)
- output lcd_rw ;//lcd的讀、寫(xiě)操作選擇輸出信號(hào)
- output lcd_en ;//lcd使能信號(hào)
- output [7:0] lcd_data ;//lcd的數(shù)據(jù)總線(不進(jìn)行讀操作,故為輸出)
- reg lcd_rs ;
- reg clk_div ;
- reg [7:0] q1h,q1l,q2h,q2l,q3h,q3l,q4l;
- reg [7:0] sp_reg1,sp_reg2,sp_reg3;
- reg [7:0] qsl,qsh,qml,qmh,qhl,qhh;
- reg [7:0] in_data_reg;
- reg [7:0] cost_reg0,cost_reg1,cost_reg2,cost_reg3;
- reg [17:0] delay_cnt ;
- reg [7:0] lcd_data ;
- reg [4:0] char_cnt ;
- reg [7:0] data_disp ;
- reg [9:0] state ;
- parameter
- idle = 10'b000000000, //初始狀態(tài),下一個(gè)狀態(tài)為CLEAR
- clear = 10'b000000001, //清屏
- set_function = 10'b000000010,
- switch_mode = 10'b000000100,
- set_mode = 10'b000001000,
- shift = 10'b000010000,
- //光標(biāo)、畫(huà)面位移設(shè)置:光標(biāo)向左平移一個(gè)字符位
- set_ddram1 = 10'b000100000,
- //設(shè)置DDRAM的地址:第一行起始為0x00(注意輸出時(shí)DB7一定要為1)
- set_ddram2 = 10'b001000000, //設(shè)置DDRAM的地址:第二行為0x40 write_ram1 = 10'b010000000, //數(shù)據(jù)寫(xiě)入DDRAM相應(yīng)的地址
- write_ram2 = 10'b100000000; //數(shù)據(jù)寫(xiě)入DDRAM相應(yīng)的地址
- assign lcd_rw = 1'b0; //沒(méi)有讀操作,R/W信號(hào)始終為低電平
- assign lcd_en = clk_div; //E信號(hào)出現(xiàn)高電平以及下降沿的時(shí)刻與LCD時(shí)鐘相同 always@(posedge sys_clk or posedge sys_rstn) /////分頻
- begin if(sys_rstn) begin delay_cnt<=18'd0; clk_div<=1'b0;
- end else if(delay_cnt==18'd200000)
- begin
- delay_cnt<=18'd0; clk_div<=~clk_div; end else
- begin delay_cnt<=delay_cnt+1'b1; clk_div<=clk_div;
- end end
- always@(posedge clk_div or posedge sys_rstn) //State Machine
- begin if(sys_rstn)
- begin state <= idle; lcd_data <= 8'b0; char_cnt <= 5'd0;
- lcd_rs<=1'b0;//地址\數(shù)據(jù)
- end else begin
- case(state)
- idle: begin //初始狀態(tài)
- state <= clear; lcd_data <= 8'b0; end
- clear: begin //清屏
- state <= set_function;
- lcd_rs<=1'b0;
- lcd_data <= 8'b00000001;
- end
- set_function: //功能設(shè)置(38H):8位數(shù)據(jù)接口/2行顯示/5*8點(diǎn)陣字符
- begin state <= switch_mode; lcd_rs<=1'b0;
- lcd_data <= 8'b00111000; end
- switch_mode: //顯示開(kāi)關(guān)控制(0CH):開(kāi)顯示,光標(biāo)和閃爍關(guān)閉
- begin state <= set_mode; lcd_rs<=1'b0;
- lcd_data <= 8'b00001110; end
- set_mode:begin //輸入方式設(shè)置(06H):數(shù)據(jù)讀寫(xiě)操作后,地址自動(dòng)加一/畫(huà)面不動(dòng)
- state <= shift; lcd_rs<=1'b0;
- lcd_data <= 8'b00000110; end
- shift: begin //光標(biāo)、畫(huà)面位移設(shè)置(10H):光標(biāo)向左平移一個(gè)字符位
- //(光標(biāo)顯示是關(guān)閉的,所以實(shí)際上設(shè)置是看不出效果的)
- state <= set_ddram1; lcd_rs<=1'b0;
- lcd_data <= 8'b0001_0000; end
- set_ddram1: //設(shè)置DDRAM的地址:第一行起始為00H(注意輸出時(shí)DB7一定要為1)
- begin state <= write_ram1;
- lcd_rs<=1'b0; lcd_data <= 8'b1000_0000;//Line1
- end
- set_ddram2: //設(shè)置DDRAM的地址:第二行為40H(DB7一定要為1)
- begin state <= write_ram2;
- lcd_rs<=1'b0; lcd_data <= 8'b1100_0000;//Line2
- end
- write_ram1:
- begin
- if(char_cnt <=5'd15)
- begin char_cnt <= char_cnt + 1'b1;
- lcd_rs<=1'b1; lcd_data <= data_disp;
- state <= write_ram1; end
- else begin state <= set_ddram2; end
- end
- write_ram2:
- begin
- if(char_cnt <=5'd30)
- begin char_cnt <= char_cnt + 1'b1;
- lcd_rs<=1'b1; lcd_data <= data_disp;
- state <= write_ram2; end
- else begin char_cnt <=5'd0; state <= shift; end
- end
- default: state <= idle;
- endcase
- end
- 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)模塊程序: - module counter0_99_16(
- clk,clr,cost_q,people,
- q0,q1,q2,q3,q4,qh,
- l12,l13,l14,l15
- );
- input clk,clr,people;
- output reg l12,l13,l14,l15;
- input [7:0] q0,q1,q2,q3,q4,qh;
- output reg [31:0] cost_q;
- reg [13:0] n;
- reg one='b1;
- initial n=0;
- initial cost_q='b0000_0000_0000_0000_0000_1000_0000_0000;
- always@( posedge clk or posedge clr or negedge people )
- begin
- if(clr ) begin l12=0;l13=0;l14=0;l15=0;cost_q=0;end
- else
- begin if(!people) begin l12=0;l13=0;l14=0;l15=0;
- if(qh>'b00000110)cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;
- else if(qh<='b00000110)cost_q='b0000_0000_0000_0000_0000_1000_0000_0000; end
- else
- begin
- if(qh>8'b00000110)
- begin
- if({q4,q3,q2,q0}<=32'b0000_0000_0001_0000_0000_0000_0000_0000
- && {q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000 ) begin
- //1000000電平除以160分,得出一分6250個(gè)上升沿
- if(n < 'd6250) //1.6元
- begin n=n+'d1; end
- if(n >= 'd6250)
- begin
- n<=0;
- begin
- l12=~l12;l13=0;l14=0;l15=0;
- cost_q = cost_q+1;
- if(cost_q[3:0] >= 10)
- begin cost_q[3:0] = 0;
- cost_q[7:4] = cost_q[7:4]+one;end
- if(cost_q[7:4] >= 10)
- begin cost_q[7:4] = 0;
- cost_q[11:8] = cost_q[11:8]+one;end
- if(cost_q[11:8] >= 10)
- begin cost_q[11:8] = 0;
- cost_q[15:12] = cost_q[15:12]+one;end
- if(cost_q[15:12] >= 10)
- begin cost_q[15:12] = 0;
- cost_q[19:16] = cost_q[19:16]+one;end
- if(cost_q[19:16] >= 10)
- begin cost_q[19:16] = 0;
- cost_q[23:20] = cost_q[23:20]+one;end
- if(cost_q[23:20] >= 10)
- begin cost_q[23:20] = 0;
- cost_q[27:24] = cost_q[27:24]+one;end
- if(cost_q[27:24] >= 10)
- begin cost_q[27:24] = 0;
- cost_q[31:28] = cost_q[31:28]+one;end
- end
- end
- end else
- end
- end
- end
- end
- 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
附錄總體原理圖
總仿真圖 
LCD顯示模塊程序:
- module counter0_99_16(
- clk,clr,cost_q,people,
- q0,q1,q2,q3,q4,qh,
- l12,l13,l14,l15
- );
- input clk,clr,people;
- output reg l12,l13,l14,l15;
- input [7:0] q0,q1,q2,q3,q4,qh;
- output reg [31:0] cost_q;
- reg [13:0] n;
- reg one='b1;
- initial n=0;
- initial cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;
- always@( posedge clk or posedge clr or negedge people )
- begin
- 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
- else
- begin if(!people) begin l12=0;l13=0;l14=0;l15=0;
- if(qh>'b00000110)cost_q='b0000_0000_0000_0000_0000_0111_0000_0000;
- else if(qh<='b00000110)cost_q='b0000_0000_0000_0000_0000_1000_0000_0000; end
- else
- begin
- if(qh>8'b00000110)
- begin
- if({q4,q3,q2,q0}<=32'b0000_0000_0001_0000_0000_0000_0000_0000
- && {q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000 ) begin//1000000電平除以160分,得出一分6250個(gè)上升沿
- if(n < 'd6250) //1.6元
- begin n=n+'d1; end
- if(n >= 'd6250)
- begin
- n<=0;
- begin
- l12=~l12;l13=0;l14=0;l15=0;
- cost_q = cost_q+1;
- if(cost_q[3:0] >= 10)
- begin cost_q[3:0] = 0;
- cost_q[7:4] = cost_q[7:4]+one;end
-
- if(cost_q[7:4] >= 10)
- begin cost_q[7:4] = 0;
- cost_q[11:8] = cost_q[11:8]+one;end
- if(cost_q[11:8] >= 10)
- begin cost_q[11:8] = 0;
- cost_q[15:12] = cost_q[15:12]+one;end
-
- if(cost_q[15:12] >= 10)
- begin cost_q[15:12] = 0;
- cost_q[19:16] = cost_q[19:16]+one;end
- if(cost_q[19:16] >= 10)
- begin cost_q[19:16] = 0;
- cost_q[23:20] = cost_q[23:20]+one;end
-
- if(cost_q[23:20] >= 10)
- begin cost_q[23:20] = 0;
- cost_q[27:24] = cost_q[27:24]+one;end
- if(cost_q[27:24] >= 10)
- begin cost_q[27:24] = 0;
- cost_q[31:28] = cost_q[31:28]+one;end
- end
- end
- end else
- if({q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000)
- begin//////////////2.4元
- if(n < 'd4166)
- begin n=n+'d1; end
- if(n >= 'd4166)
- begin
- n<=0;
- begin
- l12=0;l13=~l13;l14=0;l15=0;
- cost_q = cost_q+1;
- if(cost_q[3:0] >= 10)
- begin cost_q[3:0] = 0;
- cost_q[7:4] = cost_q[7:4]+one;end
-
- if(cost_q[7:4] >= 10)
- begin cost_q[7:4] = 0;
- cost_q[11:8] = cost_q[11:8]+one;end
- if(cost_q[11:8] >= 10)
- begin cost_q[11:8] = 0;
- cost_q[15:12] = cost_q[15:12]+one;end
-
- if(cost_q[15:12] >= 10)
- begin cost_q[15:12] = 0;
- cost_q[19:16] = cost_q[19:16]+one;end
- if(cost_q[19:16] >= 10)
- begin cost_q[19:16] = 0;
- cost_q[23:20] = cost_q[23:20]+one;end
- end
- end
- end
- else;
- end else
- if(qh<=8'b00000110)
- begin
- if({q4,q3,q2,q0}<=32'b0000_0000_0001_0000_0000_0000_0000_0000
- && {q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000)
- begin//////////////20
- if(n < 'd5000)
- begin n=n+'d1; end
- if(n>= 'd5000)
- begin
- n<=0;
- begin
- l12=0;l13=0;l14=~l14;l15=0;
- cost_q = cost_q+1;
- if(cost_q[3:0] >= 10)
- begin cost_q[3:0] = 0;
- cost_q[7:4] = cost_q[7:4]+one;end
-
- if(cost_q[7:4] >= 10)
- begin cost_q[7:4] = 0;
- cost_q[11:8] = cost_q[11:8]+one;end
- if(cost_q[11:8] >= 10)
- begin cost_q[11:8] = 0;
- cost_q[15:12] = cost_q[15:12]+one;end
-
- if(cost_q[15:12] >= 10)
- begin cost_q[15:12] = 0;
- cost_q[19:16] = cost_q[19:16]+one;end
- if(cost_q[19:16] >= 10)
- begin cost_q[19:16] = 0;
- cost_q[23:20] = cost_q[23:20]+one;end
- end
- end
- end else
- if({q4,q3,q2,q0}>32'b0000_0000_0000_0010_0000_0000_0000_0000)
- begin//////////////30
- if(n < 'd3333)
- begin n=n+'d1; end
- if(n >= 'd3333)
- begin
- n<=0;
- begin
- l12=0;l13=0;l14=0;l15=~l15;
- cost_q = cost_q+1;
- if(cost_q[3:0] >= 10)
- begin cost_q[3:0] = 0;
- cost_q[7:4] = cost_q[7:4]+one;end
-
- if(cost_q[7:4] >= 10)
- begin cost_q[7:4] = 0;
- cost_q[11:8] = cost_q[11:8]+one;end
- if(cost_q[11:8] >= 10)
- begin cost_q[11:8] = 0;
- cost_q[15:12] = cost_q[15:12]+one;end
-
- if(cost_q[15:12] >= 10)
- begin cost_q[15:12] = 0;
- cost_q[19:16] = cost_q[19:16]+one;end
- if(cost_q[19:16] >= 10)
- begin cost_q[19:16] = 0;
- cost_q[23:20] = cost_q[23:20]+one;end
- end
- end
- end
- else;
- end
- end
- end
- end
- endmodule
-
- 計(jì)費(fèi)器模塊程序:
- module lcd1602(sys_clk ,
- sys_rstn ,
- lcd_rs ,
- lcd_rw ,
- lcd_en ,
- lcd_data ,
- in_data,
- q0,q1,q2,q3,q4,qs,qm,qh,people,
- cost_lcd_in
- );
- input [31:0] cost_lcd_in;
- input [7:0] q0,q1,q2,q3,q4,qs,qm,qh;
- input sys_clk ;
- input people, sys_rstn ;
- input [3:0] in_data;
- output lcd_rs ;
- output lcd_rw ;
- output lcd_en ;
- output [7:0] lcd_data ;
- reg lcd_rs ;
- reg clk_div ;
- reg [7:0] q1h,q1l,q2h,q3h,q3l,q4l;
- reg [7:0] sp_reg1,sp_reg2,sp_reg3;
- reg [7:0] qsl,qsh,qml,qmh,qhl,qhh;
- reg [7:0] in_data_reg;
- reg [7:0] cost_reg0,cost_reg1,cost_reg2,cost_reg3;
- reg [17:0] delay_cnt ;
- reg [7:0] lcd_data ;
- reg [4:0] char_cnt ;
- reg [7:0] data_disp ;
- reg [9:0] state ;
- parameter
- idle = 10'b000000000,
- clear = 10'b000000001,
- set_function = 10'b000000010,
- switch_mode = 10'b000000100,
- set_mode = 10'b000001000,
- shift = 10'b000010000,
-
- set_ddram1 = 10'b000100000,
-
- set_ddram2 = 10'b001000000,
- write_ram1 = 10'b010000000,
- write_ram2 = 10'b100000000;
- assign lcd_rw = 1'b0;
- assign lcd_en = clk_div;
- always@(posedge sys_clk or posedge sys_rstn)
- begin if(sys_rstn) begin delay_cnt<=18'd0; clk_div<=1'b0;
- end else if(delay_cnt==18'd200000)
- begin
- delay_cnt<=18'd0; clk_div<=~clk_div; end else
- begin delay_cnt<=delay_cnt+1'b1; clk_div<=clk_div;
- end end
-
-
- always@(posedge clk_div or posedge sys_rstn)
- begin if(sys_rstn)
- begin state <= idle; lcd_data <= 8'b0; char_cnt <= 5'd0;
- lcd_rs<=1'b0;
- end else begin
-
- case(state)
-
- idle: begin
- state <= clear; lcd_data <= 8'b0; end
-
- clear: begin
- state <= set_function;
- lcd_rs<=1'b0;
- lcd_data <= 8'b00000001;
- end
- set_function:
- begin state <= switch_mode; lcd_rs<=1'b0;
- lcd_data <= 8'b00111000; end
-
- switch_mode:
- begin state <= set_mode; lcd_rs<=1'b0;
- lcd_data <= 8'b00001110; end
- set_mode:begin
- state <= shift; lcd_rs<=1'b0;
- lcd_data <= 8'b00000110; end
- shift: begin
-
- state <= set_ddram1; lcd_rs<=1'b0;
- lcd_data <= 8'b0001_0000; end
- set_ddram1:
- begin state <= write_ram1;
- lcd_rs<=1'b0; lcd_data <= 8'b1000_0000;
- end
- set_ddram2:
- begin state <= write_ram2;
- lcd_rs<=1'b0; lcd_data <= 8'b1100_0000;
- end
- write_ram1:
- begin
- if(char_cnt <=5'd15)
- begin char_cnt <= char_cnt + 1'b1;
- lcd_rs<=1'b1; lcd_data <= data_disp;
- state <= write_ram1; end
- else begin state <= set_ddram2; end
- end
- write_ram2:
- begin
- if(char_cnt <=5'd30)
- begin char_cnt <= char_cnt + 1'b1;
- lcd_rs<=1'b1; lcd_data <= data_disp;
- state <= write_ram2; end
- else begin char_cnt <=5'd0; state <= shift; end
- end
- default: state <= idle;
- endcase
- end
- end
- always @ (cost_lcd_in)
- begin
- if( people == 0) begin cost_reg0="0";
- cost_reg1="0";cost_reg2="0";cost_reg3="0"; end
- else
- case(cost_lcd_in[7:4])//顯示金錢(qián)
- 'd0 : cost_reg0="0";
- 'd1 : cost_reg0="1";
- 'd2 : cost_reg0="2";
- 'd3 : cost_reg0="3";
- 'd4 : cost_reg0="4";
- 'd5 : cost_reg0="5";
- 'd6 : cost_reg0="6";
- 'd7 : cost_reg0="7";
- 'd8 : cost_reg0="8";
- 'd9 : cost_reg0="9";
- endcase
- case(cost_lcd_in[11:8])
- 'd0 : cost_reg1="0";
- 'd1 : cost_reg1="1";
- 'd2 : cost_reg1="2";
- 'd3 : cost_reg1="3";
- 'd4 : cost_reg1="4";
- 'd5 : cost_reg1="5";
- 'd6 : cost_reg1="6";
- 'd7 : cost_reg1="7";
- 'd8 : cost_reg1="8";
- 'd9 : cost_reg1="9";
-
- endcase
- case(cost_lcd_in[15:12])
- 'd0 : cost_reg2="0";
- 'd1 : cost_reg2="1";
- 'd2 : cost_reg2="2";
- 'd3 : cost_reg2="3";
- 'd4 : cost_reg2="4";
- 'd5 : cost_reg2="5";
- 'd6 : cost_reg2="6";
- 'd7 : cost_reg2="7";
- 'd8 : cost_reg2="8";
- 'd9 : cost_reg2="9";
-
- endcase
- case(cost_lcd_in[19:16])
- 'd0 : cost_reg3="0";
- 'd1 : cost_reg3="1";
- 'd2 : cost_reg3="2";
- 'd3 : cost_reg3="3";
- 'd4 : cost_reg3="4";
- 'd5 : cost_reg3="5";
- 'd6 : cost_reg3="6";
- 'd7 : cost_reg3="7";
- 'd8 : cost_reg3="8";
- 'd9 : cost_reg3="9";
-
- endcase
- end
- always @(qs or qm or qh )//實(shí)時(shí)時(shí)間
- begin
- case(qs[3:0])
- 'd0 : qsl="0";
- 'd1 : qsl="1";
- 'd2 : qsl="2";
- 'd3 : qsl="3";
- 'd4 : qsl="4";
- 'd5 : qsl="5";
- 'd6 : qsl="6";
- 'd7 : qsl="7";
- 'd8 : qsl="8";
- 'd9 : qsl="9";
- endcase
- case(qs[7:4])
- 'd0 : qsh="0";
- 'd1 : qsh="1";
- 'd2 : qsh="2";
- 'd3 : qsh="3";
- 'd4 : qsh="4";
- 'd5 : qsh="5";
- endcase
- case(qm[3:0])
- 'd0 : qml="0";
- 'd1 : qml="1";
- 'd2 : qml="2";
- 'd3 : qml="3";
- 'd4 : qml="4";
- 'd5 : qml="5";
- 'd6 : qml="6";
- 'd7 : qml="7";
- 'd8 : qml="8";
- 'd9 : qml="9";
- endcase
- case(qm[7:4])
- 'd0 : qmh="0";
- 'd1 : qmh="1";
- 'd2 : qmh="2";
- 'd3 : qmh="3";
- 'd4 : qmh="4";
- 'd5 : qmh="5";
- endcase
- case(qh[3:0])
- 'd0 : qhl="0";
- 'd1 : qhl="1";
- 'd2 : qhl="2";
- 'd4 : qhl="4";
- 'd5 : qhl="5";
- 'd6 : qhl="6";
- 'd7 : qhl="7";
- 'd8 : qhl="8";
- 'd9 : qhl="9";
- endcase
- case(qh[7:4])
- 'd0 : qhh="0";
- 'd1 : qhh="1";
- 'd2 : qhh="2";
- 'd3 : qhh="3";
- endcase
- end
-
-
-
- always@( people or q2 or q3 or q4)//公里顯示寄存
- begin
- if( people == 0) begin q3l="0";q2h="0";q3h="0";q4l="00"; end
- else
- begin
- case(q2[7:4])
- 'd0 : q2h="0";
- 'd1 : q2h="1";
- 'd2 : q2h="2";
- 'd3 : q2h="3";
- 'd4 : q2h="4";
- 'd5 : q2h="5";
- 'd6 : q2h="6";
- 'd7 : q2h="7";
- 'd8 : q2h="8";
- 'd9 : q2h="9";
- endcase
- case(q3[3:0])
- 'd0 : q3l="0";
- 'd1 : q3l="1";
- 'd2 : q3l="2";
- 'd3 : q3l="3";
- 'd4 : q3l="4";
- 'd5 : q3l="5";
- 'd6 : q3l="6";
- 'd7 : q3l="7";
- 'd8 : q3l="8";
- 'd9 : q3l="9";
- endcase
- case(q3[7:4])
- 'd0 : q3h="0";
- 'd1 : q3h="1";
- 'd2 : q3h="2";
- 'd3 : q3h="3";
- 'd4 : q3h="4";
- 'd5 : q3h="5";
- 'd6 : q3h="6";
- 'd7 : q3h="7";
- 'd8 : q3h="8";
- 'd9 : q3h="9";
- endcase
- case(q4[3:0])
- 'd0 : q4l="0";
- 'd1 : q4l="1";
- 'd2 : q4l="2";
- 'd3 : q4l="3";
- 'd4 : q4l="4";
- 'd5 : q4l="5";
- 'd6 : q4l="6";
- 'd7 : q4l="7";
- 'd8 : q4l="8";
- 'd9 : q4l="9";
- endcase
- end
- end
- always @(in_data)//速度寄存
- begin
- if(people == 0)begin sp_reg2 ="0";sp_reg1="0"; end
- else
- begin
- case (in_data)
- 4'd0 : begin sp_reg2="0";sp_reg1="0";end
- 4'd1 : begin sp_reg2="0";sp_reg1="2";end
- 4'd2 : begin sp_reg2="0";sp_reg1="4";end
- 4'd3 : begin sp_reg2="0";sp_reg1="6";end
- 4'd4 : begin sp_reg2="0";sp_reg1="8";end
-
- 4'd5 : begin sp_reg2="1";sp_reg1="0";end
- 4'd6 : begin sp_reg2="1";sp_reg1="2";end
- 4'd7 : begin sp_reg2="1";sp_reg1="4";end
- 4'd8 : begin sp_reg2="1";sp_reg1="6";end
- 4'd9 : begin sp_reg2="1";sp_reg1="8";end
- 4'd10: begin sp_reg2="2";sp_reg1="0";end
- 4'd11: begin sp_reg2="2";sp_reg1="2";end
- 4'd12: begin sp_reg2="2";sp_reg1="4";end
- 4'd13: begin sp_reg2="2";sp_reg1="6";end
- 4'd14: begin sp_reg2="2";sp_reg1="8";end
- 4'd15: begin sp_reg2="3";sp_reg1="0";end
-
- endcase
- end
-
- end
-
- always @(char_cnt ) //輸出的字符 有人坐車(chē)界面
- begin
- if(people)
- begin
- case (char_cnt)
- 5'd0: data_disp = qhh;
- 5'd1: data_disp = qhl;
- 5'd2: data_disp = ":";
- 5'd3: data_disp = qmh;
- 5'd4: data_disp = qml;
- 5'd5: data_disp = ":";
- 5'd6: data_disp = qsh;
- 5'd7: data_disp = qsl;
- 5'd8: data_disp = " ";
- 5'd9: data_disp = q4l;
- 5'd10: data_disp = q3h;
- 5'd11: data_disp = q3l;
- 5'd12: data_disp = ".";
- 5'd13: data_disp = q2h;
- 5'd14: data_disp = "k";
- 5'd15: data_disp = "m";
-
- 5'd16: data_disp = sp_reg2;
- 5'd17: data_disp = sp_reg1;
- 5'd18: data_disp = "0";
- 5'd19: data_disp = "k";
- 5'd20: data_disp = "m";
- 5'd21: data_disp = "/";
- 5'd22: data_disp = "h";
- 5'd23: data_disp = " ";
- 5'd24: data_disp = " ";
- 5'd25: data_disp = cost_reg3;
- 5'd26: data_disp = cost_reg2;
- 5'd27: data_disp = cost_reg1;
- 5'd28: data_disp = ".";
- 5'd29: data_disp = cost_reg0;
- 5'd30: data_disp = "[ DISCUZ_CODE_13 ]quot;;
- 5'd31: data_disp = "[ DISCUZ_CODE_13 ]quot;;
- default : data_disp =" ";
- endcase
- end
- else //沒(méi)人坐車(chē)
- begin
- case (char_cnt)
- 5'd0: data_disp = qhh;
- 5'd1: data_disp = qhl;
- 5'd2: data_disp = ":";
- 5'd3: data_disp = qmh;
- 5'd4: data_disp = qml;
- 5'd5: data_disp = ":";
- 5'd6: data_disp = qsh;
- 5'd7: data_disp = qsl;
- 5'd8: data_disp = " ";
- 5'd9: data_disp = " ";
- 5'd10: data_disp = " ";
- 5'd11: data_disp = " ";
- 5'd12: data_disp = " ";
- 5'd13: data_disp = " ";
- 5'd14: data_disp = " ";
- 5'd15: data_disp = " ";
-
- 5'd16: data_disp = " ";
- 5'd17: data_disp = " ";
- 5'd18: data_disp = "E";
- 5'd19: data_disp = "m";
- 5'd20: data_disp = "p";
- 5'd21: data_disp = "t";
- 5'd22: data_disp = "y";
- 5'd23: data_disp = " ";
- 5'd24: data_disp = " ";
- 5'd25: data_disp = "c";
- 5'd26: data_disp = "a";
- 5'd27: data_disp = "r";
- 5'd28: data_disp = " ";
- 5'd29: data_disp = " ";
- 5'd30: data_disp = " ";
- 5'd31: data_disp = " ";
- default : data_disp =" ";
- endcase
- end
- end
- endmodule
-
復(fù)制代碼
0.png (13.26 KB, 下載次數(shù): 88)
下載附件
2018-11-17 15:58 上傳
全部資料51hei下載地址(源碼+word格式完整的設(shè)計(jì)報(bào)告):
taxi_billing.zip
(9.77 MB, 下載次數(shù): 244)
2018-11-17 10:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|