1? 系統(tǒng)設(shè)計
1.1 設(shè)計要求
1.1.1 設(shè)計任務(wù)
設(shè)計并制作一臺出租車計費器。
1.1.2 性能指標(biāo)要求
① 用EDA實訓(xùn)儀的I/O設(shè)備和FPGA實現(xiàn)出租車計費器的設(shè)計。
② 出租車起步開始計程和計費,計程系統(tǒng)按實際公里數(shù)計程,計費系統(tǒng)首先顯示起步價(如7.0),車行駛2km以內(nèi),只收起步價7元。
③ 出租車行駛超過2km后,按每公里1.6元在7.0元的基礎(chǔ)上增加。
④ 出租車行駛超過10km后(或超過20元路費),每公里加收50%的車費,即車費變?yōu)槊抗?.4元。
⑤ 出租車達(dá)到目的地后,(用一個按鈕)計程和計費數(shù)據(jù)清零,為下一次計費開始。
1.2 設(shè)計思路及設(shè)計框圖
1.2.1設(shè)計思路
計程和計費都是十進(jìn)制位的輸入,通過脈沖實現(xiàn)計數(shù)。計程通過分頻器的輸出作為輸入,產(chǎn)生的秒脈沖以實現(xiàn)計數(shù)功能。計費在LED數(shù)碼管上分為個位十位(例如起步價為7元,顯示器上顯示70,三公里時為86......),計程器和計費器在一個程序內(nèi)完成,分頻器用另一個程序完成,并將程序都生成一個元器件,用圖形法級聯(lián)在一起。上硬件仿真后,打開開關(guān)輸入脈沖,通過上升沿觸發(fā)使路程計算加一,并使總路計算模塊加一,到達(dá)相應(yīng)的公里數(shù)后沒每公里收費也隨之改變。
1.2.2總體設(shè)計框圖
2.1 總體電路圖
2.2 分頻器模塊
module? fpq_(clk,KS,clk_1s);
input? clk,KS;
output? reg? clk_1s;
reg[26:0]? qs;
always??? @(posedge?? clk)
if(KS==1)
begin
if(qs==49999999)????? qs=0;
else?? qs=qs+1;
if(qs==24999999)?? clk_1s=0;
else? clk_1s=1;
end
endmodule
分頻器
2.3計程計費器模塊
module CZCJFQ(clk,clrn,clk2,L1,L2,L3,L4,L5,L6);
input? clk,clrn,clk2;
output L1,L2,L3,L4,L5,L6;
wire[15:0] Q;
reg[7:0]? km;
reg[11:0]? ZJ;
reg? clk1;
reg [6:0] L1,L2,L3,L4,L5,L6;
initial??? clk1=1;
always? @(posedge?? clk^clk2?? or? negedge?? clrn)
begin
if(~clrn)?? km[3:0]=0;
else?? begin
if(km[3:0]==9)?? km[3:0]=0;
else? km[3:0]=km[3:0]+1;
if(km[3:0]==9)? clk1=0;
else?? clk1=1;
end
end
always? @(posedge? clk1 or? negedge? clrn)
begin
if(~clrn)???? km[7:4]=0;
else? begin
if( km[7:4]==9)?? km[7:4]=0;
else? km[7:4]= km[7:4]+1;
end
end
initial?? ZJ[11:0]=70;
always?? @(posedge? clk^clk2? or? negedge?? clrn)
begin
if(~clrn) ZJ[11:0]=70;
else?? begin
if(ZJ[11:0]>9999)?? ZJ[11:0]=70;
else? if(km[7:0]>'h9)?? ZJ[11:0]=ZJ[11:0]+24;
else? if(km[7:0]>'h1)?? ZJ[11:0]=ZJ[11:0]+16;
else? ZJ[11:0]=ZJ[11:0];
end
end
assign{Q[3:0]}={ZJ[11:0]}%10;
assign{Q[7:4]}={ZJ[11:0]}/10%10;
assign{Q[11:8]}={ZJ[11:0]}/100%10;
assign{Q[15:12]}={ZJ[11:0]}/1000;
路程計費器模塊
2.4 組合邏輯模塊(部分)
always@ (Q[0],Q[1],Q[2],Q[3])
begin
case ({Q[3],Q[2],Q[1],Q[0]})
4'B0000:L1=7'B1000000;
4'B0001:L1=7'B1111001;
4'B0010:L1=7'B0100100;
4'B0011:L1=7'B0110000;
4'B0100:L1=7'B0011001;
4'B0101:L1=7'B0010010;
4'B0110:L1=7'B0000010;
4'B0111:L1=7'B1111000;
4'B1000:L1=7'B0000000;
4'B1001:L1=7'B0010000;
4'B1010:L1=7'B0001000;
4'B1011:L1=7'B0000011;
4'B1100:L1=7'B1000110;
4'B1101:L1=7'B0100001;
4'B1110:L1=7'B0000110;
4'B1111:L1=7'B0001110;
endcase
end
always@ (Q[4],Q[5],Q[6],Q[7])
begin
case ({Q[7],Q[6],Q[5],Q[4]})
4'B0000:L2=7'B1000000;
4'B0001:L2=7'B1111001;
4'B0010:L2=7'B0100100;
4'B0011:L2=7'B0110000;
4'B0100:L2=7'B0011001;
4'B0101:L2=7'B0010010;
4'B0110:L2=7'B0000010;
4'B0111:L2=7'B1111000;
4'B1000:L2=7'B0000000;
4'B1001:L2=7'B0010000;
4'B1010:L2=7'B0001000;
4'B1011:L2=7'B0000011;
4'B1100:L2=7'B1000110;
4'B1101:L2=7'B0100001;
4'B1110:L2=7'B0000110;
4'B1111:L2=7'B0001110;
endcase
end
.......
3? 調(diào)試過程
在編程代碼和編譯過程經(jīng)常出現(xiàn)問題,尤其是always@(*)語句上經(jīng)常出錯,以及在下載到硬件仿真的時候LED數(shù)碼管沒有反應(yīng),在向老師求助答疑后加入了些組合邏輯模塊,修改過后的程序能正常編譯,之后將程序下載到硬件中,打開開關(guān)檢查路程計算能正常運行,路程計費計算功能正常,可以達(dá)到驗收標(biāo)準(zhǔn)。
4? 功能測試
4.1 測試儀器與設(shè)備
計算機(jī)一臺
EDA實訓(xùn)儀
4.2 性能指標(biāo)測試
打開開關(guān)后輸入脈沖可產(chǎn)生路程計算,隨著路程的遞增費用也按要求遞增,按下按鍵后數(shù)據(jù)可清零,也可以通過按下按鍵自行增加路程。
仿真波形圖(部分模塊)
需要全部資料可在我的資源里下載,包括程序文檔、源程序。
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
紛傳?點擊用微信打開即可,過程有點繁瑣請見諒