数电 电子课设 交通灯课程设计报告3兼程序

设计课题:交通信号灯控制系统

学院:电气与信息工程学院

专业班级:10级电气工程及其自动化学生姓名:

学号:

目录

一.设计任务及技术要求-----------------------------------------3 二.方案分析---------------------------------------------------------4 三.软件设计及调试------------------------------------------------8

1.交通灯主程序模块---------------------------------------------8

2.频率转换模块--------------------------------------------------12 四.测试结果---------------------------------------------------------15 五.心得体会---------------------------------------------------------15 六.参考文献---------------------------------------------------------15

一.设计任务及技术要求

由主干道A和支干道B的汇合点形成十字交叉路口,在交叉路口的-每个入口处设置有红,黄,绿三色信号灯。红灯亮禁止通行,绿灯亮允许通行;黄灯亮则使行驶到路口的车辆有时间停靠到禁止线之外。

1.设计任务:

①用红,绿,黄三色发光二极管作信号灯,主干道A为东西向,设

红,黄,绿三色灯为AR,AG,AY,支干道B为南北向,三色灯为BR,BG,BY。

②主干道车辆较多,所以亮绿灯的时间为50s,支干道亮绿灯的时间

为30s,当主干道允许通行亮绿灯的时候支干道亮红灯,相反,支干道允许通行的时候主干道亮红灯。每次由绿灯转变为红灯的时候,其间要亮5s的黄灯作为过渡,以便行驶中的车辆有时间停到禁止线以内。

③交通灯正常运行时,用四位数码管M1,M2,M3,M4显示主干道和支

干道的倒计时时间,M1M2显示主干道在当前状态的剩余时间;

M3M4显示支干道在当前状态的剩余时间。

④能实现系统清0,清0后计数器由初始状态开始计数,指示灯指示

主干道亮绿灯。

⑤具有一定的扩展功能:

它能实现特殊状态的功能显示,用开关S作为特殊信号传感器,S 为1时进入特殊状态并实现下列特殊状态功能:

A显示器M1M2M3M4闪烁,即全在0和当前计时时间中交替显示。

B计数器停止计数并保持原来的时间数据。

C东西,南北方向的三色灯全显示红色状态。

D特殊状态解除后能继续返回工作状态。

2.设计要求:

①分析任务,选择一种方案绘制系统框图和设计流程。

②设计部分单元电路或编写VHDL描述程序。计算元件参数,确定

元器件型号和数量,提出元器件清单。

③安装调试硬件电路,或制作CPLD/FPGA为基础的专用集成电路

芯片ASIC。

④对制作的电路进行功能测试,分析各项计数指标,或对设计的电

路进行功能仿真,分析仿真波形。

⑤总结设计资料,打印包括原理图仿真波形的设计报告,校验并演

示电路装置。

二.方案分析

1.十字路口的红绿灯指挥着行人和各种车辆的安全通行。有一个主干道和一个支

干道的十字路口如图所示。每边都设置了红、绿、黄色信号灯。红灯亮表示禁止通行,绿灯亮表示可以通行,在绿灯变红灯时先要求黄灯亮几秒钟,以便让停车线以外的车辆停止运行。因为主干道上的车辆多,所以主干道放行的时间要长。

因此可以得到路口交通灯系统示意图如图1所示。

黄干图1路口交通灯系统示意图

2.主干道车辆较多,所以亮绿灯的时间为50s ,支干道亮绿灯的时间为30s ,当主干道允许通行亮绿灯的时候支干道亮红灯,相反,支干道允许通行的时候主干道亮红灯。每次由绿灯转变为红灯的时候,其间要亮5s 的黄灯作为过渡,以便行驶中的车辆有时间停到禁止线以内。由此分析可得状态顺序与灯亮对应表以及交通灯控制状态图,分别如表1及图2所示

表1状态顺序与灯亮对应表

图2交通灯控制状态图

3.由以上分析,设计出交通灯控制器原理框图如图3所示

图3交通灯控制器原理框图

在VHDL设计描述中,采用自顶向下的设计思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:输入信号:外部时钟信号clk。LED在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。通过上面的分析,不难得知可以把交通灯控制系统划分为4个模块:时钟分频模块,计数模块,控制模块,分位译码模块。

①分频电路:输入较高频率脉冲用分频电路的到较第频率的时钟信号,本电路通过二次分平分别得到1Hz的时钟信号。

②控制器电路:根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。当检测到手动控制信号(hold=’1’)时,执行特殊控制;

③计数器电路:下一个时钟沿回复到0,开始下一轮计数。当检测到特殊情况(HOLD=‘1’)发生是,计数器暂停计数。

④分位译码电路:因为控制器输出的倒计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数)。七段数码管的译码电路根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管,我们用的是共阴极数码管,因此译码电路输出逻辑数值‘1’点亮二极管,译码电路输出逻辑数值‘0’熄灭二极管。

三.软件设计及调试

图4交通灯控制器设计电路图

1.交通灯主程序模块

本模块是交通灯的主程序,包括交通灯特殊状态的实现,

以及复位的实现,同时使交通灯在S0S1S2S3四个状态中转换,并变换相应的颜色以及倒计时时间值。

VHDL语言:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_unsigned.ALL;

use IEEE.STD_LOGIC_arith.ALL;

entity jiaotongdeng is

Port (

R ,CLK: in STD_LOGIC; --复位("1“有效)及时钟输入

EMERGE : in STD_LOGIC;--紧急状态输入,‘1’有效

EWRYG:out STD_LOGIC_VECTOR (2 downto 0);--东西向状态输出,顺序为红黄绿

SNRYG:out STD_LOGIC_VECTOR (2 downto 0); --南北向状态输出,顺序为红黄绿

EW :out STD_LOGIC_VECTOR (7 downto 0); --东西向两位BCD码计数输出

SN :out STD_LOGIC_VECTOR (7 downto 0) --南北向两位BCD码计数输出

);

end jiaotongdeng;

architecture Behavioral of jiaotongdeng is

signal cnt,atime,aregtime,btime,bregtime,EWH,EWL,SNH,SNL:integer range 0 to 90;

begin

process(clk,emerge,r) --由复位端及紧急状态控制大计数循环的置数,暂停或减一操作

begin

if(R='1') then

cnt<=90;

elsif(rising_edge(clk)) then

if(cnt=0) then

cnt<=90;

elsif (emerge='1') then

cnt<=cnt ;

else

cnt<=cnt-1;

end if;

end if;

end process;

a:process(clk) --东西向倒计时二进制码输出控制以及东西南北向状态灯颜色控制

variable p :integer range 0 to 1 ;

begin

if(rising_edge(clk)) then

if(emerge='1') then --紧急状态时状态灯全置红,东西向倒计数在当前状态跟全零间交替显示

EWRYG<="100";

SNRYG<="100" ;

if(p=0) then

p:=1;

atime<=aregtime;

else

p:=p-1;

atime<=0;

end if;

else

if(cnt>=40 ) then

aregtime <= cnt-40;

EWRYG <="001";

SNRYG <="100";

elsif(cnt>=35) then

aregtime<=cnt-35;

EWRYG<="010";

SNRYG<="100";

elsif (cnt>=0) then

aregtime<=cnt-0;

if(cnt>=5) then

EWRYG<="100";

SNRYG<="001";

else

EWRYG<="100";

SNRYG<="010";

end if;

end if;

atime<=aregtime;

end if;

end if;

end process;

b:process(clk) --南北向二进制码倒计时输出控制

variable q :integer range 0 to 1 ;

begin

if(rising_edge(clk)) then

if(emerge='1') then --紧急状态时南北向到计数在全零跟当天状态间交替显示 if(q=0) then

q:=1;

btime<=bregtime;

else

q:=q-1;

btime<=0;

end if;

else

if(cnt>=35) then

bregtime <= cnt-35;

elsif(cnt>=5) then

bregtime <= cnt-5;

elsif (cnt>=0) then

bregtime <= cnt-0;

end if;

btime<=bregtime;

end if;

end if;

end process;

process(atime) --将东西向二进制码转换成两位BCD码

begin

if(atime>=90) then

EWH <=9;

EWL<=atime-90;

elsif (atime>=80) then

EWH <=8;

EWL<=atime-80;

elsif (atime>=70) then

EWH <=7;

EWL<=atime-70;

elsif (atime>=60) then

EWH <=6;

EWL<=atime-60;

elsif (atime>=50) then

EWH<=5;

EWL<=atime-50;

elsif (atime>=40) then

EWH <=4;

EWL<=atime-40;

elsif (atime>=30) then

EWH<=3;

EWL<=atime-30;

elsif (atime>=20) then

EWH<=2;

EWL<=atime-20;

elsif (atime>=10) then

EWH<=1;

EWL<=atime-10;

else

EWL<=atime;

end if;

end process;

with EWH select

EW(7 downto 4) <= "1001" when 9, "1000" when 8, "0111" when 7,"0110" when 6, "0101" when 5, "0100" when 4, "0011" when 3, "0010" when 2, "0001" when 1, "0000" when 0,

"0000" when others;

with EWL select

EW(3 downto 0) <= "1001" when 9, "1000" when 8, "0111" when 7,"0110" when 6, "0101" when 5, "0100" when 4, "0011" when 3, "0010" when 2, "0001" when 1, "0000" when 0,

"0000" when others;

process(btime) --将南北向七位二进制码装换成两位BCD码输出

begin

if(btime>=90) then

SNH <=9;

SNL<=btime-90;

elsif (btime>=80) then

SNH <=8;

SnL<=btime-80;

elsif (btime>=70) then

SNH <=7;

SNL<=btime-70;

elsif (btime>=60) then

SNH <=6;

SNL<=btime-60;

elsif (btime>=50) then

SNH<=5;

SNL<=btime-50;

elsif (btime>=40) then

SNH <=4;

SNL<=btime-40;

elsif (btime>=30) then

SNH<=3;

SNL<=btime-30;

elsif (btime>=20) then

SNH<=2;

SNL<=btime-20;

elsif (btime>=10) then

SNH<=1;

SNL<=btime-10;

else

SNH<=0;

SNL<=btime;

end if;

end process;

with SNH select

SN(7 downto 4) <= "1001" when 9, "1000" when 8, "0111" when 7,"0110" when 6, "0101" when 5, "0100" when 4, "0011" when 3, "0010" when 2, "0001" when 1, "0000" when 0,

"0000" when others;

with SNL select

SN(3 downto 0) <= "1001" when 9, "1000" when 8, "0111" when 7,"0110" when 6, "0101" when 5, "0100" when 4, "0011" when 3, "0010" when 2, "0001" when 1, "0000" when

"0000" when others; end Behavioral;

仿真波形图

1.、复位

2、紧急状态

3、一般状态

2.频率转换模块

本模块主要是将10MHZ分频,将前一级信号转换为四位地址以及八位ASCII码,然后输送到交通灯总控制器中,。

VHDL语言:

--File name JTDLCD

-- 目的:在LCD上按格式显示交通灯的2个2位BCD码,红绿黄灯

--输入:EW[7..0]、SN[7..0] 东西、南北向的2个2位BCD码

--EWRYG[2..0]、SNRYG[2..0]东西南北的红绿灯信号,顺序为红黄绿

--CPIN 时钟脉冲输入按10MHz设计 ;复位R

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity JTDLCD is

port (CPIN,R,BUSY :IN STD_LOGIC;

EW,SN :IN STD_LOGIC_VECTOR(7 DOWNTO 0);

EWRYG,SNRYG : IN STD_LOGIC_VECTOR(2 DOWNTO 0);

CLK,RST,STROBE,OUTLINE : OUT STD_LOGIC;

DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

ADDR : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)

);

end entity ;

architecture JGT of JTDLCD is

TYPE STATES IS (S0,S1,S2,S3,S4);

SIGNAL S: STATES;

SIGNAL LCDPT : INTEGER RANGE 0 TO 10;

SIGNAL CPCT : INTEGER RANGE 0 TO 65535;

SIGNAL CP: STD_LOGIC;

SIGNAL ASCEW,ASCSN : STD_LOGIC_VECTOR(7 DOWNTO 0);

begin

PROCESS(CPIN,R)

BEGIN

CLK<=CPIN;

IF R='1' THEN

CPCT<=65535;

ELSIF CPIN='1' AND CPIN 'EVENT THEN

IF CPCT=0 THEN

CPCT<=65535;CP<=NOT CP;

ELSE

CPCT<=CPCT-1;

END IF;

END IF;

END PROCESS; --分频为500US周期

--主进程:拟采用500us时钟,即在500us后完成状态转换,修改LCDPT指针--S0:初始状态,在R=1时,处于S0状态,LCDPT=0

-- 流程:输出rst=1, 转S1

--S1:输出RST=0;判断BUSY=0? :Y: LCDPT+1;LCDPT到固定最后?::N: ->S2 -- ::Y: 转S3

-- ;N; NULL

--S2:给出STROBE信号。转S1

--S1,S2完成初始化固定显示的功能

PROCESS(CP,R)

BEGIN

IF R='1' THEN

S<=S0;LCDPT<=0;RST<='1';

ELSIF CP='1' AND CP 'EVENT THEN

CASE S IS

WHEN S0=> S<=S1;LCDPT<=0;RST<='1';

WHEN S1=> RST<='0';STROBE<='0';

IF BUSY='0' THEN

LCDPT<=LCDPT+1;

IF LCDPT=5 THEN

S<=S3;

ELSE

S<=S2;

END IF;

END IF;

WHEN S2=> S<=S1;STROBE<='1';

--S3~S4完成扫描显示功能

--S3:BUSY=0? :Y: LCDPT循环+1 ,转S4

--S4:给出STROBE信号,转S3

WHEN S3=> STROBE<='0';

IF BUSY='0' THEN

IF LCDPT=10 THEN

LCDPT<=5;

ELSE

LCDPT<=LCDPT+1;

END IF;

S<=S4;

END IF;

WHEN S4=> STROBE<='1';S<=S3;

WHEN OTHERS=> NULL;

END CASE;

END IF;

END PROCESS;

--选择输出进程(LCDPT)

--LCDPT=0,NULL

-- =1~4 显示EW SN E 45H,5 W57H,6 S53H,9 N4EH,10

PROCESS(LCDPT,EW,ASCEW,SN,ASCSN)

BEGIN

CASE LCDPT IS

WHEN 0 => NULL;

WHEN 1=> DATA<="01000101";ADDR<="0101";OUTLINE<='0';

WHEN 2=> DATA<="01010111";ADDR<="0110";OUTLINE<='0';

WHEN 3=> DATA<="01010011";ADDR<="1001";OUTLINE<='0';

WHEN 4=> DATA<="01001110";ADDR<="1010";OUTLINE<='0';

--LCDPT=5,6 EWBCD码 EH,5 EL,6

--LCDPT=89 SNBCD码 SH,9 SL,10

--LCDPT=10 SN 红绿灯。 G,8 R52H;Y59H;G47H

WHEN 5=>DATA<="0011"&EW(7 DOWNTO 4);ADDR<="0101";OUTLINE<='1'; WHEN 6=>DATA<="0011"&EW(3 DOWNTO 0);ADDR<="0110";OUTLINE<='1'; WHEN 7=>DATA<=ASCEW;ADDR<="0100";OUTLINE<='1';

WHEN 8=>DATA<="0011"&SN(7 DOWNTO 4);ADDR<="1001";OUTLINE<='1'; WHEN 9=>DATA<="0011"&SN(3 DOWNTO 0);ADDR<="1010";OUTLINE<='1'; WHEN 10=>DATA<=ASCSN;ADDR<="1000";OUTLINE<='1';

WHEN OTHERS=> NULL;

END CASE;

END PROCESS;

PROCESS(EWRYG)

BEGIN

CASE EWRYG IS

WHEN "100" => ASCEW<="01010010";

WHEN "010" => ASCEW<="01011001";

WHEN "001" => ASCEW<="01000111";

WHEN OTHERS=> NULL;

END CASE;

END PROCESS;

PROCESS(SNRYG)

BEGIN

CASE SNRYG IS

WHEN "100" => ASCSN<="01010010";

WHEN "010" => ASCSN<="01011001";

WHEN "001" => ASCSN<="01000111";

WHEN OTHERS=> NULL;

END CASE;

END PROCESS;

end architecture JGT;

3.蜂鸣器模块

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity spea is

port(emerge,cp:in std_logic;

speakers:out std_logic

);

end spea;

architecture jgt of spea is

signal cpct:integer range 0 to 5;

signal speak:std_logic;

begin

process(cp,emerge)

begin

if emerge='0' then

cpct<=0;speak<='0';

elsif cp='1' and cp 'event then

if cpct=5 then

cpct<=0;speak<=not speak;

else

cpct<=cpct+1;

end if;

end if;

end process;

process(speak)

begin

speakers<=speak;

end process;

end jgt;

仿真波形图

四.测试结果

将程序下载到开发板上,按照实验指导书上的操作步骤,最终可以得到我们想要的结果。

五.心得体会

在这次设计过程中,我们遇到好多以前没见多问题,经过这一次的课程设计,使我对课本知识有了新的认识和掌握,更让我学到了许多课本上学不到的知识。学会了如何从实际出发分析问题,解决问题,以及合作的重要性。同时我们也认识到在解决实际问题时一定要谨慎、细心抓住主要问题一丝不苟的深入研究,这样才能更快的解决问题。在设计电路,解决问题时,仅仅靠课本上的知识是不够的,我们还要到图书馆和互联网上查阅资料。这次课程设计让我将知识在实践中亲自应用,给了我们思考的机会,获益匪浅。由于我

时间和水平都很有限,设计中不当和欠缺之处在所难免,望老师及其他同学批评指正。

六.参考文献

(1)潘松,黄继业.《EDA技术使用教程》.科学出版社.2006.

(2)潘松,黄继业.《EDA技术与VHDL(第三版)》.清华大学出版社.2009 (3)徐志军,徐光辉.《CPLD/FPGA的开发与应用》.电子工业出版社.2002.

(4)阎石. 《数字电子技术基础(第五版)》.高等教育出版社.2005

七、教师评语

相关文档
最新文档