<03.15>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

module TaxiFare( input clk_50MHz, // 开发板50MHz时钟 input reset, // 复位信号 input distance_btn, // 里程按键(每按=0.5公里) input time_btn, // 等待按键(每按=1分钟) output [7:0] seg_out, // 数码管段选 output [7:0] dig_sel // 数码管位选 ); // 分频模块:50MHz -> 1KHz扫描时钟 reg [15:0] clk_div; wire scan_clk = clk_div[15]; // 1KHz扫描时钟 always @(posedge clk_50MHz or posedge reset) begin if (reset) clk_div <= 0; else clk_div <= clk_div + 1; end // 按键消抖模块 wire distance_pulse, time_pulse; debounce db_dist(.clk(clk_50MHz), .btn(distance_btn), .pulse(distance_pulse)); debounce db_time(.clk(clk_50MHz), .btn(time_btn), .pulse(time_pulse)); // 计费参数 localparam BASE_PRICE = 800; // 起步价8元(800分) localparam BASE_DISTANCE = 5; // 2.5公里=5个0.5公里单位 localparam PRICE_PER_KM = 80; // 0.8元/0.5公里(1.6元/公里) localparam PRICE_PER_MIN = 100; // 1元/分钟 // 计价器核心逻辑 reg [7:0] distance_count; // 0.5公里单位计数 reg [7:0] time_count; // 分钟计数 reg [15:0] total_cents; // 总费用(分) always @(posedge clk_50MHz or posedge reset) begin if (reset) begin distance_count <= 0; time_count <= 0; total_cents <= BASE_PRICE; end else begin // 里程计数 if (distance_pulse) begin distance_count <= distance_count + 1; // 超过起步里程(2.5公里)后计费 if (distance_count >= BASE_DISTANCE - 1) total_cents <= total_cents + PRICE_PER_KM; end // 等待时间计数 if (time_pulse) begin time_count <= time_count + 1; total_cents <= total_cents + PRICE_PER_MIN; end end end // 数码管显示模块(显示金额整数部分) display_ctrl disp( .clk_scan(scan_clk), .value(total_cents/100), // 转换为元单位 .seg(seg_out), .dig(dig_sel) ); endmodule // 按键消抖模块 module debounce( input clk, input btn, output pulse ); reg [19:0] count; reg btn_reg; always @(posedge clk) begin if (btn !== btn_reg) begin btn_reg <= btn; count <= 0; end else if (count < 20'd99999) count <= count + 1; end assign pulse = (count == 20'd99999) ? btn : 0; endmodule // 数码管显示模块 module display_ctrl( input clk_scan, input [15:0] value, // 0-9999元 output reg [7:0] seg, output reg [7:0] dig_sel ); reg [3:0] digit; reg [1:0] cnt; // BCD转换(千/百/十/个位) wire [3:0] thousands = value / 1000; wire [3:0] hundreds = (value % 1000) / 100; wire [3:0] tens = (value % 100) / 10; wire [3:0] units = value % 10; // 数码管扫描 always @(posedge clk_scan) begin cnt <= cnt + 1; case(cnt) 0: begin dig_sel <= 8'b11111110; digit <= units; end // 个位 1: begin dig_sel <= 8'b11111101; digit <= tens; end // 十位 2: begin dig_sel <= 8'b11111011; digit <= hundreds; end // 百位 3: begin dig_sel <= 8'b11110111; digit <= thousands; end// 千位 endcase end // 七段数码管译码 always @(*) begin case(digit) 0: seg = 8'b11000000; // "0" 1: seg = 8'b11111001; // "1" 2: seg = 8'b10100100; // "2" 3: seg = 8'b10110000; // "3" 4: seg = 8'b10011001; // "4" 5: seg = 8'b10010010; // "5" 6: seg = 8'b10000010; // "6" 7: seg = 8'b11111000; // "7" 8: seg = 8'b10000000; // "8" 9: seg = 8'b10010000; // "9" default: seg = 8'b11111111; // 熄灭 endcase end endmodule再意思不变的情况下把此代码融合成有个module文件
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值