EDA_出租车计费器
目录
HYPERLINK \l "_Toc251695187" 第一章 引言 1
HYPERLINK \l "_Toc251695188" 1.1 设计背景 1
HYPERLINK \l "_Toc251695189" 1.2 设计任务与要求 1
HYPERLINK \l "_Toc251695190" 1.21 设计任务 1
HYPERLINK \l "_Toc251695191" 1.22 设计要求 1
HYPERLINK \l "_Toc251695192" 第二章 系统方案设计 2
HYPERLINK \l "_Toc251695193" 2.1 出租车计费器工作原理 2
HYPERLINK \l "_Toc251695194" 2.2 基本设计思想 2
HYPERLINK \l "_Toc251695195" 第三章 主要功能的实现 3
HYPERLINK \l "_Toc251695196" 3.1 具体模块功能设计 3
HYPERLINK \l "_Toc251695197" 3.2 具体模块实现 4
HYPERLINK \l "_Toc251695198" 3.21 车速控制模块 4
HYPERLINK \l "_Toc251695199" 3.22 里程计数模块 4
HYPERLINK \l "_Toc251695200" 3.23 计费计数模块 4
HYPERLINK \l "_Toc251695201" 3.24 动态扫描模块 4
HYPERLINK \l "_Toc251695202" 3.3 总模块 4
HYPERLINK \l "_Toc251695203" 第四章 程序调试及局部仿真结果 6
HYPERLINK \l "_Toc251695204" 4.1 车速控制模块仿真结果 6
HYPERLINK \l "_Toc251695205" 4.2 测试结果展示 6
HYPERLINK \l "_Toc251695206" 第五章 结束语 8
HYPERLINK \l "_Toc251695207" 参考资料 9
HYPERLINK \l "_Toc251695208" 附件 10
第一章 引言
1.1 设计背景
随着出租车行业的发展,对出租车计费器的要求也越来越高。最近几年出租车行业发展迅速,在全国有几千家出租车公司。因此出租车计费器市场是庞大的。而出租车计费器成为不可缺少的一部分。
信息社会的现代电子产品,性能越来越高,复杂度越来越大,更新步伐也越来越快。实现这种进步的主要原因就是微电子技术和电子技术的发展。而电子技术的发展后者的核心就是电子设计自动化EDA(Electronic?Design?Automatic)技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
由美国国防部提出的VHDL(Very High Speed Integrated CIRCUIT HARDWARE DESCRIPTION Language)即超高速集成电路硬件描述语言,采用高层次的、自顶向下的设计方法来描述硬件,非常适合当前集成化、大规模的需要。
MAX+PLUSⅡ(Multiple Array MATRIX And Programmable Logic User Systems)是电子设计不可缺少的工具,他可以接受多种方式的输入:原理图输入、文本输入(硬件描述语言)、第三方EDA工具提供的接口等。MAX+PLUSⅡ的仿真器具有很强灵活性,可以控制对单器件或多器件的仿真。MAX+PLUSⅡ还提供了丰富的帮助库。本文采用VHDL语言来设计实现出租车计费系统,源程序经美国ALTERA公司的MAX+PLUSⅡ软件调试优化,下载到特定芯片(MAX系列之一)后,可应用于实际的出租车计费系统中。
1.2 设计任务与要求
1.21 设计任务
设计一个出租车自动计费器,计费包括起步价、行车里程计费、停止和暂停不计费三部分。现场模拟汽车的启动、停止、暂停和换挡状态。分别用四位数码管显示金额和里程,各有两位小数,行程 3公里内,起步费为6元,超过3公里,以每公里1.2元计费。
1.22 设计要求
1、设计正确,方案合理。界面友好,使用方便。程序精炼,结构清晰。
2、有详细的文档。包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。
第二章 系统方案设计
2.1 出租车计费器工作原理实际中出租车的计费工作原理一般分成3个阶段:
(1)车起步开始计费。首先显示起步价(本次设计起步费为6.00元),车在行驶3 km以内,只收起步价6.00元。
(2)车行驶超过3 km后,按每公里1.2元计费(在7.00元基础上每行驶1 km车费加1.2元),车费依次累加。
(3)行驶路程达到或超过10.5 km后(车费达到20元),每公里加收50%的车费,车费变成按每公里1.8元开始计费。车暂时停止(行驶中遇红灯或中途暂时停车)不计费,车费保持不变。若停止则车费清零,等待下一次计费的开始。
2.2 基本设计思想(1)根据出租车计费原理,将出租车计费部分由5个计数器来完成分别为counterA,counterB,counterC,counterD,counterE。①计数器A完成车费百位。②计数器B完成车费十位和个位。③计数器C完成车费角和分。④计数器D完成计数到30(完成车费的起步价)。⑤计数器E完成模拟实现车行驶100 m的功能。 (2)行驶过程中车费附加50%的功能:由比较器实现。 (3)车费的显示:由动态扫描电路来完成。用专用模块来实现,完成数据的输入即动态数据的显示。 (4)根据层次化设计理论,该设计问题自顶向下可分为车速控制模块、计数模块、译码和动态扫描显示模块,其系统框图如下图所示:
图1.1 出租车系统框图
第三章 主要功能的实现
3.1 具体模块功能设计
计费器按里程收费,每100 m开始一次计费.图3.1为原理结构图,各模块功能如下:
图3.1 出租车计费器的结构框图
(1)计数器E为带预置的可变步长的模100计数器,预置端为车速(每秒),如果预置端接入车速表,就可以实现计费了,这里用于模拟行车速度。例如:假设当计数器E计数到100则E的“CO”端输出一个高电平。此脉冲信号送给计数器D,使D完成车起步里程3 km的功能。在以后的时间里E的“CO”端的脉冲信号送给计数器C,使其完成按每公里收取费用的功能。
(2)计数器D为带预置模的十进制加法计数器,预置数为车起步里程3 km,计数脉冲为计数器E的进位信号。这样当计数器D计数达到30后,进位输出将为一个高电平,控制计数器A,B,C开始计数,这样就能实现超过3 km后计费器再按每公里加收车费。
(3)与门为2个8输入的8与门,一端用于预置,一端输入当前计费器收费情况,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,此时该与门输出一个片选信号送MUX。 (4)MUX为16选8的2选1MUX,2个选择输入端分别为每100 m收费和50%的每100 m收费,片选信号由与门控制。
(5)计数器C为可变步长的模100十进制计数器,带预置端,预置数为计数步长。计数器C主要用于累加,当车行驶达到100 m时,计数器计数一次,计数步长为每100 m的行车收费。进位脉冲信号送到计数器B的“CLK”端,控制计数器B的计数步调。
(6)计数器B为带预置的模100十进制计数器,预置数为出租车起步价,车费的个位,与数码管的第2位和第3位相连。计数时钟为计数器C的进位脉冲信号。
(7)计数器A为十进制计数器,其结果为车费的十,与4位数码管的最高位相连,计数时钟为进位脉冲。
(8)动态扫描电路将计数器A、B、C的计费状态用数码管显示出来,所连接的数码管共用一个数据端,由片选信号依次选择输出,轮流显示。
3.2 具体模块实现
3.21 车速控制模块
当启停键为启动状态(高电平时),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时,暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
3.22 里程计数模块
里程计数模块实现对于出租车在行驶过程的里程计数功能;当行驶里程大于3KM时,本模块中信号变为1;clk每来一个上升沿,里程计数模块实现一次计数,里程数加1。
计数车速控制模块发出的脉冲,并将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
3.23 计费计数模块
计费模块启动reset信号,根据输入的clk信号变化,调节费用的计数,用c0、c1、c2、c3显示费用。
其初值为6,当里程数超过3公里后,才接受计数车速控制模块发出的脉冲的驱动,并且将计数显示动态显示出来,每一个脉冲其数值加0.12,当收费超过20时数值加0.18当启停键为启动状态(高电平时),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时,暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
3.24 动态扫描模块
动态扫描电路将计数器A、B、C的计费状态用数码管显示出来,所连接的数码管共用一个数据端,由片选信号依次选择输出,轮流显示。该模块经过8选1选择器将计费数据(4位BCD码)、计程数据(4位BCD码)动态选择输出。其中计费数据送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示。
3.3 总模块
taxi的计费器的原理图:将各模块的原理图对应的端口连接。
图3.2 出租车计数器原理图
第四章 程序调试及局部仿真结果
4.1 车速控制模块仿真结果
图4.1 车速控制模块时序仿真结果
图4.1
clk为基本输入时钟即(基本车速);k为可调车速,通过改变k来模拟车速变化;start为启停开关,当start为‘1’时内部计数器开始计数;reset为复位开关,用于复位车速控制模块中定义的count2计数器;clkout为脉冲输出,当输入车速越大,脉冲输出频率越高,计数周期变短,而clkout输出脉冲的意义为,参照于基本车速所反映的一个相对时间量,一个脉冲代表在该车速下行进了0.1km;
仿真出现的问题:
该车速控制模块中的reset复位端作为整个系统复位的一个环节,配合其他模块的的复位一起使用,做到对计数模块和显示模块的清零和归位。但是在该模块中单独时,效果不能体现,因为在该模块中,它复位的是内部定义的计数器count2,在脉冲输出clkout中不能体现使其为‘0’,只是不在出现状态变换,在全体仿真和硬件测试中,reset可以体现复位和清零。
4.2 测试结果展示
a:起步价格 b:开始行使未超过三公里
c:超过三公里后 d:超过20元后
图4.2 计费和里程测试结果显示
图4.2中a为起始起步价格,6元。b为出租车开始行使,未超出三公里保持起始价格不变。c为超过三公里后按每公里加1.2元计算。d为超出20元后按每公里原价的150%计算,即每公里1.8元。
第五章 结束语
短短一周的EDA课程设计已经接近尾声了,我们从挑选课设题目,查阅资料,到研究出总体设计,详细设计,然后分工合作,再到最后的编程上机调试,修改程序,完善程序,收获颇多。出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动,停止、暂停等功能,并设计动态扫描电路显示车费数目。车暂停时停止计费。若停止清零,等待下一次计费的开始。出租车计费系统设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点。本设计在使用方面居庸一点的价值。由于时间有限和经验是平的欠缺,不足之处还望老师予以指正。
在这一周里我们再次熟悉和增强了对VHDL语言的基本知识,熟悉利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;更加了解和加深了对编制和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规范编程的思想。
本次的课程设计将各个单一的模块实现其功能后,学会通过原理图或顶层文件把各模块连接,从而实现对出租车自动计费。课设注重的不仅是把理论知识巩固,而且应把理论和实际相结合,把知识应用到生活中。在课设过程中,遇到了不少问题,数码管无法正常显示,计费不按要求等。通过的对源代码的修改,发现了一些易忽略的细节。课设考验的是思维逻辑能力,对知识的灵活应用,当然,合作精神是不可或缺的。课设时间不长,要在短时间内完成绝不是个人力量能达到的,要学会集众人之精华,还要善于利用已有的工具为自己服务,开拓思维。课设让我们认识到所学本科知识的真正实用性,只是这门课开始研究的第一步。
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。最后,我们衷心的感谢课设期间一直指导和陪伴着我们的老师。
参考资料
[1] 候伯亨,顾新. VHDL硬件描述语言与数字逻辑电路设计.修订版。西安电子科技大学出版社,1999[2] 张昌凡,等.可编程逻辑器件及VHDL设计技术.广州:华南理工大学出版社,2001 [3] 曾繁泰,陈美金.VHDL程序设计 .北京:清华大学出版社,2001 [4] 潘松,等.VHDL实用教程 .成都:电子科技大学出版社,2000
附件
1、车速控制模块源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SPEED IS
PORT(
CLK,RESET,START: IN STD_LOGIC;
K : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
CLKOUT : OUT STD_LOGIC
);
END SPEED;
ARCHITECTURE A OF SPEED IS
SIGNAL COUNT1 :STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL TEMPCLK,CLKS:STD_LOGIC;
SIGNAL KINSIDE :STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
KINSIDE<="00000"-K;
CLKS_LABEL:
PROCESS(RESET,CLK)
VARIABLE COUNT2: STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
IF RESET = '1' THEN
COUNT2:="00000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF START='1' THEN
IF COUNT2=KINSIDE THEN COUNT2:="00000";
END IF;
IF NOT (K="00000") THEN COUNT2:= COUNT2+1;
END IF;
IF COUNT2="00001" THEN TEMPCLK <= NOT TEMPCLK;
END IF;
END IF;
END IF;
END PROCESS CLKS_LABEL;
CLKOUT <= TEMPCLK;
END A;
2、计程源程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CDU99 IS
PORT (CLK,RESET: IN STD_LOGIC;
COUNT1:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
COUNT2:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
COUNT3:OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END CDU99;
ARCHITECTURE AA OF CDU99 IS
BEGIN
PROCESS(CLK,RESET)
VARIABLE MM: STD_LOGIC_VECTOR (11 DOWNTO 0);
BEGIN
IF RESET ='1' THEN
MM:="000000000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF MM(3 DOWNTO 0)="1001" THEN
MM:=MM+7; ELSE MM:=MM+1; END IF;
IF MM(7 DOWNTO 4)="1010" THEN
MM:=MM+"01100000"; END IF;
END IF;
COUNT1 <=MM(3 DOWNTO 0);
COUNT2 <=MM(7 DOWNTO 4);
COUNT3 <=MM(11 DOWNTO 8);
END PROCESS;
END AA;
4、计费模块源程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT99 IS
PORT(CLK,RESET:IN STD_LOGIC;
JUDGE2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
JUDGE3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COUNT99;
ARCHITECTURE AA OF COUNT99 IS
SIGNAL EN :STD_LOGIC;
SIGNAL MONEY :STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL MCOUNT :STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
MONEY<="00011000" WHEN ((MCOUNT(15)='1') OR (MCOUNT(14)='1') OR (MCOUNT(13)='1')) ELSE "00010010";
EN<='0' WHEN JUDGE3="0000" AND JUDGE2(3 DOWNTO 2)="00" AND((JUDGE2(1)='0') OR (JUDGE2(1)='1' AND JUDGE2(0)='0')) ELSE '1';
PROCESS(CLK,RESET)
VARIABLE MM: STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF RESET='1' THEN
MM:="0000011000000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN MM:=MM+MONEY;END IF;
IF MM(3)='1' AND (NOT(MM(2 DOWNTO 1)="00"))THEN
MM:=MM+6;END IF;
IF MM(7)='1' AND (NOT(MM(6 DOWNTO 5)="00"))THEN
MM:=MM+"01100000";END IF;
IF MM(11)='1' AND (NOT(MM(10 DOWNTO 9)="00"))THEN
MM:=MM+"011000000000";END IF;
END IF;
COUNT1<=MM(3 DOWNTO 0);
COUNT2<=MM(7 DOWNTO 4);
COUNT3<=MM(11 DOWNTO 8);
COUNT4<=MM(15 DOWNTO 12);
MCOUNT<=MM;
END PROCESS;
END AA;
5、 译码管片选信号源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SE IS
PORT(CLK: IN STD_LOGIC;
A: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END SE;
ARCHITECTURE RT1 OF SE IS
BEGIN
PROCESS(CLK)
VARIABLE B:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(B="111")THEN
B:="000";
ELSE
B:=B+1;
END IF;
END IF;
A<=B;
END PROCESS;
END RT1;
6、八选一模块程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY XXX1 IS
PORT(C:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
DP: OUT STD_LOGIC;
A1,A2,A3,A4,B1,B2,B3,B4:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
D:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END XXX1;
ARCHITECTURE RT1 OF XXX1 IS
BEGIN
PROCESS(C,A1,A2,A3,A4,B1,B2,B3,B4)
VARIABLE COMB:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
COMB:=C;
CASE COMB IS
WHEN"000"=>D<=A1;
DP<='0';
WHEN"001"=>D<=A2;
DP<='0';
WHEN"010"=>D<=A3;
DP<='1';
WHEN"011"=>D<=A4;
DP<='0';
WHEN"100"=>D<=B1;
DP<='0';
WHEN"101"=>D<=B2;
DP<='0';
WHEN"110"=>D<=B3;
DP<='1';
WHEN"111"=>D<=B4;
DP<='0';
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END RT1;
7、译码模块源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DI IS
PORT(D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DI;
ARCHITECTURE RT1 OF DI IS
BEGIN
PROCESS(D)
BEGIN
CASE D IS
WHEN"0000"=>Q<="0111111";
WHEN"0001"=>Q<="0000110";
WHEN"0010"=>Q<="1011011";
WHEN"0011"=>Q<="1001111";
WHEN"0100"=>Q<="1100110";
WHEN"0101"=>Q<="1101101";
WHEN"0110"=>Q<="1111101";
WHEN"0111"=>Q<="0100111";
WHEN"1000"=>Q<="1111111";
WHEN OTHERS=>Q<="1101111";
END CASE;
END PROCESS;
END RT1;
EDA_出租车计费器.doc