数字电路出租车计费器之欧阳语创编.docx
- 文档编号:25406669
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:17
- 大小:55.91KB
数字电路出租车计费器之欧阳语创编.docx
《数字电路出租车计费器之欧阳语创编.docx》由会员分享,可在线阅读,更多相关《数字电路出租车计费器之欧阳语创编.docx(17页珍藏版)》请在冰豆网上搜索。
数字电路出租车计费器之欧阳语创编
一、课题要求
(1)
时间:
2021.03.01
创作:
欧阳语
(2)技术要求
1.掌握较复杂逻辑的设计、调试。
2.进一步掌握用VHDL语言设计数字逻辑电路。
3.掌握用quartusII6.0软件进行编程设计。
(3)功能要求
1.能实现计费功能,计费标准为:
按行驶里程收费,起步费为7.00元,并在车行3公里后再按2.2元/公里,当计费器达到或超过一定收费(如20元)。
每公里加收50%的车费,车停止不计费
2.实现预置功能、每公里收费、车行驶加费里程。
3.实现模拟功能:
能模拟汽车启动、停止、暂停、车速等状态。
4.设计动态扫描电路
将车费显示出来。
有两位小数。
5.用VHDL语言设计符合上述功能要求的出租车计费器。
并用层次化设计方法设计该电路。
6.各计数器的技术状态用功能的方法验证,并用有关波形确认电路设计是否正确
7.完成电路全部设计后,通过系统试验箱下载验证设计课题的正确性。
二本人工作:
本人主要负责软件和硬件电路方面的设计,并进行引脚设定,以及与软硬件之间的调试运行,及时修改程序,帮助查找和分析问题,确保能够成功完成出租车计费器的设计。
三设计方案:
3.1主要中心组成
3.2FPGA芯片内部主要程序:
3.3工作原理:
基于CPLD/FPGA的出租车计费器的组成如图1所示。
各部分主要功能如下:
(1)A计数器对车轮传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。
不同车型的车轮直径可能不一样,通过“设置1”对车型做出选择,以实现对不同车轮直径的车进行调整。
(2)B计数器对百米脉冲进行累加,并输出实际公里数的BCD码给译码动态扫描模块。
每计满500送出一个脉冲给C计数器。
“设置2”实现起步公里数预制。
(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。
“设置3”用来完成超价加费、起步价预制等。
(4)译码/动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。
(5)数码管显示将公里数和计费金额均用四位LED数码管显示(2位整数,2位小数)。
3.4功能模块设计
出租车计费器由车型调整模块、计程模块、计费模块、译码动态及扫描等模块组成,整个系统采用模块化设计,首先用VHDL编写功能模块,然后用顶层原理图将各功能模块连接起来。
四单元模块设计:
首先出租车计费器的设计需要分频,所以需要设计了两个频率:
4.1oneMHZ:
由于给定的50MHZ太大,这个程序完成5000分频,实现第一次分频,确保实现动态计数,并且保证频率在驱动范围之内。
libraryieee;
useieee.std_logic_1164.all;
entityoneMHZis
port(daclk:
instd_logic;
clkout:
outstd_logic);
endoneMHZ;
architectureoneofoneMHZis
signaldata:
integerrange0to5000;
signalQ:
std_logic;
begin
process(daclk)
begin
ifdaclk'eventanddaclk='1'then
if(data=5000)then
data<=0;
Q<=notQ;
else
data<=data+1;
endif;
endif;
clkout<=Q;
endprocess;
endone;
4.2twoMHZ:
这个程序完成2500分频,实现第二次分频,确保最后数码管显示频率在合适范围
libraryieee;
useieee.std_logic_1164.all;
entitytwoMHZis
port(daclk:
instd_logic;
clkout:
outstd_logic);
endtwoMHZ;
architectureoneoftwoMHZis
signaldata:
integerrange0to2500;
signalQ:
std_logic;
begin
process(daclk)
begin
ifdaclk'eventanddaclk='1'then
if(data=2500)then
data<=0;
Q<=notQ;
else
data<=data+1;
endif;
endif;
clkout<=Q;
endprocess;
endone;
4.3Charge:
实现计费功能,按行驶里程收费,起步费为7.00元,并在车行3公里后再按2.2元/公里,当计费器达到或超过一定收费(如20元)。
每公里加收50%的车费,车停止不计费,实现预置功能、每公里收费、车行驶加费里程,实现模拟功能,能模拟汽车启动、停止、暂停、车速等状态,将车费显示出来。
有两位小数。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitychargeis
port(cp,ks,tz,zt:
instd_logic;
dis,mon:
outintegerrange0to9999);
endcharge;
architecturechofchargeis
begin
process(cp,ks,tz,zt)
variabledis1,mon1:
integerrange0to9999;
begin
if(cp'eventandcp='1')then
if(tz='0')then
dis1:
=0;mon1:
=0;
elsif(ks='0')then
dis1:
=0;mon1:
=700;
elsif(ks='1'andtz='1'andzt='1')then
dis1:
=dis1+10;
elsif(ks='1'andtz='1'andzt='0')then
dis1:
=dis1;mon1:
=mon1;
endif;
if(dis1<300)thennull;
elsif(dis1<600anddis1>300)then
mon1:
=mon1+22;
elsif(dis1>=600)then
mon1:
=mon1+33;
endif;
mon<=mon1;dis<=dis1;
endif;
endprocess;
endch;
4.4Transform实现将电路计数分高低位显示,将二进制转化为数码管可识别的十进制
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytransformis
port(daclk:
std_logic;
dis,mon:
integerrange0to9999;
dg,ds,db,dq,mg,ms,mb,mq:
outstd_logic_vector(3downto0));
endtransform;
architecturetranoftransformis
begin
process(daclk,dis)
variabled:
integerrange0to9999;
variabled1,d2,d3,d4:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(d if(d1=9andd2=9andd3=9)then d1: ="0000";d2: ="0000";d3: ="0000"; d4: =d4+1;d: =d+1; elsif(d1=9andd2=9)then d1: ="0000";d2: ="0000";d3: =d3+1;d: =d+1; elsif(d1=9)then d1: ="0000";d2: =d2+1;d: =d+1; else d1: =d1+1;d: =d+1; endif; else d: =0;d1: ="0000";d2: ="0000";d3: ="0000";d4: ="0000"; endif; endif; dg<=d1;ds<=d2;db<=d3;dq<=d4; endprocess; process(daclk,mon) variablem: integerrange0to9999; variablem1,m2,m3,m4: std_logic_vector(3downto0); begin if(daclk'eventanddaclk='1')then if(m if(m1=9andm2=9andm3=9)then m1: ="0000";m2: ="0000";m3: ="0000";m4: =m4+1;m: =m+1; elsif(m1=9andm2=9)then m1: ="0000";m2: ="0000";m3: =m3+1;m: =m+1; elsif(m1=9)then m1: ="0000";m2: =m2+1;m: =m+1; else m1: =m1+1;m: =m+1; endif; else m: =0;m1: ="0000";m2: ="0000";m3: ="0000";m4: ="0000"; endif; endif; mg<=m1;ms<=m2;mb<=m3;mq<=m4; endprocess; endtran; 4.5Sel通过选择器将路程和车费每位分别输出,送到数码管 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entityselis port(c: instd_logic_vector(2downto0); dg,ds,db,dq,mg,ms,mb,mq: instd_logic_vector(3downto0); da: outstd_logic_vector(3downto0) ); endsel; architectureseofselis begin process(c,dg,ds,db,dq,mg,ms,mb,mq) variableco: std_logic_vector(2downto0); begin co: =c; casecois when"000"=>da<=dg; when"001"=>da<=ds; when"010"=>da<=db; when"011"=>da<=dq; when"100"=>da<=mg; when"101"=>da<=ms; when"110"=>da<=mb; when"111"=>da<=mq; whenothers=>null; endcase; endprocess; endse; 4.6W用第一次分频过的脉冲实现八进制计数,为下面实现动态扫描做准备 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitywis port(clk: instd_logic; a: outstd_logic_vector(2downto0) ); endw; architecturech1ofwis begin process(clk) variableb: std_logic_vector(2downto0); begin if(clk'eventandclk='1')then if(b="111")then b: ="000"; elseb: =b+1; endif; endif; a<=b; endprocess; endch1; 4.73—8译码器: 通过八进制计数实现动态扫描 libraryieee; useieee.std_logic_1164.all; entitymux38ais port(d: instd_logic_vector(2downto0); q: outstd_logic_vector(7downto0)); endmux38a; architectureoneofmux38ais begin process(d) begin casedis when"000"=>q<="11101111"; when"001"=>q<="11011111"; when"010"=>q<="10111111"; when"011"=>q<="01111111"; when"100"=>q<="11111110"; when"101"=>q<="11111101"; when"110"=>q<="11111011"; when"111"=>q<="11110111"; whenothers=>null; endcase; endprocess; endone; 4.8数码管显示: 显示模块由8个七段LED数码管组成。 各个模块用四个数码管,三个表示整数部分,一个表示小数部分。 由于小数点的位置是固定的,因此可以将小数点接到一个固定的高电平上一直显示。 libraryieee; useieee.std-_logic_1164.all; entityledis port(a: instd_logic_vector(3downto0); L: outstd_logic_vector(6sownto0)); endled; architectureoneofledis begin process(a) begin caseais when"0000"=>L<="0111111"; when"0001"=>L<="0000110"; when"0010"=>L<="1011011"; when"0011"=>L<="1001111"; when"0100"=>L<="1100110"; when"0101"=>L<="1101101"; when"0110"=>L<="1111101"; when"0111"=>L<="0000111"; when"1000"=>L<="1111111"; when"1001"=>L<="1101111"; whenother=>null; endcase; endprocess; endone; 五顶层模块设计: 将各个程序块联合起来,实现层次化设计 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitytaxiis port(cp,start,stop,pause: instd_logic; ss1: outstd_logic_vector(7downto0); ss2: outstd_logic_vector(6downto0)); endentitytaxi; architectureymoftaxiis componentoneMHZ port(daclk: instd_logic; clkout: outstd_logic); endcomponent; componenttwoMHZ port(daclk: instd_logic; clkout: outstd_logic); endcomponent; componentcharge port(cp,ks,tz,zt: instd_logic; dis,mon: outintegerrange0to9999); endcomponent; componenttransform port(daclk: std_logic; dis,mon: integerrange0to9999; dg,ds,db,dq,mg,ms,mb,mq: outstd_logic_vector(3downto0)); endcomponent; componentw port(clk: instd_logic; a: outstd_logic_vector(2downto0)); endcomponent; componentsel port(c: instd_logic_vector(2downto0); dg,ds,db,dq,mg,ms,mb,mq: instd_logic_vector(3downto0); da: outstd_logic_vector(3downto0)); endcomponent; componentmux38a port(d: instd_logic_vector(2downto0); q: outstd_logic_vector(7downto0)); endcomponent; componentled port(a: instd_logic_vector(3downto0); L: outstd_logic_vector(6downto0)); endcomponent; signalaa0,aa1: std_logic; signala0,b0: integerrange0to9999; signalb2,a1,b1,c1,d1,e1,f1,g1,h1: std_logic_vector(3downto0); signaly: std_logic_vector(2downto0); begin u0: oneMHZportmap(daclk=>cp,clkout=>aa0); u1: twoMHZportmap(daclk=>aa0,clkout=>aa1); u2: chargeportmap(cp=>aa1,ks=>start,tz=>stop,zt=>pause,dis=>a0,mon=>b0); u3: transformportmap(daclk=>aa0,dis=>a0,mon=>b0,dg=>a1,ds=>b1,db=>c1,dq=>d1, mg=>e1,ms=>f1,mb=>g1,mq=>h1); u4: wportmap(clk=>aa0,a=>y); u5: selportmap(c=>y,dg=>a1,ds=>b1,db=>c1,dq=>d1, mg=>e1,ms=>f1,mb=>g1,mq=>h1,da=>b2); u6: mux38aportmap(d=>y,q=>ss1); u7: ledportmap(a=>b2,L=>ss2); endym; 六调试结果: 1、下载步骤: (1)安装驱动 插入USB下载线后,自动跳出窗口,手动设置D: altera\quartus6.0\driver\usb_blaster (2)IDE环境设置 Assigements—device—ep2cst144c8 device&pingoptions—configurations—useconfigurationdevise—EPCS1 --编译 (3)programmer Tools—hardwaresetup—usb—blaster Mode—SJTAG选文件xx.sof (4)下载成功后,先拔电源VCC再拔USB下载线。 注意事项: 保证下载板载断电情况下进行ASP或JTAG借口的插拔。 引脚安装图: 出租车计费器成功运行,软硬件之间衔接全无问题,我们成功调试出预想结果,并且增加一些附加功能,比如考虑出租车夜晚和白天计费不一样,设计了加速计费功能,除了软件方面,在硬件上设计了显示灯,便于观察哪个功能起作用。 虽然再调试过程出现了一些问题,但经过讨论以及观察摆出故障,测试完软硬件的独立运行,我们的软硬件之间的衔接运行相当顺利。 七实验中出现问题 在编写程序时出现了一些问题,例如编译错误,仿真结果不正确,但经过细心检查和查找资料,及时改正,尤其在实际顶层文件时出现一系列问题,但很大部分是由于更部分引脚接错造成问题。 这大多由于粗心和不熟练造成的。 在此过程中浪费了一些时间。 并且在下载过程中,尽管操作不熟练,但还是顺利完成。 再软硬件连接过程中,出现了一系列问题,刚开始出现乱码,经检查是数码管和FPGA引脚连错了,接着出现显示没有置数功能,经核查后发现为软硬件不协调,除此之外还有由于频率太快,造成显示太快,无法看清示数显示,经过一系列修改后终于达到预期要求,并增加附加功能。 八、设计小结 出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。 车暂时停止不计费,车费保持不变。 若停止则车费清零,等待下一次计费的开始。 出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。 车暂时停止不计费,车费保持不变。 若停止则车费清零,等待下一次计费的开始。 各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。 出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。 九收获与体会: 两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。 在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。 学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。 通过本次数字电路课程设计,我不但熟练的掌握了有关EDA,VHDL的设计方法以及上机的实际操作,而且还获知了有关出租车计费器基于FPGA的设计方法以及实际操作,并且成功的在多方面资料的帮助下设计出了出租车计费器。 看到出租车计费器成功的运行,我由衷的高兴,在此次的方案设计过程中,一次次的困难并没有吓倒我们,反而激起我们解决它们的决心,一次次的挫折使我们对出租车计费器的了解更加深刻。 在此感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。 由于本人的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 出租车 计费 欧阳 创编
![提示](https://static.bdocx.com/images/bang_tan.gif)