名称:出租车计费器带设计报告VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
出租车计费器带设计报告
3.1.出租车计费器一般都是按公里计费,要求是起步价3 元,准行1 公里,以后1 元/公里。显示部分的七段数码管扫描时钟选择时钟模块的1kHz。一个出租车计费器,有两个计数单位,一个用来计公里,另外一个用来计费用。在出租车的轮子上都有传感器,用来记录车轮转动的圈数,而车轮子的周长是固定的,所以知道了圈数自然也就知道了里程。在这个设计中,用实验箱直流电机模拟出租车轮子,通过传感器,可以得到电机每转一周输出一个脉冲波形,转动一圈认为是行走1米,所以每旋转1000 圈,认为车子前进1 公里。
2.用按键模块的S1来作为整个系统的复位按钮,每复位一次,计费器从头开始计费。
3.用七段数码管显示要求为前4个显示里程,后3个显示费用。
提示:首先在复位信号的作用下将所有用到的寄存器进行清零,然后开始设定到起步价记录状态,在此状态时,在起步价规定的里程里都一直显示起步价,直到路程超过起步价规定的里程时,系统转移到每公里计费状态,此时每增加一公里,计费器增加相应的费用。
1.quartusII9.0和13.0均有
2.VHDL
1. 工程文件
2. 程序文件
原理图
代码
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图(顶层模块)
分频模块
状态机模块
数码管控制模块
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --控制模块 ENTITY ctrl IS PORT ( clk : IN STD_LOGIC;--时钟 rst : IN STD_LOGIC;--复位信号 start_key : IN STD_LOGIC;--启动信号,行程开始 pulse_in : IN STD_LOGIC;--1公里脉冲 mileage : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);--里程 money : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)--合计费用 ); END ctrl; ARCHITECTURE behave OF ctrl IS --定义状态 TYPE state_type IS (S0,S1,S2); -- 定义状态 SIGNAL state: state_type; -- 创建信号 SIGNAL all_money : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000";--总价钱 SIGNAL all_mileage : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000";--里程 SIGNAL sec_10 : STD_LOGIC := '0'; SIGNAL cnt : integer := 0; BEGIN --起步价3 元,准行1 公里,以后1 元/公里 --状态机 PROCESS (clk, rst) BEGIN IF (rst = '0') THEN state <= S0;--复位 ELSIF (clk'EVENT AND clk = '1') THEN CASE state IS WHEN S0 =>--空闲状态 IF (start_key = '0') THEN--按下起动键start,汽车起动 state <= S1; ELSE state <= S0;--空闲状态 END IF; WHEN S1 =>--起步价状态 IF (all_mileage >= "0000000000000001") THEN--大于1.0公里 state <= S2; ELSE state <= S1; END IF; WHEN S2 =>--车行驶 1.0公里后按每公里1元计费 state <= S2; WHEN OTHERS => state <= S0; END CASE; END IF; END PROCESS; PROCESS (clk, rst) BEGIN IF (rst = '0') THEN all_money <= "0000000000000000";--清零 money <= "0000000000000000";--清零 ELSIF (clk'EVENT AND clk = '1') THEN money <= all_money;--输出合计费用 CASE state IS WHEN S0 =>--空闲状态 IF (start_key = '0') THEN--按下起动键start,汽车起动 all_money <= "0000000000000011";--显示起步价3元,1公里 ELSE all_money <= "0000000000000000"; END IF; WHEN S1 =>--起步价状态 all_money<=all_money; WHEN S2 =>--车行驶 1.0公里后按每公里1元计费 IF (pulse_in = '1') THEN all_money <= all_money + "0000000000000001";--每公里1元计费 END IF; END CASE; END IF; END PROCESS;
源代码
点击下方的公众号卡片获取