名稱:出租車計(jì)價(jià)器VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
要求:
1.該出租車計(jì)價(jià)器,計(jì)費(fèi)包括起步價(jià)、等待時(shí)間計(jì)費(fèi)、里程計(jì)費(fèi)、燃油附加費(fèi)四部分。
2.白天計(jì)價(jià)模式:起步價(jià)為90元,3km之內(nèi)按起步價(jià)計(jì)費(fèi),超過3km,每km增加2元,等待時(shí)間單價(jià)為每分鐘0.1元,燃油附加費(fèi)2.0元。
3.夜晚計(jì)價(jià)模式:起步價(jià)為10.0元,3km之內(nèi)按起步價(jià)計(jì)費(fèi),超過3km,每km增加2元,等待時(shí)間單價(jià)為每分鐘0.1元,燃油附加費(fèi)20元。
4.用兩位數(shù)碼管顯示總里程,最大值為99km,用兩位數(shù)碼管顯示等待時(shí)間,最大值為59min,用四個(gè)數(shù)碼管顯示總費(fèi)用,最大值為9999元。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
頂層電路
3. 程序編譯
4. RTL圖
5. 仿真圖
頂層
Keyin模塊
Speed模塊
Times模塊
Kmmoney模塊
部分代碼展示:
library?ieee;?--加載庫文件 use?ieee.std_logic_1164.all; use?ieee.std_logic_unsigned.all; entity?keyin?is port(?????????????--定義輸入輸出端口 clk50MHZ??:in?std_logic;--輸入時(shí)鐘50MHZ reset:in?std_logic;--復(fù)位信號,低電平復(fù)位 key_on:in?std_logic;--開始計(jì)費(fèi)按鍵 key_off:in?std_logic;--停止計(jì)費(fèi)按鍵 key_kong:in?std_logic;--空檔按鍵 key_up:in?std_logic;--空檔按鍵 moshi:in?std_logic;-- key_start:out??std_logic;--開始計(jì)費(fèi)信號 key_stop?:out??std_logic;--停止計(jì)費(fèi)信號 sp???:out?std_logic_vector(2?downto?0);?--檔位,key_speed0,空,加減檔 ????????clk_1khz_out:out??std_logic; ????????clk_1hz_out:out??std_logic; ????????mode?:out??std_logic ); end??; architecture?rtl?of?keyin?is signal?spp??:?std_logic_vector(2?downto?0):="000"; signal?CLK100HZ,CLK1kHZ,CLK1HZ:std_logic; signal?key?:std_logic_vector(4?downto?0); signal?bai:std_logic; begin key<=key_on?&?key_off?&?key_kong?&?key_up?&?moshi?; ----------------分頻程序---------------------------- PROCESS(clk50MHZ,reset) ?VARIABLE??Q1??:integer?range?0?to?500000;?--定義標(biāo)準(zhǔn)邏輯位矢量數(shù)據(jù)類型 ?VARIABLE??Q2??:integer?range?0?to?500000;?--定義標(biāo)準(zhǔn)邏輯位矢量數(shù)據(jù)類型 ?VARIABLE??Q3??:integer?range?0?to?50000000;?--定義標(biāo)準(zhǔn)邏輯位矢量數(shù)據(jù)類型 ??BEGIN???? ??if?reset='0'then CLK100HZ<='0'; CLK1kHZ<='0'; CLK1HZ<='0'; Q1?:=0; Q2?:=0; Q3?:=0; ??ELSIF??RISING_EDGE(clk50MHZ)?THEN?? ???IF?Q1>=9?--50?000?000?/((249+1)*2)=100??HZ50m/100=x,x/2-1=??249999 then?Q1?:=0; CLK100HZ<=NOT?CLK100HZ;--10ms ELSE Q1?:=?Q1?+?1?; ???END?IF; ???IF?Q2>=2??--50?000?000?/100x,x/2-1??HZ??24999 then?Q2?:=0; CLK1kHZ<=NOT?CLK1kHZ;--1ms ELSE Q2?:=?Q2?+?1?; ???END?IF; ??????IF?Q3>=24??--50?000?000?/((24999+1)*2)=1??HZ??24999999 then?Q3?:=0; CLK1HZ<=NOT?CLK1HZ;--1s ELSE Q3?:=?Q3?+?1?; ???END?IF; ????END?IF; ?????clk_1hz_out<=CLK1HZ; ?clk_1khz_out<=CLK1kHZ; ?END?PROCESS;? --------------------------------------------------- process(CLK100HZ,reset)????--敏感信號發(fā)生變化時(shí),啟動(dòng)進(jìn)程 variable?keyflag:std_logic:='0'; begin if?reset='0'then--復(fù)位清零 spp<="000";--速度清0 keyflag:='0'; key_start<='0'; key_stop<='0'; bai<='1'; elsif?CLK100HZ'event?and?CLK100HZ='1'then--時(shí)鐘上升沿到達(dá)時(shí),狀態(tài)轉(zhuǎn)換 if(key="11111")thenkeyflag:='0';?end?if; ?if(keyflag='0')then? if(key_on='0')then?--開始計(jì)費(fèi) keyflag:='1';--保持按鍵按下標(biāo)志 key_start<='1';--開始計(jì)費(fèi) key_stop<='0';spp<="001"; elsif(key_off='0')then?--停止計(jì)費(fèi) keyflag:='1';--保持按鍵按下標(biāo)志 key_start<='0';--? key_stop<='1';--停止計(jì)費(fèi) elsIF(key_kong='0')then?--空檔按下 keyflag:='1';--保持按鍵按下標(biāo)志 spp<="000";--速度清0 elsIF(key_up='0')then?-- keyflag:='1';--保持按鍵按下標(biāo)志 spp<="001";-- elsif(moshi='0')then--白天夜間模式切換 keyflag:='1';--保持按鍵按下標(biāo)志 bai<=NOT?bai; end?if; end?if; end?if; sp?<=spp; mode?<=bai; end?process; end?rtl;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=444