出租车计费器1.docx
《出租车计费器1.docx》由会员分享,可在线阅读,更多相关《出租车计费器1.docx(14页珍藏版)》请在冰豆网上搜索。
出租车计费器1
上海电力学院
课程设计报告
课程设计名称:
FPGA设计实践
设计课题名称:
出租车计费器
班级:
2007142指导老师:
赵倩
姓名:
潘虎学号:
20072713
成绩:
设计时间:
2010.7.5~7.9
设计地点:
计算机信息与工程学院
。
。
。
。
。
。
。
。
(写题目)报告
一、设计目的:
本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。
本课程有助于培养学生的数字电路设计方法、掌握模块划分、工程设计思想与电路调试能力,为以后从事各种电路设计、制作与调试工作打下坚实的基础。
二、实验器材和工具软件:
本课程要求学生在掌握数字电路理论基础上,以FPGA技术为基础,以VHDL为语言,以QuartusII为工具,设计题目:
出租车计费器、数字秒表、简易乒乓游戏机、电梯控制器、多功能波形发生器设计、微波炉控制器、电子点菜系统、自动打铃、抢答器设计、地铁自动售票逻辑设计系统等,一人一题。
三、设计内容:
一、实验任务及要求
l.能实现计费功能,计费标准为:
按行驶里程收费,起步费为7.00元,并在车行3公里后再按2.2元/公里,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,车停止不计费。
2.实现预置功能:
能预置起步费、每公里收费、车行加费里程。
3.实现模拟功能:
能模拟汽车启动、停止、暂停、车速等状态。
4.设计动态扫描电路:
将车费显示出来,有两位小数。
5.用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。
6.各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
7.完成电路全部设计后,通过系统实验箱下载验证设计课题的正确性
四、设计具体步骤:
1、首先是根据要求绘制顶层框图
从绘制的框图,可以将主要功能分为四个模块,分别编辑;
对功能模块功能是百米波形,车费计算,里程计算,和预置模块,
百米波形模块的功能是根据行车距离产生百米的波形,这个波形是与距离相关,而不是与时间相关,产生这个波形以被车费计算模块和里程计算模块使用。
车费计算模块功能是结合百米波形和起步费,和单公里车费计算车费。
里程计算模块功能是结合百米波形,计算车程。
预置模块的功能是对起步费和单公里费用的预置,同时处理加班费用。
同时在编辑中,有使用到分频器和BCD码转7段数码管,在之前的实验中已经编辑过,所以在这里就直接引用了。
2、分别编辑各个模块。
首先是百米波形产生,通过速度输入,结合分频器,每隔一段时间对速度进行采样,然后累加,当数值大于100,产生波形,同时寄存器减100,由此产生波形。
波形产生的原理图
模块代码
3、车费计算
车费计算的模块
libraryieee;
useieee.std_logic_1164.all;
useieee.numeric_std.all;
useieee.std_logic_unsigned.all;
useieee.math_real.all;
entitychefeiis
port(clk,reset:
instd_logic;
fen,jiao,ge,shi:
bufferstd_logic_vector(3downto0);
qibu:
instd_logic_vector(7downto0);
dgl:
instd_logic_vector(7downto0));
endentity;
architecturebehav_cfofchefeiis
begin
process(clk,reset)
variablechfe,ji,ji1,qb:
Integer:
=0;
variablelichen:
Integer:
=0;
variablefen1,jiao1,ge1,shi1:
Integer;
begin
ifreset='1'then
fen<="0000";jiao<="0000";ge<="0000";shi<="0000";lichen:
=0;chfe:
=0;
elsifrising_edge(clk)then
lichen:
=lichen+1;
iflichen<30then
chfe:
=qb*100;
elsiflichen>30then
chfe:
=chfe+ji1*10+ji;
endif;
endif;
fen1:
=chferem10;
jiao1:
=(chfe/10)rem10;
ge1:
=(chfe/100)rem10;
shi1:
=(chfe/1000)rem10;
caseqibuis
when"00000111"=>qb:
=7;
when"00001000"=>qb:
=8;
when"00001001"=>qb:
=9;
when"00001010"=>qb:
=10;
when"00001011"=>qb:
=11;
when"00001100"=>qb:
=12;
when"00001101"=>qb:
=13;
when"00001110"=>qb:
=14;
when"00001111"=>qb:
=15;
when"00010000"=>qb:
=16;
whenothers=>qb:
=20;
endcase;
casedgl(3downto0)is
when"0001"=>ji:
=1;
when"0010"=>ji:
=2;
when"0011"=>ji:
=3;
when"0100"=>ji:
=4;
when"0101"=>ji:
=5;
when"0110"=>ji:
=6;
when"0111"=>ji:
=7;
when"1000"=>ji:
=8;
when"1001"=>ji:
=9;
when"0000"=>ji:
=0;
whenothers=>ji:
=0;
endcase;
casedgl(7downto4)is
when"0001"=>ji1:
=1;
when"0010"=>ji1:
=2;
when"0011"=>ji1:
=3;
when"0100"=>ji1:
=4;
when"0101"=>ji1:
=5;
when"0110"=>ji1:
=6;
when"0111"=>ji1:
=7;
when"1000"=>ji1:
=8;
when"1001"=>ji1:
=9;
when"0000"=>ji1:
=0;
whenothers=>ji1:
=0;
endcase;
casefen1is
when0=>fen<="0000";
when1=>fen<="0001";
when2=>fen<="0010";
when3=>fen<="0011";
when4=>fen<="0100";
when5=>fen<="0101";
when6=>fen<="0110";
when7=>fen<="0111";
when8=>fen<="1000";
when9=>fen<="1001";
whenothers=>fen<="1111";
endcase;
casejiao1is
when0=>jiao<="0000";
when1=>jiao<="0001";
when2=>jiao<="0010";
when3=>jiao<="0011";
when4=>jiao<="0100";
when5=>jiao<="0101";
when6=>jiao<="0110";
when7=>jiao<="0111";
when8=>jiao<="1000";
when9=>jiao<="1001";
whenothers=>jiao<="1111";
endcase;
casege1is
when0=>ge<="0000";
when1=>ge<="0001";
when2=>ge<="0010";
when3=>ge<="0011";
when4=>ge<="0100";
when5=>ge<="0101";
when6=>ge<="0110";
when7=>ge<="0111";
when8=>ge<="1000";
when9=>ge<="1001";
whenothers=>ge<="1111";
endcase;
caseshi1is
when0=>shi<="0000";
when1=>shi<="0001";
when2=>shi<="0010";
when3=>shi<="0011";
when4=>shi<="0100";
when5=>shi<="0101";
when6=>shi<="0110";
when7=>shi<="0111";
when8=>shi<="1000";
when9=>shi<="1001";
whenothers=>shi<="1111";
endcase;
endprocess;
endbehav_cf;
4、车程计算
libraryieee;
useieee.std_logic_1164.all;
useieee.numeric_std.all;
useieee.std_logic_unsigned.all;
useieee.math_real.all;
entitylichenis
port(reset,clk:
instd_logic;
dian,ge,shi,bai:
bufferstd_logic_vector(3downto0));
endentity;
architecturebehav_lcoflichenis
begin
a1:
process(clk,reset)
variablelichen:
Integer:
=0;
variabledian1,ge1,shi1,bai1:
Integer;
begin
ifreset='1'then
dian<="0000";ge<="0000";shi<="0000";bai<="0000";lichen:
=0;
elsifrising_edge(clk)then
lichen:
=lichen+1;
endif;
dian1:
=(lichen)rem10;
ge1:
=(lichen/10)rem10;
shi1:
=(lichen/100)rem10;
bai1:
=(lichen/1000)rem10;
casedian1is
when0=>dian<="0000";
when1=>dian<="0001";
when2=>dian<="0010";
when3=>dian<="0011";
when4=>dian<="0100";
when5=>dian<="0101";
when6=>dian<="0110";
when7=>dian<="0111";
when8=>dian<="1000";
when9=>dian<="1001";
whenothers=>dian<="1111";
endcase;
casege1is
when0=>ge<="0000";
when1=>ge<="0001";
when2=>ge<="0010";
when3=>ge<="0011";
when4=>ge<="0100";
when5=>ge<="0101";
when6=>ge<="0110";
when7=>ge<="0111";
when8=>ge<="1000";
when9=>ge<="1001";
whenothers=>ge<="1111";
endcase;
caseshi1is
when0=>shi<="0000";
when1=>shi<="0001";
when2=>shi<="0010";
when3=>shi<="0011";
when4=>shi<="0100";
when5=>shi<="0101";
when6=>shi<="0110";
when7=>shi<="0111";
when8=>shi<="1000";
when9=>shi<="1001";
whenothers=>shi<="1111";
endcase;
casebai1is
when0=>bai<="0000";
when1=>bai<="0001";
when2=>bai<="0010";
when3=>bai<="0011";
when4=>bai<="0100";
when5=>bai<="0101";
when6=>bai<="0110";
when7=>bai<="0111";
when8=>bai<="1000";
when9=>bai<="1001";
whenothers=>bai<="1111";
endcase;
endprocessa1;
endbehav_lc;
4、预置单元
libraryieee;
useieee.std_logic_1164.all;
useieee.numeric_std.all;
useieee.std_logic_unsigned.all;
useieee.math_real.all;
entityyuzhiis
port(clk,reset:
instd_logic;
sec1,sec2,sec3:
instd_logic;
data:
instd_logic_vector(7downto0);
ti1:
instd_logic_vector(3downto0);
qibu:
outstd_logic_vector(7downto0);
dgl:
bufferstd_logic_vector(7downto0));
endentity;
architecturebehav_yzofyuzhiis
signaljia:
std_logic_vector(7downto0);
signaljiaz:
std_logic;
begin
process(clk,ti1,sec1,sec2,sec3,reset)
begin
ifreset='1'then
jia<="00010001";qibu<="00000111";dgl<="00100010";jiaz<='0';
elsif(clk'eventandclk='1')then
ifsec1='1'then
qibu<=data;
elsifsec2='1'then
dgl<=data;
elsifsec3='1'then
jia<=data;
endif;
ifti1="0010"andjiaz='0'then
dgl<=jia+dgl;jiaz<='1';
endif;
endif;
endprocess;
endbehav_yz;
对于预置单元,他主要是对单公里费用进行更改预置,以及对单公里费用和超过20元后的加班费用的预置,同时在预置单元中有对超过20元后每公里车费的处理。
模块的输入端主要有时钟,复位,预置选择,和数据输入端,输出有预置后的起步费,和单公里费用。
预置的功能是这样完成的,通过预置端选择对应的更改数据,将数据输入口的数值赋予,在模块中有对起步费,单公里费用和加班费的预置,对应的选择端为sec1,sec2,sec3,高电平有效,而数据输入端是和百米波形产生器的速度端是共用的,通过各自的启停,和选取端来使用公共端口,在程序中,预置的数据是按照要求,起步费为7元,单公里费用为2.2,加班费为150%,都可以在预置模块中预置。
预置模块还有一项功能是对加班后每公里费用的处理,通过车费计数输出车费十位的BCD码进行处理,在模块中就讲加班处理好,而在车费计数中可以不用处理,可以是车费处理单元只处理车费计算。
减少其复杂程度,可以是计费更精确的进行。
五、设计收获以及存在的问题:
这次实践中,编辑了出租车计费器,是自己第一次完成从顶层框图,到最后模块的设计,同时,在十进制转BCD码的程序上借鉴往人的经验,不过通过理解,在主题思想不变的情况下,又重新设计了译码程序,同根据自己的模块的要求,又逆向设计了四位二进制,转整形十进制,以方便自己的程序使用。
对于存在的问题是,对于VHDL语言还是不是很熟练,所以在编辑程序时,使用各种语句还是不是很熟练,同时设计上有些程序可能比较繁琐,不能通过对VHDL的熟练来精简程序,同时存在的最大问题是我的程序集成度不高,有个别模块还是可以集成到其他模块中的。
六、心得体会
在这次时间,重要的收获是完成了一个设计流程,从顶层到基本模块,完成了整个设计后,我想也有了基本的设计经验,虽然只是个简单的系统。
在设计中发现,设计经验是需要去积累的,只有编程的次数多了,才能对各个算法,有最佳的设计方案,这个往往需要积累,在编程,就遇到这样的问题,自己设想了一个算法,编辑出来仿真是往往遇到很多问题,需要优化,甚至重新设计才能够完成设计。
这算是最深的体会。
同时在设计中,也遇到了编程语言较为单调的问题,虽然VHDL语言并不多,但是,在使用上还是有些匮乏。