出租车计费器1.docx

上传人:b****5 文档编号:5902455 上传时间:2023-01-02 格式:DOCX 页数:14 大小:244.82KB
下载 相关 举报
出租车计费器1.docx_第1页
第1页 / 共14页
出租车计费器1.docx_第2页
第2页 / 共14页
出租车计费器1.docx_第3页
第3页 / 共14页
出租车计费器1.docx_第4页
第4页 / 共14页
出租车计费器1.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

出租车计费器1.docx

《出租车计费器1.docx》由会员分享,可在线阅读,更多相关《出租车计费器1.docx(14页珍藏版)》请在冰豆网上搜索。

出租车计费器1.docx

出租车计费器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语言并不多,但是,在使用上还是有些匮乏。

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

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1