实验五 交通灯信号控制器的设计
一、实验目的
1.掌握VHDL语言的基本结构。
2.掌握VHDL层次化的设计方法。
3.掌握VHDL基本逻辑电路的综合设计应用。
二、实验原理
交通灯信号控制器主要用于主干道与支干道公路的交叉路口,要求是优先保证主干道的畅通。因此,平时处于“主干道绿灯,支道红灯”状态,只有在支道有车辆要穿行主干道时,才将交通灯切向“主干道红灯,支道绿灯”,一旦支道无车辆通过路口,交通灯又回到“主干道绿灯,支道红灯”的状态。
图1 交通灯控制器的内部电路逻辑图
图1是交通灯信号控制器的内部电路逻辑图,整个系统由5个单元电路组成。其中,交通灯控制器JTDKZ模块:根据主、支干道传感器信号SM、SB以及来自时基发生电路的时钟信号CLK,发出主、支干道指示灯的控制信号,同时向各定时单元、显示控制单元发出使能控制信号EN1、EN2、EN3、EN4; 45S定时单元CNT45S、25S定时单元CNT25S、5S定时单元CNT05S:根据SM、SB、CLK及JTDKZ发出的有关使能控制信号EN1、EN2、EN3、EN4,按要求进行定时,并将其输出传送至显示控制单元;显示控制单元XSKZ:根据JTDKZ发出的有关使能控制信号EN1、EN2、EN3、EN4选择定时单元CNT45S、CNT25S、CNT05S的输出传送至各显示译码器。
三、实验设备
计算机软件:Quartus II
EDA实验箱。主芯片:EPM7128SLC84-15或EP1K100QC208-3。
电缆,导线等。
四、实验内容及步骤
设计并调试好一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制器,具体要求如下:
1.主、支干道各设一个绿、黄、红指示灯,两个显示数码管。
2.主干道处于常允许通行状态,而支干道有车来时才允许通行。当主干道允许通行亮绿灯时,支干道亮红灯。而支干道允许通行亮绿灯时,主干道亮红灯。
3.当主、支干道均有车时,两者交替允许通行,主干道每次放行45S,支干道每次放行25S,在每次由亮绿灯变成亮红灯的转换过程中,要亮5S的黄灯作为过渡,并进行减计时显示。
要求编写交通灯控制器电路逻辑图中的各个模块的VHDL语言程序,并完成交通灯控制器的顶层设计,然后利用开发工具软件对其进行编译和仿真,最后要通过实验开发系统对其进行硬件验证。
(一)编写交通灯控制器JTDKZ模块的VHDL程序,并对其进行编译和仿真,初步验证设计的正确性。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY JTDKZ IS
PORT(CLK, SM, SB: IN STD_LOGIC;
MR, MY, MG, BR, BY, BG: OUT STD_LOGIC);
END ENTITY JTDKZ;
ARCHITECTURE ART OF JTDKZ IS
TYPE STATE_TYPE IS(A, B, C, D);
SIGNAL STATE: STATE_TYPE;
signal cnt:integer range 0 to 45;
BEGIN
PROCESS(CLK) IS
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
CASE STATE IS
WHEN A=>
IF(SB AND SM)='1' THEN //主干道、支干道都有车,则主干道绿灯45s
IF CNT=44 THEN
CNT<=0; STATE<=B;
ELSE
CNT<=CNT+1;STATE<=A;
END IF;
ELSIF(SB AND (NOT SM))='1' THEN //支干道有车主干道没车,则主干道进入B状态
STATE<=B; CNT<=0;
ELSE STATE<=A; CNT<=0; //否则,保持在A状态
END IF;
WHEN B=>
IF CNT=4 THEN //黄灯时间5s结束
CNT<=0;STATE<=C;
ELSE
CNT<=CNT+1;STATE<=B;
END IF;
WHEN C=>
IF(SM AND SB)='1' THEN //主干道、支干道都有车,则支干道绿灯25s
IF CNT=24 THEN
CNT<=0; STATE<=D; ELSE
CNT<=CNT+1;STATE<=C; END IF;
ELSIF SB='0' THEN //支干道无车,则立即进入D状态
STATE<=D; CNT<=0;
ELSE STATE<=C; CNT<=0; //
END IF;
WHEN D=>
IF CNT=4 THEN
CNT<=0; STATE<=A;
ELSE
CNT<=CNT+1;STATE<=D;
END IF;
END CASE;
END IF;
END PROCESS ;
RGY:PROCESS(STATE) IS
BEGIN
CASE STATE IS
WHEN A=>
MR<='0'; MY<='0'; MG<='1';
BR<='1'; BY<='0'; BG<='0';
WHEN B=>
MR<='0'; MY<='1'; MG<='0';
BR<='1'; BY<='0'; BG<='0';
WHEN C=>
MR<='1'; MY<='0'; MG<='0';
BR<='0'; BY<='0'; BG<='1';
WHEN D=>
MR<='1'; MY<='0'; MG<='0';
BR<='0'; BY<='1'; BG<='0';
END CASE;
END PROCESS RGY;
END ARCHITECTURE ART;
(二)编写45S定时单元CNT45S模块的VHDL程序,并对其进行编译和仿真,初步验证设计的正确性。
--45s定时模块源程序CNT45S.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY time_45s IS
PORT(SB,SM, CLK, EN45: IN STD_LOGIC;
DOUT45M, DOUT45B: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY time_45s ;
ARCHITECTURE ART OF time_45s IS
SIGNAL CNT6B: STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
PROCESS(SB, SM, CLK, EN45) IS
BEGIN
IF(CLK'EVENT AND CLK= '1')THEN
IF SB='1' AND SM='1' THEN
IF EN45='1'THEN CNT6B<=CNT6B+1;
ELSE CNT6B<="000000";
END IF;
ELSE CNT6B<="000000";
END IF;
END IF;
END PROCESS;
PROCESS(CNT6B) IS
BEGIN
CASE CNT6B IS
WHEN "000000"=>DOUT45M<="01000101"; DOUT45B<="01010000"; --BCD数45, 50
WHEN "000001"=>DOUT45M<="01000100"; DOUT45B<="01001001"; --BCD数44, 49
WHEN "000010"=>DOUT45M<="01000011"; DOUT45B<="01001000"; --BCD数43, 48
WHEN "000011"=>DOUT45M<="01000010"; DOUT45B<="01000111"; --BCD数42, 48
WHEN "000100"=>DOUT45M<="01000001"; DOUT45B<="01000110"; --BCD数41, 50
WHEN "000101"=>DOUT45M<="01000000"; DOUT45B<="01000101"; --BCD数40, 49
WHEN "000110"=>DOUT45M<="00111001"; DOUT45B<="01000100"; --BCD数39, 48
WHEN "000111"=>DOUT45M<="00111000"; DOUT45B<="01000011"; --BCD数38, 48
WHEN "001000"=>DOUT45M<="00110111"; DOUT45B<="01000010"; --BCD数37, 50
WHEN "001001"=>DOUT45M<="00110110"; DOUT45B<="01000001"; --BCD数36, 49
WHEN "001010"=>DOUT45M<="00110101"; DOUT45B<="01000000"; --BCD数35, 48
WHEN "001011"=>DOUT45M<="00110100"; DOUT45B<="00111001"; --BCD数34, 48