《大型完整系统设计实例-交通灯和频率计.ppt》由会员分享,可在线阅读,更多相关《大型完整系统设计实例-交通灯和频率计.ppt(35页珍藏版)》请在三一办公上搜索。
1、第6章大型完整系统设计实例,第一部分交通灯信号控制器的设计,设计一个主干道和支干道十字路口的交通管理系统,并用VHDL进行描述。该交通管理系统的技术要求为:如果只有一个方向有车时,则保持该方向畅通;当两个方向都有车时,主干道和支干道交替通行,但主干道通行的时间要比支干道长一些。,系统设计第一步:在明确技术要求的基础上,首先制定系统的设计方案。第二步:系统划分,得到系统结构图。第三步:根据设计方案和系统结构图进行算法设计,可以画出控制系统的ASM图。第四步:设计输入,用VHDL对该系统进行描述。,根据技术要求,在主干道和支干道两个方向上都安装红、黄、绿三色信号灯;Ca和Cb分别是安装在主干道和支
2、干道上的传感器,用于检测是否有车辆需要通过路口。在只有主干道有车时,主干道亮绿灯,支干道亮红灯;当只有支干道有车时,主干道亮红灯,支干道亮绿灯;当两个方向都有车时,则两个方向轮流亮绿灯和红灯,但主干道每次亮绿灯的时间不得少于60s,支干道每次亮绿灯的时间不得多于40s,在由绿灯转红灯之间要有10s的黄灯(公共停车时间)作为过渡。本系统最终采用可编程逻辑器件来实现。,第一步:在明确技术要求的基础上,首先制定系统的设计方案。,交通管理系统的结构图,第二步:系统划分,得到系统结构图。根据以上的设计方案,可以画出系统的结构图。,本系统主要由控制器和受控制的定时器组成。定时器用来确定主干道、支干道通行时
3、间以及公共停车时间;CNT是定时的值;LD是定时值的同步预置信号,高电平有效;ST是这个定时器的状态信号,当定时结束时,ST输出为1;Ca和Cb分别为主干道和支干道的传感器输出信号,高电平表示有车需要通过;clk是周期为秒的时钟信号;reset是异步复位信号,低电平有效,复位后的初始状态为主干道畅通;Ra、Ya、Ga和Rb、Yb、Gb分别为主干道和支干道的红、黄、绿灯的控制信号,高电平有效。,第三步:根据设计方案和系统结构图进行算法设计,可以画出控制系统的ASM图。ASM图很清楚地表明了该交通管理系统共有4个状态(S0、S1、S2和S3)以及各状态之间的转换关系。,当ST=1时,LD=1,CN
4、T的值取决于当前的状态和Ca、Cb的值。,CNT的取值表,第四步:设计输入,用VHDL对该系统进行描述。本设计采用分层次描述,以下为VHDL源文件。,-定时器模块(count.vhd):LIBRARY IEEE;USE IEEE.STD-LOGIC-1164.ALL;USE IEEE.STD-LOGIC-UNSIGNED.ALL;ENTITY counter IS PORT(reset,clk,LD:IN STD-LOGIC;CNT:IN INTEGER RANGE 0 TO 63;ST:OUT STD-LOGIC);END ENTITY counter;ARCHITECTURE arch O
5、F counter IS SIGNAL Q:INTEGER RANGE 0 TO 63;BEGIN PROCESS(reset,clk)-定时器进程 BEGIN,IF(reset=0)THEN Q=60;ELSIF(clkEVENT AND clk=1)THEN IF(LD=1)THEN Q=CNT;ELSIF(Q/=0)THEN Q=Q1;END IF;END IF;END PROCESS;PROCESS(reset,clk)-定时器ST的进程 BEGIN IF(reset=0)THEN ST=0;ELSIF(clkEVENT AND clk=1)THEN IF(Q=2)THEN ST=1;
6、ELSE ST=0;END IF;END IF;END PROCESS;END ARCHITECTURE arch;,-控制器模块(control.vhd):LIBRARY IEEE;USE IEEE.STD-LOGIC-1164.ALL;USE IEEE.STD-LOGIC-UNSIGNED.ALL;ENTITY con-trol IS PORT(reset,clk,ST,Ca,Cb:IN STD-LOGIC;Ra,Ya,Ga,Rb,Yb,Gb,LD:OUT STD-LOGIC;CNT:OUT INTEGER RANGE 0 TO 63);END ENTITY con-trol;ARCHIT
7、ECTURE arch OF con-trol IS CONSTANT T1:INTEGER:=60;CONSTANT T2:INTEGER:=40;CONSTANT T3:INTEGER:=10;TYPE STATE-TYPE IS(S0,S1,S2,S3);SIGNAL state:STATE-TYPE;SIGNAL RYG:STD-LOGIC-VECTOR(5 DOWNTO 0);BEGIN,PROCESS(reset,clk)-描述状态转换 BEGIN IF(reset=0)THEN state IF(Cb=0)THEN state state IF(Ca=0)THEN state s
8、tate=S0;END CASE;END IF;END IF;END PROCESS;,-描述交通灯控制信号 Ra RYG RYG RYG RYG IF(Cb=0)THEN CNT CNT IF(Ca=0)THEN CNT CNT=T1;END CASE;END PROCESS;END ARCHITECTURE arch;,-顶层文件(traffic.vhd):LIBRARY IEEE;USE IEEE.STD-LOGIC-1164.ALL;USE IEEE.STD-LOGIC-UNSIGNED.ALL;PACKAGE traffic-lib IS COMPONENT con-trol IS
9、PORT(reset,clk,ST,Ca,Cb:IN STD-LOGIC;Ra,Ya,Ga,Rb,Yb,Gb,LD:OUT STD-LOGIC;CNT:OUT INTEGER RANGE 0 TO 63);END COMPONENT con-trol;,COMPONENT counter IS PORT(reset,clk,LD:IN STD-LOGIC;CNT:IN INTEGER RANGE 0 TO 63;ST:OUT STD-LOGIC);END COMPONENT counter;END PACKAGE traffic-lib;LIBRARY IEEE;USE IEEE.STD-LO
10、GIC-1164.ALL;USE IEEE.STD-LOGIC-UNSIGNED.ALL;USE WORK.traffic-lib.ALL;ENTITY traffic IS PORT(reset,clk,Ca,Cb:IN STD-LOGIC;Ra,Ya,Ga,Rb,Yb,Gb:OUT STD-LOGIC);END ENTITY traffic;,ARCHITECTURE arch OF traffic IS SIGNAL ST,LD:STD-LOGIC;SIGNAL CNT:INTEGER RANGE 0 TO 63;BEGIN u1:con-trol PORT MAP(reset,clk,
11、ST,Ca,Cb,Ra,Ya,Ga,Rb,Yb,Gb,LD,CNT);u2:counter PORT MAP(reset,clk,LD,CNT,ST);END ARCHITECTURE arch;,第二部分数字频率计的设计,1.设计思路 下图是8位十进制数字频率计的电路逻辑图,它由一个测频控制信号发生器TESTCTL、8个有时钟使能的十进制计数器CNT10、一个32位锁存器REG32B组成。以下分别叙述频率计各逻辑模块的功能与设计方法。,8位十进制数字频率计逻辑图,1)测频控制信号发生器设计 频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求TESTCTL的计数使能信号TSTEN能产
12、生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,并由外部的7段译码器译出并稳定显示。锁存信号之后,必须有一清零信号CLR_CNT对计数器进行清零,为下1秒钟的计数操作作准备。测频控制信号发生器的工作时序如图所示。为了产生这个时序图,需首先建立一个由D触发器构成的二分频器,在每次时钟CLK上沿到来时其值翻转。,其中控制信号时钟CLK的频率取1 Hz,而信号TSTEN的脉宽恰好为1
13、 s,可以用作闸门信号。此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。由图可见,在计数完成后,即计数使能信号TSTEN在1 s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,0.5 s后,CLR_CNT产生一个清零信号上跳沿。高质量的测频控制信号发生器的设计十分重要,设计中要对其进行仔细的实时仿真(TIMING SIMULATION),防止可能产生的毛刺。,测频控制信号发生器工作时序,2)寄存器REG32B设计 设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。若已有32位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到
14、寄存器REG32B的内部,并由REG32B的输出端输出,然后由实验板上的7段译码器译成能在数码管上显示输出的相对应的数值。,3)十进制计数器CNT10的设计 如图所示,此十进制计数器的特殊之处是,有一时钟使能输入端ENA,用于锁定计数值。当高电平时计数允许,低电平时禁止计数。,2.VHDL源程序1)有时钟使能的十进制计数器的源程序CNT10.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;-有时钟使能的十进制计数器ENTITY CNT10 ISPORT(CLK:IN STD_LOGIC;-计数时钟信号 CLR:IN STD_LOGIC;-清零信号 END
15、:IN STD_LOGIC;-计数使能信号 CQ:OUT INTEGER RANGE 0 TO 15;-4位计数结果输出 CARRY_OUT:OUT STD_LOGIC);-计数进位 END CNT10;ARCHITECTURE ART OF CNT10 IS,SIGNAL CQI:INTEGER RANGE 0 TO 15;BEGIN PROCESS(CLK,CLR,ENA)BEGIN IF CLR=1 THEN CQI=0;-计数器异步清零 ELSIF CLKEVENT AND CLK=1 THEN IF ENA=1 THEN IF CQI9 THEN CQI=CQI+1;ELSE CQI
16、=0;END IF;-等于9,则计数器清零 END IF;END IF;END PROCESS;PROCESS(CQI)BEGIN IF CQI=9 THEN CARRY_OUT=1;-进位输出 ELSE CARRY_OUT=0;END IF;END PROCESS;CQ=CQI;END ART;,2)32位锁存器的源程序REG32B.VHDLIBRARY IEEE;-32位锁存器USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG32B IS PORT(LOAD:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOU
17、T:OUT STD_LOGEC_VECTOR(31 DOWNTO 0);END REG32B;ARCHITECTURE ART OF REG32B IS BEGINPROCESS(LOAD,DIN)BEGINIF LOAD EVENT AND LOAD=1 THEN DOUT=DIN;-锁存输入数据 END IF;END PROCESS;END ART;,3)测频控制信号发生器的源程序TESTCTL.VHD LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;-测频控制信号发生器ENTITY TESTCTL IS PORT(CLK:IN STD_LOGIC;-1
18、Hz测频控制时钟 TSTEN:OUT STD_LOGIC;-计数器时钟使能 CLR_CNT:OUT STD_LOGIC;-计数器清零 LOAD:OUT STD_LOGIC);-输出锁存信号END TESTCTL;ARCHITECTURE ART OF TESTCTL IS SIGNAL Dvi2CLK:STD_LOGIC;BEGIN,PROCESS(CLK)BEGINIF CLKEVENT AND CLK=1 THEN-1 Hz时钟二分频Div2CLK=NOT Div2CLK;END IF;END PROCESS;PROCESS(CLK,Div2CLK)BEGIN IF CLK=0 AND D
19、iv2CLK=0 THEN-产生计数器清零信号 CLR_CNT=1;ELSE CLR_CNT=0;END IF;END PROCESS;LOAD=NOT Div2CLK;TSTEN=Div2CLK;END ART;,4)数字频率计的源程序FREQ.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQ IS PORT(FSIN:IN STD_LOGIC;CLK:IN STD_LOGIC;DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0);END FREQ;ARCHITECTURE ART OF FREQ ISCO
20、MPONENT CNT10-待调用的有时钟使能的十进制计数器端口定义 PORT(CLK,CLR,ENA:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);,END COMPONENT;COMPONENT REG32B-待调用的32位锁存器端口定义 COMPONENT TESTCTL-待调用的测频控制信号发生器端口定义 SIGNAL TSTEN:STD_LOGIC;SIGNAL CLR_CNT:STD_LOGIC;SIGNAL LOAD:STD_LOGIC;SIGNAL CARRY1:STD_LOG
21、IC;SIGNAL CARRY2:STD_LOGIC;SIGNAL CARRY3:STD_LOGIC;SIGNAL CARRY4:STD_LOGIC;SIGNAL CARRY5:STD_LOGIC;SIGNAL CARRY6:STD_LOGIC;SIGNAL CARRY7:STD_LOGIC;SIGNAL CARRY8:STD_LOGIC;SIGNAL DIN:STD_LOGIC_VECTOR(31 DOWNTO 0);,BEGINU0:TESTCTL PORT MAP(CLK=CLK,TSTEN=TSTEN,CLR_CNT=CLR_CNT,LOAD=LOAD);U1:CNT10 PORT M
22、AP(CLK=FSIN,CLR=CLR_CNT,ENA=TSTEN,CQ=DIN(3 DOWNTO 0),CARRY_OUT=CARRY1);U2:CNT10 PORT MAP(CLK=CARRY1,CLR=CLR_CNT,ENA=TSTEN,CQ=DIN(7 DOWNTO 4),CARRY_OUT=CARRY2);U3:CNT10 PORT MAP(CLK=CARRY2,CLR=CLR_CNT,ENA=TSTEN,CQ=DIN(11 DOWNTO 8),CARRY_OUT=CARRY3);U4:CNT10 PORT MAP(CLK=CARRY3,CLR=CLR_CNT,ENA=TSTEN,C
23、Q=DIN(15 DOWNTO 12),CARRY_OUT=CARRY4);U5:CNT10 PORT MAP(CLK=CARRY4,CLR=CLR_CNT,ENA=TSTEN,,CQ=DIN(19 DOWNTO 16),CARRY_OUT=CARRY5);U6:CNT10 PORT MAP(CLK=CARRY5,CLR=CLR_CNT,ENA=TSTEN,CQ=DIN(23 DOWNTO 20),CARRY_OUT=CARRY6);U7:CNT10 PORT MAP(CLK=CARRY6,CLR=CLR_CNT,ENA=TSTEN,CQ=DIN(27 DOWNTO 24),CARRY_OUT
24、=CARRY7);U8:CNT10 PORT MAP(CLK=CARRY7,CLR=CLR_CNT,ENA=TSTEN,CQ=DIN(31 DOWNTO 28),CARRY_OUT=CARRY8);U9:REG32B PORT MAP(LOAD=LOAD,DIN=DIN(31 DOWNTO 0),DOUT=DOUT);END ART;,3.硬件逻辑验证 选择实验电路结构图NO.0,测频控制器时钟信号CLK(1 Hz)可接CLOCK1,待测频FSIN可接CLOCK0,8位数码显示输出DOUT31.0接PIO47PIO16。进行硬件验证时方法如下:选择实验模式0,测频控制器时钟信号CLK与CLOCK1信号组中的1 Hz信号相接,待测频FSIN与CLOCK0信号组中的某个信号相接,数码管应显示来自CLOCK0的频率。,