资源描述
VHDL语言的出租车计费器设计
VHDL语言的出租车计费器设计
1 引 言
最近几年出租车行业发展迅速,在全国有几千家出租车公司,因此出租车计费器的市场是庞大的。随着电子科学技术的不断发展,特别是集成电路的迅猛发展,电子设计自动化已经成为主要的设计手段。随着EDA技术的大力发展,FPGA等数字可编程器件的出现,数字出租车计费器的设计也就变得更加简单,而且性能更稳定、能实现较复杂的功能,且运用EDA软件可方便的在计算机上实现设计与仿真。本设计基于VHDL(FPGA)语言是电子设计领域中最具活力和发展前途的一项技术,未来必定会取代部分落伍的数字元元件。
1.1 课程设计目的
随着电子技术的不断发展与进步,集成电路的设计方法也在不断地更新。时至今日,传统的手工设计过程已经被先进的电子设计自动化(EDA)工具所代替。只有以硬件描述语言和逻辑综合为基础的子项项下的电路设计方法才能满足日趋复杂的集成电路系统设计需求,才能缩短设计周期以满足设计对集成电路系统日益急迫的需求。在这种情形下,传统的出租车计费器设计方法已不能跟上现在的节奏,以往的出租车计费器在功能上也远不能满足现实的需求。以往的出租车计费器的不稳定性,功能稍等缺点是的大家开始寻求更新的,功能更强大,性能更稳定,价钱更低廉的新型出租车计费器。而大规模可编程逻辑器件的出现,VHDL硬件描述语言的出现,使得这一切成为可能。
本设计的研究目标和意义也就是要使用价钱低廉、性能稳定、价钱低廉、可扩性强、适应目前出租车市场需求的出租车计费器,以解决目前出租车计费器存在的一系列问题。
1.2课程设计要求
1. 能实现计费功能,计费标准为:按行驶里程收费,起步费为10.00元,并在车行3公里后再按2元/公里,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,车停止不计费。
2. 实现预置功能:能预置起步费、每公里收费、车行加费里程。
3. 实现模拟功能:能模拟汽车启动、停止、暂停、车速等状态。
4. 设计动态扫描电路:将车费显示出来,有两位小数。
5. 用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。
6. 各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
7. 完成电路全部设计后,通过系统实验箱下载验证设计的正确性。
1.3 设计平台
MAX + plusⅡ是美国Altera 公司的一种EDA 软件,用于开发CPLD 和FPGA 进行数字系统的设计。
2 应用工具介绍
作为当今最流行的计算机软件系统,EDA技术是以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。EDA可提供文本输入以及图形编辑的方法将设计者的意图用程序或者图形方式表达出来,而我们经常用到的VHDL语言便是用于编写源程序所需的最常见的硬件描述语言(HDL)之一。
2.1 EDA技术介绍
EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来。EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计[1]。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。也就是说,综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。
在今天,EDA技术已经成为电子设计的普遍工具,无论设计芯片还是设计系统,没有EDA工具的支持,都是难以完成的。EDA工具已经成为设计师必不可少的武器,起着越来越重要的作用。从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用广泛、工具多样、软件功能强大。EDA技术发展迅猛,完全可以用日新月异来描述。EDA技术的应用广泛,现在已涉及到各行各业。EDA水平不断提高,设计工具趋于完美的地步。
2.2VHDL语言介绍
电子设计自动化(EDA)的关键技术之一是要求用形式化方法来描述数字系统的硬件电路。VHDL 硬件描述语言在电子设计自动化中扮演着重要的角色,他是EDA 技术研究的重点之一。
硬件描述语言是EDA 技术的重要组成部分,VHDL 是作为电子设计主流硬件描述语言,VHDL(Very High Speed Integrated Circuit Hardware Description Language)于1983 年由美国国防部发起创建,由IEEE进一步发展并在1987年作为IEEE标准10760发布。因此,VHDL成为硬件描述语言的业界标准之一。VHDL作为IEEE的工业标准硬件描述语言,得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性,使用VHDL语言,可以就系统的总体要求出发,自上而下地将设计内容细化,最后完成系统硬件的整体设计。一个完整的VHDL程序包括以下几个基本组成部分:实体(Entity),结构体(Architecture),程序包(Package),库(Library)。其中,实体是一个VHDL程序的基本单元,由实体说明和结构体两部分组成,实体说明用于描述设计系统的外部接口信号;结构体用于描述系统的行为,系统数据的流程或系统组织结构形式。程序包存放各设计模块能共享的数据类型,常数,子程序等。库用于存放已编译的实体,机构体,程序包及配置。
VHDL 语言的编译环境有不同的版本,我们应用的是Altera 公司的Maxplus 软件,它的操作顺序如下:使用TEXTEDITOR 编写VHDL 程序使用COMPILER 编译VHDL 程序;使用WAVE2FORMEDITOR,SIMULAROT 仿真实验;使用TIMINGANALTZER 进行芯片的时序分析;用FLOORPLANEDITOR 锁定芯片管脚位置;使用PROGRAMMER 将编译好的VHDL 程序下载到芯片中。
VHDL 进行工程设计的优点是显而易见的。
1.与其他的硬件描述语言相比,VHDL 具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
2.VHDL 丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
3.VHDL 语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效、高速地完成必须有多人甚至多个代发组共同并行工作才能实现。
4.对于用VHDL 完成的一个确定的设计,可以利用EDA 工具进行逻辑综合和优化,并自动的将VHDL 描述设计转变成门级网表。
5.VHDL 对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
6.用VHDL 语言编写的源程序便于文档管理,用源代码描述来进行复杂控制逻辑的设计,既灵活方便,又便于设计结果的交流、保存和重用。
3 设计原理
车速
控制模块
计费动态显示
里程
动态显示
车速选择
起/停开关
基本速率
Reset
扫描时钟
显示输出 显示输出
图3.1 系统顶层框图
计费器按里程收费,每100米开始一次计费。各模块功能如下:
(1) 车速控制模块
当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
(2) 里程动态显示模块
其包括计数车速控制模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
(3) 计费动态显示模块
其初值为10元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉冲(代表运行了0.5公里)其数值加1元,当收费超过20时数值加1.5元。
4 设计步骤
VHDL设计流程图(如图4.0):
VHDL文本编辑
VHDL文本编辑
FPGA/CPLD适配器
FPGA/CPLD编辑下载器
VHDL
仿真器
FPGA/CPLD器件和电路系统
时序与功能仿真器
图4.0 VHDL设计流程图
4.1程序设计
图4.1系统的总体模块图
(1)模块MS的实现(如图4.1.1所示)
图4.1.1 模块MS图
模块MS,输入端口CK0、CK1为两个不同的时钟信号,来模拟汽车的加速和匀速,JS加速按键。
(2)模块SOUT的实现(如图4.1.2所示)
图4.1.2 模块SOUT图
该模块实现车行状态输出功能,其中clk为时钟信号,enable 为启动使能信号,sto暂停信号, clr为清零信号,st为状态信号。
(3)模块PULSE的实现(如图4.1.3所示)
图4.1.3 模块PULSE图
该模块实现将时钟信号5分频功能。
(4)模块COUNTER的结果验证(如图4.1.4所示)
图4.1.4 模块COUNTER图
实现汽车模拟计费功能。clr1为清零信号,si为状态信号,c1,c2,c3分别为费用的三为显示。
(5)模块SCAN_LED的实现(如图4.1.5所示)
图4.1.5 模块SCAN_LED图
该模块实现显示车费功能。BT为选位信号,SG译码信号
4.2系统仿真:
系统仿真是在实际系统上进行实验研究比较困难时适用的必不可少的工具,它是指通过系统模型实验去研究一个已经存在或正在设计的系统的过程,通俗地讲,就是进行模型实验。因而,系统仿真的结果决定整个课程设计任务完成的到位程度。
程序输入完成后进行编译,编译完成后,可以对所进行的设计进行仿真,本课程设计的仿真平台是MAX+plusⅡ,通过对VHDL源程序进行编译检错,然后创建波形文件(后缀名为.scf),加入输入输出变量,选择适用的芯片以及设定仿真结束时间,设置好输入初值进行仿真,得到仿真波形图:
1.模块MS的结果验证(如图4.2.1)
图4.2.1
当JS为高电平,CLK_OUT按照CLK1输出;低电平时,按照CLK0输出
2模块SOUT的结果验证(如图4.2.2)
enable高电平时,每一个时钟上升沿时,CQI计数加1,若CQI<=30时,state赋01,30<CQI<=80时,state赋10态,…..;enable低电平时,CQI计数暂停,保持不变
图4.2.2
3模块PULSE的结果验证(如图4.2.3)
每个CLK0上升沿时,CNT计数加1,加到4时在下一个时钟上升沿赋值0;cnt不为0时fout赋值高电平,否则低电平
图4.2.3
4模块COUNTER的结果验证(如图4.2.4)
SI为出租车状态信号:“00”表示计费值停止,Q1~Q3不变;“01”计费清零,设置为起步价10元,Q2=1,Q3=0,Q1=0;“10” 正常计费,每公里1元,“11”超过20元后,每公里1.5元;Q1,Q2,Q3的信号分别赋值给C1,C2,C3
图4.2.4
5模块SCAN_LED的结果验证(如图4.2.5)
BT位选,SG译码对应数字0~9
图4.2.5
6模块TAXI的结果验证(如图4.2.6)
图4.2.6
4.3 结果分析
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。车暂时停止不计费,车费保持不变。若停止则车费清零,等待下一次计费的开始。出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。车暂时停止不计费,车费保持不变。若停止则车费清零,等待下一次计费的开始。各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
5 结束语
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
通过这次实验使我收获很多,对书本理论知识有了进一步加深,初步掌握了MAXPLUSII软件的一些设计使用方法。对一些器件的使用方法了解更深刻了,如一些器件的使能端的作用等。主要有以下一些实验感想
1、 应该对实验原理有深刻理解;
2、 做实验必须不急不躁,不能看见其他同学做的快就沉不住气了;
3、 熟练掌握其他软件是必要的,如Matlab软件、Excel、Word等;
4、 必须学会自己调试电路,一般第一次设计出的电路都会通不过编译的,所以要学会调试电路,而不是等老师解答或同学帮助;
致 谢
经过三周的奋战我的课程设计终于完成了。在没有做课程设计以前觉得课程设计只是对这半年来所学知识的单纯总结,但是通过这次做课程设计发现自己的看法有点太片面。课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
在此要感谢我们的指导老师陈老师对我们悉心的指导,感谢老师们给我们的帮助。在设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,收获颇丰。
参考文献
[1] 曹昕燕,周凤臣,聂春燕.EDA技术实验与课程设计【M】.清华大学出版社
[2] 刘欲晓,方强,黄宛宁.EDA技术与VHDL电路开发应用实践【M】.电子工业出版社
[3] 潘松,黄继业.EDA技术实用教程(第三版)【M】.科学出版社
[4] 赵岩岭,刘春等.在MAX+PLUSII平台下用VHDL进行数字电路设计.西安:希典出版社,2005
[5] 康华光主编.电子技术基础模拟部分.北京:高等教育出版社,2006
[6] 阎石主编.数字电子技术基础.北京:高等教育出版社,2003
附录1:模块MS清单
// 程序名称:MS
// 程序功能:模块MS,输入端口CK0、CK1为两个不同的时钟信号,来模拟汽车的加速和匀速,JS加速按键。
// 程序作者:金人佼
// 最后修改日期:2010.12.31
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MS IS
PORT(CK0:IN STD_LOGIC; //慢速档的时钟信号
CK1:IN STD_LOGIC; //快速档的时钟信号
JS:IN STD_LOGIC; //换挡按键信号
CLK_OUT:OUT STD_LOGIC);
END MS;
ARCHITECTURE ONE OF MS IS
BEGIN
PROCESS(JS, CK0,CK1)
BEGIN
IF JS='0' THEN CLK_OUT<=CK0; //JS低电平,则为慢速档
ELSE CLK_OUT<=CK1; //JS高电平,快速档
END IF;
END PROCESS;
END ONE;
附录2:模块SOUT清单
// 程序名称:SOUT
// 程序功能:该模块实现车行状态输出功能,其中clk为时钟信号,enable 为启动使能信号,sto暂停信号, clr为清零信号,st为状态信号。
// 程序作者:金人佼
// 最后修改日期:2010.12.31
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SOUT IS
PORT(CLK:IN STD_LOGIC;
ENABLE:IN STD_LOGIC;
STO :IN STD_LOGIC;
CLR:IN STD_LOGIC;
ST:OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END SOUT;
ARCHITECTURE ONE OF SOUT IS
BEGIN
PROCESS(CLK,ENABLE ,STO,CLR)
VARIABLE CQI:STD_LOGIC_VECTOR(7 DOWNTO 0);
VARIABLE STATE:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF CLR='0' THEN CQI:=(OTHERS=>'0'); //CLR低电平,CQI清零
ELSIF CLK'EVENT AND CLK='1' THEN //CLK上升沿触发
IF STO='1' THEN STATE:="00";CQI:=CQI; //STO高电平时,state赋00态
ELSIF ENABLE ='1' THEN //ENABLE高电平,CQI计数加1
CQI:=CQI+1;
IF CQI<=30 THEN STATE:="01"; //CQI<=30时,state赋01态
ELSIF CQI>30 AND CQI<=80 THEN STATE:="10"; //30<CQI<=80时,state赋10态
ELSE
STATE:="11"; //CQI>80时,state赋11态
END IF;
END IF;
END IF;
ST<=STATE;
END PROCESS;
END ONE;
附录3:模块PULSE
// 程序名称:PULSE
// 程序功能:该模块实现将时钟信号5分频功能。
// 程序作者:金人佼
// 最后修改日期:2010.12.31
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PULSE IS
PORT(CLK0:IN STD_LOGIC;
FOUT:OUT STD_LOGIC);
END PULSE;
ARCHITECTURE ONE OF PULSE IS
BEGIN
PROCESS(CLK0)
VARIABLE CNT:STD_LOGIC_VECTOR(2 DOWNTO 0);
VARIABLE FULL :STD_LOGIC;
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN
IF CNT="100" THEN //CNT计数到5(“100”)
CNT:="000" ; //CNT清零
FULL:='1'; //FULL高电平
ELSE
CNT:=CNT+1; //否则计数CNT加1
FULL:='0'; //FULL赋低电平
END IF;
END IF;
FOUT<=FULL; //FULL为CLK的五分频信号,赋值给FOUT做输出信号
END PROCESS;
END ONE;
附录4:模块COUNTER
// 程序名称:COUNTER
// 程序功能:实现汽车模拟计费功能。clr1为清零信号,si为状态信号,c1,c2,c3分别为费用的三为显示。
// 程序作者:金人佼
// 最后修改日期:2010.12.31
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER IS
PORT(CLK_DIV:IN STD_LOGIC;
CLR1:IN STD_LOGIC;
SI:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
C1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
C2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
C3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COUNTER;
ARCHITECTURE ONE OF COUNTER IS
BEGIN
PROCESS(CLK_DIV,CLR1,SI)
VARIABLE Q1: STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE Q2: STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE Q3: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF CLR1='0' THEN Q1:="0000";Q2:="0000";Q3:="0000"; //CLR低电平,清零
ELSIF CLK_DIV'EVENT AND CLK_DIV='1' THEN //CLK_DIV上升沿触发
CASE SI IS //SI:“00”表示计费值停止,“01”计费清零,设置为起步价10元,“10” 正常计费,每公里1元,“11”超过20元后,每公里1.5元;
WHEN "00" =>Q1:=Q1;Q2:=Q2;Q3:=Q3;
WHEN "01"=> Q1:="0000";Q2:="0000";Q3:="0001"; //起步价10元
WHEN "10"=> IF Q2<"1001" THEN
Q2:=Q2+1;
ELSE
Q2:="0000";
IF Q3<"1001" THEN
Q3:=Q3+1;
END IF;
END IF;
Q1:="0000";
WHEN "11"=> IF Q1<"0101" THEN
Q1:=Q1+5;
ELSE
Q1:="0000";
END IF;
IF Q1="0101" THEN
IF Q2<"1001" THEN
Q2:=Q2+1;
ELSE
Q2:="0000";
IF Q3<"1001" THEN
Q3:=Q3+1;
END IF;
END IF;
ELSE
IF Q2<"1001" THEN
Q2:=Q2+2;
ELSE
Q2:="0001";
IF Q3<"1001" THEN
Q3:=Q3+1;
END IF;
END IF;
END IF;
WHEN OTHERS=>NULL;
END CASE;
END IF;
C1<=Q1;
C2<=Q2;
C3<=Q3;
END PROCESS;
END ONE;
附录5:模块SCAN_LED的实现
// 程序名称:SCAN_LED
// 程序功能:该模块实现显示车费功能。BT为选位信号,SG译码信号。
// 程序作者:金人佼
// 最后修改日期:2010.12.31
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SCAN_LED IS
PORT(DI1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DI2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DI3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK2:IN STD_LOGIC;
SG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
BT:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END SCAN_LED;
ARCHITECTURE ONE OF SCAN_LED IS
SIGNAL CNT4 :STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
P1:PROCESS(CLK2)
VARIABLE SQ :STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF CLK2'EVENT AND CLK2='1' THEN
IF SQ="10" THEN SQ:="00"; //位选信号,1-3位循环
ELSE
SQ:=SQ+1;
END IF;
END IF;
CNT4<=SQ;
END PROCESS P1;
P2: PROCESS (CNT4)
BEGIN
CASE CNT4 IS
WHEN "00" =>BT<="001";A<=DI1;
WHEN "01"=>BT<="010";A<=DI2;
WHEN "10"=>BT<="100";A<=DI3;
WHEN "11"=>BT<="100";A<="1111";
WHEN OTHERS =>NULL;
END CASE;
END PROCESS P2;
P3:PROCESS(A)
BEGIN
CASE A IS //根据A的值,显示0~9
WHEN "0000"=>SG<="0111111"; //数码管显示数字0
WHEN "0001"=>SG<="0000110"; //数码管显示数字1
WHEN "0010"=>SG<="1011011"; //数码管显示数字2
WHEN "0011"=>SG<="1001111"; //显示数字3
WHEN "0100"=>SG<="1100110"; //显示数字4
WHEN "0101"=>SG<="1101101"; //显示数字5
WHEN "0110"=>SG<="1111101"; //显示数字6
WHEN "0111"=>SG<="0000111"; //显示数字7
WHEN "1000"=>SG<="1111111"; //显示数字8
WHEN "1001"=>SG<="1101111"; //显示数字9
WHEN OTHERS=>NULL;
END CASE;
END PROCESS P3;
END ONE ;
附录6:模块TAXI
// 程序名称:TAXI
// 程序功能:该模块为最终的顶层模块。
// 程序作者:金人佼
// 最后修改日期:2010.12.31
LIBRARY IEEE;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TAXI IS
PORT(T_CLK0:IN STD_LOGIC;
T_CLK1:IN STD_LOGIC;
T_CLK2:IN STD_LOGIC;
T_JS :IN STD_LOGIC;
T_ENABLE:IN STD_LOGIC;
T_CLR:IN STD_LOGIC;
T_STO:IN STD_LOGIC;
T_BT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
T_SG: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END TAXI;
ARCHITECTURE STRUC OF TAXI IS //顶层模块设计
COMPONENT MS
PORT(CK0:IN STD_LOGIC;
CK1:IN STD_LOGIC;
JS:IN STD_LOGIC;
CLK_OUT:OUT STD_LOGIC);
END COMPONENT;
COMPONENT SOUT
PORT(CLK:IN STD_LOGIC;
ENABLE:IN STD_LOGIC;
STO :IN STD_LOGIC;
CLR:IN STD_LOGIC;
ST:OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END COMPONENT;
COMPONENT PULSE
PORT(CLK0:IN STD_LOGIC;
FOUT:OUT STD_LOGIC);
END COMPONENT;
COMPONENT COUNTER
PORT(CLK_DIV:IN STD_LOGIC;
CLR1:IN STD_LOGIC;
SI:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
C1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
C2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
C3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
COMPONENT SCAN_LED
PORT(DI1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DI2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DI3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK2:IN STD_LOGIC;
SG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
BT:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END COMPONENT;
SIGNAL L_CLK: STD_LOGIC;
SIGNAL L_FOUT:STD_LOGIC;
SIGNAL L_ST:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL L_C1:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL L_C2:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL L_C3:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN //元件例化
U0:MS PORT MAP(CK0=>T_CLK0,CK1=>T_CLK1,JS=>T_JS,CLK_OUT=>L_CLK);
U1:SOUT PORT MAP(CLK=>L_CLK
展开阅读全文