资源描述
实验八 交通灯控制电路的设计
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理 勿做商业用途
· 可编程逻辑设计
——实验八报告
学院:物理与信息工程学院
专业:通信工程
年级:2007级
班级:二班
学号:110700221
姓名:林明明
指导老师:杨秀芝
实验八 交通灯控制电路的设计
一、实验目的:
进一步学习复杂数字电路的设计方法,提高利用硬件描述语言进行电路设计的技巧和熟练程度。
二、实验要求及原理:
1、 满足图1顺序工作流程。图中设南北方向的红、黄、绿灯分别为NSR、NSY、NSG,东西方向的红、黄、绿灯分别为EWR、EWY、EWG。它们的工作方式有些必须是并行进行的,即南北方向绿灯亮,东西方向红灯亮;南北方向黄灯亮,东西方向红灯亮;南北方向红灯亮,东西方向绿灯亮;南北方向红灯亮,东西方向黄红灯亮。
南北方向绿灯亮,东西方向红灯亮(5t)
南北方向黄灯亮,东西方向红灯亮(1t)
南北方向红灯亮,东西方向绿灯亮(5t)
南北方向红灯亮,东西方向黄灯亮(1t)
图1 交通灯顺序工作流程图
2、 应满足两个方向的工作时序:即东西方向亮红灯时间应等于南北方向亮黄、绿灯时间之和,南北方向亮红灯时间应等于东西方向亮黄、绿灯时间之和。时序流程图2所示。
图2中,假设每个单位时间为3秒,则南北、东西方向绿、黄、红灯亮时间分别15秒、3秒、18秒,一次循环为36秒。其中红灯亮的时间为绿灯、黄灯亮的时间之和。
1 2 3 4 5 6 7 8 9
10 11 12 1 2 3 4 5 6
NSG
NSY
NSR
EWR
EWG
EWY
t
5t
6t
t
图2 交通灯时序工作流程图
3、 十字路口要有数字显示,作为时间提示,以便人们更直观地把握时间。具体为:当某方向红灯亮时,置显示器为某值,然后以每秒减1计数方式方式工作,直至减到数为“0”,十字路口红、绿灯交换,一次工作循环结束,进入下一步某方向地工作循环。
例如:当南北方向从黄灯转换成红灯时,置南北方向数字显示为24,并使数显计数器开始减“1”计数,当减到“0”,时,此时红灯灭,而南北方向的绿灯亮;同时,东西方向的红灯亮,并置东西方向的数显为24。
三、实验内容:
1、根据实验要求及原理1、2画出交通指示灯控制电路原理框图。
提示:两个方向的控制电路可以共用一个24进制计数器实现。
2、用VHDL硬件描述语言层次化设计方法进行顶层文件和各模块电路的设计。
3、用QuartusII对设计进行编译、综合、仿真,给出仿真波形和时序分析数据(不包括数码显示部分)。
4、通过QuartusII集成环境,将设计下载到实验电路上进行硬件测试。
管脚锁定:
clk: clk1 43 clk1
start: PIO23 30 SW1
NSG PIO19 29 LED12
NSY PIO20 28 LED11
NSR PIO21 27 LED10
EWG PIO22 LED3
EWY PIO12 LED2
EWR LED1
5、画出完整的交通灯控制电路原理框图(含数码显示部分)。
6、修改上述内容2的设计,增加数码显示部分。
注意:两方向的计数要求分别显示在数码管1、2和数码管7、8上。
7、用MAX_plusⅡ对设计进行编译、综合、仿真,给出仿真波形和时序分析数据.
8、再次将设计下载到实验电路上进行硬件测试.
新增管脚锁定:
A(6): PIO6 11 SEG g
A(5): PIO5 10 SEG f
A(4): PIO4 9 SEG e
A(3): PIO3 8 SEG d
A(2): PIO2 7 SEG c
A(1): PIO1 6 SEG b
A(0): PIO0 5 SEG a
*S(2): 80
*S(1): 79
*S(0): 78
四、思考题:
1、控制电路除用有限状态机实现外,还可以采用什么方法实现?
2、如果增加夜间显示(即全部黄灯闪烁),电路该怎样设计?
实验结果:
交通灯控制电路原理框图:
顶层电路的VHDL描述:
library ieee;
use ieee.std_logic_1164。all;
use ieee.std_logic_unsigned。all;
entity traffic is
port(clk,start:in std_logic;
NSG,NSY,NSR,EWG,EWY,EWR:out std_logic;
ledNS,ledEW:out std_logic_vector(7 downto 0)
);
end;
architecture behav of traffic is
component NSEW
port(clk,start:in std_logic;
NSG,NSY,NSR,EWG,EWY,EWR:out std_logic
);
end component;
component led7s
port(clock,start:in std_logic;
ledns,ledew:out std_logic_vector(7 downto 0)
);
end component;
signal clk0,clk1,clk2,clknsr,clkewr:std_logic;
begin
u1:NSEW port map(clk=〉clk,start=>start,
NSG=〉NSG,NSY=>NSY,NSR=〉NSR,
EWG=〉EWG,EWY=>EWY,EWR=〉EWR);
u2:led7s port map(clock=>clk,start=>start,
ledns=〉ledNS,ledew=〉ledEW);
end;
各模块电路的VHDL描述:
模块clock的VHDL描述—-
library ieee;
use ieee.std_logic_1164。all;
use ieee。std_logic_unsigned.all;
entity clock is
port(clk,start:in std_logic;
clk0,clk1,clk2:out std_logic
);
end clock;
architecture behav of clock is
begin
process(clk,start)
variable cql:std_logic_vector(6 downto 0);
begin
if clk’event and clk=’1’ then
if start=’1'then
if cql<48 then cql:=cql+1;
else cql:=(others=〉’0’);
end if;
if cql<24 then
clk1〈=’1';else clk1〈='0’;
end if;
if cql〉23 and cql<48 then
clk2〈='1’;else clk2<=’0’;
end if;
end if;
end if;
end process;
end;
模块cnt10的VHDL描述—-
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164。ALL;
USE IEEE。STD_LOGIC_UNSIGNED。ALL;
ENTITY CNT10 IS
PORT(CLK,EN,LD:IN STD_LOGIC;
CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END CNT10;
ARCHITECTURE BEHAV OF CNT10 IS
BEGIN
PROCESS(CLK,EN)
VARIABLE CQI :STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF CLK’EVENT AND CLK=’1' THEN
IF LD='1' THEN CQI:=D;
IF EN=’1' THEN
IF CQI〉0 THEN CQI:=CQI-1;
ELSE CQI:="1001";
END IF;
END IF;
END IF;
END IF;
IF CQI=0 THEN COUT<=’1';
ELSE COUT〈=’0’;
END IF;
CQ〈=CQI;
END PROCESS;
END BEHAV;
模块NSG的VHDL描述——
library ieee;
use ieee。std_logic_1164.all;
use ieee。std_logic_unsigned.all;
entity NSG is
port(clk,start:in std_logic;
cq:out std_logic_vector(3 downto 0);
oout:out std_logic
);
end;
architecture one of NSG is
begin
process(clk,start)
variable cqi:std_logic_vector(3 downto 0);
begin
if clk’event and clk=’1' then
if start='1’ then
if cqi〈11 then cqi:=cqi+1;
else cqi:=(others=>’0');
end if;
end if;
if cqi<5 then oout〈='1’;
else oout〈=’0’;
end if;
end if;
cq〈=cqi;
end process;
end one;
模块NSR的VHDL描述-—
library ieee;
use ieee。std_logic_1164。all;
use ieee.std_logic_unsigned.all;
entity NSR is
port(clk,start:in std_logic;
cq:out std_logic_vector(3 downto 0);
oout:out std_logic
);
end;
architecture one of NSR is
begin
process(clk,start)
variable cqi:std_logic_vector(3 downto 0);
begin
if clk’event and clk=’1' then
if start='1' then
if cqi<11 then cqi:=cqi+1;
else cqi:=(others=>'0');
end if;
end if;
if cqi<6 then oout<='0';
else oout〈='1';
end if;
end if;
cq<=cqi;
end process;
end one;
模块NSEW的VHDL描述——
library ieee;
use ieee。std_logic_1164.all;
use ieee。std_logic_unsigned.all;
entity NSEW is
port(clk,start:in std_logic;
NSG,NSY,NSR,EWG,EWY,EWR:out std_logic
);
end;
architecture one of NSEW is
begin
process(clk,start)
variable cqi:std_logic_vector(5 downto 0);
begin
if clk'event and clk='1’and start=’1' then
if cqi〈47 then cqi:=cqi+1;
else cqi:=(others=〉’0');
end if;
if cqi<21 then NSG〈=’1';
else NSG<=’0';
end if;
if cqi〉20 and cqi〈25 then NSY<='1';
else NSY<=’0’;
end if;
if cqi<25 then EWR〈=’1';
else EWR<='0’;
end if;
if cqi>24 and cqi<49 then NSR<='1';
else NSR〈='0’;
end if;
if cqi>24 AND cqi<45 then EWG<='1’;
else EWG<='0';
end if;
if cqi〉44 AND CQI〈49 then EWY<=’1';
else EWY〈='0’;
end if;
end if;
end process;
end one;
模块led7s的VHDL描述:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned。all;
entity led7s is
port(clock,start:in std_logic;
ledns,ledew:out std_logic_vector(7 downto 0)
);
end;
architecture behav of led7s is
signal cqi : std_logic_vector(7 downto 0);
signal cql : std_logic_vector(7 downto 0);
signal cnt6: std_logic_vector(7 downto 0);
signal clk : std_logic;
begin
clk 〈= clock ;
process(clk)
begin
if clk’event and clk=’1’ then
if start='1’then
if cnt6<47 then cnt6〈=cnt6+1;
else cnt6〈="00000000”;
end if;
end if;
end if;
end process;
process(clk)
begin
if clk'event and clk='1' then
if start=’1’then
if cqi>32 then cqi〈=cqi-1;
elsif cqi=32 then cqi〈="00011001”;
elsif cqi〉16 then cqi<=cqi—1;
elsif cqi=16 then cqi〈=”00001001";
elsif cqi>0 then cqi<=cqi—1;
elsif cqi=0 and cnt6=0
then cqi〈="00100100";
end if;
if cql>32 then cql〈=cql-1;
elsif cql=32 then cql<="00011001";
elsif cql>16 then cql<=cql—1;
elsif cql=16 then cql<="00001001";
elsif cql>0 then cql〈=cql-1;
elsif cql=0 and cnt6=24
then cql<=”00100100”;
end if;
end if;
end if;
end process;
ledew〈=cqi;
ledns〈=cql;
end;
交通灯工作时序仿真波形:
测试结果及分析:
(1)东西方向亮红灯时间应等于南北方向亮黄、绿灯时间之和,南北方向亮红灯时间应等于东西方向亮黄、绿灯时间之和。
(2)当某方向红灯亮时,置显示器为某值,然后以每秒减1计数方式方式工作,直至减到数为“0”,十字路口红、绿灯交换,一次工作循环结束,进入下一步某方向地工作循环。
例如:当东西方向从黄灯转换成红灯时,置东西方向数字显示为24,并使数显计数器开始减“1”计数,当减到“0”,时,此时红灯灭,而东西方向的绿灯亮;同时,南北方向的红灯亮,并置南北方向的数显为24。
【回答问题】
1、控制电路除用有限状态机实现外,还可以采用什么方法实现?
2、如果增加夜间显示(即全部黄灯闪烁),电路该怎样设计?
答:
1. 还可以用进程语句实现,用一个十二进制的计数器作为控制模块,则EWR、EWG、EWY、NSR、NSG、NSY在计数器不同输出的时候有相应的输出.
2. 把黄灯输出信号EWY、NSY作为使能端,接到一个锁存器上,锁存器的输入时一个频率较高的信号,输出接黄色LED。当EWY、NSY=1时,黄灯闪烁。
12
展开阅读全文