eda课程设计 出租车计费器Word文档下载推荐.docx
《eda课程设计 出租车计费器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《eda课程设计 出租车计费器Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
计算乘客所行驶的公里数。
计程器的量程为99公里,满量程自动归零。
2.2.3译码显示模块
该模块经过4位BCD码译码器、计程数据(2位BCD码)动态选择输出。
其中计费数据送入显示译码模块进行译码,十元、元为单位对应的数码管上显示,最大显示为99元;
计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示,最大显示为99公里。
3、主要功能的实现
3.1分频模块的实现
由图3-1分频模块封装图可知:
系统是对240HZ时钟脉冲信号进行分频,得到一种频率。
输入为clk,输出为q1.
图3-1分频模块封装图
3.2计量模块的实现
由图3-2可知:
本模块实现对于出租车在行驶过程中计算里程;
当行驶里程大于3KM时,本模块中en0信号变为1;
clk1每来一个上升沿,计量模块实现一次计数,里程数加1。
图3-2计量模块封装图
3.3计费功能的实现
由图3-3可知:
输入一个脉冲信号,同时当start为时开始计价;
c0、c1、c2、c3为价格的显示信号。
图3-3计费模块封装图
3.4控制功能的实现
由图3-4可知:
本模块主要是通过输入的使能信号,对两个输入脉冲进行选择输出,使能信号是计量模块中的输出。
图3-4控制模块封装图
3.5译码和动态扫描功能实现
由图3-5可知:
该模块通过case语句把不同情况的输出用七段显示数码管的输出方式
图3-5译码模块封装图
3.6总体功能原理图
4、程序调试
4.1分频模块波形仿真图
图4-1分频模块仿真波形图
由图4-1可知:
当输入240HZ的clk脉冲信号时,clk每出现240个脉冲时q1出现1个,相当于计费1元,帮助计费。
4.2计量模块波形仿真图
图4-2计量模块波形仿真图
由图4-2可知:
由于讲输入参数fin一直设为高,将stop一直设为低。
所以k1、k0记录路程的输出量有值。
4.3计费模块波形仿真图
图4-3计费模块波形仿真图
由图4-3可知:
输入一个脉冲信号,同时当start为高时开始计价;
c0、c1、c2、c3为价格的显示信号,逢9后一位将进1。
4.4控制模块波形仿真图
图4-4控制模块波形仿真图
由图4-4可知:
本模块主要是通过两个不同的输入使能信号,对两个输入脉冲进行选择输出,使能信号是计量模块中的输出,两个输入脉冲是分频模块输出的16HZ、10HZ的脉冲。
4.5译码显示模块波形仿真图
图4-5译码模块波形仿真图
由图4-5可知:
首先以一个case语句进行通道的选择,以8为二进制表示。
当某一位为1时,表示选择该通道接着。
接着又以一个case语句对所选的通道进行动态扫描,由于时间极小,因此在我们用肉眼感觉是同时显示出来的。
4.6总模块的波形仿真图
图4-6总模块的波形仿真图
5、总结
本设计采用VHDL语言完成了具有计费、显示等功能的出租车计费系统,该设计的可靠性高,成本低,通用性强即在不改变电路结构的前提下可根据各地区的需求在VHDL程序中设置各种参数,适应各地区出租车计费的需求,还可以根据各地区需求增加系统功能。
此出租车计费器的设计采用了硬件描述语言的自顶向下的设计方法,将整个系统分为几个相对独立的模块分别设计、仿真、最后连成整个系统集中仿真,很大程度上提高了设计的效率。
最后在试验箱上进行检测,实验现象是:
计费器的初始值是8。
然后按开始键,里程数以一定频率增加,3以后计费器的跳动频率和里程数的跳动频率保持一致。
通过此次课程设计,让我进一步了解了EDA,培养了我发现问题与解决问题的能力。
查找了大量资料后选择了一个模板,按照自己所需要的改写已有程序,这过程碰到了相当的困难。
经过同学的帮助和查找差不多的例子后,终于实现了设计。
6、程序代码
顶层文件
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitychuzucheis
port(clk240,start,fin:
instd_logic;
sg1,sg2,sg3,sg4,sg5,sg6:
outstd_logic_vector(6downto0));
endchuzuche;
architectureBehavioralofchuzucheis
componentfp--实现对分频模块的例化
port(clk:
instd_logic;
q1:
outstd_logic);
endcomponent;
componentjl--实现对计量模块的例化
port(s,fin,clk1:
en0:
inoutstd_logic;
k1,k0:
inoutstd_logic_vector(3downto0));
componentkz--实现对控制模块的例化
port(clkin,e0,clk_in1:
clk3:
outstd_logic);
componentjf--实现对计费模块的例化
port(clk2,s:
c0,c1,c2,c3:
componentym--实现对译码和动态扫描模块的例化
port(clk:
k1,k0,c3,c2,c1,c0:
instd_logic_vector(3downto0);
sg11,sg12,sg13,sg14,sg15,sg16:
outstd_logic_vector(6downto0));
signalm1,n0,l:
std_logic;
--定义中间信号
signaltemp0,temp1,p3,p2,p1,p0:
std_logic_vector(3downto0);
begin
a1:
fpportmap(clk240,m1);
a2:
jlportmap(start,fin,m1,n0,temp1,temp0);
a3:
kzportmap(clk240,n0,m1,l);
a4:
jfportmap(l,start,p0,p1,p2,p3);
a5:
ymportmap(clk240,temp1,temp0,p3,p2,p1,p0,sg1,sg2,sg3,sg4,sg5,sg6);
endBehavioral;
entityfpis
port(clk:
q1:
--频率为16的时钟
endfp;
architectureBehavioraloffpis
process(clk)
variablecout1:
integerrange0to929900000;
begin
ifclk'
eventandclk='
1'
then
ifcout1=9990000--240hz分频为1hz
thencout1:
=0;
q1<
='
;
elsecout1:
=cout1+1;
0'
endif;
endprocess;
计量模块
entityjlis
port(s,fin,clk1:
--计量开始信号
--计量控制信号
--路程的计量
endjl;
architectureBehavioralofjlis
process(clk1)
ifclk1'
eventandclk1='
then--驱动信号发挥作用
ifs='
thenen0<
k1<
="
0000"
k0<
--初始化值
elsif(fin='
)then
if(k0="
1001"
)thenk0<
if(k1="
)thenk1<
elsek1<
=k1+'
endif;
elsek0<
=k0+'
if(k1&
k0>
"
00000010"
)thenen0<
--当路程大于3km时,使能信号en0开始发挥作用
elseen0<
控制模块
entitykzis
port(clkin,e0,clk_in1:
--输入脉冲
--输出脉冲
endkz;
architectureBehavioralofkzis
process(clkin)
ifclkin'
eventandclkin='
if(e0='
)then--根据条件选择所需的通道
clk3<
=clk_in1;
endif;
计费模块
entityjfis
port(clk2,s:
--计费驱动信号--计费开始信号
--费用显示信号
endjf;
architectureBehavioralofjfis
process(clk2,s)
if(s='
)thenc3<
c2<
c1<
c0<
1000"
elsifclk2'
eventandclk2='
if(c0="
)thenc0<
if(c1="
)thenc1<
if(c2="
)thenc2<
if(c3="
--计费功能
elsec3<
=c3+'
elsec2<
=c2+'
elsec1<
=c1+'
elsec0<
=c0+'
译码模块
entityymis
port(
clk:
instd_logic_vector(3downto0);
endym;
architectureBehavioralofymis
signala,b,c,d,e,f:
std_logic_vector(6downto0);
process(clk)--译码
begin
ifclk'
casec0is
when"
=>
a(6downto0)<
1000000"
0001"
1111001"
0010"
0100100"
0011"
0110000"
0100"
0011001"
0101"
0010010"
0110"
0000010"
0111"
1111000"
0000000"
0010000"
whenothers=>
null;
endcase;
casec1is
b(6downto0)<
casec2is
c(6downto0)<
casec3is
d(6downto0)<
casek0is
e(6downto0)<
casek1is
f(6downto0)<
000001