名称:出租车计价器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元。
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;
源代码
扫描文章末尾的公众号二维码