名称:Quartus出租车计费系统VHDL代码
软件:Quartus
语言:VHDL
代码功能:
出租车计费系统设计。
设计要求:
设计一个模拟出租车计费的电路系统,具有以下:
(1)能实现计费功能,计费标准为:按行驶路程收费,起步价为11元,并在车行3公里(3km)后按2元/公里收费。当总费用达到或超过40元时每公里收费4元。当遇到红绿灯或客户有事需要停车等待时,则按时间收费,计费单价为每20s收费。
(2)实现预置功能:能预置起步费、每公里收车行加费里程、计时收费。
(3)实现模拟功能:能模拟汽车行驶、停止和暂停等状态。
(4)将路程和车费显示出来,以十进制BCD码方式输出信号。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
代码
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
速度控制模块
状态机控制模块
显示模块
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --状态机控制模块 ENTITY taxi_state IS PORT ( clk_in : IN STD_LOGIC;--时钟100Hz reset_n : IN STD_LOGIC;--复位信号 start_n : IN STD_LOGIC;--启动信号,行程开始 stop_n : IN STD_LOGIC;--中途暂停 pulse_kilometre : IN STD_LOGIC;--1公里产生一次脉冲 mileage_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);--里程 totel_money_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)--合计费用 ); END taxi_state; ARCHITECTURE behave OF taxi_state IS --定义状态 TYPE State_type IS (s_idle, s_starting_price, s_mileage_price, s_highmileage_price ,s_stop_1,s_stop_2,s_stop_3); -- 定义状态 SIGNAL state: State_Type; -- 创建信号 SIGNAL totel_money : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000";--总价钱 SIGNAL mileage : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000";--里程 SIGNAL ten_seconds : STD_LOGIC := '0'; SIGNAL count_seconds : integer := 0; BEGIN mileage_out <= mileage;--输出 PROCESS (clk_in, reset_n) BEGIN IF (reset_n = '0') THEN--复位 mileage <= "0000000000000000"; ELSIF (clk_in'EVENT AND clk_in = '1') THEN IF (state = s_starting_price OR state = s_mileage_price OR state = s_highmileage_price) THEN IF (pulse_kilometre = '1') THEN--1公里里程加1 mileage <= mileage + "0000000000000001"; ELSE mileage <= mileage; END IF; END IF; END IF; END PROCESS; --每20秒收取1元 PROCESS (clk_in, reset_n) BEGIN IF (reset_n = '0') THEN count_seconds <= 0; ten_seconds <= '0'; ELSIF (clk_in'EVENT AND clk_in = '1') THEN IF (state = s_stop_1 OR state = s_stop_2 OR state = s_stop_3) THEN--停车等待 IF (count_seconds >= 200) THEN--20秒 count_seconds <= 0; ten_seconds <= '1';--20秒信号 ELSE count_seconds <= count_seconds + 1;--计数 ten_seconds <= '0'; END IF; END IF; END IF; END PROCESS; PROCESS (clk_in, reset_n) BEGIN IF (reset_n = '0') THEN state <= s_idle;--复位 totel_money <= "0000000000000000";--清零 totel_money_out <= "0000000000000000";--清零 ELSIF (clk_in'EVENT AND clk_in = '1') THEN totel_money_out <= totel_money;--输出合计费用 CASE state IS WHEN s_idle =>--空闲状态 IF (start_n = '0') THEN--按下起动键start,汽车起动 state <= s_starting_price; totel_money <= "0000000000001011";--显示起步价11元,3公里 ELSE state <= s_idle;--空闲状态 totel_money <= "0000000000000000"; END IF; WHEN s_starting_price =>--起步价状态 IF (stop_n = '0') THEN--中途停车 state <= s_stop_1; ELSIF (mileage >= "0000000000000011") THEN--大于3.0公里 state <= s_mileage_price; ELSE state <= s_starting_price; END IF; WHEN s_mileage_price =>--车行驶 3.0公里后按每公里2元计费 IF (pulse_kilometre = '1') THEN totel_money <= totel_money + "0000000000000010";--每公里2元计费 END IF; IF (totel_money >= "0000000000101000") THEN--当总费用达到40元时,每公里按4元收费 state <= s_highmileage_price; ELSIF (stop_n = '0') THEN--中途停车 state <= s_stop_2; ELSE state <= s_mileage_price; END IF; WHEN s_highmileage_price =>--当总费用达到40元时,每公里按4元收费 IF (pulse_kilometre = '1') THEN totel_money <= totel_money + "0000000000000100";--每公里4元计费 END IF; IF (stop_n = '0') THEN--中途停车 state <= s_stop_3; ELSE state <= s_highmileage_price; END IF; WHEN s_stop_1 =>--停车等待 IF (ten_seconds = '1') THEN--每20秒 totel_money <= totel_money + "0000000000000001";--每20秒收取1元 END IF; IF (start_n = '0') THEN--启动 state <= s_starting_price; ELSE state <= s_stop_1; END IF; WHEN s_stop_2 =>--停车等待 IF (ten_seconds = '1') THEN--每20秒 totel_money <= totel_money + "0000000000000001";--每20秒收取1元 END IF; IF (start_n = '0') THEN--启动 state <= s_mileage_price; ELSE state <= s_stop_2; END IF; WHEN s_stop_3 =>--停车等待 IF (ten_seconds = '1') THEN--每20秒 totel_money <= totel_money + "0000000000000001";--每20秒收取1元 END IF; IF (start_n = '0') THEN--启动 state <= s_highmileage_price; ELSE state <= s_stop_3; END IF; WHEN OTHERS => state <= s_idle; END CASE; END IF; END PROCESS; END behave;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=424
阅读全文
540