出租车计价器设计方案和功能介绍(verilog、fpga).doc

上传人:scccc 文档编号:11261784 上传时间:2021-07-19 格式:DOC 页数:35 大小:54.50KB
返回 下载 相关 举报
出租车计价器设计方案和功能介绍(verilog、fpga).doc_第1页
第1页 / 共35页
出租车计价器设计方案和功能介绍(verilog、fpga).doc_第2页
第2页 / 共35页
出租车计价器设计方案和功能介绍(verilog、fpga).doc_第3页
第3页 / 共35页
出租车计价器设计方案和功能介绍(verilog、fpga).doc_第4页
第4页 / 共35页
出租车计价器设计方案和功能介绍(verilog、fpga).doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《出租车计价器设计方案和功能介绍(verilog、fpga).doc》由会员分享,可在线阅读,更多相关《出租车计价器设计方案和功能介绍(verilog、fpga).doc(35页珍藏版)》请在三一文库上搜索。

1、出租车计价器设计方案和功能介绍(verilog、fpga) 导读:就爱阅读网友为您分享以下“出租车计价器设计方案和功能介绍(verilog、fpga)”资讯,希望对您有所帮助,感谢您对的支持!1 出租车计价器设计方案和功能介绍 2目录一、系统的总体设计方案 . . 41功能模块关系图 . 42设计描述 . 43 按键功能介绍 . 74 开关功能介绍 . 85 状态表示介绍表 . 8二、主要模块的设计代码 . . 101控制模块 . 102 里程计数模块 . 153 时钟模块 . 174 等待时间计数模块 . 195 计价模块 . 206 数码管驱动模块(有小数点) . . 257 尾灯模块 .

2、 29三、总结感想(这是编程中遇到的一些问题的处理方法) . 311 复位键(reset )的使用心得 . . 312 关于,有用信号leap=1,是否需要让leap=0的问题。 . . 313 在一个Verilog 文件中,不可以在两个always 模块中同时操作一个变量。 . 324 数码管闪烁 . 32 5 对于一些取值不能为0的变量,如year ,month 等,应该赋给初始值,以免显示出错。. 3236 对于reset 这样的点击键应该写成点击形式,加上消抖程序。不应该用连加,以避免出错。. 327 关于按键检测问题 . 328 怎么获得一个变量,某时刻和该时刻之前的变量? . .

3、32 9 每一个verilog 模块不能包含太多阻塞赋值语句,否则编译器会报错。尽可能多用非阻塞语句赋值。 . . 34附录:总设计图 . . 35 4 出租车计价器设计方案和功能介绍一、系统的总体设计方案1功能模块关系图 2设计描述 本数字钟有10个模块组成,分频器模块、消抖模块、控制模块、等待时间计数模块、时钟模块、里程计算模块、计价模块、显示模块、数码管驱动模块、尾灯模块。1 分频器模块:将开发板提供的50MHz 的时钟,分频成1Hz 、4Hz 、1KHz 和6MHz 的时钟信号,供各模块使用。52 消抖模块:处理按键毛刺,产生稳定信号3控制模块:(1) 白天近程和远程单价,晚上近程和远

4、程单价(2) 白天起步价,晚上起步价(3) 等待每分钟价格(4) 起步价可行公里数,远程和近程分界线(5) 白天晚上开始时间4等待时间计数模块:在state=1(计价器已经打开)且run=0(出租车暂停)时,开始计时。产生数据单位为分钟,最小值位1分钟,没有小数。5 时钟模块:对1Hz 时钟信号进行处理,实现时分秒循环计数,构成时钟。6里程计算模块:对1Hz 时钟作为模拟信号源,模拟每秒走0.2Km 。输出数据单位为千米,最小值为1千米,没有小数。7计价模块:计价模块位本出租车计价器中最核心和重要的模块,如果该模块编好,计价器就完成了一半。对里程模块输出数据进行处理,统计出在白天近程(pric

5、e_day_short)、白天远程(price_day_long)、晚上近程(price_night_short)、晚上远程(price_night_long)单价内,行驶的里程数cnt1、cnt2、cnt3、cnt4。6对时钟模块时钟进行处理,判断出现在是白天还是晚上,给里程单价和起步价提供判断依据。对等待时间计数模块输出数据处理,计算出等待时间所产生的金额。总的计价公式=起步价+price_day_short*cnt1+price_day_long*cnt2+price_night_short*cnt3+price_night_long*cnt4+等待金额8 显示模块:(1) 金额和里程显

6、示(2) 等待时间显示(3) 时钟时分秒显示(4) 设置时单价显示(5) 设置时等待价格显示(6) 设置起步价显示(7) 设置里程分界显示(8) 设置白天和晚上开始时间显示9 数码管驱动模块:根据显示模块提供的段选、位选信号和小数点控制信号,控制8个数码管显示数据。输入信号必须为,每4个二进制位为一组表示一位十进制数(十进制数09),小数点控制信号时8位的。10 尾灯模块:尾灯模块用8个LED 灯显示车的转向状态,用两个7开关模拟出租车左转和右转。左转时:8个LED 灯从右向左依次循环点亮;右转时:8个LED 灯从左向右依次循环点亮。在车处于计价等待时间时,8LED 灯闪烁。 3 按键功能介绍

7、 共有四个按键,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,表示按一次键后计价器开始计价)计价器开始计价、停止计价(计价结束,显示数据)、数据清零。设置好价格数

8、据后,start 键每按三次就是一次循环,也就是拉完一个客人。 第二功能:当state !=0时,负责该状态设置数值加1。 4 run键:第一功能:当start=0且start_out=1时,有两个状态run_out=1、0(run_out初始值为1,表示按一次后车状态为停止)车运行、车停止。run 键每按一次在运行和停止变换一次第二功能:state !=0,负责该状态设置数值减1。84开关功能介绍LED_LEFT开关:当出租车要左转时,打开该开关。8个LED 灯从右向左依次循环点亮。LED_RIGHT开关:当出租车要左转时,打开该开关。8个LED 灯从左向右依次循环点亮。5 状态表示介绍表9

9、 10二、主要模块的设计代码这里只列举控制模块、里程计数模块、时钟模块、等待时间计数模块、计价模块、数码管驱动模块、尾灯模块。分频模块、消抖模块和显示模块不在列举。1控制模块由于该模块重复代码太多了,直接去了一部分。但是,该模块还是完整地模块,所缺少只是其它状态下对其它数据的设置,和状态4b3和4b4很相似。该模块最经典的时,start 和run 键双功能设置。 /控制模块/控制计价器开始/停止/控制出租车状态走/停module control(clk, /50MHz reset, /复位set, /状态切换start, /计费启动开关run, /出租车运行状态开关price_day_shor

10、t, /白天近程单价price_day_long, /白天远程单价price_night_short, /晚上近程单价 price_night_long, /晚上远程单价11price_wait_time, /等待时间每分钟价格one_price_day, /白天起步价one_price_night, /晚上起步价short_distance, /起步价可行最大里程数long_distance, /最大近程里程数day_time, /白天开始时间night_time, /晚上开始时间start_out,run_out,state,password /更改信息的密码);inputclk,rese

11、t,set,start,run;input 5:0 password;output7: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;outputrun_out;reg7:012price_day_

12、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;regrun_out,add,sub; initial /为了处理小数点,把实际价格扩大十倍beginday_time=5; /白天开始时间night_time=23; /晚上开始时间short_di

13、stance=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元 end13initialbeginstate=4d0;end always(posedgeclk)be

14、ginif(reset=1) /复位键 state=4d0;if(set=1) /总状态设置 if(state=4d14)state=4d1; elsestate=state+4d1; / start/run第一功能区 if(start=1&state=0) /state=0,该功能可用 /计费启动键,每按一次取反一次。if(start_out=4d2) start_out=4d0; /总状态设置 elsestart_out=start_out+4d1;14 if(start_out=0) run_out=1;if(start_out=1&run=1&state=0) /出租车行驶状态键,没按

15、一次取反一次。 beginrun_out=run_out; end / start/run第二功能区 add=start; /加, 第二功能sub=run; /减, 第二功能if(password=6b010101) /密码正确才能更改价格和参数case(state)4d0:;4d1:;4d2:;4d3:beginif(add=1) /白天近程单价设置 if(price_day_short=8d99) price_day_short=8d0;15 elseprice_day_short=price_day_short+8d1;if(sub=1)if(price_day_short=8d0) p

16、rice_day_short=8d99;elseprice_day_short=price_day_short-8d1;end4d4: /白天远程单价设置beginif(add=1)if(price_day_long=8d99) price_day_long=8d0;elseprice_day_long=price_day_long+8d1;if(sub=1)if(price_day_long=8d0) price_day_long=8d99;elseprice_day_long=price_day_long-8d1;endendcaseend endmodule2 里程计数模块/里程计算模块

17、module distance(clk, /1Hzstart, /计费启动开关16run, /出租车运行状态开关distance /里程);inputclk,run;input 3:0 start;output 15:0 distance;reg 15:0 distance,count,count1; always(posedgeclk)beginif(start=0) count=0; /清零 if(start=1&run=1)beginif(count1=4) begin count1=0;count=count+1; end /为了方便模拟,出租车每秒走0.2Kmelse count1=

18、count1+1;end distance=count; 17endendmodule3 时钟模块/时钟模块/为系统提供时间module clock(clk, /1Hz时钟hour_out, /时,显示时间min_out, /分,显示时间sec_out, /秒, 显示时间 );inputclk;output 7:0 hour_out,min_out,sec_out; reg 7:0 hour_out,min_out,sec_out;initialbegin hour_out=12;min_out=0;sec_out=0; endalways (posedgeclk)18begin if(sec

19、_out59)beginsec_out=sec_out+7b1;end if(sec_out=59)beginsec_out=0;if(min_out59) min_out=min_out+7b1;end if(min_out=59)beginmin_out=0;if(hour_out23) hour_out=hour_out+7b1;end if(hour_out=23)begin hour_out=0;19 endendendmodule4 等待时间计数模块 /等待时间模块modulewait_time (clk, /1Hzstart, /计费启动开关run, /出租车运行状态开关led_

20、stop,wait_time /等待时间);inputclk,run;input 3:0 start;output 15:0 wait_time;outputled_stop;reg 15:0 wait_time,count;regled_stop; always(posedgeclk) begin20 if(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

21、;wait_time=wait_time+1;endendelsebeginled_stop=0;end endendmodule5 计价模块/ 计价模块/根据里程、时钟、等待时间计算出总价 /里程:判断远程和近程/时钟:判断白天和晚上/价格单位:元/里程单位:千米/等待时间单位:分钟21 /时间和里程为整数/价格为小数module charge(clk, /50MHz start, /计费启动开关 run, /出租车运行状态开关 distance,/里程 hour,/时钟,时 min,/时钟,分 sec,/时钟,秒 wait_time,/等待时间 day_time,/白天开始时间 night

22、_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,/等待时间每分钟价格22 charge, /总费用total_charge,total_distance);inputclk,run;input 3:0 s

23、tart;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

24、_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; /晚上远程里程数23reg flag,flag1; always(posedgeclk)beginif(start=0) /清零beginflag=0;flag1=1;cnt1=0;cnt2=0;cnt3=0;cnt4=0;o

25、ne_price=0;end if(start=1&flag=0)beginflag=1;if(hour=day_time&hour=night_time) one_price=one_price_day; /白天,起步价else one_price=one_price_night; /夜晚,起步价24 enddistance1=distance; /检测该时钟与该时钟之前时钟的变量值,是否相等。有变化则执行下面语句。 distance2=distance1; if(distance2!=distance1) /白天近程、白天远程、晚上近程、晚上远程各价位里程数计数 beginif(start

26、=1&distanceshort_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 /总费用 /为了处理小数,该价格以被扩大十倍 25charge=one_price+cnt1*price_day_short+cnt2*price_day_long+cnt3*p

27、rice_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; /统计每天总里程end endendmodule6 数码管驱动模块(有小数点)/功能: 动态八位数码管扫描/输入参数:扫描时钟clk_1k,待显示的数据d/输出参数:数码管段选输出sm_seg,数码管位选输出sm_bit/备 注:待显示的数

28、据为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);26input clk_1k; /输入时钟input31:0 D; /数据输入端input7

29、:0 DP; /数码管小数点控制信息 output7:0 sm_seg; /数码管段选输出sm_seg output7:0 sm_bit; /数码管位选输出sm_bit reg7: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) /定义上升沿触发进程 be

30、gincount= count +1b1;endalways (posedge clk_1k)begincase(count) /选择扫描显示数据3d7 : disp_dat = D31:28; /第八个数码管 3d6 : disp_dat = D27:24; /第七个数码管 3d5 : disp_dat = D23:20; /第六个数码管 3d4 : disp_dat = D19:16; /第五个数码管273d3 : disp_dat = D15:12; /第四个数码管3d2 : disp_dat = D11:8; /第三个数码管3d1 : disp_dat = D7:4; /第二个数码管3

31、d0 : disp_dat = D3:0; /第一个数码管default :disp_dat = 0;endcasecase(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_bi

32、t_r = 8b1101_1111; /选择第三个数码管显示 3d1 : sm_bit_r = 8b1011_1111; /选择第二个数码管显示 3d0 : sm_bit_r = 8b0111_1111; /选择第一个数码管显示 default :sm_bit_r = 8b1111_1111;endcaseend always (disp_dat) /高电平:关闭小数点 低电平:打开小数点 begincase (disp_dat)/七段译码 /小数点位 /不控制小数点位284h0 : 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 =

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1