出租车计费器VHDL代码Quartus 开发板

名称:出租车计费器VHDL代码Quartus  开发板(文末获取)

软件:Quartus

语言:Verilog

代码功能:

出租车计费器方案一原理

基于CPLD/FPGA的出租车的组成如图1所示。各部分主要的功能如下

(1)A计数器对车轮的传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。不

同车型的车轮可能不一样,通过“设置1”对车型做出选择,以实现对不同车型直径的车进行调整。

(2)B计数器对百米脉冲进行累加,并输出实际的公里数的BCD码给出译码动态扫

描模块。每计,满500送出一个脉冲给出C计数器。

设置2”实现起步公里数预制。

(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。“设置

3”用来完成超价加费,起步价预制等

(4)译码/动态扫描见路程与费用的数字译码后动态扫描的方式驱动数码管。(5)码管显示将公里数和计费金额平均用四位数码管显示(三位整数,1为小数)

本代码已在开发板验证,开发板如下,其他开发板可以修改管脚适配:

开发板.jpg

显示模块仿真图

速度控制模块

状态机控制模块

分频模块

整体仿真图

部分代码展示:

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;
源代码

 扫描文章末尾的公众号二维码

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值