出租车计费器 FPGA 设计 Verilog Quartus

📅 2026/7/1 20:14:39
出租车计费器 FPGA 设计 Verilog Quartus
名称出租车计费器 FPGA 设计 Verilog Quartus软件Quartus语言Verilog功能介绍本设计为出租车计费器 FPGA 工程使用 Verilog 编写并基于 Quartus 工程组织。系统围绕出租车行程计费场景设计包含启动、停止、车轮脉冲输入、车辆行驶/等待状态判断、里程累计、等待时间累计、总费用输出以及数码管显示等功能。 工程顶层模块为 taxi_fee外部输入包括 clk、reset、stop、start 和 pulse_in其中 reset 为低有效复位start 用于行程开始stop 用于本次行程结束pulse_in 表示车轮脉冲。输出端包含两组数码管段选和位选信号可用于显示费用、里程和等待时间等计费相关信息。 计费逻辑通过多个功能模块协同完成先根据车轮脉冲判断车辆是否处于行驶状态再产生车轮计数脉冲和秒脉冲随后转换为 1 公里触发信号和 1 分钟等待触发信号最后由状态控制模块完成里程、等待时间和总费用的统计。该设计重点体现了出租车计费系统中“按里程计费”和“等待计时计费”的基本控制流程。运行环境开发语言Verilog 开发软件Quartus 仿真环境ModelSim/Nativelink 相关仿真工程文件 工程类型FPGA 数字逻辑设计工程 顶层模块taxi_fee 主要文件taxi_fee.v、judge.v、wheel_second_pluse.v、speed_pulse.v、taxi_state.v、display.v设计思路设计采用分层模块化思路将出租车计费过程拆分为车辆状态判断、脉冲生成、里程/等待时间换算、计费控制和数码管显示几个部分。顶层模块 taxi_fee 负责连接外部时钟、复位、启动、停止、车轮脉冲输入以及两组数码管输出各子模块之间通过 one_kilometre、one_minute、mileage、minute_time、totel_money 等信号传递运行状态和计费数据。 车辆运行状态由 judge 模块根据车轮脉冲进行判断Speed 信号用于区分等待和行驶状态。wheel_second_pluse 模块在 Speed 状态和 pulse_in 输入的配合下输出车轮脉冲与秒脉冲其中车轮脉冲用于里程累计秒脉冲用于等待时间累计。speed_pulse 模块进一步把底层脉冲整理为“1公里产生一次”和“等待1分钟产生一次”的计费触发信号。 taxi_state 模块承担核心计费控制功能结合 start、stop、Speed、one_kilometre、one_minute 等输入完成行程过程中的里程、等待时间和总费用更新。display 模块将费用、里程、等待时间转换为数码管段选和位选输出适合用于观察计费结果和运行过程。整体结构清晰适合课程设计、模块化 Verilog 练习和出租车计费逻辑仿真参考。模块结构工程主要模块包括 1. taxi_fee顶层模块连接启动、停止、复位、车轮脉冲输入以及数码管显示输出完成各子模块例化和信号互联。 2. judge车辆状态判断模块通过对车轮脉冲计数判断出租车是否停下输出 Speed 状态信号Speed 为 0 表示等待Speed 为 1 表示行驶。 3. wheel_second_pluse车轮脉冲和秒脉冲产生模块根据输入脉冲和车辆状态输出 wheel_pulse、second_pulse。 4. speed_pulse1 公里及 1 分钟信号产生模块将车轮脉冲和秒脉冲转换为 one_kilometre、one_minute 计费触发信号。 5. taxi_state计费控制模块根据启动、停止、行驶状态、里程触发和等待时间触发信号输出等待时间、里程和总费用。 6. display显示模块将费用、里程、等待时间转换为数码管段选和位选信号。 同时包含 speed_pulse_tb、display_tb、judge_tb、wheel_second_pluse_tb、taxi_state_tb 等测试文件便于分别验证功能模块。演示视频配套演示视频展示了出租车计费工程的仿真运行过程可用于直观看到启动、行驶脉冲、等待计时以及费用显示相关信号在仿真中的变化情况便于下载后对照工程进行学习和验证。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计说明工程文件 程序文件 程序编译 RTL图 Testbench 仿真图 整体仿真图 判断模块 判断模块通过对车轮脉冲进行计数判断出租车是否停下 Speed0等待 1行驶 秒脉冲即车轮输出模块 1公里及1分钟信号产生模块 计费控制模块 显示模块部分代码以下展示顶层模块taxi_fee的部分代码完整代码可关注下方公众号卡片获取。module taxi_fee( input clk,//时钟 input reset,//复位信号低有效 input stop,//本次行程结束停止计费高有效--按键 input start,//启动信号行程开始高有效 --按键 input pulse_in,//车轮脉冲 //数码管 output [7:0] dig_led_1,//数码管段选 output [3:0] wei_led_1,//数码管位选 output [7:0] dig_led_2,//数码管段选 output [3:0] wei_led_2//数码管位选高电平点亮高电平选通 ); wire wheel_pulse; wire second_pulse; wire Speed;//0等待 1行驶--开关 //判断模块通过对车轮脉冲进行计数判断出租车是否停下 judge i_judge( . clk(clk),//时钟 . reset(reset),//复位信号低有效 . pulse_in(pulse_in),//车轮脉冲 . Speed(Speed)//0等待 1行驶 ); //车轮脉冲产生及秒脉冲产生模块 wheel_second_pluse i_wheel_second_pluse( . clk(clk),//标准时钟 . reset(reset),//复位信号低有效 . Speed(Speed),//0等待 1行驶 . pulse_in(pulse_in),//车轮脉冲 . wheel_pulse(wheel_pulse), // 车轮脉冲,10个1公里 . second_pulse(second_pulse) //秒脉冲 ); //模块例化 wire one_kilometre;//1公里产生一次 wire one_minute;//暂停等待,1分钟产生一次 wire [15:0] totel_money; wire [7:0] mileage; wire [7:0] minute_time; //1公里及1分钟信号产生模块 speed_pulse U_speed_pulse( . clk(clk),//标准时钟 . reset(reset),//复位信号低有效 . wheel_pulse(wheel_pulse), // 车轮脉冲,10个1公里 . second_pulse(second_pulse), //秒脉冲 . one_kilometre(one_kilometre),//1公里产生一次 . one_minute(one_minute)//1分钟产生一次 ); //状态控制模块 taxi_state U_taxi_state( . clk(clk),//标准时钟 . reset(reset),//复位信号低有效 . stop(stop),//本次行程结束停止计费高有效 . start(start),//启动信号行程开始高有效 . Speed(Speed),//0等待 1行驶 . one_kilometre(one_kilometre),//1公里产生一次 . one_minute(one_minute),//1分钟产生一次 . minute_time(minute_time), . mileage_out(mileage), . totel_money_out(totel_money)//合计费用 ); //显示模块 display U_display( . clk(clk),//标准时钟 . reset(reset),//复位信号低有效 . totel_money(totel_money),//费用 . mileage(mileage),//里程 . minute_time(minute_time), . dig_led_1(dig_led_1), . wei_led_1(wei_led_1), . dig_led_2(dig_led_2), . wei_led_2(wei_led_2)//高电平点亮高电平选通 ); endmodule代码获取下方公众号“FPGA代码设计学习资料”