杭电数字电路课程设计——出租车计费器

实验目的

(1)学习数码管动态扫描方法,进一步熟悉模块调用的方法,锻炼编程设计数字系统的能力。
(2)掌握灵活运用Verilog HDL语言进行各种描述与建模的技巧和方法。

模块设计

(1)分频模块:因出租车计费器模拟以秒为单位,即分频1秒产生一个clk_out,控制其他模块工作。
(2)计程模块:用于根据有效的单位时间、速度来增加相应的里程数。
(3)出租车等红绿灯模块:用于进行等红绿灯时的计时,若为10秒,产生一个time_enable信号控制计费器是否进行等红绿灯计费。
(4)计费模块:根据传入的里程来计算相应的费用,以及根据time_enable信号判断是否增加额外的等红绿灯计费。
(5)数码管刷新模块:用于刷新数码管,以62.5Hz为刷新率保证人视觉上感受不到数码管的闪烁。
(6)二进制转BCD码模块:用于将传入的里程、费用转换成BCD码以便于数码管显示。
(7)数码管显示模块:根据相应的控制信号来将里程或费用转换成位选、段选信号来实现数码管的实现。
程序模块关系
(1)分频模块的分频1s有效的时钟信号控制计程模块、出租车等红绿灯模块、计费模块工作。
(2)计程模块的里程数用于计费模块的费用计算。
(3)出租车等红绿灯模块的time_enable用于控制计费模块是否产生出租车等红绿灯额外费用。
(4)数码管刷新模块产生的位选信号用于控制数码管显示。
(5)二进制转BCD码模块产生的里程BCD码、费用BCD码用于数码管显示。

程序源代码

module sy_last_code(reset, clk_M, start, pause, waitL, speedup, d_m, Seg, AN);input reset;input clk_M;input start;input pause;input waitL;input [1:0] speedup;input d_m;//段选output [7:0] Seg;//位选output [3:0] AN;wire [9:0] fee_before;wire [9:0] distance_before;wire [15:0] distance_b;wire [15:0] fee_b;wire time_enable;wire clk_out;wire [1:0] Bit_Sel;Fdiv u1(reset, clk_M, clk_out);// 计程Distance u2(clk_out, reset, start, speedup, waitL, pause, distance_before);// 等待红绿灯时间Time u3(clk_out, reset, pause, waitL, time_enable);// 计费Fee u4(clk_out, reset, waitL, pause, time_enable, distance_before, start, fee_before);// 分频刷新数码管Delay_4ms u5(clk_M, Bit_Sel);// 二进制转换为BCD码Binary u6(distance_before, distance_b);Binary u7(fee_before, fee_b);// 显示数码管Smg u8(d_m, fee_b, distance_b, Bit_Sel, Seg, AN);endmodule//分频模块
// 1s
module Fdiv(input wire reset,input wire clk_M,output reg clk_out
);// 定义计数器reg [31:0] counter;initial begin counter = 32'd0; endinitial begin clk_out = 0; endalways @(posedge reset or posedge clk_M)beginif(reset)begin// reset 置0counter <= 32'd0;clk_out <= 1'b0;endelse if(counter == 32'd12_500_000)beginclk_out <= ~clk_out;counter <= 32'd0;endelse begincounter <= counter + 1'b1;clk_out <= 0;endend
endmodule//计程模块
module Distance(input wire clk,// 汽车复位input wire reset,// 汽车启动input wire start,input wire [1:0] speedup,// 等车(红绿灯)input wire waitL,// 暂停汽车行为input wire pause,output reg [9:0] distance
);initial begin distance = 10'b0; endalways @(posedge reset or posedge clk)beginif(reset)begindistance <= 10'd0;endelse if(start && !waitL && !pause)begincase(speedup)2'b0_0: begin distance <= distance + 10'd1; end2'b0_1: begin distance <= distance + 10'd2; end2'b1_0: begin distance <= distance + 10'd3; end2'b1_1: begin distance <= distance + 10'd4; endendcaseend         end
endmodule// 计时模块用于当等待红灯的时候
module Time(input wire clk,input wire reset,input wire pause,input wire waitL,output reg time_enable
);reg [7:0]count;initial begin count = 8'd0; endinitial begin time_enable = 0; endalways @(posedge reset or posedge clk)beginif(reset)begincount <= 8'd0;time_enable <= 0; endelse if(count == 8'd10)begintime_enable <= ~time_enable;count <= 8'd0;endelse if(!pause && waitL)begincount <= count + 1'd1;time_enable <= 0;endend
endmodule// 计费
module Fee(input wire clk,input wire reset,input wire waitL,input wire pause,input wire time_enable,input wire [9:0] distance,input wire start,output reg [9:0] fee
);initial begin fee <= 10'b0; endparameter s_fee = 10'd60;always @(posedge reset or posedge clk)beginif(reset)beginfee <= 16'd0;endelse if(start && !waitL && !pause)beginif(distance <= 30)beginfee <= s_fee;endelse if(fee < 10'd200)beginfee <= s_fee + (12 * (distance - 30)) / 10;if(fee > 10'd200)beginfee <= s_fee + (18 * (distance - 30)) / 10;endendelsebeginfee <= s_fee + (18 * (distance - 30)) / 10;endendelse if(time_enable)beginfee <= fee + 10'd5;endend
endmodule// 分频刷新数码管
module Delay_4ms(clk_M,Bit_Sel);input wire clk_M;output reg [1:0] Bit_Sel;// 定义计数器integer counter = 0;initial begin Bit_Sel <= 2'b00; endalways@(posedge clk_M)begincounter <= counter + 1;// 25MHz 时钟脉冲// 采用62.5Hz刷新频率,得到16ms一遍,每个数码管选通路的时间4msif(counter == 100000)begin Bit_Sel <= Bit_Sel + 2'b01;counter <= 0;endend
endmodule// 数码管显示
module Smg(input wire d_m,input wire [15:0] fee,input wire [15:0] distance, //数码管选择input wire [1:0] Bit_Sel,  //段选output reg [7:0] Seg,//位选output reg [3:0] AN
);reg [3:0]  Data_now;reg [7:0]  duan_ctrl;initial begin Data_now = 4'b0; duan_ctrl = 8'b0;endalways @(*)begincase(Bit_Sel)2'b00:AN<=4'b1000;2'b01:AN<=4'b1001;2'b10:AN<=4'b1010;2'b11:AN<=4'b1011;default:AN<=4'b1111;endcaseendalways  @(*)beginif(d_m)begincase(Bit_Sel)2'b00: Data_now[3:0] <= distance[15:12];2'b01: Data_now[3:0] <= distance[11:8];2'b10: Data_now[3:0] <= distance[7:4];2'b11: Data_now[3:0] <= distance[3:0];default: Data_now[3:0] <= distance[3:0];endcaseendelsebegincase(Bit_Sel)2'b00: Data_now[3:0] <= fee[15:12];2'b01: Data_now[3:0] <= fee[11:8];2'b10: Data_now[3:0] <= fee[7:4];2'b11: Data_now[3:0] <= fee[3:0];default: Data_now[3:0] <= fee[3:0];endcaseendendalways @(*)begin// 0~9// 采用共阳极连接,低电平点亮,根据数码管8个信号if(Bit_Sel == 2'b10)begin case(Data_now[3:0])4'b0000: Seg[7:0] <= 8'b00000010;4'b0001: Seg[7:0] <= 8'b10011110;4'b0010: Seg[7:0] <= 8'b00100100;4'b0011: Seg[7:0] <= 8'b00001100;4'b0100: Seg[7:0] <= 8'b10011000;4'b0101: Seg[7:0] <= 8'b01001000;4'b0110: Seg[7:0] <= 8'b01000000;4'b0111: Seg[7:0] <= 8'b00011110;4'b1000: Seg[7:0] <= 8'b00000000;4'b1001: Seg[7:0] <= 8'b00001000;default:Seg[7:0]<=8'b11111111;endcaseendelsebegincase(Data_now[3:0])4'b0000: Seg[7:0] <= 8'b00000011;4'b0001: Seg[7:0] <= 8'b10011111;4'b0010: Seg[7:0] <= 8'b00100101;4'b0011: Seg[7:0] <= 8'b00001101;4'b0100: Seg[7:0] <= 8'b10011001;4'b0101: Seg[7:0] <= 8'b01001001;4'b0110: Seg[7:0] <= 8'b01000001;4'b0111: Seg[7:0] <= 8'b00011111;4'b1000: Seg[7:0] <= 8'b00000001;4'b1001: Seg[7:0] <= 8'b00001001;default:Seg[7:0]<=8'b11111111;endcaseendend
endmodulemodule Binary(bin,bcd);input wire [9:0] bin;output reg [15:0] bcd;initial begin bcd = 16'b0; endalways @(*)beginbcd [ 3:0]  = bin % 10;//个位bcd [ 7:4]  = bin /10 % 10;//十位bcd [11:8] = bin / 100 % 10;//百位bcd [15:12] = bin / 1000 % 10;//百位end
endmodule

测试程序源代码

module test;// Inputsreg reset;reg clk_M;reg start;reg pause;reg waitL;reg [1:0] speedup;reg d_m;// Outputswire [7:0] Seg;wire [3:0] AN;// Instantiate the Unit Under Test (UUT)sy_last_code uut (.reset(reset), .clk_M(clk_M), .start(start), .pause(pause), .waitL(waitL), .speedup(speedup), .d_m(d_m), .Seg(Seg), .AN(AN));always begin #10 clk_M = ~clk_M; endinitial begin// Initialize Inputsreset = 1;clk_M = 0;start = 1;pause = 0;waitL = 0;speedup = 0;d_m = 0;// Wait 100 ns for global reset to finish#100;reset = 0;start = 1;pause = 0;waitL = 0;speedup = 2'b00;d_m = 1;  end
endmodule

思考及遇到的问题

1.实验出现的问题与解决方案
出现的问题:
在二进制转BCD模块中,采用判断大于4加三移位法,来实现BCD码的转换,所有情况均成立,但在9的转换上每次都是多加3。
解决方案:
最终采用了整除取余法,即个位为对10取余,十位为整除10对10取余,百位为整除100对10取余,千位为对100整除对10取余。最终经过调试测试成功。
2.思考与探索
思考题1:如果系统时钟频率是20MHz,要实现要求的档位速度,源程序应做怎样的改动?
因本实验采用系统时钟频率为25MHz计算,即要实现每秒速度,在延时模块中将count值进行修改,原25MHz分成1Hz,计数值为12_500_000;现20MHz分成1Hz,计数值为10_000_000。
思考题2:如果要求显示车费精确到1元,而显示行驶里程精确到1公里,那么程序应该如果修改?
在二进制转BCD码模块中,将个位数默认定为0即不输出小数点后的数字,意思就为精确到1元或1公里,但是寄存器中存的是完整的值,这样符合系统需求又可随时切换精度。

本文为作者原创,转载请附链接!!
完整的报告内容已经上传~
创作不易~~

杭电数字电路课程设计——出租车计费器相关推荐

  1. 杭电数字电路课程设计——移位寄存器

    杭电数字电路课程设计-移位寄存器 实验目的 (1)学习双向移位寄存器. (2)掌握灵活运用Verilog HDL语言进行各种描述与建模的技巧和方法. 模块设计 模块功能: 用于实现多功能移位寄存器,受 ...

  2. 杭电数字电路课程设计-实验十-JK触发器设计实验

    JK触发器设计 实验目的 实验要求 实验原理 程序代码 电路管脚图 引脚配置文件 工程文件 实验目的 学习JK触发器的原理与设计方法: 掌握灵活运用Verilog HDL语言进行各种描述与建模的技巧和 ...

  3. 【swjtu】数字电路课程设计-音乐播放器

    数字电子技术B 课程设计报告 (2021-2022第1学期) 课题名称:音乐播放器 指导教师:郑  狄 项目成员:

  4. 杭电嵌入式课程设计——上位机

    TCP服务器 课程设计要求 将电脑作为TCP服务器 处理接收到的数据 曲线绘制 图表 曲线 文件写入 工程链接 课程设计要求 如下图: 我们选择采用C#进行开发,因为串口有距离限制不方便我们采集数据, ...

  5. 设计题目:基于CPLD/FPGA的出租车计费器

    一.设计任务及要求: 本设计要求设计一个基于CPLD/FBGA的出租车计费器,其具体要求如下: 1  能够实现计费功能 费用是按行驶的里程进行 计算的,设出租车的起价是6.0元,当里程小于3km时,按 ...

  6. 数字电路课程设计(电路图,报告)

    数字电路课程设计–大汇总 电子钟 交通灯 抢答器 自动循环计数器 篮球比赛 彩灯控制 拔河控制器 乒乓球游戏 智力竞赛抢答器 八路循环彩灯 病房呼叫系统 步进电机调速控制 答辩自动报时器 电风扇控制 ...

  7. linux打地鼠课程设计,数字电路课程设计打地鼠.doc

    数字电路课程设计打地鼠 北京科技大学 : 数字电子实验仿真 仿真设计项目名称: 打地鼠游戏 院系:计算机与通信工程 专业班级:通信1204 组长:吕文诺 组员:刘豪 庄御乾 孙仲乐 打地鼠游戏 一.实 ...

  8. 基于FPGA的数码管显示出租车计费器

    基于FPGA简易出租车计价器设计技术规范 专业:集成电路设计与集成系统 班级:电路1401班 姓名:童峥 学号:05146034 一. 功能描述: 本设计基于FPGA设计并使用Verilog HDL硬 ...

  9. 数字电子技术课程设计-八路抢答器

    数字电子技术课程设计-八路抢答器 大学生活逐渐虚度光阴,不知道干了啥都已经快大三了~~~~ 做的东西还是有一些bug,到最后答辩完事之后就开始复习期末考试了,没时间再整 有错误请指正 目录 第一章 课 ...

  10. java蜂鸣节拍器_电子课程设计-电子节拍器的设计.doc

    电子课程设计-电子节拍器的设计 通 信 工 程 专业 课程设计题单 班级 学生 孙伟杰 课程名称 电子课程设计 课 题 电子节拍器的设计 设计要求 节拍器具有声光显示功能:设有2/4,3/4,4/4三 ...

最新文章

  1. 在IIS8.5的环境下配置WCF的Restful Service
  2. php 发布时间设计,php – 发布和评论的数据库设计
  3. 想做测试经理的看过来
  4. PHP运行神器--用HHVM减少你一半的服务器
  5. 数据库查找出list数据,进行处理
  6. 【IT资讯】华为方舟编译器编译工具正式发布和工具下载
  7. serialport通过usb通讯_IOT串口通讯-RS232/RS485
  8. 【CodeForces - 570A】Elections(模拟,水题)
  9. 高校寒假时间公布!看完心态稳住…
  10. 考教育统计与测量可以带哪种计算机,《教育统计与测量》练习题库及答案
  11. 网络编程基础--协程--greenlet切换---gevent自动识别 IO ---
  12. 下载丨DataGuard环境搭建详细步骤
  13. js保留n位小数——toFiexed()
  14. android蓝牙5.0扫描失败,bluetooth-lowenergy – BLE扫描的解决方案SCAN_FAILED_APPLICATION_REGISTRATION_FAILED?...
  15. 【回归预测】基于matlab麻雀算法优化LSSVM回归预测【含Matlab源码 1128期】
  16. 电源大师课笔记 1.2
  17. 安装Matlab2016a中文破解版教程
  18. 电子政务建设模式的演进
  19. Python之pip安装出现报错ERROR: Cannot unpack file
  20. ubuntu安装utorrent,以闪电的速度在六维空间下载东西!

热门文章

  1. TB6612与电机编码器
  2. iOS | OC 面向对象的编程
  3. erp系统实施方案会遇到哪些问题?
  4. Java变量命名规范
  5. 教程 海湾主机crt_海湾消防主机JB-QT-GST5000火灾报警控制器(联动型)与crt是怎么连接编公式的...
  6. BP神经网络详解+原理
  7. 等保二级和等保三级的区别
  8. python3.5安装PyHook3
  9. 【微信小程序|组件库】一款清新且简洁的卡片样式
  10. python科赫雪花正方形_python—科赫曲线(科赫雪花小包裹)