




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
整个工程源代码下载地址新浪微盘/s/dpldXQHVgoR9t 出租车计价器设计方案和功能介绍目录一、系统的总体设计方案31功能模块关系图32设计描述33 按键功能介绍64 开关功能介绍65 状态表示介绍表7二、主要模块的设计代码71控制模块72 里程计数模块103 时钟模块114 等待时间计数模块125 计价模块136 数码管驱动模块(有小数点)157 尾灯模块17三、总结感想(这是编程中遇到的一些问题的处理方法)181 复位键(reset)的使用心得182 关于,有用信号leap=1,是否需要让leap=0的问题。193 在一个Verilog文件中,不可以在两个always模块中同时操作一个变量。194 数码管闪烁195 对于一些取值不能为0的变量,如year,month等,应该赋给初始值,以免显示出错。196 对于reset这样的点击键应该写成点击形式,加上消抖程序。不应该用连加,以避免出错。197 关于按键检测问题198 怎么获得一个变量,某时刻和该时刻之前的变量?209 每一个verilog模块不能包含太多阻塞赋值语句,否则编译器会报错。尽可能多用非阻塞语句赋值。20附录:总设计图21出租车计价器设计方案和功能介绍一、系统的总体设计方案1功能模块关系图控制模块等待时间计数时钟模块数码管驱动模块里程计算模块计价模块显示模块出租车计价器组成模块关系图分频器模块消抖模块2设计描述本数字钟有10个模块组成,分频器模块、消抖模块、控制模块、等待时间计数模块、时钟模块、里程计算模块、计价模块、显示模块、数码管驱动模块、尾灯模块。1 分频器模块:将开发板提供的50MHz的时钟,分频成1Hz、4Hz、1KHz和6MHz的时钟信号,供各模块使用。2 消抖模块:处理按键毛刺,产生稳定信号3 控制模块:(1) 白天近程和远程单价,晚上近程和远程单价(2) 白天起步价,晚上起步价(3) 等待每分钟价格(4) 起步价可行公里数,远程和近程分界线(5) 白天晚上开始时间4 等待时间计数模块:在state=1(计价器已经打开)且run=0(出租车暂停)时,开始计时。产生数据单位为分钟,最小值位1分钟,没有小数。5 时钟模块:对1Hz时钟信号进行处理,实现时分秒循环计数,构成时钟。6 里程计算模块:对1Hz时钟作为模拟信号源,模拟每秒走0.2Km。输出数据单位为千米,最小值为1千米,没有小数。7 计价模块:计价模块位本出租车计价器中最核心和重要的模块,如果该模块编好,计价器就完成了一半。对里程模块输出数据进行处理,统计出在白天近程(price_day_short)、白天远程(price_day_long)、晚上近程(price_night_short)、晚上远程(price_night_long)单价内,行驶的里程数cnt1、cnt2、cnt3、cnt4。对时钟模块时钟进行处理,判断出现在是白天还是晚上,给里程单价和起步价提供判断依据。对等待时间计数模块输出数据处理,计算出等待时间所产生的金额。总的计价公式=起步价+price_day_short*cnt1+price_day_long*cnt2+price_night_short*cnt3+price_night_long*cnt4+等待金额8 显示模块:(1) 金额和里程显示(2) 等待时间显示(3) 时钟时分秒显示(4) 设置时单价显示(5) 设置时等待价格显示(6) 设置起步价显示(7) 设置里程分界显示(8) 设置白天和晚上开始时间显示9 数码管驱动模块:根据显示模块提供的段选、位选信号和小数点控制信号,控制8个数码管显示数据。输入信号必须为,每4个二进制位为一组表示一位十进制数(十进制数09),小数点控制信号时8位的。10 尾灯模块:尾灯模块用8个LED灯显示车的转向状态,用两个开关模拟出租车左转和右转。左转时:8个LED灯从右向左依次循环点亮;右转时:8个LED灯从左向右依次循环点亮。在车处于计价等待时间时,8LED灯闪烁。3 按键功能介绍共有四个按键,reset(复位键)、set(设置键)、start(开始计价/加键)、run(运行状态控制/减键)。1 reset键:按一次state=0,复位,显示金额和里程数。2 set键:每按一次,state状态加一。state共有014的15个状态,set键只能在114之间连续循环;reset键能够让state置0。3 start键:该键有两个功能第一功能:当state=0时,start有三个状态控制start_out=1、2、0(start_out初始值时0,表示按一次键后计价器开始计价)计价器开始计价、停止计价(计价结束,显示数据)、数据清零。设置好价格数据后,start键每按三次就是一次循环,也就是拉完一个客人。第二功能:当state!=0时,负责该状态设置数值加1。4 run键:第一功能:当start=0且start_out=1时,有两个状态run_out=1、0(run_out初始值为1,表示按一次后车状态为停止)车运行、车停止。run键每按一次在运行和停止变换一次第二功能:state!=0,负责该状态设置数值减1。4 开关功能介绍LED_LEFT开关:当出租车要左转时,打开该开关。8个LED灯从右向左依次循环点亮。LED_RIGHT开关:当出租车要左转时,打开该开关。8个LED灯从左向右依次循环点亮。5 状态表示介绍表状态数码管备注876543210显示总价里程数显示总价和里程11时分秒时钟:时分秒22等待时间等待时间3里程单价:元/千米3白远白天近程单价44黑近白天远程单价55黑近晚天近程单价66黑远晚天远程单价7分/元7等待时间等待时间单价8起步价8白起步价白天起步价99晚起步价晚起步价10里程千米a白里程起步价可行公里时11b黑里程远近分界线12时间小时c白时间白天开始时间13d晚时间晚上开始时间14显示每天总价每天总里程显示每天总数颜色说明调整状态:数值可以调整显示状态:数值不能变化熄灭状态:数码管熄灭二、主要模块的设计代码这里只列举控制模块、里程计数模块、时钟模块、等待时间计数模块、计价模块、数码管驱动模块、尾灯模块。分频模块、消抖模块和显示模块不在列举。1控制模块由于该模块重复代码太多了,直接去了一部分。但是,该模块还是完整地模块,所缺少只是其它状态下对其它数据的设置,和状态4b3和4b4很相似。该模块最经典的时,start和run键双功能设置。/控制模块/控制计价器开始/停止/控制出租车状态走/停module control(clk, /50MHzreset, /复位set, /状态切换start, /计费启动开关run, /出租车运行状态开关price_day_short, /白天近程单价price_day_long, /白天远程单价price_night_short, /晚上近程单价price_night_long, /晚上远程单价price_wait_time, /等待时间每分钟价格one_price_day, /白天起步价one_price_night, /晚上起步价short_distance, /起步价可行最大里程数long_distance, /最大近程里程数day_time, /白天开始时间night_time, /晚上开始时间start_out,run_out,state,password /更改信息的密码);input clk,reset,set,start,run;input 5:0 password;output 7:0 price_day_short,price_day_long,price_night_short,price_night_long,price_wait_time;output 11:0 one_price_day,one_price_night;output 7:0 short_distance,long_distance;output 7:0 day_time,night_time;output 3:0 state,start_out;output run_out;reg 7:0 price_day_short,price_day_long,price_night_short,price_night_long,price_wait_time;reg 11:0 one_price_day,one_price_night;reg 7:0 short_distance,long_distance;reg 7:0 day_time,night_time;reg 3:0 state,start_out;reg run_out,add,sub;initial /为了处理小数点,把实际价格扩大十倍beginday_time=5; /白天开始时间night_time=23; /晚上开始时间short_distance=3; /起步价可行最大里程数long_distance=10; /最大近程里程数price_day_short=24; /实际价格2.4元price_day_long=36; /实际价格3.6元price_night_short=31; /实际价格3.1元price_night_long=47; /实际价格4.7元one_price_day=140; /实际价格14元one_price_night=180; /实际价格18元price_wait_time=10; /实际价格1元endinitialbeginstate=4d0;endalways(posedge clk)begin if(reset=1) /复位键state=4d14) state=4d1; else state=4d2) start_out=4d0; /总状态设置else start_out=8d99) price_day_short=8d0;else price_day_short=price_day_short+8d1;if(sub=1)if(price_day_short=8d0) price_day_short=8d99;else price_day_short=8d99) price_day_long=8d0;else price_day_long=price_day_long+8d1;if(sub=1)if(price_day_long=8d0) price_day_long=8d99;else price_day_long=4) begin count1=0;count=count+1; end /为了方便模拟,出租车每秒走0.2Kmelse count1=count1+1; enddistance=count;endendmodule3 时钟模块/时钟模块/为系统提供时间module clock(clk, /1Hz时钟hour_out, /时,显示时间min_out, /分,显示时间sec_out, /秒, 显示时间);input clk;output 7:0 hour_out,min_out,sec_out;reg 7:0 hour_out,min_out,sec_out;initialbeginhour_out=12;min_out=0;sec_out=0;endalways (posedge clk)beginif(sec_out59)beginsec_out=sec_out+7b1;endif(sec_out=59)beginsec_out=0;if(min_out59) min_out=min_out+7b1;endif(min_out=59)beginmin_out=0;if(hour_out23)hour_out=hour_out+7b1;endif(hour_out=23)beginhour_out=0;endendendmodule4 等待时间计数模块/等待时间模块module wait_time (clk, /1Hzstart, /计费启动开关run, /出租车运行状态开关led_stop,wait_time /等待时间);input clk,run;input 3:0 start;output 15:0 wait_time;output led_stop;reg 15:0 wait_time,count;reg led_stop;always(posedge clk)beginif(start=0) wait_time=0; /清零if(start=1&run=0) /计价开关为1,且车状态位0,开始计时beginled_stop=1;if(count10) count=count+16b1;/为了便于模拟,每10s,当做一分钟else begin count=0;wait_time=wait_time+1;endendelsebeginled_stop=0;endendendmodule5 计价模块/ 计价模块/根据里程、时钟、等待时间计算出总价/里程:判断远程和近程/时钟:判断白天和晚上/价格单位:元/里程单位:千米/等待时间单位:分钟/时间和里程为整数/价格为小数module charge(clk, /50MHzstart, /计费启动开关run, /出租车运行状态开关distance, /里程hour, /时钟,时min, /时钟,分sec, /时钟,秒wait_time, /等待时间day_time, /白天开始时间night_time, /晚上开始时间short_distance, /起步价可行最大里程数long_distance, /最大近程里程数price_day_short, /白天近程单价price_day_long, /白天远程单价price_night_short, /晚上近程单价price_night_long, /晚上远程单价one_price_day, /白天起步价one_price_night, /晚上起步价price_wait_time, /等待时间每分钟价格charge, /总费用total_charge,total_distance);input clk,run;input 3:0 start;input 7:0 hour,min,sec,day_time,night_time;input 7:0 short_distance,long_distance;input 7:0 price_day_short,price_day_long,price_night_short,price_night_long,price_wait_time;input 11:0 one_price_day,one_price_night;input 15:0 distance,wait_time;output 15:0 charge;output 15:0 total_charge,total_distance;reg 15:0 one_price,charge;reg 15:0 distance1,distance2;reg 15:0 total_charge,total_distance;reg 15:0 cnt1; /白天近程里程数reg 15:0 cnt2; /白天远程里程数reg 15:0 cnt3; /晚上近程里程数reg 15:0 cnt4; /晚上远程里程数reg flag,flag1;always(posedge clk)beginif(start=0) /清零beginflag=0;flag1=1;cnt1=0;cnt2=0;cnt3=0;cnt4=0;one_price=0;endif(start=1&flag=0)beginflag=day_time&hour=night_time) one_price=one_price_day; /白天,起步价else one_price=one_price_night; /夜晚,起步价enddistance1=distance; /检测该时钟与该时钟之前时钟的变量值,是否相等。有变化则执行下面语句。distance2short_distance)beginif(hour=day_time&hour=night_time) /白天if(distance=long_distance) cnt1=cnt1+1; /近程else cnt2=cnt2+1; /远程else /夜晚if(distance=long_distance) cnt3=cnt3+1; /近程else cnt4=cnt4+1; /远程endend/总费用 /为了处理小数,该价格以被扩大十倍charge=one_price+cnt1*price_day_short+cnt2*price_day_long+cnt3*price_night_short+cnt4*price_night_long+wait_time*price_wait_time; if(start=2&flag1=1)beginflag1=0;total_charge=total_charge+charge; /统计每天总金额total_distance=total_distance+distance; /统计每天总里程endendendmodule6 数码管驱动模块(有小数点)/功能: 动态八位数码管扫描/输入参数:扫描时钟clk_1k,待显示的数据d/输出参数:数码管段选输出sm_seg,数码管位选输出sm_bit/备 注:待显示的数据为16进制格式,例如输入0x12345678,显示12345678/ DP7 DP6 DP5 DP4 DP3 DP2 DP1 DP0/小数点位:数码管八 数码管七 数码管六 数码管五 数码管四 数码管三 数码管二 数码管一/ D31:28 D27:24 D23:20 D19:16 D15:12 D11:8 D7:4 D3:0/数据位: 数码管八 数码管七 数码管六 数码管五 数码管四 数码管三 数码管二 数码管一module led_drive3(clk_1k,D,DP,sm_seg,sm_bit);input clk_1k; /输入时钟input31:0 D; /数据输入端input7:0 DP; /数码管小数点控制信息output7:0 sm_seg; /数码管段选输出sm_segoutput7:0 sm_bit; /数码管位选输出sm_bitreg7:0 sm_seg_r; /数码管段选输出寄存器reg7:0 sm_bit_r; /数码管位选输出寄存器reg3:0 disp_dat; /定义显示数码寄存器reg2:0 count; /定义计数寄存器assign sm_seg = sm_seg_r; /输出数码管译码结果assign sm_bit = sm_bit_r; /输出数码管选择always (posedge clk_1k) /定义上升沿触发进程begin count = count +1b1;end always (posedge clk_1k)begin case(count) /选择扫描显示数据 3d7 : disp_dat = D31:28; /第八个数码管 3d6 : disp_dat = D27:24; /第七个数码管 3d5 : disp_dat = D23:20; /第六个数码管 3d4 : disp_dat = D19:16; /第五个数码管 3d3 : disp_dat = D15:12; /第四个数码管 3d2 : disp_dat = D11:8; /第三个数码管 3d1 : disp_dat = D7:4; /第二个数码管 3d0 : disp_dat = D3:0; /第一个数码管 default : disp_dat = 0; endcase case(count) /选择数码管显示位 3d7 : sm_bit_r = 8b1111_1110; /选择第八个数码管显示 3d6 : sm_bit_r = 8b1111_1101; /选择第七个数码管显示 3d5 : sm_bit_r = 8b1111_1011; /选择第六个数码管显示 3d4 : sm_bit_r = 8b1111_0111; /选择第五个数码管显示 3d3 : sm_bit_r = 8b1110_1111; /选择第四个数码管显示 3d2 : sm_bit_r = 8b1101_1111; /选择第三个数码管显示 3d1 : sm_bit_r = 8b1011_1111; /选择第二个数码管显示 3d0 : sm_bit_r = 8b0111_1111; /选择第一个数码管显示 default : sm_bit_r = 8b1111_1111; endcaseendalways (disp_dat) /高电平:关闭小数点 低电平:打开小数点begincase (disp_dat)/七段译码 /小数点位 /不控制小数点位 4h0 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b100_0000; end /显示0 4h1 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b111_1001; end /显示1 4h2 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b010_0100; end /显示2 4h3 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b011_0000; end /显示3 4h4 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b001_1001; end /显示4 4h5 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b001_0010; end /显示5 4h6 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b000_0010; end /显示6 4h7 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b111_1000; end /显示7 4h8 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b000_0000; end /显示8 4h9 : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b001_0000; end /显示9 4ha : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b000_1000; end /显示a 4hb : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b000_0011; end /显示b 4hc : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b100_0110; end /显示c 4hd : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b010_0001; end /显示d 4he : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b000_0110; end /显示e /保留一个状态,用于闪屏,因此不显示f/4hf : begin sm_seg_r7=DPcount-1b1; sm_seg_r6:0 = 7b000_1110; end /显示f default:begin sm_seg_r7=1b1; sm_seg_r6:0 = 7b111_1111; end /不显示,数码管,熄灭 endcase endendmodule7 尾灯模块module tail_light(clk, /4Hz时钟led_left, /左转灯信号led_stop, /停止灯信号led_right, /右转信号led /8位LED灯输出控制端);input clk,led_left,led_stop,led_right;output 7:0 led;reg 7:0 led,led_l,led_s,led_r;initial /初始化beginled_l=8b0000_0001; led_s=8b0000_0000; led_r=8b1000_0000; endalways(posedge clk)beginif(led_left=0&led_stop=0&led_right=0) led=8b0000_0000; /清屏if(led_left=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术表情创意课件
- 2025年电商内容营销策略优化:种草经济下的品牌战略研究报告
- 2025年事业单位工勤技能-湖北-湖北广播电视天线工五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-海南-海南铸造工四级(中级工)历年参考题库含答案解析
- 2025年零售门店数字化智能化门店导购系统技术应用与用户体验优化案例研究报告
- 2025年事业单位工勤技能-河南-河南计量检定工二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-江苏-江苏工程测量员四级(中级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西政务服务办事员一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-广东-广东防疫员四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广东-广东机械冷加工三级(高级工)历年参考题库典型考点含答案解析
- 2025年度运输业安全生产知识竞赛试题(附答案)
- 光伏居间的合同8篇
- GB/T 45418-2025配电网通用技术导则
- 医疗风险防控培训课件
- 机械设计部绩效考核制度
- 诊疗规范培训课件
- 《KANO模型培训》课件
- 复苏室患者的交接流程
- DB21-T 2523-2015矿山地质环境恢复治理规程
- 新能源集控中心建设方案
- 《中国老年糖尿病诊疗指南(2024版)》解读课件
评论
0/150
提交评论