名称:出租车计费器VHDL代码Quartus 开发板(文末获取)
软件:Quartus
语言:Verilog
代码功能:
出租车计费器方案一原理
基于CPLD/FPGA的出租车的组成如图1所示。各部分主要的功能如下
(1)A计数器对车轮的传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。不
同车型的车轮可能不一样,通过“设置1”对车型做出选择,以实现对不同车型直径的车进行调整。
(2)B计数器对百米脉冲进行累加,并输出实际的公里数的BCD码给出译码动态扫
描模块。每计,满500送出一个脉冲给出C计数器。
设置2”实现起步公里数预制。
(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。“设置
3”用来完成超价加费,起步价预制等
(4)译码/动态扫描见路程与费用的数字译码后动态扫描的方式驱动数码管。(5)码管显示将公里数和计费金额平均用四位数码管显示(三位整数,1为小数)
本代码已在开发板验证,开发板如下,其他开发板可以修改管脚适配:
显示模块仿真图
速度控制模块
状态机控制模块
分频模块
整体仿真图
部分代码展示:
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;--0.1公里产生一次脉冲 start_price_set : IN STD_LOGIC_VECTOR(1 DOWNTO 0);--起步价设置 start_mileage_set : IN STD_LOGIC_VECTOR(1 DOWNTO 0);--起步公里设置 feeper_mileage_set : IN STD_LOGIC_VECTOR(1 DOWNTO 0);--每公里费用设置 high_price_set : IN STD_LOGIC_VECTOR(1 DOWNTO 0);--超价加费设置 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 start_price : STD_LOGIC_VECTOR(15 DOWNTO 0);--起步价 SIGNAL start_mileage : STD_LOGIC_VECTOR(15 DOWNTO 0);--起步公里 SIGNAL feeper_mileage : STD_LOGIC_VECTOR(15 DOWNTO 0);--每公里费用 SIGNAL high_price : STD_LOGIC_VECTOR(15 DOWNTO 0);--超价加费 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--0.1公里里程加0.1 mileage <= mileage + "0000000000000001"; ELSE mileage <= mileage; END IF; END IF; END IF; END PROCESS; --每10秒收取等待费用 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 >= 1000) THEN--10秒 count_seconds <= 0; ten_seconds <= '1';--10秒信号 ELSE count_seconds <= count_seconds + 1;--计数 ten_seconds <= '0'; END IF; END IF; END IF; END PROCESS; --起步价-00-5元 --50 =0000000000110010 --起步价-01-8元 --80 =0000000001010000 --起步价-10-10元 --100=0000000001100100 --起步价-11-12元 --120=0000000001111000 start_price <="0000000000110010" when start_price_set="00" else "0000000001010000" when start_price_set="01" else "0000000001100100" when start_price_set="10" else "0000000001111000" ; --超价加费-00-1元--1=0000000000000001 --超价加费-01-2元--2=0000000000000010 --超价加费-10-3元--3=0000000000000011 --超价加费-11-4元--4=0000000000000100 high_price<="0000000000000001" when high_price_set="00" else "0000000000000010" when high_price_set="01" else "0000000000000011" when high_price_set="10" else "0000000000000100" ; --起步公里--00-3公里--30=0000000000011110 --起步公里--01-4公里--40=0000000000101000 --起步公里--10-5公里--50=0000000000110010 --起步公里--11-6公里--60=0000000000111100 start_mileage <="0000000000011110" when start_mileage_set="00" else "0000000000101000" when start_mileage_set="01" else "0000000000110010" when start_mileage_set="10" else "0000000000111100" ; --每公里费用-00-1元--1=0000000000000001 --每公里费用-01-2元--2=0000000000000010 --每公里费用-10-3元--3=0000000000000011 --每公里费用-11-4元--4=0000000000000100 feeper_mileage <="0000000000000001" when feeper_mileage_set="00" else "0000000000000100" when feeper_mileage_set="01" else "0000000000000011" when feeper_mileage_set="10" else "0000000000000010" ; --其他是否标准如下: --停车等待收费:每10秒收取0.1元 --当总费用达到超价费用(40元)时,每公里在原价基础上再加超价费用 --控制状态机 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 <= start_price;--显示起步价 ELSE state <= s_idle;--空闲状态 totel_money <= "0000000000000000"; END IF; WHEN s_starting_price =>--起步价状态 IF (stop_n = '0') THEN--中途停车 state <= s_stop_1; ELSIF (mileage >= start_mileage) THEN--大于起步公里 state <= s_mileage_price; ELSE state <= s_starting_price; END IF; WHEN s_mileage_price =>--车行驶起步公里公里后按每公里n元计费 IF (pulse_kilometre = '1') THEN totel_money <= totel_money + feeper_mileage;--每0.1公里0.n元计费 END IF; IF (totel_money >= "0000000110010000") THEN--当总费用达到超价费用(40元)时,每公里按m元收费 state <= s_highmileage_price; ELSIF (stop_n = '0') THEN--中途停车 state <= s_stop_2; ELSE state <= s_mileage_price; END IF; WHEN s_highmileage_price =>--当总费用达到超价费用元时,每公里按m元收费 IF (pulse_kilometre = '1') THEN totel_money <= totel_money + feeper_mileage + high_price;--在原价基础上再加超价费用 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--每10秒 totel_money <= totel_money + "0000000000000001";--每10秒收取0.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--每10秒 totel_money <= totel_money + "0000000000000001";--每10秒收取0.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--每10秒 totel_money <= totel_money + "0000000000000001";--每10秒收取0.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;
源代码
扫描文章末尾的公众号二维码