基于FPGA的出租车计费系统设计报告.docx
封面XXXXXXX 学院题目:基于 FPGA 的出租车计费系统设计院系:专业班级: 学生姓名: 指导教师:时间:年月日目 录1. 引言22. 试验任务及要求23. 模块功能24. 设计说明35. 试验结果46. 一些问题和改进47. 心得与体会48.附录··························2摘要介绍了出租车计费器系统的组成及工作原理,简述了在EDA 平台上用FPGA 器件构成该数字系统的设计思想和实现过程。论述了分频模块,速度猎取模块,计费模块,进制转换模块,显示模块等的设计方法与技巧。一、引言随着EDA 技术的高速进展,电子系统的设计技术发生了深刻的变化, 大规模可编程规律器件 CPLDFPGA 的消灭,给设计人员带来了诸多便利。利用它进展产品开发,不仅本钱低、周期短、牢靠性高,而且具有完全的学问产权。本文介绍了一个以 Altera 公司可编程规律芯片 cyclone2 系列的 EP2C35F672C6 的 fpga 芯片为掌握核心、附加肯定外围电路组成的出租车计费器系统。随着社会的不断进步,人们生活水平的不断提高,出租车渐渐成为人们日常生活不行缺少的交通工具。而计价器作为出租车的一个重要组成局部,关系着出租车司机和乘客双方利益,起着重要的作用,因而出租车计价器的进展格外迅猛二、试验任务及要求1. 能实现计费功能,计费标准为:按行驶里程收费,起步费为10.00 元,并在车行3 公里后再按 2 元/公里,车起启动后停顿等待时为每分钟 1 元程序中为显示功能,设置为每 10 秒 1 元。2. 实现预置功能:能预置起步费、每公里收费、车行等待时间、总费用。3. 实现模拟功能:能模拟汽车启动、停顿、暂停、等状态。4. 设计动态扫描电路:将车费显示出来,一共三位5. 用 Verilog 语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。6. 各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。7. 完成电路全部设计后,通过系统试验箱下载验证设计的正确性。三、模块功能计费器按里程收费,每 100 米开头一次计费。各模块功能如下:(1) 里程动态显示模块其包括计数车速掌握模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加 0.1掌握器每发一个脉冲代表运行了 0.1 公里。(2) 计费动态显示模块其初值为 10 元,当里程超过3 公里后才承受计数车速掌握模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉冲代表运行了 0.5 公里其数值加 2 元,等待时每分钟加 1 元。(3) 等待计时模块车载行使后,假设处于停滞状态,等待时每分钟收费 1 元。(4) 计费模块计算车载行使和停顿状态时的费用总和。(5) 显示模块在DE0 板数码管上显示以上模块。四:设计说明:实际设计共五个模块,分别为分频模块每一百米送一个脉冲以便利计数、计算里程模块、等待计时模块、计费模块、显示模块。具体功能如下:l 分频模块:假设车轮每转一圈为 2 米,送一个脉冲,则需要50 分频共 100 米,同理,假设知道车轮直径,即可算出分频比l 里程模块:每一百米记一次数,最大可以计999.9 公里,准确到 0.1 公里。l 取整模块:现实中出租车的准确度为0.1 公里,计算价格的时候缺乏一公里的按一公里算,所以加了这一个模块,输出的是计算价格时的里程数。l 计费模块:按行驶里程收费,起步费为10.00 元包括 2 元得燃油附加费,并在车行3 公里后再按 2 元/公里,处于等待状态时每分钟收费 1 元。l 显示模块:通过动态扫描显示车费和里程数,将十进制数转化为四位十进制数如将 9999 转化为四个 9以便利显示。设计流程图如下脉冲输入50 分频器计费模块显示模块里程计算模块计时模块流程说明:车轮每转一圈送一个脉冲波,假设每转一圈为2 米,则经过 50 分频器后是每 100 米送一个脉冲到里程计算模块,里程计算模块可以准确到 0.1 公里,将计算的里程数送至取整模块进展推断,假设小数局部不为零则整数局部加1,即缺乏一公里的局部按一公里计算,取整后的里程送至计费模块计费,同时和计算的费用用过显示模块进展转化和显示顶层原理图如下:时序仿真图引脚安排图6五、试验结果:通过 quartusII 将文件下载到 DE0 板上,运行正常, 与试验目的全都,可以通过调整输入的脉冲频率来调整计费的速度。初始价格为 10 元,超过 3 公里每公里加收 2 元,等待时每分钟 1 元。六、一些问题和改进:总的来说本次试验是顺当的,过程中主要遇到了这几点问题: 1、刚开头没有完全想好要用几个模块做,没画好流程图,所以模块数量显得有点多,很多模块显得有些不必要,如取整模块完全可以合并到计费模块中。2、对其中的管脚定义太过于随便,造成很大空间的铺张, 而且在使用较早的芯片时消灭管脚缺乏的现象,这和模块过多也有很大关系 。一些改进的想法:1、在本次设计中,模拟路程的脉冲必需通过拨动开关给脉冲,不能连续变化,应当改进。2、不能模拟语音 3、显示局部可以扩展到VGA 或者LCD 上显示,效果会更好。4、应当参照实际生活中的出租车功能,更加人性化的设计。七、心得与体会课程设计是培育学生综合运用所学学问 ,觉察,提出,分析和解决实际问题,熬炼实践力量的重要环节,是对学生实际工作力量的具体训练和考察过程.随着科学技术进展的日日异,因此作为二十一世纪的大学来说把握EDA 的开发技术是格外重要的。10附:参考书目1. 谢自美主编. 电子线路设计综合设计. 华中科技大学出版社,20232. 罗杰,谢自美主编. 电子线路设计.试验.测试第 4 版.电子工业出版社,2023.43. 罗杰主编. Verilog HDL 与数字 ASIC 设计根底. 华中科技大学出版社,2023.34. FPGA 与SOPC 设计教程-DE2 实践,张志刚编著,西安电子科技大学出版社,2023.45. 夏宇闻. Verilog数字系统设计教程. 北京航空航天大学出版社程序清单1、module FDIV ( CLK, K); /分频器设计input CLK ;output K ;reg12:0 count ;reg M1 ;parameter ratio=50 ;/定义分频比为 50 always (posedge CLK)beginif (count=ratio-1)count<=0 ; else count<= count+1 ; if (count=0) M1 <= M1;else if (count=ratio/2)M1 <= M1 ;endassign K=M1 ; endmodule2、module Mileage(clk,start,reset,number,distansl,distansh,distans_enable);/里程模块input clk,start,reset,number;/输入信号output distansl,distansh,distans_enable;/里程凹凸位及使能端reg distans_enable;reg3:0 distansl,distansh;always(posedge clk) beginif(reset)begin /进位规律推断distansl<=0; distansh<=0;distans_enable<=0;endelse if(start) beginif(number) beginif(distansl=9) begindistansl<=0; if(distansh=9) begindistansh<=0;endelse distansh<=distansh+1;endelse distansl<=distansl+1;endend if(!(distansl<=2&&distansh=0) begindistans_enable<=1; endend endmodule3、module time_count(clk,reset,start,timel,timeh,time_enable);/等待计时模块input clk,reset,start;output timel,timeh,time_enable; reg time_enable; reg3:0timel,timeh; reg7:0seconds;always(posedge clk) beginif(reset) begintimel,timeh<=8”h00;end else beginif(!start)begin/等待计时规律推断time_enable<=0; if(seconds<10) beginseconds<=seconds+1;end else beginseconds<=8”h0; if(timel=9) begintimel<=0; if(timeh=9) begintimeh<=0;endelse timeh<=timeh+1;endelse timel<=timel+1;endif(seconds=10)&&!(timel<2&&timeh=0) begintime_enable<=1;endendendendendmodule4、ModuleFare(select_clk,time_enable,distans_enable,reset,start,fee1,fee2,fee3);/计费模块input select_clk,time_enable,distans_enable,reset,start; output3:0 fee1,fee2,fee3;reg3:0 fee1,fee2,fee3;always(negedge select_clk) beginif(!reset) beginif(distans_enable|time_enable) beginif(start)begin/计费进位规律推断if(fee3>=8)beginfee3=fee3-8; if(fee2=9) beginfee2<=0; if(fee1=9) fee1<=0;else fee1<=fee1+1;endelse fee2<=fee2+1;endelse fee3<=fee3+2;end else beginif(fee3>=9) beginfee3=fee3-9; if(fee2=9)beginfee2<=0; if(fee1=9) beginfee1<=0;endelse fee1<=fee1+1;endelse fee2<=fee2+1;endelse fee3<=fee3+1;endendendelse fee1,fee2,fee3<=12”h010;endendmodule5、显示模块/ 数码管动态扫描always(posedge clk1khz) begincnt=cnt+1;endalways(cnt) begincase(cnt)”b000:begin data<=m_one;dp<=”d0;scan<=”b00000001;end ”b001:begin data<=m_ten;dp<=”d0;scan<=”b00000010;end ”b010:begin data<=m_hun;dp<=”d1;scan<=”b00000100;end ”b011:begin data<=m_tho;dp<=”d0;scan<=”b00001000;end ”b100:begin data<=d_one;dp<=”d0;scan<=”b00010000;end ”b101:begin data<=d_ten;dp<=”d0;scan<=”b00100000;end ”b110:begin data<=d_hun;dp<=”d1;scan<=”b01000000;end ”b111:begin data<=d_tho;dp<=”d0;scan<=”b10000000;end default:begin data<=”bx;dp<=”bx;scan<=”bx;endendcaseendmodule choose(in1,in2,in3,in4,in5,in6,in7,out1,out2,out3,out4,ch_enable,clk);/选择模块input 6:0 in1,in2,in3,in4,in5,in6,in7;input clk,ch_enable;output out1,out2,out3,out4; reg6:0 out1,out2,out3,out4;always(posedge clk) beginif(ch_enable) beginout1<=in1; out2<=in2; out3<=in3; out4<=in4;endelse beginout1<=in7; out2<=in6;out3<=in5; out4<=7”b1000000;end endEndmodulemodule select_clk(clk,reset,start,time_enable,number,select_clk); input clk,start,reset,number,time_enable;output select_clk; wire select_clk;assign select_clk=reset?clk:(start?number:time_enable); endmodule/7 段译码always(data) begincase(data3:0) 4”b0000:seg76:0=7”b1111110;4”b0001:seg76:0=7”b0110000;4”b0010:seg76:0=7”b1101101;4”b0011:seg76:0=7”b1111001;4”b0100:seg76:0=7”b0110011;4”b0101:seg76:0=7”b1011011;4”b0110:seg76:0=7”b1011111;4”b0111:seg76:0=7”b1110000;4”b1000:seg76:0=7”b1111111;4”b1001:seg76:0=7”b1111011;default:seg76:0=7”b0000000; endcaseend endmodule