您当前的位置:首页 > 发表论文

汽车电子防盗报警系统软件设计全文

2015-10-09 09:28 来源:学术参考网 作者:未知


第1章  绪  论
1.1  课题背景、目的和意义
1.1.1  课题的背景 
众所周知,汽车是当今世界主要的交通工具之一。随着人民生活水平的不断提高,汽车越来越成为人们生活中不可缺少的一部分,从世界上第一辆T型福特车被盗开始,偷车已成为现今城市最常见的犯罪行为之一。随着汽车数量的增加,特别是轿车正以很快的速度步入家庭,车辆被盗的数量逐年上升,这给社会带来极大的不安定因素,担心车辆被盗,成为困扰每一位汽车用户的难题。人们为了车辆的安全大都安装了汽车防盗报警系统。汽车防盗报警器的使用在很大程度上有效地保护了国家和人民生命财产的安全。使人们有了安全的依靠。同时车辆防盗报警器的使用也减少了盗窃犯罪事件的发生,起到了一定的威慑作用。随着科学技术的进步,为对付不断升级的盗车手段,人们研制开发不同方式结构的防盗器。
目前汽车防盗装置已经由初期的机械控制,发展成为电子密码、遥控呼救、信息报警等高科技产品,早期的防盗装置主要用于控制门锁、门窗、起动器、制动器、切断供油等联锁机构,以及为防止盗贼拆卸零件而设计的专用套筒扳手。随着科技的发展,汽车防盗装置日趋严密和完善,目前防盗器按其结构与功能可分四大类:机械式、电子式、芯片式和网络式,各有优劣,但汽车防盗的发展方向是向智能程度更高的芯片式和网络式发展[1]。
1、机械锁
机械锁是最常见也是最早的汽车防盗器,现阶段在高中档汽车中几乎不被使用,即便是低档汽车也已经很少单独使用,主要和电子式、芯片式联合使用,分为方向盘锁和变速箱锁两大类。其中方向盘锁在使用时,主要是将方向盘与制动脚踏板连接一起,使方向盘不能作大角度转向及不能制动汽车。而安装变速箱锁是在换挡杆附近安装变速锁,可使变速箱不能换挡。通常在停车后,把换挡杆推回P位或Ⅰ挡位置,加上变速箱锁,可使汽车不能换挡。方向盘锁和变速箱锁、钩锁等这些机械式防盗器,主要是靠锁定离合、制动、油门或转向盘、变速杆来达到防盗的目的,但只能防盗不能报警。另外,机械式防盗锁靠坚固的金属结构锁住汽车的操纵部位,使用起来不隐蔽,且占用驾驶室空间;机械锁主要起到限制车辆操作的作用,对防盗方面能够提供的帮助非常有限,很难抵挡住生猛型盗车贼手中撬棍、钢锯、老虎钳等重型工具的盗窃。但它们能拖延偷车贼作案的时间却是事实,一般偷车贼要用几十秒甚至几分钟才能撬开方向盘锁,变速杆锁的破坏时间还要长一点。
2、电子式防盗系统
在现阶段,应用最广泛的是电子式防盗锁。机械防盗装置是预防汽车被盗的装置,但这种装置不能防止他人进入驾驶室、车内,打开行李箱、发动机罩或起动发动机等。而电子防盗装置不仅能可靠地防止汽车被盗,而且能防止他人拆卸某些汽车零件和进入车内。电子防盗报警器,也称微电脑汽车防盗器,是目前使用最广泛的类型,包括插片式、按键式和遥控式等电子式防盗器。它主要是靠锁定点火或启动系统来达到防盗的目的,同时具有声音报警功能。这种防盗器共有4种功能:
(1)服务功能,包括遥控车门、遥控起动、阻吓窃贼作用等;
(2)警惕提示功能,具有触发报警记录(提示车辆曾被人打开过车门);
(3)报警提示功能,即当有人动车时发出警报;
(4)防盗功能,当防盗器处于警戒状态时,切断汽车上的起动电路,使汽车无
法起动。
该类防盗器安装隐蔽,功能齐全,无线遥控,操作简便,但需要靠良好的安装技术和完善的售后服务来保证。电子防盗系统的致命弱点在于其电子密码和遥控操作方式,当车主用遥控器开关车门时,匿藏在附近的偷车贼可以用接收器或扫描器盗取遥控器发出的无线电波或红外线,再经过解码,就可以开启汽车的防盗系统。另外这类电子防盗报警器的使用频率普遍被限定在300~350MHz的业余频段上,而这个频段的电子波干扰源又多,电波、雷电、工业电焊等都会干扰它而产生误报警。如上海通用别克系列轿车上配置的PasskeyⅡ和PasskeyⅢ防盗系统就是电子式防盗系统。
3、芯片式数码防盗系统
电子防盗系统固然有其优点,但随着时间的推移,人们研制出了更先进性的替代品,这就是目前在汽车防盗领域位居重点的芯片式数码防盗器。由于特点突出且使用方便,大多数轿车均采用这种防盗方式作为原配防盗器。目前很多高档车,如国产的大众、广州本田、派力奥、爱丽舍、毕加索等车型已装有原厂的芯片数码防盗系统。芯片式数码防盗器基本原理是锁住汽车的马达、电路和油路,在没有芯片钥匙的情况下无法启动车辆。数字化的密码重码率极低,而且要用密码钥匙接触车上的密码锁才能开锁,杜绝了被扫描的弊病。
    目前芯片式防盗已经发展到第四代,最新面世的第四代电子防盗芯片,具有特殊诊断功能,即已获授权者在读取钥匙保密信息时,能够得到该防盗系统的历史信息。系统中经授权的备用钥匙数目、时间印记以及其他背景信息,成为收发器安全特性的组成部分。第四代电子防盗系统除了比以往的电子防盗系统更有效地起到防盗作用外,还具有其他先进之处,如它独特的射频识别技术可以保证系统在任何情况下都能正确识别驾驶者,在驾驶者接近或远离车辆时可自动识别其身份自动打开或关闭车锁;无论在车内还是车外,独创的TMS37211器件都能够轻松探测到电子钥匙的位置。国内不少厂商通过引进国外先进技术开发出了我国的芯片式防盗系统,如爱丽舍应答式防盗系统是在BOSCH MP5.2电喷系统的基础上增加了一套新系统,它可以用来锁定和解锁发动机电脑,从而来实现车辆的防盗功能,当插入一把带有应答器的正确钥匙并打到“M”位时,系统自动完成对码、解锁发动机电脑,否则发动机电脑处于闭锁状态,发动机点火和喷油的控制被切断,汽车无法起动。
4、网络式防盗系统
网络防盗是指通过网络来实现汽车的开关门、启动马达、截停汽车、汽车的定位以及车辆会根据车主的要求提供远程的车况报告等功能。网络防盗主要是突破了距离的限制。目前主要使用的网络有:无线网络(BB机网络)、卫星定位跟踪系统(简称GPS),其中应用最广的就是GPS。
GPS系统全称为“全球卫星定位系统”。实际上,此技术是美国耗资100多亿美元,历时20多年发展的一大航天工程。1991年在海湾战争中被首次使用,海湾战争之后,GPS技术在非军事领域得到了更加深入的应用,在汽车反劫防盗领域已 取得实际效果。GPS卫星定位汽车防盗系统属于网络式防盗器,它主要靠锁定点火或起动来达到防盗的目的, GPS应用于汽车反劫防盗服务就得益于卫星监控中心对车辆的24小时不间断、高精度的监控服务。该系统由安装在指挥中心的中央控制系统、安装在车辆上的移动GPS终端以及GSM通信网络组成,接受全球定位卫星发出的定位信息,计算出移动目标的经度、纬度、速度、方向,并利用GSM网络的短信息平台作为通信媒介来实现定位信息的传输,具有传统的GPS通信方案所无法比拟的优势。缺点是价格昂贵,每月要交纳一定的服务费。一些常见的品牌有赛格、华强、迈吉贝斯、大三通等等,这类产品因费用太高等各方面原因,目前在市场上还不普及,市场占有率非常低。
1.1.2  课题的目的和意义
本课题采用现代数字系统设计的思路和自顶向下的EDA设计方法,针对当今社会汽车防盗越来越重要的现实问题,通过VHDL语言软件编程设计基于可编程器件的汽车电子防盗报警系统,达到了实时监测非法入侵、及时声光报警、启动/解除警戒和禁止非法使用发动机移动车辆等基本要求,为汽车防盗报警方面进一步研究,扩展更实用更全面的功能,设计更完善的产品打下了基础。通过设计掌握EDA设计的基本思路、VHDL语言编程方法,有限状态机的设计方法以及掌握开发软件Xilinx ISE,仿真软件Modelsim和综合工具Leonado Spectrum的运用。
1.2  论文的主要内容
本文由五章的内容构成,绪论部分介绍了当今汽车防盗报警系统发展的状况,说明了本课题的目的和意义以及论文主要内容。后面的四章对系统的设计过程和实现过程作了详细阐述。第2章对系统进行整体分析和模块划分;第3章详细介绍了系统四个模块和系统顶层的程序设计编写过程;第4章主要是系统四个模块的独立调试与仿真;最后一章是系统顶层的实现过程,也是整个系统的实现过程,这一章对系统实现的流程做了总体的介绍。
1.3  本章小结
本章主要介绍了当今社会汽车防盗报警系统发展状况,现有的种类和特点以及本课题的目的和意义并对论文主要内容作了简要概述。


第2章 汽车防盗报警系统整体设计
2.1  系统分析与设计
2.1.1  设计要求
本课题要求设计一种基于可编程逻辑器件的汽车防盗报警电子系统,完成软件部分设计,得出系统功能仿真结果。其具体设计指标要求如下:
(1)启动/解除警戒,灯亮表示启动,灯灭表示解除警戒;
(2)实时检测非法入侵,检测到非法入侵,锁住车门;
(3)禁止非法使用发动机移动车辆,一旦非法使用发动机,锁止发动机并锁住
车门;
(4)及时声光报警,采用喇叭发声和三个灯轮流点亮的方式进行声光报警。
2.1.2  系统分析
从本系统的设计要求来分析,软件设计可以采用原理图设计和硬件描述语言设计。硬件描述语言(Hardware Description Language, HDL)属于文本输入方法的范畴,是一种用形式化方法来描述数字电路和设计数字逻辑的语言,这种设计方法也被称为高层次设计(High-Level-Design)方法,其设计流程示意图如图2-1所示。
 
                          图2-1 HDL设计流程的示意图
相对于原理图设计,硬件描述语言设计具有很多优点:开发效率高、便于移植、便于文档管理、便于仿真、可以开发出非常复杂的数字系统等等。因此本系统采用硬件描述语言设计。硬件描述语言有VHDL语言和Verilog HDL语言,这两种语言都具备HDL的优点,Verilog HDL推出比VHDL早,它模仿C语言,语法简单,风格自由,比较容易掌握,而VHDL是基于Ada语言的,追求语法的严格性,学习起来相对烦琐一点,但是严格的语法在一定程度上限制了错误的产生,调试起来可能会容易一些[2]。VHDL的系统抽象能力比Verilog HDL要强一些,在系统级的描述上占一定的优势,本系统设计采用VHDL语言编写程序代码。
整个系统是一个数字系统,非法入侵信号采用数字信号模拟,用高电平‘1’表示车辆受到非法入侵,用低电平‘0’表示不存在非法入侵。灯光报警要求每个灯持续一个确定的时间,这就需要一个标准时钟信号,而标准时钟信号都是从外部晶振中得到的,本设计采用频率为1MHZ的外部晶振,在设计中需要考虑时钟的换算。
2.2  系统工作原理及模块划分           
系统的工作原理:启动系统装置,系统进入检测信号状态,同时检测非法入侵信号和非法使用发动机的信号,若无非法信号,系统将一直处于检测状态,当检测到非法入侵信号时,进行声光报警,并锁住车门;当检测到非法使用发动机信号时,进行声光报警,并锁止发动机以及锁住车门。解除系统报警,系统停止工作。
根据系统分析及系统工作原理,把整个系统划分成四个模块:启动/解除警戒模块、检测信号模块、声音报警及锁止模块和光报警模块 ,系统结构图如图2-2。
 
图2-2 系统模块构成图
四个模块的功能是:启动/解除警戒模块用以启动或解除整个防盗报警系统,使装置进入或退出正常工作状态;检测信号模块检测汽车是否存在异常移动、异常振动、异常提升、车身异常切斜和非法启动发动机等异常情况;声音报警及锁止模块发出声音报警,并锁住车门,锁止非法启动发动机信号;光报警模块通过LED灯闪烁发出报警信号;
2.3  本章小结
本章主要介绍了系统设计的一些要求及性能指标,并对整个系统进行了分析,选择了适合的设计输入方式和硬件描述语言。通过分析系统的工作原理,对系统进行了模块的划分,总共划分为四个模块:启动/解除警戒模块、检测信号模块、声音报警及锁止模块和光报警模块。


第3章 系统软件设计
3.1  VHDL编程语言
VHDL的全称为VHSIC(Very High Speed Integrated Circuit)Hardware Description Language,它的中文译名为超高速集成电路的硬件标准语言。模块化和自顶向下,逐层分解的结构化设计思想贯穿于整个VHDL设计文件之中。VHDL将所设计的任意复杂的电路系统均看作一个设计单元,可以用一个程序文件来表示。一个完整的VHDL语言程序通常包含实体、构造体、配置、程序包和库五个部分。实体是声明到其他实体或其他设计的接口,即定义本设计的输入/输出端口;构造体是用来定义实体的实现,即电路的具体描述;配置为实体选定某个特定的结构体;程序包则用来声明在设计或实体中将用到的常数、数据类型、元件及子程序等;库用以存储预先完成的程序包和数据集合体。这五个部分并不是每一个VHDL程序都必须具备的, 其中只有一个实体和一个与之对应的构造体是必须的。
VHDL编程语言具有以下主要优点[3]:
(1)具有强大的功能,覆盖面广,描述能力强,可用于从门级、电路级直至系
统级的描述、仿真和综合。
(2)有良好的可读性,它可以被计算机接受,也容易被读者理解。用VHDL书
写的既是源文件又是文档。
(3)有良好的可移植性,作为一种已被IEEE承认的工业标准VHDL事实上已
成为通用的硬件描述语言,可以在不同的设计环境和系统平台中使用。
(4)使用VHDL可以延长设计的生命周期。
(5)VHDL支持对大规模设计的分解和已有设计的再利用。
3.2  系统模块设计
3.2.1  启动/解除警戒模块设计
此模块用于启动/解除整个系统,使系统进入/退出正常的工作状态。用一个开关来控制系统的启动和解除,并用一个led灯来显示系统的状态。开关接通,即输入为高电平‘1’时,系统进入正常的工作状态,led灯点亮。开关断开时,输入的为低电平‘0’,系统退出正常工作状态,led灯熄灭。这用IF语句的双路选择结
构实现,其中sta表示开关控制信号,led1表示led 灯信号,程序见附录。
3.2.2  检测信号模块设计
信号检测模块的任务是检测非法入侵信号和非法启动发动机信号,非法入侵信号包括汽车异常移动、异常振动、异常提升、车身异常切斜四个信号,总共五个非法信号。整个模块采用有限状态机来进行设计,下面先对有限状态机作介绍。
状态机是包括一组寄存器的电路,该寄存器的值称为状态机的状态。状态机的状态不仅和输入信号有关,而且还与寄存器的当前状态有关。状态机可以认为是组合逻辑电路和寄存器逻辑电路的特殊组合,它包括两个主要部分:组合逻辑部分和寄存器部分。寄存器逻辑用于存储状态机的状态,组合逻辑包括两部分:状态译码和输出译码。状态译码用于确定状态机下各时钟周期的状态值,即确定状态机的激励方程,而输出译码确定状态机的输出,即确定状态机的输出方程。
最一般和最常用的状态机通常包括说明部分、状态更新进程、状态译码进程、辅助进程等几个部分。说明部分用于说明状态机中的状态情况和定义状态机的现态和次态;状态更新进程就是状态机的主控时序进程,它负责状态机运转和在时钟驱动下负责状态转换的进程;状态译码过程也就是主控组合进程,它的任务是根据外部输入的控制信号(包括来自状态机外部的信号和来自状态机内部其它非主控的组合和时序进程的信号),或/和当前状态的状态值确定下一状态的取向,以及确定对外输出或对内部其它组合或时序进程输出控制信号的内容。辅助进程用于配合状态机工作的组合或时序进程。例如为了完成某种算法的进程,或用于配合状态机工作的其它时序进程,或为了稳定输出设置的数据锁存器等[4]。
状态机分为同步状态机和异步状态机。同步状态机使用全局时钟信号,所有寄存器的时钟都是同一个,这使得状态的改变只发生在时钟的上升沿。异步状态机则利用组合逻辑电路的传播延迟来实现状态的存储功能,这样的状态机难于设计,而且很不稳定,一般情况设计同步状态机。
在状态机的输出的产生过程中,根据输出译码是否使用输入信号可分为两类状态机:摩尔状态机和米利状态机。在摩尔状态机中,输出只与当前状态有关,而在米利状态机中,输出不仅和当前状态有关,还与输入状态有关。此模块设计采用的是米利状态机。米利状态机的模型如图3-1所示。
 
图3-1 米利状态机模型
本模块总共八个输入信号,其中五个非法信号分别为a1,a2,a3,a4,b,一个时钟信号clk,一个复位信号 rst,一个启动输入信号start1;一个检测结果输出信号q。整个模块采用一个米利状态机来实现,它包括四个进程,分别是状态更新进程,状态译码进程,辅助进程和输出译码进程。状态机中设计了两个状态,为状态st1和st2,状态st1表示检测信号状态,状态st2表示报警状态。状态转移如图3-2所示。
 
图3-2 检测信号模块的米利状态机转移图
一开始工作状态机进入检测信号状态st1进行实时监测,当检测到非法信号,状态机转移到报警状态st2。在这里,非法信号为a1,a2,a3,a4,b,它们都是高电平‘1’有效,把这五个信号相或作为判断条件,即是其中任一个非法信号有效,则判断条件成立,状态机就转移到报警状态。一旦进入报警状态st2,将持续5s的报警,不管此时是不是还有非法信号存在,5s报警完成后,状态机继续判断是不是还存在非法信号,如果存在,则继续报警,否则回到检测状态st1继续进行实时监测。
在程序的编写中状态更新进程是一个很重要的部分,它既用于状态机的复位,同时也负责整个状态机的状态更新,此进程VHDL代码如下:
process( clk , rst )     --每个时钟上升沿,更新状态
          begin
                 if rst = '1'  then                --状态机复位
                   cur_state <= st0 ;
               elsif clk'event and clk = '1' then  --状态更新   
                   cur_state <= next_state;
                 end if ;
         end process ;
状态译码进程也是起着关键作用的一部分,在这里,它实现检测信号状态st1和报警状态st2之间的转移。处于报警状态的时候必须有持续5s的报警状态,这一功能将在辅助进程中实现,因而这里就需要设置一个标志位flag,并在程序中进行声明,如下:
signal flag : std_logic;
且需要把标志位放到译码进程的敏感表中,flag作为st2时发生状态转移的一个条件。状态机状态转移程序如下:
       case cur_state is
     when st1 => if (a1 or a2 or a3 or a4 or b) = '1' then
                    next_state <= st2;
                else
               next_state <= st1;
         end if;
     when st2 => if flag = '1'  then 
                       if (a1 or a2 or a3 or a4 or b) = '1'  then
                            next_state <= st2;
                  else
                            next_state <= st1;
                       end if;
                    else
                            next_state <= st2;
        end if;
          end case;
上面提到的持续5s的报警状态将在辅助进程里实现,在这里采用一个计数器来实现这项功能,由于外部提供的是频率1MHZ的晶振,所以计数器不能只是简单的计5个数,而是需要先对计数器计数值进行换算,换算如下:1MHZ的晶振提供的时钟的周期为1us,要计时5s,则必须计数5s/1us= 5000000次,换算成二进制,则为10011000100101101000000,计数器从0开始计数,则需要计数到10011000100101100111111。计数器在状态st2中实现,但在状态st1中需要先对计数器以及标志位f lag赋初值。在计数器计数的同时,同样的也要对标志位flag进行赋值,以便跟译码进程关联起来。计数器的程序编写如下:
if clk'event and clk = '1' then               
                      if cnt = "10011000100101100111111"  then
                            cnt <= "00000000000000000000000";
                            flag <= '1';
                 else   cnt <=  cnt + '1';
                            flag <= '0';
                 end if;
             end if;
状态机的前几个进程编写完成后,接下来就是编写它的输出进程。本状态机为米利状态机,输出与输入信号有关,这里有关的输入信号为启动输入信号start1,它是高电平‘1’有效,因此在输出条件判断上不仅要判断状态机的状态还要判断输入信号是否有效。
3.2.3  光报警模块设计
本模块用于光报警,通过三个led灯依次轮流点亮来发出报警信号,其中每个led灯点亮的时间均为2s。输入信号总共有三个:时钟信号clk,复位信号rst, 报警触发信号q1;输出为红灯输出r,绿灯输出g,黄灯输出y三个信号。此模块用的也是一个状态机来实现,它也由状态更新进程,状态译码进程,辅助进程和输出译码进程四个进程组成,辅助译码进程用于实现三个led灯持续点亮时间的计数。与检测信号模块不同的是,它是一个摩尔型状态机。摩尔状态机的模型如图3-3。
状态机设计了四个状态:无灯亮状态s0,红灯亮状态s1,绿灯亮状态s2,黄灯亮状态s3。状态转移图如图3-4所示。

  图3-3 摩尔状态机模型

 
                      图3-4 光报警模块的摩尔状态机转移图
状态图中的flag1,flag2,flag3为状态机中设置的三个标志位,高电平‘1’有效,它们分别用于判断红,绿,黄三个状态是不是已经计时够2s,如果满足这样的条件,则作为s1,s2,s3三个状态向下一状态转移的一个判断条件。在判断标志位之前,还需要判断另一条件:q1是否为‘1’,如果为‘1’,则再判断标志位是否有效,如果不为‘1’,则转移到s0状态。最开始状态机处于无灯亮状态,当输入报警信号q1为有效电平高电平‘1’时,转移到红灯亮状态s1,此时,如果q1持续为‘1’,则红灯持续亮2S,即当flag1为‘1’时,就转移到绿灯亮状态s2,同样的绿灯也持续点亮2s,当flag1为‘1’时,转移到黄灯亮状态s2,紧接着黄灯点亮2s,flag3为‘1’,然后又到红灯点亮,这样一直循环点亮发出报警信号。状态机状态转移程序如下:
      when s0 =>if  q1= '1' then
                  next_state <= s1;
               else
             next_state <= s0;
         end if;
         when s1 => if q1 = '1' then
                 if flag1 = '1' then
                     next_state <= s2;
                 else
             next_state <= s1;
         end if;
          else   next_state <= s0;
          end if;              
        when s2 => if q1 = '1' then
                 if flag2 = '1' then
                     next_state <= s3;
                 else
                next_state <= s2;
                    end if;
                 else   next_state <= s0;
         end if;
        when s3 => if q1 = '1' then
                 if flag3 = '1' then
                     next_state <= s1;
                 else
                next_state <= s3;
                   end if;
                  else   next_state <= s0;
          end if;
红,绿,黄三个led灯持续点亮的时间用三个计数器来实现,计数器写在状态机的辅助进程里。三个标志位flag1,flag2,flag3以及三个计数器都需要先在状态s0的时候赋初值。外部提供的时钟是频率为1MHZ晶振,在设置计数器的计数值时,需要先进行换算,换算方式与检测信号模块中的计数器值换算方式一样,经过换算,每个计数器计数的值为:0到111101000010001111111。当状态机进入s1,s2,s3状态任一状态时,其对应的计数器开始计数,当计数到111101000010001111111时,即是计时完2s时,标志位置‘1’,这样,s1,s2,s3三个状态就可以循环转移了。s1状态下的计数器程序如下,s2,s3状态下的计数器与此相似。
if clk'event and clk = '1'  then           
                   if cnt1 = "111101000010001111111" then
                        cnt1 <= "000000000000000000000";
                        flag1 <= '1';
              else  cnt1 <= cnt1 + '1';
                        flag1 <= '0';
              end if;
         end if;
摩尔状态机的输出进程只与当前状态有关,与输入信号无关,在本状态机中,只要根据系统的当前状态即可决定输出值,当为无灯亮状态s0时,三个输出信号r,g,y全为‘0’;当为红灯亮状态s1时,只有r为‘1’;当为绿灯亮状态s2时,只有g 为‘1’;当为绿灯亮状态s3时,只有y为‘1’。
3.2.4  声音报警及锁止模块设计
本模块不仅用于实现声音报警,还用于锁止非法启动发动机信号以及锁住车门。输入信号有:启动信号start1,非法启动发动机信号b1,非法信号q2。输出信号有:锁止发动机输出led_b,锁住车门输出led_door,声音报警输出alarm。设计中先判断启动信号是否为有效信号高电平‘1’,如果有则判断是否有非法启动发动机信号,如果有就锁止发动机,锁住车门并发出声音报警;如果没有非法启动发动机信号,就接着判断是否存在其它的非法信号,若存在,则锁住车门并发出声音报警;如果启动信号为‘0’,则所有输出信号都为‘0’。此模块用If语句中的多路控制语句来实现即可。
3.3  系统顶层设计
    完成系统的四个模块设计后,就需要编写系统的顶层文件,把整个系统连接起
来。在系统顶层的设计中,用构造体的结构描述方式进行程序的编写。所谓构造体的结构描述方式,就是在多层次的设计中,高层次的模块调用低层次的设计模块,或者直接用门电路设计单元来构成一个复杂的逻辑电路的描述方法。这里就要用到component语句和component_instant语句,component语句的基本书写格式如下:
COMPONENT 元件名                   
GENEIRC 说明;--参数说明              
PORT 说明;--端口说明
END COMPONENT
component_instant语句的基本书写格式如下:
标号名:元件名
PORT  MAP(信号,…)
标号名加在元件名前,在该构造体的说明中该标号名一定是唯一的。下一层的端口信号与实际连接的信号用PORT  MAP的映射关系联系起来。这里用的映射方式是在PORT  MAP端上加上component各输入输出端的名称,用’=>’把信号关联起来,这样就可以很清楚的知道各信号是怎样一一对应连接的[5]。
本系统的顶层设计的对外接口有输入信号start,a1,a2,a3,a4,b,时钟信号clk,复位信号rst, 输出信号led1,led_b,led_door,r,g,y,alarm。在设计中先对对外端口 进行声明,接着要申明的是在顶层设计中用到的四个模块的component,其声明的位置是在architecture与begin之间。接着还要声明一些内部信号,作为component间连接用,在这里只需要声明一个信号aa,它用于连接检测信号模块与光报警模块、声音报警及锁止模块。最后在architecture的begin与end间,则是用component_instant将信号相连接。这样,整个系统设计就完成了。整个系统的程序源代码见附录。
3.4  本章小结
在系统软件设计这一部分,先对要用的编程语言VHDL做了相关的介绍,列出了它的一些优点。在本章中对系统的各个模块以及系统顶层的设计作了详细的说明。启动/解除警戒模块通过led灯显示系统工作状态,启动警戒灯亮,解除警戒灯灭;检测信号模块采用米利型有限状态机实现,实现了实时监测系统的功能;光报警模块采用摩尔型有限状态机来实现,实现了红绿黄三个led灯依次轮流闪烁进行光报警的功能,其中每个灯亮两秒;声音报警及锁止模块和光报警模块实现了声音报警,并具有锁住车门,锁止汽车发动机的功能。系统顶层设计是整个设计的一个重要组成部分,主要通过利用构造体的结构描述方式把整个系统连接了起来,实现所有子模块的功能。

第4章 系统模块实现
4.1  调试与仿真综合软件介绍
系统用VHDL语言编程,采用VHDL语言仿真软件Xilinx ISE进行代码调试。Xilinx ISE集成综合环境是美国Xilinx公司的现场可编程逻辑器件数字电路开发工具集,其集成的工具可以使设计人员方便、快速的完成FPGA/CPLD数字开发电路全过程。Xilinx ISE是Xilinx公司EDA软件开发系统,是一个集成化环境,主要由项目导航工具,设计输入工具,逻辑综合工具,设计实现工具,设计约束图形编辑接口等组成一个平台。项目导航工具是基本窗口界面,用来访问ISE软件系统的各种工具箱;设计输入工具包括:电路逻辑图输入工具——电路图编辑器、硬件描述语言输入工具——硬件描述语言编辑器、状态机编辑器、硬件描述语言测试生成器;逻辑综合工具将硬件描述语言代码经过综合优化后输出EDIF格式电路逻辑连接(网表);设计实现工具用于面向FPGA的设计实现中的布局布线,并且可以对网表反标注以便提供给仿真工具进行后仿真验证;设计约束图形编辑接口包含图形化的约束编辑接口,实现控制逻辑块的位置约束和时间约束[6]。
系统采用Xilinx ISE进行调试,完成了设计输入并成功的进行了编译,只能说明设计符合一定的语法规范,并不能保证设计可以获得所期望的功能,这时就需要通过仿真对设计进行验证,这里就要用到第三方软件—Model Technology公司的ModelSim仿真软件。ModelSim是一个独立的仿真工具,它在工作的时候并不需要其它软件的协助,在Xilinx公司的ISE集成开发环境中给ModelSim仿真软件预留了接口,通过这个接口可以从ISE集成环境中直接启动ModelSim工具进行仿真[7]。使用此方法启动ModelSim工具需要具备三个条件:第一,启动ISE集成环境并建立一个FPGA/CPLD的工程项目;第二,添加设计源代码并且编译通过;第三,使用ISE中的Test Fixture 或Test Bench Waveform工具为当前的设计提供一个测试模板(Testbench),并且在测试模板中添加设计激励,或者在相应的工程下建立一个sim.do文件,在文件里设置信号激励。ModelSim仿真工具在默认条件下提供九种不同的用户窗口:主窗口、结构窗口、源程序窗口、信号窗口、进程窗口、变量窗口、数据流窗口、波形窗口以及列表窗口等。本设计中主要用到的是主窗口和波形窗口。主窗口在ModelSim启动时就直接打开,是所有其他窗口运行的基础,它分为工作区和脚本区,通过工作区可以很方便的对当前工程的工作库以及所有打开的数据集合进行控制,通过脚本区可以在ModelSim的提示符下输入所有ModelSim的各种命令,并且可以将命令执行后的信息反馈回来,以便用户了解命令的执行情况。通过波形窗口可以观察仿真的波形文件。
系统仿真完毕,接着需要用综合工具进行综合。Xilinx ISE软件有内嵌的综合工具XST,虽然安装ISE后可以直接使用XST,但是它的综合功能不全面,相对综合能力较差一点。因此本设计采用Mentor Graphics公司的Leonardo Spectrum综合工具进行系统综合。Leonardo Spectrum提供了先进的综合技术,支持增量设计、模块化设计,以及小组设计方法。简单易用,可控性较强,可以在Leonardo Spectrum中综合优化并产生EDIF文件。在ISE设计环境中,ISE提供与Mentor Graphics 的Leonardo Spectrum的无缝集成。 只需按一个按钮,就可开始综合系统。
4.2  系统模块实现
双击桌面上的Project Navigator的快捷方式打开ISE开发环境,点击主菜单上Edit->preferences,出现一个preferences,点击Integrated Tools,在Model tech Simulator下面的路径栏选择modelsim.exe的路径,在LeonardoSpectrum下面的路径栏选择leonardo.exe的路径,然后确定,这样就在ISE中把ModelSim以及LeonardoSpectrum关联起来了。接着就可以通过主菜单上File->New Project 建立新的工程了。新建工程中,其Project Properties的设置图4-1所示:
 
                 
图4-1 工程属性设置
建立工程后,在Process View窗口中右键点击Compile HDL Simulation Libraries,
选择Properties,出现一个窗口,在Target Simulator项选择ModelSim SE,在Simulator
Path项选择Modeltech下Win32文件夹的路径,确定,然后双击Compile HDL Simulation Libraries,就进行ModelSim仿真库的编译了,只有编译了仿真库,之后的仿真才能顺利的进行。
4.2.1  启动/解除警戒模块实现
建立了新的工程,在工程中添加新的on_off.vhd源文件,在源文件写入启动/解除报警模块的程序代码,保存以后就可以进行编译了。这个程序比较的简单,编译一次就通过了。这时就可以通过ModelSim进行仿真了,仿真之前先在对应的程序目录下新建一个sim.do文件。此模块sim.do的内容如下:
force sta 0 0,1 100,0 1000,1 2000,0 5000
run 10000
force和run都是命令词,force命令给VHDL信号予以激励,它的常规语法如下:
force <item_name> <value> <time>,<value> <time>
item_name表示被激励的信号的名称;value是被强制的项的值,它必须适合项的数据类型;time指指定值的时间单位,它是相对于当前的仿真时间。run命令后面的参数表示仿真即将运行的时间 。
通过ISE启动ModelSim仿真环境,然后选择Workspace下的Library,接着点击主菜单上的Tools->Execute Macro…,出现一个窗口,选择对应的do确认,仿真开始运行,完成后即可在仿真波形窗口看到仿真波形。在这里需要强调一点,在仿真之前一定要选择Workspace下的Library,因为环境的默认项是sim选项,如果不进行选择或则选择其它项,仿真就会出现错误,不能顺利仿真。在刚开始仿真的时候,本人就没有注意到这一点,结果就出现问题了。启动/解除警戒模块的仿真波形图如图4-2。
观看波形图,通过分析知,功能仿真结果符合程序编写要求。之后,通过Leonardo Spectrum 综合工具对本模块进行综合实现。
4.2.2  检测信号模块实现
    在建立的新工程里添加一个新的源文件test.vhd,把设计好的信号检测模块的VHDL语言程序代码写入到文件中,保存。接下来的操作都与启动/解除报警模块的类似。最先设计这个模块的程序编写的时候,用的状态机是摩尔型的,除了检测

图4-2 启动/解除警戒模块的仿真波形图
信号状态和报警状态,还多设置了一个等待状态s0,它通过输入信号led1的值来判断状态机的下一个转移,即是当整个系统启动时,由等待状态进入检测信号状态。由于设置了这一状态,因此在状态机的输出进程中就与输入信号无关了。当时理论上分析认为这样的设计应该是可以实现想要的功能的,可通过分析仿真结果,发觉这样的设计并不能完全的实现模块应有的功能。一开始系统开启,得到的结果是正确的,可开启之后再解除,状态机却仍然在状态s1,s2之间转换,输出结果仍然有效,这样的话,就没有实现该实现的功能。结果不正确,就需要修改源程序,通过多次的修改和调试,最后在程序中用米利型状态机状态机设计,功能仿真结果相符。由于源程序中使用了23位的二进制计数器,计数的值太大,在仿真中耗时太长,因而在程序中把计数器设置为8位的二进制计数器,这样就能比较及时的看到和分析仿真结果,这样的修改不影响模块的功能实现。
仿真前建立的sim.do中,始终信号的设置如下,在下面的语句中-rep 10表示以10ns为时钟周期进行循环设置,成为一个时钟信号。
                    force clk 0 0,1 5,0 10 -rep 10
通过调试仿真,得出检测信号模块的仿真波形图如图4-3,4-4。仿真完毕,运用 Leonardo Spectrum 综合工具对本模块进行综合。
4.2.3  光报警模块实现
    这个模块在调试仿真的过程中出现了不少问题,经过多次修改,才实现了模块要求的功能。在最开始设计的时候,本意也是用状态机来实现,不过在程序中只设置了一个计数器,且把计数器单独放到一个进程里实现,而在状态机进程中就没有设置辅助进程,在状态转移进程里根据计数器的取值范围了确定当前状态和下一状
 
                        图4-3 检测信号模块仿真整体波形图
 
图4-4 检测信号模块仿真部分波形图
态,从理论上来看这样是可以实现的,但是通过调试仿真,状态机的四个状态并不能按预想的那样正常运转。经过思考和分析,找出了不妥的地方:整个程序并不能说是一个状态机,因为计数器进程是单独的进程,并不属于状态机,这样,程序里状态机部分调用的计数器的值就不能使状态机正常的运转。首次调试失败后,进行了重新设计,把整个程序设计成一个摩尔状态机,这次设置了三个计数器和三个标志位,把计数器放在状态机的辅助进程里实现。程序编译成功后,又进行了仿真,虽然这次要比上次的好很多,但是功能还是没有完全的符合要求,当系统开启,解除,再开启警戒的时候,报警灯并不是先从红灯开始报警,而是随机的。这样当然不行,经过检查分析程序,在s1,s2,s3的转移条件中加上了对输入信号q1的值的判断,再进行调试仿真,完全实现了模块要求的功能。由于源程序中使用的是21位的二进制计数器,计数的值太大,仿真耗时太长,因而在程序中把计数器设置为8位的二进制计数器,这样就能比较及时的看到分析仿真结果,这样的修改不影响模块的功能实现。光报警模块的仿真波形图如图4-5,4-6。仿真完毕,通过Leonardo Spectrum 综合工具对本模块进行综合实现。
 
图4-5 光报警模块仿真整体波形图
4.2.4 声音报警及锁止模块实现
    这个模块的程序编写比较简单,在调试仿真的过程中比较顺利,其仿真波形图如图4-7。仿真完毕,通过Leonardo Spectrum 综合工具对本模块进行综合实现。
 
图4-6 光报警模块仿真部分波形图
 
图4-7 声音报警及锁止模块仿真波形图
4.3 本章小结
这一章简单介绍了调试软件Xilinx ISE集成开发环境,仿真软件ModelSim 和综合工具Leonardo Spectrum,对系统模块程序的调试步骤作了简要的说明,重点介绍了在调试过程中遇到的一些问题以及解决的方法,并给出了四个模块独立的仿真波形图。
第5章 系统顶层实现
5.1 系统顶层仿真
系统的四个模块通过编译,仿真综合完毕后,就开始进行系统顶层的调试。进行系统顶层调试前,需要先把各个模块添加到系统顶层目录下,并需要先一一的对四个模块进行编译,仿真和综合。完成准备工作,就可以开始编译系统顶层。编译的过程没有出现大的问题,但在仿真中却出现了问题,功能仿真结果与所要求实现的功能不一致,主要是没有实现光报警的功能。而各个模块单独调试的时候是完全实现了相应的功能的,可见问题出现在系统顶层的程序编写中。经过仔细的分析和多次调试,找到了问题所在。在顶层程序中,最开始设置的中间信号有问题,原来设置的为q,q1,q2,设置的中间信号与实际需求不相符,而q,q1,q2在模块的设计中已经存在,这样在顶层程序中有可能引起混乱,因而就无法实现所有的功能。之后,对设置的中间信号进行修改,只设置了一个中间信号aa,用它把模块中的q,q1,q2按相应的关系连接起来。再次进行编译仿真,仿真结果符合要求,其功能仿真波形图如图5-1,5-2所示。
 
图5-1 系统顶层仿真整体波形图
 
图5-2 系统顶层仿真部分波形图
5.2 系统顶层综合
系统顶层也使用Mentor Graphics公司 的Leonardo Spectrum综合工具进行综合。双击Synthesis-Leonardo Spectrum开始进行综合,综合的一切信息都在信息显示窗口显示。综合完毕,通过Launch Tools可以查看系统综合的一些情况。Launch Tools下包括三个选项View RTL Schematic, View Technology Schematic, View Critical Path Schematic。View RTL Schematic可以查看 系统设计的寄存器传输级原理,它可以帮助理解设计的源代码。View Technology Schematic查看综合优化后的结构视图,视图模块为FPGA/CPLD的硬件原语,帮助理解电路综合结果,分析关键路径。View Critical Path Schematic显示设计的关键路径,关键路径是最影响工作速度或时序约束的的路径。通过View RTL Schematic查看到本系统的寄存器传输级原理图如图5-3所示。
5.3 系统引脚锁定
完成了综合部分,紧接下来就是系统引脚的锁定。引脚的锁定通过约束编辑器
PACE实现,在资源管理窗选中设计的顶层模块,选择User Constraints 下的Assign
Package Pins命令,则生成一个UCF文件,此时就启动PACE进行引脚位置锁定。
 
图5-3 系统的寄存器传输级原理图
PACE主要由设计浏览窗口(Design Browser Window),设计对象列表窗口(Design Object List Window),器件结构窗口(Device Architecture Window),引脚封装窗口(Package Pins Window)和引脚封装图例窗口(Package Pins Legend Window)等部分组成。PACE约束引脚位置的基本方法有两种:第一种引脚锁定的方法是在Design Object List Window中双击信号的位置属性(Location)选项,直接指定引脚位置。第二种方法是在Design Object List Window中选定需要约束管脚位置的信号,用鼠标拖到引脚封装窗口的相应位置。系统引脚锁定情况如图5-4所示。引脚锁定完成后,保存用户约束文件,退出PACE。
5.4系统实现过程及布线后仿真
系统实现(Implement)就是将综合输出的逻辑网表翻译成所选器件的底层模块与硬件语言,将设计映射到器件结构上,进行布局布线,达到在选定器件上实现设计的目的。实现主要分为三个步骤:翻译(Translate)逻辑网表,映射(Map)到
器件单元和布局布线(Place & Route)。右键点击Implement Design,选择Properties,
可以对实现过Implement Design,实现过程的三个步骤依次进行实现,实现过程的一切信息都在程的三个步骤进行属性设置,本设计中默认软件的属性设置。双击
 
                      图5-4 系统引脚锁定图
信息显示窗口显示。
实现过程完成后,进行布局布线后仿真。将布局布线的时延信息反标到设计网表中,所进行的时序仿真就叫布局布线后仿真,简称布线后仿真。布线后仿真步骤必须进行,以确保设计功能与FPGA实际运行情况相一致。展开当前资源操作窗口的实现项目,双击布局布线项目下的Generate Post-Place & Route Simulation Model命令,产生布局布线后仿真模型。Xilinx 自动产生的仿真模型名为“top_timesim.vhd”。仿真延时信息文件名为“top_timesim.sdf”。后仿真模型文件自动调用SDF延时文件,将延时信息反标到仿真模型中。调用Modelsim进行布线后仿真,仿真结果与原结果一致,如图5-5所示。
5.5 使用iMPACT进行下载配置
iMPACT是ISE集成的配置工具,具有生成PROM格式的下载文件、向FPGA/CPLD/PROM下载配置文件、验证配置数据是否正确等功能。iMPACT支持四种下载模式:边界扫描(Boundary Scan)模式,从串(Slave Serial)模式、SelectMap模式和Desktop配置模式。边界扫描模式标准统一、设备简单,可以通过JTAG口配置FPGA/CPLD/PROM等多种器件,因而用得也最多。本设计也是采用边界扫描
模式。用iMPACT配置FPGA的过程分为两步,第一步是生成一个BIT文件,准备PROM等配置文件;第二步是下载配置文件。这两步操作步骤利用配置向导完成。
使用iMPACT生成PROM配置文件如图5-6所示。
 
图5-5 布线后功能仿真波形图
 
                图5-6 使用iMPACT生成PROM配置文件
使用iMPACT下载配置文件,选择配置连接方式Boundary-Scan Mode,接着选择Boundary-Scan连接检测方式Automatically connet to cable and identify Boundary-Scan chain, 完成后iMPACT将自动连接到下载电缆并检测Boundary-Scan连接链,显示边界扫描链的结构,同时提示将为边界扫描链中的器件配置文件。完成配制文件指定后,用鼠标选中器件,单击鼠标右键弹出命令菜单,选中Program命令,设置编程属性,确定后对PROM进行编程。
5.6 本章小结
   本章对系统设计的整个流程进行了总体介绍,对系统顶层的调试仿真过程作了详细的说明,通过仿真得到了系统的功能仿真波形图。文中把整个设计进行了综合优化,得到系统寄存器传输原理图和结构视图。系统后端的布局布线、布线后仿真以及下载配置运用Xilinx ISE实现。文中对系统后端实现也做了详细的说明,并给出了相应的一些图形。

结    论
本系统是基于可编程逻辑器件的软件设计,根据EDA设计的思路,采用了自顶向下的设计方法进行汽车防盗报警系统的设计。整个系统划分为四个模块:启动/解除警戒模块、检测信号模块、声音报警及锁止模块和光报警模块。启动/解除警戒模块通过led灯显示系统工作状态,启动警戒灯亮,解除警戒灯灭;检测信号模块采用米利型有限状态机实现,实现了实时监测系统的功能;光报警模块采用摩尔型有限状态机实现,实现了红绿黄三个led灯依次轮流闪烁进行光报警的功能,其中每个灯亮两秒;声音报警及锁止模块实现了声音报警,并具有锁住车门,锁止汽车发动机的功能。四个模块通过系统顶层连接起来,实现了汽车防盗报警的功能。程序采用Xilinx ISE进行前端设计输入、后端布局布线及配置下载;用Modelsim软件对系统进行功能仿真,得到了各个模块和整个系统的功能仿真波形图;用Leonado Spectrum进行综合,得到系统综合优化后的寄存器传输级原理图和结构视图。
本设计虽然实现了汽车防盗报警的功能,但是设计中还是有许多需要改进的地方。在声音报警方面,可以设计喇叭发出不同频率的报警声音。在对外部时钟信号的处理上,可以在系统中增加时钟分频模块先对时钟信号进行分频,这样,在计数的时候就可以设置小数值的计数器。整个汽车防盗报警系统的功能比较的简单,在功能方面还有很大改进和扩展空间,比如设置静音防盗功能,自动提示开启防盗等。静音防盗功能即是在系统正常工作状态下,若有非法入侵信号,喇叭不响,但不影响防盗功能;自动提示开启防盗功能就是在汽车停泊后一定的短时间内,系统发出提示音提醒车主开启防盗系统等等。

致    谢
首先感谢我的毕业设计的导师熊莉英老师,感谢她的督促和耐心的指导,同时也感谢在中电网论坛上帮助我的ID是“pe ngyoubieku”和“一切从零”的朋友以及帮助过我的同学们。在你们的帮助下,我才能更深刻的了解此次设计的任务目的,做出今天的成果。从你们的帮助中,我不仅学到了更多的专业知识,也学到了很多做人的道理。在此,我真心的感谢你们。

参考文献
[1] 肖军.现代汽车防盗看好智能化的发展方向[J].交通与运输,2006,2:38-39.
[2] 求是科技,张立科.CPLD/FPGA应用开发技术与工程实践[M].北京:人民邮电出版社,2005:3-21,245-280.
[3] 潘松,黄继业.EDA技术与VHDL[M].北京:清华大学出版社,2005:5-16.
[4] 齐洪喜,陆颖.VHDL电路设计使用教程[M].北京:清华大学出版社,2004:10-22.
[5] 侯伯亨,顾新.VHDL硬件描述语言与数字电路逻辑设计(修订版)[M].西安:西安电子科技大学出版社,1999:65-72.
[6] 段有艳.基于Xilinx ISE软件平台用VHDL实现FPGA电路设计[J].昆明冶金高等专科学校学报,2005,22(3)76-80 .
[7] 王诚,薛小刚,钟信潮.FPGA/CPLD设计工具——Xilinx ISE 5.X使用详解[M].北京:人民邮电出版社,2003:86-96,121-178.
[8] 吴佳凤,肖安,聂兵.基于VHDL的有限状态机设计方法与实现[J].武汉工业学院学报,2005,
25(1):12-14.
[9] 张常年.基于VHDL语言的远程拨号智能预警系统[J].计算机应用,2002,22(1):47-49.
[10] 刘桂华,马建国.基于VHDL语言的智能拨号报警器的设计[J].电子技术应用,2001,3:78-80.
[11] 张曦,李文元,丁润涛.基于CPLD防盗报警系统设计[J].电子测量技术,2004,3:20-21.
[12] 张文英,邹晴,柴燕.基于VHDL语言的数字电路设计[J].中国仪器仪表,2003,3:95-96.
[13] 付家才.EDA工程实践技术[M].北京:化学工业出版社,2005:93-132.
.The Seventh International Conference on Electronic Measurement and Instruments,2005,7:647-649.
[15] Xilinx Inc. ISE Quick Start Tutorial. Xilinx[M].Xilinx,2003:11-41.
[16] Steven Golson. State machine design techniques for Verilog and VHDL[J].Carlisle ,1994:2-22.
[17] Douglas L.Perry. VHDL Programming by Example[M].McGraw-Hill,2002:270-295.

附    录
1、启动/解除警戒模块程序源代码on_off.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity on_off is
    Port ( sta : in std_logic;
         led1 : out std_logic);
end on_off;
architecture one of on_off is
begin
process ( sta )
begin
    if sta = '1'  then
        led1 <= '1';
    else led1 <= '0';
    end if;
  end process;
end one;

2、检测信号模块程序源代码test.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity test is
    Port ( clk : in std_logic;    --频率1MHZ的时钟信号
         rst : in std_logic;        --复位信号
         a1 : in std_logic;       --汽车异常移动信号
         a2 : in std_logic;       --汽车异常振动信号
         a3 : in std_logic;       --汽车异常提升信号
         a4 : in std_logic;       --汽车车身异常倾斜信号
         b : in std_logic;       --非法启动发动机信号
         start1 : in std_logic;      --启动检测系统触发信号
         q : out std_logic);        --检测结果输出
end test;
architecture one of test is
type states is ( st1, st2 );              --st1:检测状态;st2:报警状态
signal cur_state, next_state: states;     --定义当前状态和下一状态
signal flag: std_logic; --标志位
signal cnt: std_logic_vector ( 7 downto 0 );      --定义计数,仿真用此语句
--signal cnt: std_logic_vector ( 22 downto 0 );    --实际用以下语句
begin
   process (clk, rst )                      --每个时钟上升沿,更新状态
   begin
       if rst = '1' then                   --状态机复位
       cur_state <= st1;
     elsif clk'event and clk = '1' then     --状态更新    
       cur_state <= next_state;
       end if;
   end process;
  
process ( cur_state, next_state, a1, a2, a3, a4, b, flag )
   begin
       case cur_state is
     when st1 => if ( a1 or a2 or a3 or a4 or b ) = '1'  then
                    next_state <= st2;
               else
               next_state <= st1;
          end if;
     when st2 => if flag = '1'  then 
                          if ( a1 or a2 or a3 or a4 or b ) = '1' then
                                next_state <= st2;
                      else
                                next_state <= st1;
                           end if;
                        else
                                 next_state <= st2;
              end if;
                    end case;
    end process;

process ( clk, cur_state )    
    begin
       case cur_state is
         when st1 => cnt <= "00000000"; 
                   flag <= '0';   
         when st2 => if clk'event and clk = '1' then                  
                      if cnt = "10011000" then
                            cnt <= "00000000";
                            flag <= '1';
                 else   cnt <= cnt + '1';
                            flag <= '0';
                 end if;
              end if;
       end case;
end process;

process ( clk, rst, cur_state )           --状态机输出
    begin
       if rst = '1' then
          q <= '0';
       else
          if clk'event and clk = '1' then
             if cur_state = st2 and start1 = ’1’ then
             q <= '1';  
             else 
             q <= '0';
                  end if;
           end if;
       end if;
end process;
end one;

3、光报警模块程序源代码led.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity led is
    Port ( clk : in std_logic;    --频率1MHZ的时钟信号
         rst : in std_logic;     --复位信号
         q1 : in std_logic;    --报警触发信号
          r : out std_logic;    --红灯输出
          g : out std_logic;    --绿灯输出
          y : out std_logic);   --黄灯输出
end led;
architecture one of led is
type state is ( s0, s1, s2, s3 );
signal per_state, next_state: state;           --定义当前状态和下一状态
signal cnt1, cnt2, cnt3: std_logic_vector ( 7 downto 0 ) ;   --仿真用此语句
--signal cnt1, cnt2, cnt3: std_logic_vector ( 7 downto 0 ) ;  --实际使用此语句
signal flag1, fl ag2, flag3: std_logic;
begin
  process ( rst, clk )               --每个时钟上升沿,更新状态
  begin
      if rst = '1'then                --状态机复位
       per_state <= s0;  
   elsif clk'event and clk ='1 'then   --状态更新
       per_state <= next_state;
      end if;
  end process;

  process ( per_state, next_state, q1, flag1, flag2, flag3 )  --状态转移进程
    begin
      case per_state is
     when s0 => if q1 ='1'  then
                  next_state <= s1;
              else
             next_state <= s0;
         end if;
        when s1 =>if q1 ='1'  then
                   if flag1 = '1' then
                       next_state <= s2;
                   else
                  next_state <= s1;
           end if;
          else  
next_state <= s0;
         end if;              
       when s2 => if q1 ='1'  then
                 if flag2 ='1'  then
                     next_state <= s3;
                 else
                 next_state <= s2;
                   end if;
                else   
next_state <= s0;
        end if;
       when s3 => if q1 = '1' then
                 if flag3 = '1' then
                     next_state <= s1;
                 else
                next_state <= s3;
                    end if;
                else  
next_state <= s0;
        end if;
    end case;
end process;

process ( per_state, clk )
begin
   case per_state is
        when s0 => cnt1 <= "00000000";
               flag1 <= '0';
          cnt2 <= "00000000";
               flag2 <= '0';
          cnt3 <= "00000000";
              flag3 <= '0';
     when s1 => if clk'event and clk = '1' then               
                      if cnt1 = "11110100" then
                           cnt1 <= "00000000";
                           flag1 <= '1';
                 else 
cnt1 <=  cnt1 + '1';
                           flag1 <= '0';
                end if;
          end if;
     when s2=>if clk'event and clk = '1' then              
                      if cnt2 = "11110100" then
                            cnt2 <= "00000000";
                            flag2 <= '1';
                 else  
cnt2 <= cnt2 + '1';
                            flag2 <= '0';
                 end if;
           end if;
    when s3 => if clk'event and clk = '1' then               
                      if cnt3 = "11110100" then
                           cnt3 <= "00000000";
                           flag3 <= '1';
                 else  
cnt3 <= cnt3+'1';
                           flag3 <= '0';
                 end if;
          end if;
   end case;
end process;
process ( clk, rst, per_state )   --状态输出进程
  begin
    if rst = 1' then
       r <= '0'; g <= '0'; y <= '0';
    else
       if clk'event and clk = '1' then
         if per_state = s0  then
             r <= '0'; g <= '0'; y <= '0';
      else
            if per_state = s1  then
                 r <= '1';g <= '0'; y <= '0';
            else
               if per_state = s2 then
                 r <= '0'; g <='1' ;y <= '0';
               else
           if per_state = s3  then
                       r <= '0'; g <= '0'; y <= '1';
                  else  r <= '0'; g <= '0'; y <= '0';
                  end if;
               end if;
            end if;
         end if;
       end if;
     end if;
end process;     
end one;

4、声音报警及锁止模块程序源代码sound.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity sound is
    Port ( start1: in std_logic; 
           b1 : in std_logic;      --非法启动发动机信号
           q2 : in std_logic;      --非法信号
           led_b : out std_logic;     --锁止发动机输出
           led_door : out std_logic;  --锁止车门输出
           alarm : out std_logic);  --声音报警
end sound;

architecture one of sound is
begin
processs ( b1, q2, start1 )
    begin
     if start1 = '1' then
         if b1 = '1' then 
            led_b <= '1';
         led_door <= '1';
         alarm <= '1';
     else  
         if q2 = '1' then
            led_b <= '0';
         led_door <= '1';
         alarm <= '1';
           else
         led_b <= '0';
         led_door <= '0';
         alarm <= '0'; 
          end if;
       end if;
     else   
        led_b <= '0';
     led_door <= '0';
    alarm <= '0';
     end if;
  end process;
end one;

5、系统顶层程序源代码top.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity top is
      Port ( clk : in std_logic;
           rst : in std_logic;
           a1 : in std_logic;
           a2 : in std_logic;
           a3 : in std_logic;
           a4 : in std_logic;
           b : in std_logic;
           start : in std_logic;
           led1 : out std_logic;
           r : out std_logic;
           g : out std_logic;
           y : out std_logic;
           led_door : out std_logic;
           led_b : out std_logic;
           alarm : out std_logic );
end top;

architecture one of top is
COMPONENT on_off
    Port ( sta : in std_logic;
           led1 : out std_logic);
end COMPONENT;               

COMPONENT test
    Port ( clk : in std_logic;     --频率1MHZ的时钟信号
         rst : in std_logic;      --复位信号
         a1 : in std_logic;     --汽车异常移动信号
         a2 : in std_logic;     --汽车异常振动信号
         a3 : in std_logic;     --汽车异常提升信号
         a4 : in std_logic;     --汽车车身异常倾斜信号
         b : in std_logic;     --非法启动发动机信号
         start1 : in std_logic;   --启动检测系统触发信号
         q : out std_logic );     --检测结果输出
end COMPONENT;

COMPONENT led
     Port  ( clk : in std_logic;    --频率1MHZ的时钟信号
           rst : in std_logic;     --复位信号
           q1 : in std_logic;   --报警触发信号
           r : out std_logic;       --红灯输出
           g : out std_logic;   --绿灯输出
           y : out std_logic );     --黄灯输出
end COMPONENT;

COMPONENT sound
    Port  ( start1: in std_logic; 
           b1 : in std_logic;       --非法启动发动机信号
           q2 : in std_logic;       --非法信号
           led_b : out std_logic;      --锁止发动机输出
           led_door : out std_logic;   --锁止车门输出
           alarm : out std_logic);    --声音报警
end COMPONENT;

signal  aa: std_logic;

begin
u1: on_off
PORT MAP ( sta => start,
           led1 => led1);
u2: test
PORT MAP (a1 => a1,
           a2 => a2,
        a3 => a3,
        a4 => a4,
        b => b,
        clk => clk,
        rst => rst,
        start1 => start,
        q => aa );
u3: led
PORT MAP( clk => clk,
           rst => rst,
        q1 => aa,
         r => r,
         g => g,
        y => y );
u4: sound
PORT MAP (start1 => start,
             q2 => aa,
             b1 => b,
          led_b => led_b,
          led_door => led_door,
          alarm => alarm );
end one;
 

相关文章
学术参考网 · 手机版
https://m.lw881.com/
首页