1、 EDA技术课程设计十字路口交通灯控制器设计学 院电气与信息工程专业电子信息工程班级0934111课程名称EDA技术学号0934111*姓名*俊豪指导教师*成绩评定一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。二、评分评分项目设计报告评分答辩评分平时表现评分合 计 (100分)任务完成情 况(20分)课程设计报告质量(40分)表达情况(10分)回答问题情 况(10分)工作态度与纪律(10分)独立工作能力(10分)得分课程设计成绩评定班级 0934111 姓名 学号 0934111成绩: 分(折合等级 )指导教师签字 年 月 日、目录一、设计题目1二、设计任务和要求1三
2、、EDA设计23.1、明确系统的功能,并进行逻辑抽象23.2、模块功能说明33.3、波形仿真及分析33.3.1、代码33.3.2、各模块rtl电路及功能仿真和时序仿真4四、硬件测试7五、实验困难问题及解决措施7参考文献9附录10前 言伴随着社会的发展以及人类生活水平的提高, EDA技术在电子信息、通信、自动、控制及计算机应用等领域的重要性日益突出。随着技术市场与人才市场对DEA需求的不断增加,交通的问题日益突出,单单依靠人力来指挥交通已经不可行了,所以设计交通灯来完成这个需求就显的越加迫切了。为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。以下就是运用数字电
3、子设计出的交通灯:其中红灯亮,表示该条路禁止通行;黄灯亮表示停车;绿灯亮表示允许通行。一、设计题目十字路口交通灯控制器设计。二、设计任务和要求用EDA技术设计一个十字路口的交通信号灯控制器,控制A、B两条交叉道路上的车辆通行,具体要求如下:设计一个十字路口交通信号管理控制器。对于每个路口,可实现直行、停止、左转指示,并显示当前状态剩余时间1. 每个方向有直行红灯、直行绿灯、停行黄灯和左转绿灯共4个LED指示灯组成;2. 每个方向用两位数码管显示当前状态剩余时间;3. 系统复位后进入东西直行,南北禁行状态;4. 直行状态最后3秒内,绿灯闪烁状态;三、EDA设计由于本设计实验的功能较多,所以就采用
4、模块化设计。整个程序设计基于8种状态,如下表所示:交通灯状态转换表状态SS1S2S3S4S5S6S7S0A方向左拐a1黄灯ay绿灯ag黄灯ay红灯ar红灯ar红灯ar红灯ar亮灯时间10s4s20s4s33B方向红灯br红灯br红灯br红灯br左拐b1黄灯by绿灯bg黄灯by亮灯时间38s10s4s15s4s注释:系统复位后进入A方向直行绿灯,B方向直行红灯的状态即S3。A方向B方向监督图1 A、B方向示意图顶层模块控制模块分频模块计数模块显示模块译码模块 图2 整体模块示意图3.1、明确系统的功能,并进行逻辑抽象如图1本方案可实现在确定时刻,倒计数数字显示能够及时变化,红黄绿灯能准确变化,考
5、虑到实际应用,加入人工监督功能,通过改变频率来控制交通灯亮灭的时间的长短。本设计采用模块化设计,图2为本设计十字路口交通等系统的层次结构框图。3.2、模块功能说明 1.主控制模块(kongzhi):控制系统输入输出之间联系。 2.显示模块(xianshi):显示倒计时时间和工作状。其输出用来驱动4位共阴数码管,并显示倒计时时间(动态扫描)。 3.分频模块(fenpin):本系统动态扫描需要1KHZ的脉冲而系统时钟需要1HZ的脉冲,分频器主要为系统提供所需要的时钟脉冲。该模块将1KHZ的脉冲信号进行分频,产生周期为1hz的方波,作为系统时钟信号的倒计时闪烁信号。 4.译码模块(yima):根据控
6、制信号,驱动交通灯即LED的显示。 5.计数模块(jishu):用来设定A方向和B方向计时器的初值,并为显示模块提供倒计时时间。 6.顶层模块jiaotongdeng,连接各模块设计,使之成为一个有机体。前5个模块分别进行仿真测试,成功后把所有.vhdl文件包含在工程jiaotongdeng,实现模块化设计。3.3、波形仿真及分析3.3.1、代码见附录一。3.3.2、各模块rtl电路及功能仿真和时序仿真各模块分别建立工程文件,并进行功能仿真、时序仿真,前六个模块成功编译,得到正确仿真结果后,建立顶层模块。模块一:控制模块(kongzhi) 图3 控制模块(kongzhi)rtl图 图4 控制模
7、块(kongzhi)仿真图模块二:计时模块(jishi)图5 计时模块(jishi)rtl图 图6 计时模块(jishi)仿真图模块三:显示模块(xianshi)图7 显示模块(xianshi)rtl图图8 显示模块(xianshi)仿真图模块四:译码模块(yima)图9 译码模块(yima)rtl图图10 译码模块(yima)仿真图模块五:分频模块(fenpin)图11 分频模块(fenpin)rtl图图12 分频模块(fenpin)仿真图模块六:顶层模块图13 本设计整体rtl图四、硬件测试编程下载和硬件测试的步骤如下:1、 打开下载窗口。选择菜单“Tool“项的”programmer“,
8、便可打开下载窗口。2、 设置下载电缆。将ByteBlaster电缆的一端与微机的并行口相连,另一端10针插头与装有目标器件的PCB板上的插座相连。并在”Hardware Setup”中设置下载电缆。3、设置JTAG链。Altera器件基本都支持JTAG在系统编程方式,这种方式简单易行,不需要专门的编程器。4、选用模式NO.5,分配引脚,并编译后,把生成*.sof文件下载到基于Cyclone型GW48系列FPGA实验箱开发板上,成功查看结果,CLK时钟频率用1Hz,可通过实验箱上“键7”控制Reset全局复位。五、实验困难问题及解决措施在实验的过程中,编写主程序的时候,也遇到调试不成功的问题,主
9、要问题如下:在编写xianshi模块时,最后给输出信号赋值时,使用了进程语句,但是由于敏感列表不全,导致在仿真时其输出信号的值产生错误。解决措施就是通过逐个查看内部信号,由于敏感列表不全,致使有些时刻,最后赋值的进程语句没有启动,从而造成输出结果不全。在实现绿灯剩余时间小于三秒时开始闪烁功能时,遇到问题。具体表现在yima模块中。开始为了在绿灯状态,使绿灯在高、地电平间变换,所以就尝试使用时钟信号clk的上升沿和下降沿,其中上升沿时,绿灯高电平即亮,下降沿时绿灯熄灭。虽然这种方案在modelsim中仿真成功,但是在quartus进行综合出现错误,该综合软件综合不出此寄存器。经过多次试验,使用了
10、clk高低电平触发,不再使用其上升下降沿。在整个程序中有时在使用IF语句时,会因为考虑不完整造成实验结果出错。因为在IF语句中如果过没有ELSE语句,那么输出将默认保持前一个状态,这样很容易产生错误。总之经过查阅各种资料,成功的把程序调试了出来。在查阅试验箱说明书的情况下,完成了引脚的选定,并把程序下载到了试验箱里面,完成了实物的演示。参考文献1邹彦编.EDA技术与数字系统设计.北京:电子工业出版社.2007.2潘松,黄继业编.EDA技术与VHDL(第二版).北京:清华大学出版社.2007.3王锁萍编.电子设计自动化教程.成都:电子科技大学出版社.2000. 4徐志军,徐光辉编.CPLD/FP
11、GA的开发与应用.北京:电子工业出版社.2002 .5杨旭,刘盾等编.EDA技术基础与实验教程.北京:清华大学出版社.2010.七、附录附录一:本系统采用用硬件描述语言VHDL描述。分为五个模块,分别为控制模块、计时模块、显示模块、译码模块和分频模块,下面针对每个模块给出相应的程序:模块一:/*控制部分*/*定义输入输出端口*/library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity kongzhi is -实体部分; port ( clk,clr : in std_logic; at,bt
12、: in std_logic_vector(7 downto 0); s : out std_logic_vector(2 downto 0) );end kongzhi;architecture rtl of kongzhi is -结构体部分;signal q :std_logic_vector(2 downto 0);begin- main logicprocess (clk,clr,at,bt)beginif clr=1 then q=011; -系统复位后,系统的状态是A干道绿灯; B干道红灯; elsif (clkevent and clk =1) then if (at=x01)
13、 or (bt=x01) then -倒计时结束时,状态发生改变;q=q+1; else q=q; end if; end if;end process;s = q;end rtl;模块二:/*计时部分*/*为A,B方向设置初值 */library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jishi is -实体部分 port ( clk, clr : in std_logic; s :in std_logic_vector(2 downto 0); at,bt :out std_logic
14、_vector(7 downto 0) );end jishi;architecture rtl of jishi is -结构体signal ati,bti :std_logic_vector(7 downto 0);-中间信号signal art,agt,alt,abyt:std_logic_vector(7 downto 0);signal brt,bgt,blt:std_logic_vector(7 downto 0);begin- main logic -每个状态的总时间分别赋给相应的信号;art=x33; -A方向直行红灯总时间为33s;agt=x20; -A方向直行绿灯总时间为2
15、0s;alt=x10; -A方向左拐绿灯总时间为4s;abyt=x04; -黄灯总时间为4s;brt=x38; -B方向直行红灯总时间为38s;bgt=x15; -B方向直行绿灯总时间为15s;blt=x04; -B方向左拐绿灯总时间为4s;process (clk,clr,s) begin if clr=1 then ati=x33;btiati=alt;btiatiatiatiati=art;btibtibtibtiati=ati;bti=bti; end case; end if; if ati/=x01 then -当前时间大于1s时,则相应位进行减一; if ati(3 downto
16、 0)=0000 then ati(3 downto 0)=1001;-因为总时间使用的是十六进制 ati(7 downto 4)=ati(7 downto 4)-1; else ati(3 downto 0)=ati(3 downto 0)-1; ati(7 downto 4)=ati(7 downto 4); end if; end if; if bti/=x01 then -当前时间大于1s时,则相应位进行减一; if bti(3 downto 0)=0000 then bti(3 downto 0)=1001; bti(7 downto 4)=bti(7 downto 4)-1; el
17、se bti(3 downto 0)=bti(3 downto 0)-1; bti(7 downto 4)=bti(7 downto 4); end if; end if; end if;end process;at= ati; -最后给输出信号赋值;bt=bti;end rtl; 模块三: /*显示部分*/*显示倒计时时间和系统工作状态 */library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xianshi is -实体部分; port ( clk1k,clr ,clk : in st
18、d_logic; at,bt:in std_logic_vector(7 downto 0); led : out std_logic_vector(6 downto 0); sel: out std_logic_vector(3 downto 0) );end xianshi;architecture rtl of xianshi is -结构体部分;signal ou : std_logic_vector(3 downto 0) ;signal dis,ds : std_logic_vector(7 downto 0);signal sl : std_logic_vector(2 down
19、to 0):=000;signal sq : std_logic_vector(3 downto 0):=0000;begin- main logicsl1:process (clk1k,clr)begin if clr=1 then sl=000; elsif (clk1kevent and clk1k =1)then if sl=011 then sl =000; else sl sqsqsqsqnull; end case; end process;ou1:process(sl) -显示时间与位选信号一一对应; begin case sl is when 000=ouououououds
20、dsdsdsdsdsdsdsdsdsds=x00; end case; end process;saomiao:process(clk,ds,clr,sl) -给输出信号赋值; begin if clr=1 then dis=ds; elsif sl101 then if clk=0 then dis=ds;-低电平数码管显示时间; else dis=x00; -高电平数码管全关闭; end if; else dis=ds; end if; end process; led=dis(6 downto 0); sel =sq; end rtl;模块四:/*译码部分*/*驱动交通灯的显示*/lib
21、rary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yima is -实体部分; port ( clr,clk : in std_logic; at,bt : in std_logic_vector(7 downto 0); s : in std_logic_vector(2 downto 0); abl :out std_logic_vector(7 downto 0) );end yima;architecture rtl of yima is -结构体部分;signal lt :std_
22、logic_vector(7 downto 0);signal a :std_logic_vector(7 downto 0);signal b :std_logic_vector(7 downto 0);begin- main logicprocess (clr,s,clk) -状态S控制着每个方向的LED灯;beginif clr=1 then ltltltltltltltltltlt=lt; end case;end process;process(clk,at,bt,s) 绿灯时间小于4秒时,绿灯开始闪烁; begin if(s=011) then if atx04 then if c
23、lk=1 then a=00000001; elsif clk=0 then a=00100001; end if; else a=00100001; end if; else a=00100001; end if; if (s=111) then if btx04 then if clk = 1 then b=00010000; elsif clk=0 then b=00010010; end if; else b=00010010; end if; else b=00010010; end if; end process; abl = lt;end rtl; 模块五:/*分频部分*/*为系
24、统提供所需要的时钟脉冲 */library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin is -实体部分; port ( clk1k : in std_logic; clk : out std_logic );end fenpin;architecture rtl of fenpin is -结构体部分;signal fp :std_logic_vector(9 downto 0):=0000000000;begin- main logicprocess (clk1k)begin
25、if (clk1kevent and clk1k =1) then fp = fp+1; -计数 end if;end process;clk s1,clk=s2);-元件端口映射;u2: kongzhi port map(clk=s2,clr=s3,at=s9,bt=s10,s=s7);u3: jishi port map(clk=s2,clr=s3,s=s7,at=s9,bt=s10);u4: yima port map(clr= s3,s=s7,abl=s11,at=s9,bt=s10,clk=s2);u5: xianshi port map (clk=s2,clk1k=s1,clr=s
26、3,at=s9,bt=s10,led=s12,sel=s13);s1=clk1k;s3=clr;shuma=s12;sel=s13;led1 sig_clk1k, clr = sig_clr, led1 =sig_led1, shuma = sig_shuma, sel =sig_sel);process beginsig_clk1k =0;wait for period;sig_clk1k =1; wait for period;end process;sig_clr = 1, 0 after 3 sec, 1 after 10 sec,0 after 11 sec;end behaviour;附