出租车计费器.docx
《出租车计费器.docx》由会员分享,可在线阅读,更多相关《出租车计费器.docx(16页珍藏版)》请在冰豆网上搜索。
出租车计费器
目录
摘要……………………………………………………………………………………………I
Abstract…………………………………………………………………………………………II
绪论…………………………………………………………………………………………III
1、设计目的及要求……………………………………………………………………………1
1.1设计目的………………………………………………………………………………1
1.2设计任务及要求………………………………………………………………………1
2、设计原理及单元模块设计……………………………………………………………………2
2.1设计原理及方法………………………………………………………………………2
2.2单元模块设计…………………………………………………………………………3
2.2.1分频模块设计……………………………………………………………………3
2.2.2控制模块设计……………………………………………………………………3
2.2.3计时模块设计……………………………………………………………………3
2.2.4计程模块设计……………………………………………………………………3
2.2.5计费模块设计……………………………………………………………………3
2.2.6显示模块设计……………………………………………………………………4
3、代码仿真结果………………………………………………………………………………5
3.1分频模块仿真结果……………………………………………………………………5
3.2计程模块仿真结果……………………………………………………………………5
3.3计费模块仿真结果……………………………………………………………………6
4、硬件调试………………………………………………………………………………………7
5、心得体会………………………………………………………………………………………8
6、参考文献………………………………………………………………………………………9
附件1:
顶层文件图……………………………………………………………………………10
附件2:
程序源代码……………………………………………………………………………11
2、设计原理及单元模块设计
2.1设计原理及方法
本次设计首先在QuartusⅡ环境中对出租车自动计费器的各个部分利用VHDL这一硬件描述语言予以设计,生成模块。
主要有:
分频模块、控制模块、计时模块、计程模块、计费模块及显示模块组成。
其系统框图如图2-1所示。
图2-1出租车自动计费器系统框图
计费器在非停车状态完成计程功能并输出到计费模块进行计费,计时模块在停车状态完成计时功能并产生等时计费信号。
计费模块是设计的核心与难点,涉及到多种时钟信号,并有多种计费标准。
计程模块、计时模块、计费模块根据位选信号,输出相应数据的当前选中数字,由顶层模块根据显示数据类型变换信号进行选择,传输给显示模块。
由于实验箱上数码管有限,另用三个LED灯组合,帮助显示计时的分钟。
本次设计首先在QuartusⅡ环境中对出租车自动计费器的各个部分利用VHDL这一硬件描述语言予以设计,进行仿真,然后编写顶层模块将各个模块连接,并对相互之间的信号进行必要处理,从而实现整机功能,最后在实验箱上进行物理测试。
2.2单元模块设计
2.2.1分频模块设计
分频模块从外部读入实验箱的时钟信号clk,向外输出计时信号q,供控制模块、显示模块使用。
具体程序代码详见附录。
2.2.2控制模块设计
控制模块输入端有系统时钟输入端clk、系统复位信号输入端rst、停车信号输入端stop。
靠与时钟信号clk进行逻辑与运算,达到控制计程及计时功能。
具体程序代码详见附录。
2.2.3计时模块设计
计时器有秒计数及60进制的计数,当停车信号stop为'0',进行计时。
计时器中还有一个3进制计数,每当代表分钟的60进制计数器计数3次,产生一个等时计费信号led。
具体程序代码详见附录。
2.2.4计程模块设计
计程器在得到停车信号时,计程器时钟信号无效,在没有停车信号stop时,每有1000个脉冲clk(1s)才进行计数1次,即里程加0.1mil。
在得到复位信号rst时,计程器内部所有计数器和计数信号清零复位,里程计费信号输出'0'。
具体程序代码详见附录。
2.2.5计费模块设计
因为在计费过程中存在小数的计费情况,所以需精确到十分位。
此计价器根据里程及费用来选择不同的计费方式。
根据停车的时间信号led,来选择计费是否加0.7。
复位信号rst为'0',计价器所有数据复位。
具体程序代码详见附录。
2.2.6显示模块设计
显示模块包含一个8位共阴数码管和3/8译码器,还有3个led灯,用来显示停车时间的分钟数。
具体程序代码详见附录。
3、代码仿真结果
仿真结果分为功能仿真与逻辑仿真两幅图进行呈现。
我们会发现时序仿真与功能仿真的波形有差异,这是因为在实际门电路的运行中,电平的处理过程造成了信号的延时。
3.1分频模块仿真结果
该模块的任务是将输入的时钟信号,进行偶数次分频,此处选为4分频进行仿真。
图3-1分频模块功能仿真图
图3-2分频器模块时序仿真图
3.2计程模块仿真结果
该模块的任务是当输入脉冲时,进行计数,当有复位信号时,计数器复位。
当计数器计满后,产生进位信号。
图3-3计程模块功能仿真图
图3-4计程模块时序仿真图
3.3计费模块仿真结果
该模块的任务是根据输入里程数,进行计算。
不同时刻、不同里程,计算所得出的费用不一样。
图3-5计费模块功能仿真图
图3-6计费模块时序仿真图
4、硬件调试
在完成程序综合后,进行硬件调试之前,先要对芯片进行定义。
具体操作如下:
首先点击Assignments—Device,选择实验箱所用芯片型号EP1C3T144C8。
点选DeviceandPinOptions。
在这里选择UnusedPins选项卡,将Reserveallunusedpins选为Asinputtri-stated。
然后开始进行管脚设定,根据实验箱的资源配置设置如下:
PinName
Location
I/OStandard
PinName
Location
I/OStandard
Clk
16
Input
Segout[5]
99
Output
Led[0]
109
Output
Segout[6]
100
Output
Led[1]
110
Output
Segout[7]
103
Output
Led[2]
111
Output
Sel[0]
85
Output
Segout[0]
91
Output
Sel[1]
84
Output
Segout[1]
94
Output
Sel[2]
83
Output
Segout[2]
96
Output
Stop
51
Input
Segout[3]
97
Output
Rst
52
Input
Segout[4]
98
Output
表4-1.芯片管脚分配表
再次进行综合,正确后就可将文件下载到芯片中。
连接下载线,调整实验箱的跳线后,打开电源,经QuartusⅡ中的“PROGRAMMER”菜单,调出编程器窗口。
按下编程器窗口中的“START”按钮,设计的内容就开始下载到FPGA芯片中。
进行多组功能组合测试,显示结果符合设计要求,证明设计成功。
5、心得体会
通过两个星期的课程设计,让笔者明白了不仅要运用学过的EDA技术及应用,数字电路、模拟电路以及电子技术实验等知识,还要学会查阅各种图书资料和工具书,并将新知识和所学的结合起来为自己所用。
在做整个课程设计的过程中,作者进一步熟悉使用了QuartusII软件,能较好的应用这个软件,不管是程序的编写还是在顶层原理图的设计都有所提高,还增强了动手能力。
应用软件的时候,要注意积累每次的体会和错误,下次碰到该注意的地方就要小心点,碰到出过错误的地方就要格外注意不要再犯同样的错误,这种方法应该适用做任何一件事吧。
在设计中遇到一些困难和问题,在与同学的讨论中,解决了问题,觉得很有收获。
在整个课程设计的过程中让作者意识到耐心、毅力和细心是做好一件事的必须品质。
在应用QuartusII软件编程的时候,有很多小细节是需要注意的,不然一不小心就会出现很多错误。
要注意保存文件名和实体名要一致,保存位置要是某个盘里的某个文件夹。
图形编辑中同样有很多需要注意的地方,以及怎样将程序和图形结合起来。
通过这次设计,作者更好地掌握了这些基本技巧,学会了多学多练,也懂得了实践出真知。
6、参考文献
[1]潘松,黄继业.EDA技术与VHDL.北京:
清华大学出版社,2007.1.
[2]宋嘉玉,孙丽霞.EDA实用技术.北京:
人民邮电出版社,2006.12.
[3]齐洪喜,陆颖.VHDL电路设计实用技术.北京:
清华大学出版社,2004.5.
[4]刘艳萍,高振斌,李志军.EDA实用技术及应用.北京:
国防工业出版社,2006.1.
[5]章彬宏.EDA应用技术.北京:
北京理工大学出版社,2007.7.
附件1:
顶层文件图
附件2:
程序源代码
---------------------------------------------------------------------------------------------------------------------
libraryieee;-------分频器
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitycount10000is
port(clk:
instd_logic;
q:
outstd_logic);
endcount10000;
architecturebhvofcount10000is
signalq0:
std_logic;
begin
process(clk)
variablecount:
integerrange0to10000;
begin
if(clk'eventandclk='1')then
if(count<10000)then
count:
=count+1;
else
q0<=notq0;
count:
=0;
endif;
endif;
endprocess;
q<=q0;
endbhv;
---------------------------------------------------------------------------------------------------------------------
libraryieee;-----控制器
useieee.std_logic_1164.all;
entitystopis
port(stop:
instd_logic;
rst:
instd_logic;
clk:
instd_logic;
q1:
outstd_logic;
q2:
outstd_logic;
rst_o:
outstd_logic);
endstop;
architecturebhvofstopis
begin
process(clk,stop,rst)
begin
q1<=clkand(notstop)andrst;
q2<=clkandstopandrst;
rst_o<=rst;
endprocess;
endbhv;
---------------------------------------------------------------------------------------------------------------------
libraryieee;--------计时器
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitymin3is
port(stop:
instd_logic;
clk:
instd_logic;
led:
outstd_logic_vector(0to2);
q:
bufferintegerrange0to59);
endmin3;
architecturebhvofmin3is
signalq0:
std_logic;
begin
process(clk,stop)
variablecount:
integerrange0to500;
variablemin:
integerrange0to3;
begin
if(clk'eventandclk='1')then
if(count<500)then
count:
=count+1;
else
q0<=notq0;
if(q0='1')then
if(q<59)then
q<=q+1;
if(min=0)then
led<="000";
endif;
else
q<=0;
min:
=min+1;
if(min=1)then
led<="001";
elsif(min=2)then
led<="011";
elsif(min=3)then
led<="111";
min:
=0;
endif;
endif;
endif;
count:
=0;
endif;
endif;
if(stop='1')then
q<=0;
min:
=0;
led<="000";
endif;
endprocess;
endbhv;
---------------------------------------------------------------------------------------------------------------------
libraryieee;----------计程器
useieee.std_logic_1164.all;
entitymileis
port(clk:
instd_logic;
rst:
instd_logic;
mil:
bufferintegerrange0to99;
mil_p:
bufferintegerrange0to9);
endmile;
architecturebhvofmileis
begin
process(clk,rst)
variablenum:
integerrange0to1000;
begin
if(clk'eventandclk='1')then
if(num=1000)then
if(mil_p=9)then
if(mil=99)then
mil<=0;
else
mil<=mil+1;
endif;
mil_p<=0;
else
mil_p<=mil_p+1;
endif;
num:
=0;
else
num:
=num+1;
endif;
endif;
if(rst='0')then
mil<=0;mil_p<=0;
endif;
endprocess;
endbhv;
---------------------------------------------------------------------------------------------------------------------
libraryieee;------------计费器
useieee.std_logic_1164.all;
entityfeeis
port(stop_3min:
instd_logic_vector(0to2);
clk:
instd_logic;
mil:
inintegerrange0to99;
mil_p:
inintegerrange0to9;
rst:
instd_logic;
fee:
bufferintegerrange0to99;
fee_p:
bufferintegerrange0to9);
endfee;
architecturebhvoffeeis
begin
process(clk,rst,stop_3min)
variablefee_p0:
integerrange0to20;
variablemil0:
integerrange3to99;
variablechk_3:
std_logic:
='0';
begin
if(clk'eventandclk='1')then
if(stop_3min/="111")then
chk_3:
='0';
endif;
if(stop_3min="111"andchk_3='0')then
fee_p0:
=fee_p0+7;
fee<=fee+fee_p0/10;
chk_3:
='1';
endif;
if(mil=0)then
fee<=3;
fee_p0:
=0;
endif;
if(mil>0andmil<3)then
if(mil_p>=5)then
fee<=(mil+1)*2+1;
else
fee<=(mil+1)*2;
endif;
endif;
if(mil=3)then
fee<=8;
endif;
if(mil>3andfee<20andmil=mil0+1)then
fee_p0:
=fee_p0+4;
fee<=fee+1+fee_p0/10;
mil0:
=mil;
endif;
if(fee>=20andmil=mil0+1)then
fee_p0:
=fee_p0+1;
fee<=fee+2+fee_p0/10;
mil0:
=mil;
endif;
fee_p<=fee_p0rem10;
fee_p0:
=fee_p0rem10;
endif;
if(rst='0')then
fee<=0;fee_p<=0;mil0:
=3;
endif;
endprocess;
endbhv;
---------------------------------------------------------------------------------------------------------------------
libraryieee;------------显示模块
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityseg7is
port(time:
inintegerrange0to59;
fee:
inintegerrange0to99;
fee_p:
inintegerrange0to9;
mil:
inintegerrange0to99;
mil_p:
inintegerrange0to9;
clk:
instd_logic;
sel:
bufferstd_logic_vector(2downto0);
segout:
outstd_logic_vector(7downto0));
endseg7;
architecturebhvofseg7is
signalshow:
integerrange0to10;
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(sel="000")then
show<=feerem10;
sel<="001";
elsifsel="001"then
show<=fee/10;
sel<="010";
elsifsel="010"then
show<=mil_p;
sel<="011";
elsifsel="011"then
show<=milrem10;
sel<="100";
elsifsel="100"then
show<=mil/10;
sel<="101";
elsifsel="101"then
show<=timerem10;
sel<="110";
elsifsel="110"then
show<=time/10;
sel<="111";
elsifsel="111"then
show<=fee_p;
sel<="000";
else
sel<="000";
endif;
endif;
endprocess;
withshowselect
segout(6downto0)<="0111111"when0,
"0000110"when1,
"1011011"when2,
"1001111"when3,
"1100110"when4,
"1101101"when5,
"1111101"when6,
"0000111"when7,