北邮数字电路实验报告_简易出租车计价器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路实验报告简易出租车计价器
班级:
学号:
姓名:
一、设计课题的任务要求
设计一台出租车计价器,不同情况具有不同的收费标准
基本内容
1、行驶公里:用时钟2秒钟表示出租车匀速行驶1公里,在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。燃油附加费为每运次1元。
2、途中等待:用按键控制中途等待,等待少于(包括)5秒不收费,超过5秒后每等
待3秒钟加收1元。
3、用数码管分时显示计费金额、行驶里程和等候时间。字母A表示当前处于显示计费
金额状态,字母B表示当前处于显示行驶里程状态,字母C表示当前处于显示等候
时间状态。
4、用按键控制出租车空驶、载客状态并用点阵显示空驶、载客状态。
提高要求
1、用点阵滚动显示收费单据。
2、具有夜间模式,基本单价加收20%的费用。出租汽车收费结算以元为单位,元以下
四舍五入。
3、出租车行驶速度可调可控。
4、多人乘车,分段计价。
5、自拟其它功能。
二、系统设计
1.设计思路
首先考虑得到需要一个分频装置,分别输出频率到计数器与控制器,另有计算单元用来计算里程、时间与费用。
Clk为系统时针,rst、start、waiting分别为重置、开始、等待信号,由按键输入
系统流程图
三、仿真波形及波形分析
四、功能说明及资源利用情况
开始行车
1、功能说明
本次试验成果的主要功能为:
开始点阵显示“无人状态”。
按下按键“btn1”(start),计价器开始正常工作,六个数码管每两个分别显示“总费用”“行进里程”“等待时间”,同时点阵显示“载客状态”。行进里程开始累计,里程数在5公里内总价不变,在超过5公里后,每公里增加两元。
在行进中按下按键“btn2”(waiting),等待时间开始累计,等待时间未超过5s时,等待费用为零,所以总价并不累计。在等待时间超过5s后,每三秒钟总价加一元。
再次按下按键“btn2”(waiting),停止等待状态,继续行进,状态与上述一样。
再次按下按键“btn1”(start),表示客人到达目的地,数码管显示总价,里程以及总等待时间,即开始结算。
按下按键“btn0”(rst),所以状态清零。点阵回到无人状态,数码管显示全部清零。2、资源利用情况
五、故障及问题分析
本次试验,在实验过程中,发现了众多不同的问题。
其中最恶心的一次就是代码调试的时候,没有任何的语法错误,但是它表示编译不通过,说是逻辑单元有1307个,但是设备只能提供1270个,所以无法通过。对于这个问题,我实在不知道该怎么解决,最后只有重新写代码,换了一两个结构后发现问题神奇般的解决了。但我始终不知道原因。
其他的问题都只是代码的语法错误之类的,无需赘言。
六、总结和结论
有过上个学期的一些基础知识后,这次的实验并没有太过于手足无措,总的来说还是比较容易上手。所选的课题逻辑也并不复杂,所以不算太难。还是比较快的实现了所要求的功能。虽然最后发现与老师的要求有一些出入,但总体来说,自己还是比较满意的。因为本次试验所有代码都是自己一个字母一个字母敲出来的,通过与同学们的交流也学到了很多东西,可能也就是因为没有和别的班级同学交流,所以没有达到老师的期望吧!
七、源代码(含注释)
1、仿真版
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity taxi is
port(clk:in std_logic;
start:in std_logic;
waiting:in std_logic;
rst:in std_logic;
T0,T1,T2,T3,T4,T5:out std_logic_vector(3 downto 0)
);
end;
architecture bhv of taxi is
signal count:integer range 0 to 499999999;
signal km_clk,sec_clk,en:std_logic;
signal c1,c2,tt:integer range 0 to 99;
signal await,mile,cost:integer range 0 to 99;
signal await_s,await_g,mile_s,mile_g,cost_s,cost_g:integer range 0 to 9;
signal rst_clk,start_clk,waiting_clk:std_logic:='0';
signal waiting_time:integer range 0 to 99;
begin
U1:process(rst,start,waiting)--实现按键
begin
if start 'event and start='1' then
if start_clk='1' then
start_clk<='0';
else start_clk<='1';
end if;
end if;
if waiting'event and waiting='1' then
if waiting_clk='1'then
waiting_clk<='0';
else waiting_clk<='1';
end if;
end if;
end process;
u2:process(rst,clk)
begin
if clk'event and clk='1' then
if rst='0' then
if count=9 then --两秒钟一公里
count<=0;km_clk<='1';sec_clk<='1';
elsif count=4 then --一秒钟
count<=count+1;km_clk<='0';sec_clk<='1';
else
count<=count+1;km_clk<='0';sec_clk<='0';
end if;
end if;
end if;
end process;
U3:process(rst,start_clk,waiting_clk,km_clk) --里程计数
begin
if rst='1' then
mile<=0; --按下“rst”后数字清零elsif start_clk='0' then
mile<=mile; --按下“start/stop”后显示总里程elsif waiting_clk='1' then
mile<=mile;
elsif km_clk'event and km_clk='1' then
if mile=99 then
mile<=0;
else
mile<=mile+1;
end if;
end if;
end process;
U4:process(rst,start_clk,waiting_clk,sec_clk) --等待时间计数