EDA课程设计计程器.docx
- 文档编号:23571688
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:17
- 大小:176.11KB
EDA课程设计计程器.docx
《EDA课程设计计程器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计计程器.docx(17页珍藏版)》请在冰豆网上搜索。
EDA课程设计计程器
一、课程设计内容与要求
(1)能够实现计费的功能
费用的计算是按形式的里程收费的,设出租车的起步价为8.00元,当里程小于3Km时,按起价计算费用;当里程大于3Km时每公里按1.6元计费。
等待累计时间超过3min,按每分钟1元计费。
所以总费用按下式计算:
总费用=起费用+(里程-3Km)*里程单价+等候时间*等候单价。
.
(2)能够实现显示的功能
a) 显示汽车行驶里程:
用四位数字显示,显示方式为“XX”,单位为K。
计程范围为0-99K,计程分辨率为1K。
b) 显示等候时间:
用两位数字显示分钟,现实方式为“XX”。
计时范围为0-59,计时分辨率为1。
c) 显示总费用:
用四位数字显示,显示方式为“XXXX”,单价为元。
计价范围为0-9999元。
二、系统方案设计
根据设计要求,系统的输入信号有:
系统时钟信号CLK,出租车启动信号START,等待信号STOP,公里信号FIN。
系统的输出信号有:
总费用数CHA0-CHA3,行驶距离(数)KM0-KM1和等待时间MIN0-MIN1等。
系统组成方框图如下所示,它由分频模块、计量模块、计费模块和控制模块四部分组成。
其系统模块图如图1所示。
图1系统功能原理图
三、功能模块的原理及算法分析
有图1系统功能原理图可知:
该设计问题自顶向下可分为分频模块、计量模块、计费模块和控制模块四个部分,下面就每个部分的原理及算法进行分析。
3.1分频模块
分频模块对频率为240Hz的输入脉冲进行分频,得到的频率为16Hz,10Hz和1Hz的三种频率。
该模块产生频率信号用于计费,每个1Hz脉冲为0.1元计费控制,10Hz信号为1元的计费控制,16Hz信号为1.6元计费控制。
3.2计量控制模块
计量控制模块是出租车自动计程器系统的主体部分,该模块主要完成等待几时功能、计价功能、计程功能,同时产生3分钟的等待计时使能控制信号en1,行程3公里外的使能控制信号en0。
其中计价功能主要完成的任务是:
行程3公里内,且等待累计时间3分钟内,起步价为8元;3公里外以每公里1.6元计费,等待累计时间3分钟外以每分钟1元计费;计时功能主要完成的任务是:
计算乘客的等待累计时间,计时器的量程为59分,满量程自动归零;计程功能主要完成的任务是:
计算乘客所行使的公里数。
计程器的量程为99公里,满量程自动归零。
3.3控制模块
控制模块主要是通过计量模块产生的两个不同的输入使能信号en0,en1,对每个分频模块输出的16hz,10hz的脉冲进行选择输出的过程;本模块实现了双脉冲的二选一;最终目的为了计费模块中对行驶过程中不同的时段进行计价。
3.4计费模块
当计费信号start一直处于高电平即计费状态时,本模块根据控制模块选择出的信号从而对不同的单价时段进行计费。
即行程在3km内,而且等待累计时间小于3min则为起步价8元;3km外以每公里1.6元计费,等待累积时间超过3min则按每分钟1元计费。
c0,c1,c2,c3分别表示费用的显示。
四、主要模块的实现
4.1分频模块的实现
由图2分频模块封装图可知:
系统是对240Hz时钟脉冲信号进行分频,分别得到16Hz、10Hz、1Hz三种频率,本设计中通过三种不同频率脉冲信号实现计程车在行使、等待两种情况下的不同计费。
图2分频模块封装图
4.2计量模块的实现
由图3可知:
本模块实现对于出租车在行使和等待过程中的计程和计时功能。
当行使里程大于3Km时,本模块中en0信号变为1;当等待时间大于3min时,本模块中en1信号变为1,clk1每来一个上升沿,计量模块实现一次计数,里程数或者等待时间加1。
图3计量模块封装图
4.3控制功能的实现
由图5可知:
本模块主要是通过两个不同的输入使能信号,对两个输入脉冲进行选择输出,使能信号是计量模块的输出,两个输入脉冲是分频模块输出的16Hz、10Hz的脉冲。
图4控制模块封装图
4.4计费功能的实现
由图4可知:
输入一个脉冲信号,同时当start为高电平时开始计价,c0、c1、c2、c3为价格的显示信号。
图5计时模块封装图
4.4总体功能原理图
总体原理如图6所示。
图6总体功能原理图
五、程序调试
4.1分频模块波形仿真图
图7分频模块仿真波形图
由图7可知:
当输入240Hz的clk脉冲信号时,clk每出现240个脉冲是q1、q10、q16分别出现1、24、15个,相当于计费0.01元、1元、1.6元,帮助计费。
4.2计量模块波形仿真图
图8计量模块波形仿真图
由图8可知:
由于公里输入参数fin一直设为高,所以看k1、k0一开始就开始计数,即为行程公里数;当等待时间信号stop设为高电平是,m1、m0开始计数,即为等待时间。
4.3计费模块波形仿真图
图9计费模块波形仿真图
由图9可知:
输入一个脉冲信号,同时当start为高电平是开始计价,c0、c1、c2、c3为价格的显示信号,逢9后一位将进1。
.
4.4控制模块波形仿真图
图10控制模块波形仿真图
由图10可知:
本模块主要是通过两个不同的输入使能信号,对两个输入脉冲进行选择输出,使能信号是计量模块的输出,两个输入脉冲是分频模块输出的16Hz、10Hz的脉冲。
4.5总模块的波形仿真图
图11总模块的波形仿真图
六、硬件测试
在QuartusⅡ软件进行程序编译后,根据实验室提供的EDA实验工具箱,选择目标芯片EP1C3T144C8,并设置对应的引脚值,实现引脚锁定,如图12所示。
这里我选用的是模式5,根据模式5的电路图设置数码管8~5显示的是价格cha3、cha2、cha1、cha0,数码管4、3显示的是行程公里数km1、km0,数码管2、1显示的是等待时间min1、min0,start、stop、fin信号分别对应于键1、键2、键3,系统时钟clock240对应于clcok0,最后进行编程下载到试验箱中。
下载到试验箱后,将模式调到5,clock的短路帽插到4Hz处。
当按下键1,即启动start信号,可以看到数码8~5显示0080,即为起步价8元。
按下键3,可以发现数码管4、3开始计数,即显示出租车行程公里数。
当公里数为3km时,数码管8~5开始计数,说明当公里数>3km时开始计费。
按下键2,可以发现码管2、1开始计数,即显示出租车等待的时间,当时间大于3时,数码管8~5又开始计数,说明当等待时间>3s时开始计费。
综上所知,实验观察结果符合实验要求,硬件调试成功。
图12设置引脚图
七、实验中存在的问题及解决方案
7.1分频模块只得到了频率q10,而频率q1、q16未得到。
解决方案:
仔细检查程序是否写错,发现在对q1和q16分频程序时,q1未加1,而令q1为0时,写到了q16为0,改正后编译并查看时序即得到正确结果。
7.2计量模块得到时序中只有km1、km0显示,而没有min1、min0显示。
解决方案:
由于在min1、min0程序中定义了一定变量w,导致时序错误,去掉w即可得到正确结果。
7.3数码管数据显示太快。
解决方案:
改变clock的频率,将其调低即可。
八、实验心得
通过此次课程设计,让我重温了EDA技术的基本知识、理论,同时全面地分析该课程设计实现的原理,独立地完成在QuarterⅡ软件上对HDL语言程序的编程、调试,下载到试验箱,得到最终结果。
我所做的计程器是通过4个模块来实现的,再通过顶层设计中的例话语句将它们整合起来。
刚开始把每个模块的程序都编写好了,然后整合后,在顶层文件对应的工程上查看时序图,发现并没有得到想要的结果,后来改了很久还是没有成功,有时还出现乱码,几乎都有想放弃了。
后来,让自己静下心来,从每个模块的时序进行着手分析,发现模块对应的程序存在很多的错误,通过一步步修改,终于得到将每个模块的时序都弄好了。
然后在顶层文件工程中进行时序仿真即得到了正确的结果。
从这次编程中,我学会了遇到问题时,不要盲目地去修改,而是理清思绪,从每个简单部分入手检查,这样才能快速有效地解决问题。
由于在编程中我很重视时序图是否正确,所以当把得到正确时序图的工程文件下载到试验箱时即得到了正确的结果。
这次课程设计顺利地完成不仅锻炼了我动手、编程能力,而且还让我对EDA强大的功能产生兴趣,我们不能只局限于实验室给我们提供的课程设计机会,而是利用课余时间深入学习它,提高自己的专业技能。
九、附件
9.1分频功能实现的源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk:
instd_logic;
q16:
outstd_logic;
q10:
outstd_logic;
q1:
outstd_logic);
endfenpin;
architectureqqoffenpinis
begin
process(clk)
variablecount16:
integerrange0to14;
variablecount10:
integerrange0to23;
variablecount1:
integerrange0to239;
begin
ifclk'eventandclk='1'
thenifcount10=23
thencount10:
=0;q10<='1';
elsecount10:
=count10+1;q10<='0';
endif;
ifcount16=14
thencount16:
=0;q16<='1';
elsecount16:
=count16+1;q16<='0';
endif;
ifcount1=239
thencount1:
=0;q1<='1';
elsecount1:
=count1+1;q1<='0';
endif;
endif;
endprocess;
endqq;
9.2计量功能实现的源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityjiliangis
port(s:
instd_logic;
fin,stop:
instd_logic;
clk1:
instd_logic;
en0,en1:
bufferstd_logic;
k1,k0:
bufferstd_logic_vector(3downto0);
m1,m0:
bufferstd_logic_vector(3downto0));
endjiliang;
architecturert2ofjiliangis
signalw:
integerrange0to59;
begin
process(clk1)
begin
ifclk1'eventandclk1='1'then
ifs='0'thenen0<='0';en1<='0';k1<="0000";k0<="0000";m1<="0000";m0<="0000";
elsifstop='1'then
ifm0="1001"thenm0<="0000";
ifm1="0101"thenm1<="0000";
elsem1<=m1+1;
endif;
elsem0<=m0+1;
endif;
ifm1&m0>"00000010"thenen1<='1';
elseen1<='0';
endif;
elsiffin='1'then
ifk0="1001"thenk0<="0000";
ifk1="1001"thenk1<="0000";
elsek1<=k1+1;
endif;
elsek0<=k0+1;
endif;
ifk1&k0="00000010"thenen0<='1';
elseen0<='0';
endif;
elseen1<='0';en0<='0';
endif;
endif;
endprocess;
endrt2;
9.3计费功能实现的源代码如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_arith.all;
useIEEE.std_logic_unsigned.all;
entityjifeiis
port(clk2:
instd_logic;--计费驱动信号
start:
instd_logic;--计费开始信号
c0,c1,c2,c3:
bufferstd_logic_vector(3downto0));
endjifei;
architecturert1ofjifeiis
begin
process(clk2,start)
begin
ifstart='0'thenc3<="0000";c2<="0000";c1<="1000";c0<="0000";--起步价5元
elsifclk2'eventandclk2='1'then
ifc0="1001"thenc0<="0000";
ifc1="1001"thenc1<="0000";
ifc2="1001"thenc2<="0000";
ifc3="1001"thenc3<="0000";
elsec3<=c3+1;
endif;
elsec2<=c2+1;
endif;
elsec1<=c1+1;
endif;
elsec0<=c0+1;
endif;
endif;
endprocess;
endrt1;
9.4控制功能实现的源代码如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_arith.all;
useIEEE.std_logic_unsigned.all;
entitykongzhiis
port(en0,en1:
instd_logic;--使能选择信号
clk_in1:
instd_logic;--14分频输入信号
clk_in2:
instd_logic;--13分频输入信号
clk_out:
outstd_logic);--输出信号
endkongzhi;
architecturert3ofkongzhiis
begin
process(en0,en1)
begin
ifen0='1'then--实现二选一功能
clk_out<=clk_in1;
elsifen1='1'then
clk_out<=clk_in2;
endif;
endprocess;
endrt3;
9.5顶层文件实现的源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytaxiis
port(clk240:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
fin:
instd_logic;
cha3,cha2,cha1,cha0:
outstd_logic_vector(3downto0);
km1,km0:
outstd_logic_vector(3downto0);
min1,min0:
outstd_logic_vector(3downto0));
endtaxi;
architecturebehavoftaxiis
componentfenpinis
port(clk:
instd_logic;
q16:
outstd_logic;
q10:
outstd_logic;
q1:
outstd_logic);
endcomponent;
componentjiliangis
port(s:
instd_logic;
fin,stop:
instd_logic;
clk1:
instd_logic;
en0,en1:
bufferstd_logic;
k1,k0:
bufferstd_logic_vector(3downto0);
m1,m0:
bufferstd_logic_vector(3downto0));
endcomponent;
componentkongzhiis
port(en0,en1:
instd_logic;--使能选择信号
clk_in1:
instd_logic;--16分频输入信号
clk_in2:
instd_logic;--10分频输入信号
clk_out:
outstd_logic);--输出信号
endcomponent;
componentjifeiis
port(clk2:
instd_logic;--计费驱动信号
start:
instd_logic;--计费开始信号
c0,c1,c2,c3:
bufferstd_logic_vector(3downto0));
endcomponent;
signalm1,m3,m2,n1,n0,l:
std_logic;
begin
u1:
fenpinportmap(clk=>clk240,q16=>m3,q10=>m2,q1=>m1);
u2:
jiliangportmap(s=>start,fin=>fin,stop=>stop,
clk1=>m1,en1=>n1,en0=>n0,k1=>km1,
k0=>km0,m1=>min1,m0=>min0);
u3:
kongzhiportmap(en0=>n1,en1=>n0,clk_in1=>m2,clk_in2=>m3,clk_out=>l);
u4:
jifeiportmap(clk2=>l,start=>start,c0=>cha0,c1=>cha1,c2=>cha2,c3=>cha3);
endbehav;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 计程