资源描述
可编程逻辑器件实训报告——2014.06
广东水利电力职业技术学校
可
编
程
逻
辑
器
件
实 训 报 告
项目名称:交通灯控制电路
班级:13电子2班
姓名:邓明顺
指导老师:龚兰芳
前言
可编程逻辑控制器
即(Programmable Logic ControllerPLC),
它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入、输出控制各种类型的机械或生产过程。
当可编程逻辑控制器投入运行后,其工作过程一般分为三个阶段,即输入采样、用户程序执行和输出刷新三个阶段。学习PLC对于机械工程的学生来说,是一门必课,因此,PLC的实训是踏入工作前一次很有意义的学习!
目录
一、 设计要求……………………………………………………………………1
二、 设计目的……………………………………………………………………1
三、 任务要求……………………………………………………………………1
四、 设计方案……………………………………………………………………1
五、 设计原理图…………………………………………………………………2
六、 设计步骤……………………………………………………………………2
七、 硬件要求……………………………………………………………………3
八、 源程序………………………………………………………………………3
九、 引脚分配……………………………………………………………………7
十、硬件下载实现现象描述……………………………………………………8
十一、收获与体会………………………………………………………………10
13电子2·邓明顺·12号
可编程逻辑器件实训报告——2014.06
一、设计要求
此次实训是依照现实中交通灯工作逻辑设计简易交通灯控制器,在十字路口,每条道路各有一组红、黄、绿灯和倒计时显示器,用以指挥车辆和行人有序地通行。期中,红灯(r)亮,表示该条道路禁止通行;黄灯亮(y),表示停车;绿灯亮(g),表示可以通行。倒计时显示器是用来显示允许通行和禁止通行地时间。觉得控制器就是用来自动控制十字路口的交通灯和计时器,指挥各种车辆和行人安全通行。
二、设计目的
利用VHDL设计系统数据的能力,结合生活实际例子,模拟真实环境,编写出程序控制彩灯的亮灭,以数码管的计数和点阵上显示的图形,指挥十字路口交通灯的现象。
三、任务要求
在十字路口的两个方向上各设一组红、绿黄灯,显示顺序为其中一方向(东西方向)是绿灯、黄灯、红灯;令一方向(南北方向)是红灯、绿灯、黄灯。
设计两组数码管,以倒计时的方式显示允许通行或禁止通行的时间,其中绿灯、黄灯、红灯的持续时间分别是20s、5s、25s。
当各条路上任意一条上出现特殊情况时,如当消防车、救护车或其它需要优先通行的车辆通过时,各方向均是红灯亮,倒计时停止,且显示数字在闪烁。当特殊运行状态结束后,控制器恢复用来状态,继续正常进行。
四、设计方案
1.整理思路:从要求中可以发现交通灯亮灭的规律。
计数器的计数值与交通灯亮灭的关系如下图所示。
计数值与交通灯亮灭的关系
2.分析:
显然,本课题的核心是一个技术范围0-49(共50S)的计数器和一个根据计数值做出规定反应的控制器。另外,所用实验板配备的晶振20MHz,因此还需要一个分频电路。最后,要驱动七段数码管,显然还需要一个译码电路。
交通灯控制器系统框图
五、设计原理图
设计原理图
六、 设计步骤
1.计数器的设计
这里需要的计数器的计数范围为0—49。计到49后,下一个时钟沿回复到0,开次下一轮计数。此外,当检测到特殊情况(hold=’1’)发生时,计数器暂停计数,而系统复位信号reset则使计算器异步清0。
2.控制器的设计
控制器的作用是根据计算器的计数值控制发光二极管的亮、灭,以及输
出倒计时数值给七段数译管的分位译码电路。此外,当检测到特殊情况(hold=’1’)发生时,无条件点亮红色的发光二极管。
3.分位译码器电路的设计
因为控制器输出的倒计时数值可能是1位或2位十进制,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位十进制,如25分为2和5,7分为0和7)。
七、硬件要求
在硬件方面,主要是含有芯片EPM240T100C5的开发板和下载线与电源线。交通控制器主要用到了两个拨码开关和四组红绿黄LED灯。拨码开关分别是rst复位开关,hold是紧急开关。四组LED灯是东西和南北两个方向的交通指示灯。
八、源程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity jtd is
port(
clk: in std_logic;
rst,hold:in std_logic;
x:out std_logic_vector(1 to 7);
en:out std_logic_vector(1 to 6);
fm,r,y,g:out std_logic;
row:out std_logic_vector(1 to 4);
lie,hang:out std_logic_vector(1 to 8)
);
end jtd;
architecture one of jtd is
signal clk1,clk2:std_logic;
signal w1:integer range 0 to 3;
signal w3,w4:integer range 0 to 2;
signal w2:integer range 0 to 1;
signal a,b,c,d:integer range 0 to 9;
signal e,f:integer range 0 to 2;
signal countnum:integer range 0 to 49;
signal flash,de,num:std_logic;
signal numa,numb:integer range 0 to 25;
begin
process(clk)
variable cnt1:integer range 0 to 2000;
variable cnt2:integer range 0 to 12500;
begin
if clk'event and clk='1' then
if cnt1=2000 then
cnt1:=0;
if cnt2=12500 then
cnt2:=0;
clk1<=not clk1;
else
cnt2:=cnt2+1;
end if;
else
cnt1:=cnt1+1;
end if;
end if;
end process;
process(clk)
variable cnt1:integer range 0 to 100;
variable cnt2:integer range 0 to 625;
begin
if clk'event and clk='1' then
if cnt1=100 then
cnt1:=0;
if cnt2=625 then
cnt2:=0;
clk2<=not clk2;
else
cnt2:=cnt2+1;
end if;
else
cnt1:=cnt1+1;
end if;
end if;
end process;
process(rst,clk1)
begin
if rst='1' then
countnum<=0;
elsif rising_edge(clk1)then
if hold='1' then
countnum<=countnum;
else
if countnum=49 then
countnum<=0;
else
countnum<=countnum+1;
end if;
end if;
end if;
end process;
process(clk2,flash)
variable num:integer range 0 to 9;
begin
if flash=clk1 then
en<="111111"; --6个数码管
end if;
if flash='0' then
if rising_edge(clk2)then
if w1=3 then
w1<=0;
else
w1<=w1+1;
end if;
end if;
case w1 is
when 0=>en<="111110";num:=a;
when 1=>en<="111101";num:=b;
when 2=>en<="101111";num:=c;
when 3=>en<="011111";num:=d;
end case;
case num is
when 0=>x<="1111110"; --七段数码管
when 1=>x<="0110000";
when 2=>x<="1101101";
when 3=>x<="1111001";
when 4=>x<="0110011";
when 5=>x<="1011011";
when 6=>x<="1011111";
when 7=>x<="1110000";
when 8=>x<="1111111";
when 9=>x<="1111011";
end case;
end if;
end process;
process(clk2)
variable de:integer range 0 to 2;
begin
if rising_edge(clk2)then
if w2=1 then
w2<=0;
else
w2<=w2+1;
end if;
case w2 is
when 0=>row<="0101";de:=e;
when 1=>row<="1010";de:=f;
end case;
case de is --东西南北
when 0=>r<='1';y<='0';g<='0';
when 1=>r<='0';y<=clk1;g<='0';
when 2=>r<='0';y<='0';g<='1';
end case;
end if;
end process;
process(clk1)
begin
if hold='1' then
e<=0; f<=0;
fm<=clk1;
flash<=clk1;
else
fm<='0';
flash<='0';
if countnum<=19 then
numa<=19-countnum;
e<=2;
elsif countnum<=24 then
numa<=24-countnum;
e<=1;
else
numa<=49-countnum;
e<=0;
end if;
if countnum<=24 then
numb<=24-countnum;
f<=0;
elsif countnum<=44 then
numb<=44-countnum;
f<=2;
else
numb<=49-countnum;
f<=1;
end if;
end if;
end process;
process(numa,numb)
begin
if numa>=20 then
b<=2; a<=numa-20;
elsif numa>=10 then
b<=1; a<=numa-10;
else
b<=0; a<=numa;
end if;
if numb>=20 then
d<=2; c<=numb-20;
elsif numb>=10 then
d<=1; c<=numb-10;
else
d<=0; c<=numb;
end if;
end process;
process(clk2) --点阵
begin
if rising_edge(clk2) then
if countnum<25 then
if w4=2 then
w4<=0;
else
w4<=w4+1;
end if;
case w4 is
when 0=>hang<="11111111";lie<="11100111";
when 1=>hang<="01100110";lie<="11011011";
when 2=>hang<="00100100";lie<="10111101";
end case;
else
if w3=2 then
w3<=0;
else
w3<=w3+1;
end if;
case w3 is
when 0=>hang<="00011000";lie<="00000000";
when 1=>hang<="00100100";lie<="10011001";
when 2=>hang<="01000010";lie<="11011011";
end case;
end if;
end if;
end process;
end one;
九、 引脚分配
十、 硬件下载实现现象描述
e:当数码管显示0-24计数倒计时,南北方向红灯亮,
当数码管显示0-19计数倒计时,南北方向绿灯亮,点阵上箭头显示可行方向;当数码管显示0-4计数倒计时,南北方向黄灯亮。
f:当数码管显示0-19计数倒计时,东西方向绿灯亮,点阵上箭头显示可行方向;当数码管显示0-4计数倒计时,东西方向黄灯亮,
当数码管显示0-24计数倒计时,东西方向红灯亮。
当hold='1'时,蜂鸣器鸣叫,数码管以1hz频率闪烁,发光二极管显示红灯,表示紧急情况下。
当rst=’1’时,复位,重新计数。
十一、收获与体会
经过一学期来的学习,训练,我已深深爱上了这个科目——可编程逻辑器件技术。
刚开始时是不懂这门课的,经过老师的教学,我学到了许多。
在这次实训中,我温习了对软件的应用,学习了相关知识,更理解了可编程逻辑的一般语法知识。感谢这一学期老师的陪伴,谢谢。
- 9 -
13电子2·邓明顺·12号
展开阅读全文