名称:出租车计价器VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
要求:
1.该出租车计价器,计费包括起步价、等待时间计费、里程计费、燃油附加费四部分。
2.白天计价模式:起步价为90元,3km之内按起步价计费,超过3km,每km增加2元,等待时间单价为每分钟0.1元,燃油附加费2.0元。
3.夜晚计价模式:起步价为10.0元,3km之内按起步价计费,超过3km,每km增加2元,等待时间单价为每分钟0.1元,燃油附加费20元。
4.用两位数码管显示总里程,最大值为99km,用两位数码管显示等待时间,最大值为59min,用四个数码管显示总费用,最大值为9999元。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
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;--输入时钟50MHZ reset:in?std_logic;--复位信号,低电平复位 key_on:in?std_logic;--开始计费按键 key_off:in?std_logic;--停止计费按键 key_kong:in?std_logic;--空档按键 key_up:in?std_logic;--空档按键 moshi:in?std_logic;-- key_start:out??std_logic;--开始计费信号 key_stop?:out??std_logic;--停止计费信号 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;?--定义标准逻辑位矢量数据类型 ?VARIABLE??Q2??:integer?range?0?to?500000;?--定义标准逻辑位矢量数据类型 ?VARIABLE??Q3??:integer?range?0?to?50000000;?--定义标准逻辑位矢量数据类型 ??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)????--敏感信号发生变化时,启动进程 variable?keyflag:std_logic:='0'; begin if?reset='0'then--复位清零 spp<="000";--速度清0 keyflag:='0'; key_start<='0'; key_stop<='0'; bai<='1'; elsif?CLK100HZ'event?and?CLK100HZ='1'then--时钟上升沿到达时,状态转换 if(key="11111")thenkeyflag:='0';?end?if; ?if(keyflag='0')then? if(key_on='0')then?--开始计费 keyflag:='1';--保持按键按下标志 key_start<='1';--开始计费 key_stop<='0';spp<="001"; elsif(key_off='0')then?--停止计费 keyflag:='1';--保持按键按下标志 key_start<='0';--? key_stop<='1';--停止计费 elsIF(key_kong='0')then?--空档按下 keyflag:='1';--保持按键按下标志 spp<="000";--速度清0 elsIF(key_up='0')then?-- keyflag:='1';--保持按键按下标志 spp<="001";-- elsif(moshi='0')then--白天夜间模式切换 keyflag:='1';--保持按键按下标志 bai<=NOT?bai; end?if; end?if; end?if; sp?<=spp; mode?<=bai; end?process; end?rtl;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=444