数字电子技术课程设计——交通灯控制器设计报告
封面自行设计,仅供参考!
交通灯控制器设计报告
一.设计目的.
(1) 初步学习,运用VHDL(Verilog)语言编写模块程序。
(2) 巩固课堂所学的组合逻辑电路,时序逻辑电路及其有关的应用,如计数器,分频器等。
(3) 提高实践及运用意识。
二.设计任务及要求.
利用EDA/SOPC实验开发平台提供的八位七段管码显示模块以及EP2C35核心板,实现交通灯信号控制器。
设交通灯信号控制器用于主干道公路的交叉路口,要求是优先保证主干道的畅通,因此,平时处于“主干道绿灯,支道红灯”状态。
(1)当处于“主干道绿灯,支道红灯”状态:
① 主干道有车要求通行,支道也有车要求通行时,若主干道通行时间大于等于30秒则切换到“主黄,支红”,4秒后自动切换到“主红,支绿”。
② 主干道无车要求通行,支道有车要求通行时,立即切换到“主黄,支红”,4秒后自动切换到“主红,支绿”。
其它情况保持“主绿,支红”状态。
(2)当处于“主干道红灯,支道绿灯”状态:
① 支道有车要求通行时,保持“主红,支绿”状态,但最多保持30秒然后自动切换到“主红,支黄”状态,4秒后自动切换到“主绿,支红”状态。
② 支道无车要求通行时,立即切换到“主红,支黄”状态,4秒后自动切换到“主绿,支红”状态。
(3)利用八位七段管码显示模块其中的2位实现时间显示。
(4)扩展要求:自主设计(如改变时间显示方式,丰富控制逻辑等)
三.设计原理及方案.
1.总体设计框图
2.原理概述:
(1)由于主干道,支干道的交通灯均在绿,黄,红三种状态之间有顺序的转换,组合共有四种。所以,利用状态机按照设定的条件实现“主绿,支红” 、“主黄,支红” 、“主红,支绿”、“主红,支黄”4种状态之间的切换。
(2)因为红黄绿灯之间转换有时间限制,所以要有计数器,可用七段数码管显示模块,由于时间是两位数,所以只需要八位七段管码显示模块其中的2位实现时间显示。
(3)由于实验室提供的基准频率为50MHZ,所以得用分频器得到所需要的频率。
四.电路设计及实现.
(1)各模块设计程序及模块图:
1.1计数器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY counter IS
PORT (clk:IN STD_LOGIC;
reset:in std_logic;
countNum:BuFFeR INTEGER RANGE 0 TO 64);
END;
ARCHITECTURE beha
BEGIN
process(reset,Clk)
BEGIN
IF Reset='1' THEN
countNum<=0;
ELSIF rising_edge(Clk) THEN
IF countNum=64 THEN
countNum<=0;
ELSE
countNum<=countNum+1;
END IF;
END IF;
END PROCESS;
END;
(2)七段显示器程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY bcd_da
PORT
(bcd_da
segout: out STD_LOGIC_VECTOR(6 downto 0));
END;
ARCHITECTURE beha
BEGIN
process(bcd_da
BEGIN
case bcd_da
when "0000"=>segout<="0111111";
when "0001"=>segout<="0000110";
when "0010"=>segout<="1011011";
when "0011" =>segout<="1001111";
when "0100" =>segout<="1100110" ;
when "0101"=>segout<="1101101" ;
when "0110"=>segout<="1111101" ;
when "0111"=>segout<="0000111" ;
when "1000" =>segout<="1111111" ;
when "1001" =>segout<="1101111";
when others =>null;
END CASE;
END PROCESS;
END;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_unsigned.ALL;
ENTITY dtsm IS
PORT(clk:in STD_LOGIC;
NumA,NumB: in STD_LOGIC_VECTOR(3 downto 0);
segout1:out STD_LOGIC_VECTOR(6 downto 0);
led_sel:out STD_LOGIC_VECTOR(2 downto 0));
END dtsm;
architecture bhv of dtsm is
component bcd_da
port (bcd_da
segout:out STD_LOGIC_VECTOR(6 downto 0));
end component;
signal x:STD_LOGIC_VECTOR(3 downto 0);
signal Q:STD_LOGIC;
begin
p1:process(clk)
begin
if clk'event and clk ='1' then
if Q='1' THEN Q<='0';
ELSE Q<='1';
END IF;
end if;
end process;
p2:process(Q)
begin
case Q is
when'0'=>led_sel<="010";x<=NumB;
when'1'=>led_sel<="001";x<=NumA;
when others=>null;
end case;
end process;
u1:bcd_da
end ;
3. 分频到512Hz程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenpin123 is
port (clk: in std_logic;
clkfen: out std_logic);
end fenpin123;
architecture fenpin of fenpin123 is
signal clk_mid: std_logic;
begin
process(clk)
variable da
begin
if clk'event and clk='1' then
if da
da
clk_mid<=not clk_mid;
else
da
end if;
end if;
clkfen<=clk_mid;
end process;
end fenpin;
4. 分频到1Hz程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenpin is
port( clk:in std_logic;
finout:out std_logic);
end fenpin;
architecture bhv of fenpin is
signal tmp:INTEGER RANGE 0 TO 49999999;
begin
process(clk)
begin
if clk'event and clk='1' then
if tmp=49999999 then tmp<=00000000;
else tmp<=tmp+1;
end if;
if tmp<25000000 then finout<='0';
else finout<='1';
end if;
end if;
end process;
end bhv;
(5)分位程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH;
ENTITY FENWEI IS
PORT
(Numin:IN integer RANGE 0 TO 31;
NumA,NumB:OUT Integer RANGE 0 to 9
);
END;
ARCHITECTURE beha
BEGIN
process(Numin)
BEGIN
IF Numin>=30 THEN
NumA<=3;
NumB<=Numin-30;
ELSIF Numin>=20 THEN
NumA<=2;
NumB<=Numin-20;
ELSIF Numin>=10 THEN
NumA<=1;
NumB<=Numin-10;
ELSE
NumA<=0;
NumB<=Numin;
END IF;
END PROCESS;
END;
(6)交通灯控制程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH;
ENTITY traffic IS
PORT(
CLK , SM , SB : IN BIT;
MR,MY,MG,BR,BY,BG : OUT BIT;
reset:OUT std_logic;
CountNum:in INTEGER RANGE 0 TO 64;
Num:out INTEGER RANGE 0 TO 31
);
END traffic;
ARCHITECTURE BEHAV OF traffic IS
TYPE STATE_TYPE IS (A,B,C,D);
SIGNAL STATE : STATE_TYPE ;
BEGIN
CNT:PROCESS(CLK,SM,SB,CountNum)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CASE STATE IS
WHEN A => MR<='0';MY<='0';MG<='1';--主绿支红
BR<='1';BY<='0';BG<='0';
RESET<='0';
IF (SB AND SM)='1' THEN
IF CountNum<=29 THEN
Num<=30-CountNum;
ELSE
STATE<=B;RESET<='1';
END IF;
END IF;
IF (SB AND(NOT SM))='1' THEN
STATE<=B;RESET<='1';
END IF;
WHEN B => MR<='0';MY<='1';MG<='0';--主黄支红
BR<='1';BY<='0';BG<='0';
RESET<='0';
IF CountNum<=3 THEN
Num<=4-CountNum;
ELSE
STATE<=C;RESET<='1';
END IF;
WHEN C => MR<='1';MY<='0';MG<='0';--主红支绿
BR<='0';BY<='0';BG<='1';
RESET<='0';
IF (SB AND SM)='1' THEN
IF CountNum<=29 THEN
Num<=30-CountNum;
ELSE
STATE<=D;RESET<='1';
END IF;
END IF;
IF SB='0' THEN
STATE<=D;RESET<='1';
END IF;
WHEN D => MR<='1';MY<='0';MG<='0';--主红支黄
BR<='0';BY<='1';BG<='0';
RESET<='0';
IF CountNum<=3 THEN
Num<=4-CountNum;
ELSE
STATE<=A;RESET<='1';
END IF;
WHEN OTHERS=>STATE<=A;
END CASE;
END IF;
END PROCESS CNT;
END BEHAV;
(2)总体原理图:
(3)管脚对应表
信号名称 |
对应FPGA管脚名 |
说明 |
50MHz |
L1 |
基准时钟 |
A |
G6 |
七段数码管a |
B |
G7 |
七段数码管b |
C |
H3 |
七段数码管c |
D |
H4 |
七段数码管d |
E |
H5 |
七段数码管e |
F |
H6 |
七段数码管f |
G |
J4 |
七段数码管g |
SEL0 |
G5 |
数码管选择控制端0 |
SEL1 |
G3 |
数码管选择控制端1 |
SEL2 |
F4 |
数码管选择控制端2 |
R1 |
D3 |
主干道红灯 |
Y1 |
D4 |
主干道黄灯 |
G1 |
D5 |
主干道绿灯 |
R2 |
E3 |
支道红灯 |
Y2 |
E4 |
支道黄灯 |
G2 |
F3 |
支道绿灯 |
K1 |
E15 |
主干道通车请求开关 |
K2 |
B14 |
支道通车请求开关 |
五.分析与讨论.
在实验室先后下载三次,{dy}次时灯亮但数码管显示有问题,经陈老师建议,重新检查管脚,发现有一个未设置,导致出错。第二次调试还是失败,显示器数字显示不对,我就把程序检查了一遍,重新根据管脚,结合数码管为共阴极写数码管程序。第三次成功了。
成功后的设计电路达到了要求,灯管按照车辆请求和时间有规律的变化,显示管显示出时间。在设计有很强的实践意义,可以安装到乡间公路和城市公路的十字路口,稍加改进就可以是主干道通车时间长,符合实际,可以更有效的指导交通,保证交通秩序和安全。
六.设计总结.
通过为期一周的课程设计,我应用所学数字电子技术和自学的VHDL语言顺利得完成了交通灯控制器的设计。期间,我查阅里很多相关书籍,学习了VHDL语言,并利用它设计了符合设计要求的计数器,分频器,状态机等。不仅巩固了课堂知识,而且有效的和实际结合在了一起,扩展了所学知识和见识。
在设计过程中遇到不少问题,如编程能力不够,相关元件运用条件不熟等问题。总体感觉就是:学得不够,知识真的和有用。同时,也感觉到书本知识与实际问题及需要结合的难处,但也激发了我这方面的兴趣,提高了理论结合实际的意识。
这是一次有意义的尝试!