青岛农业大学理学与信息科学学院电子设计自动化及专用集成电路课程设计报告设计题目__________ 用状态机设计交通灯控制器___________ 学生专业班级_____ 通信工程2008级1班 _______________ 学生姓名(学号)孙鹏飞(20082715)_____________ 扌旨导教师________________ 刘金梅_____________________ 完成时间2011-9-9 ________________________ 实习(设计)地点工程楼405 __________________2011年9月9日、课程设计目的和任务课程设计目的:本次课程设计是在学生学习完数字电路、模拟电路、电子设 计自动化的相关课程之后进行的。
通过对数字集成电路或模拟集成电路的模拟与 仿真等,熟练使用相关软件设计具有较强功能的电路, 提高实际动手,为将来设计大规模集成电路打下基础。
课程设计任务:设计一个交通控制器,用 LED 显示灯表示交通状态,并以 7 段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行 35s ,支干道每次放行25s 。
每次由绿 灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为 5s o 能进行特殊状 态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED 灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
二、分析与设计1、设计任务分析本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东 西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红 灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续 35S 后,主干道和支干道上的黄灯都亮启,持续 5S 后,主干道上红灯亮启,支 干道上绿灯亮启持续25S ,之后主干道和支干道上的黄灯都亮启 5s ,一个循环完 成。
循环往复的直行这个过程。
其过程如下图所示:图1•交通灯点亮时间控制说明2、设计方案论证主干道方向支干道方向本次采用文本编辑法,即利用 Verilog HDL语言描述交通控制器,通过状态 机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED 模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余 时间,控制时钟由试验箱上频率信号提供。
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的 时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化, 其真 值表及状态转化图如下所示:图2.交通灯控制状态转化说明:该状态图为交通灯在正常情况下的状态转化图, 进入控制后,状态00 时主干道绿灯及支干道红灯亮起, 进入状态01后两路黄灯亮起,状态11时主干道 红灯及支干道绿灯亮起。
进入10状态两路黄灯亮起。
结束一个循环,从00状态重 新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程 序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:图3•交通灯控制系统结构图其中resets 复位信号,elk 为时钟信号,hold 为特殊情况控制信号,输入hold 时两个 方向红灯无条件亮起。
3、详细设计根据整体设计要求,编写各个功能部分 Verilog HDL 程序,设置各输入输出 变量说明如下主干道方向 支干道方向 状态00 红、黄、绿 -001 状态01 红、黄、绿 -010状态11 红、黄、绿-100 状态10红、黄、绿 -010红、黄、绿 100 红、黄、绿 010 红、黄、绿 001 红、黄、绿 010状态00状态0110 状态11clk:为计数时钟;qclk :为扫描显示时钟;en:使能信号,为 1 的话,则控制器开始工作;reset: 复位信号,为 1 的话,控制及技术回到初始状态;hold :特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;light1: 控制主干道方向四盏灯的亮灭;其中, light1[0]~light[2] ,分别控制主干道方向的绿灯、黄灯和红灯;light2: 控制支干道方向四盏灯的亮灭;其中, light2[0] ~ light2[2] ,分别控制支干道方向的绿灯、黄灯和红灯;num1: 用于主干道方向灯的时间显示, 8 位,可驱动两个数码管;num2: 用于支干道方向灯的时间显示, 8 位,可驱动两个数码管;counter:用于数码管的译码输出;stl, st2:数码管扫描信号。
输入输出及中间变量设置如下:moduletraffic(en,clk,qclk,reset,reset1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,reset,hold,reset1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;3.1二极管点亮控制该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。
此外,当检测到特殊情况( hold= ‘)1'发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00 状态。
因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下:1)主干道方向 always @(posedge clk ) beginif(reset) //复位与特殊情况控制begin light1<=3'b001; num1<=green1;endelse if(hold) begin light1<=3'b100; num1<=green1;endelse if(en)begin //使能有效开始控制计数if(!tim1) //begin //主干道交通灯点亮控制 tim1<=1;case(state1)2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end 2'b01:beginnum1<=yellow1;light1<=3'b010;state1<=2'b11;end 2'b11:beginnum1<=red1;light1<=3'b100;state1<=2'b10;end 2'b10:beginnum1<=yellow1;light1<=3'b010;state1<=2'b00;end default:light1<=3'b100;endcaseend2)支干道方向 always @(posedge clk ) begin if(reset) //复位与特殊情况控制 beginlight2<=3'b100;num2<=red2;end else if(hold) begin light2<=3'b100;num2<=red2;endelse if(en)beginif(!tim2)begintim2<=1;case(state1)2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;enddefault:light2<=3'b100;endcaseend3.2倒数计时该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。
本次设计直接用逻辑运算完成2 位十进制数的计数,未采用分位器的设计。
因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:always @(posedge clk )beginelsebegin // 倒数计时if(num1>0)if(num1[3:0]==0)beginnum1[3:0]<=4'b1001;num1[7:4]<=num1[7:4]-1;endelse num1[3:0]<=num1[3:0]-1;if(num1==1) tim1<=0;endendelsebeginlight1<=3'b010;num1=2'b00;tim1<=0;endend3.3数码管的译码及扫描显示该段程序主要完成4 个7 段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。
译码的时钟频率要低,为Hz 级。
扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示:always @(posedge qclk)begin //数码管扫描if(reset1)beginst1=0;st2=0;endelsebegincase({st2,st1})2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01; end2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10; end2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11; end2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00; endendcaseendendalways @(posedge qclk)begin //数码管译码显示case(num)4'b0000: counter<=7'b0111111; //0 4'b0001: counter<=7'b0000110; //1 4'b0010: counter<=7'b1011011; //2 4'b0011: counter<=7'b1001111; //3 4'b0100: counter<=7'b1100110; //4 4'b0101: counter<=7'b1101101; //5 4'b0110: counter<=7'b1111101; //6 4'b0111: counter<=7'b0000111; //7 4'b1000: counter<=7'b1111111; //84'b1001: counter<=7'b1101111; 〃9 default: counter<=7'b0111111; 〃0 endcase end en dmodule4、源代码清单(按照设计的功能模块,提供适量主要代码并注释, 1页-1.5页)module traffic(e n,clk,qclk,reset,reset1,hold, nu m1, nu m2,light1,light2,co un ter,st1,st2);in put en, clk,qclk,reset,hold,reset1; output st1,st2;output[7:0] num1,num2; output[6:0]counter;output[2:0] light1,light2; reg tim1,tim2,st1,st2; reg[1:0]state1,state2,ste; reg[2:0]light1,light2; reg[3:0]num; reg[6:0]counter; reg[7:0] num1,num2;'TcTcQ Q QR1reg[7:0] red1,red2,green1,green2,yellow1,yellow2;always @(en )if(!en) begin //设置计数初值 green1<=8'b00110101;red1<=8'b00100101; yellow1<=8'b00000101; green2<=8'b00100101;red2<=8'b00110101; yellow2<=8'b00000101;endalways @(posedge clk )beginif(reset) //复位与特殊情况控制begin light1<=3'b001; num1<=green1;endelse if(hold)begin light1<=3'b100; num1<=green1;endelse if(en)begin //使能有效开始控制计数 if(!tim1) // 开始控制begin //主干道交通灯点亮控制 tim1<=1;case(state1)2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;enddefault:light1<=3'b100;endcaseendelsebegin //倒数计时if(num1>0)if(num1[3:0]==0) beginnum1[3:0]<=4'b1001; num1[7:4]<=num1[7:4]-1;endelse num1[3:0]<=num1[3:0]-1;if(num1==1) tim1<=0;endendelsebeginlight1<=3'b010;num1=2'b00;tim1<=0;endendalways @(posedge clk )beginif(reset) //复位与特殊情况控制beginlight2<=3'b100;num2<=red2;endelse if(hold)beginlight2<=3'b100;num2<=red2;endelse if(en)beginif(!tim2)begintim2<=1;case(state1)2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end 2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;enddefault:light2<=3'b100;endcaseendelsebegin //倒数计时if(num2>0)if(num2[3:0]==0)beginnum2[3:0]<=4'b1001;num2[7:4]<=num2[7:4]-1;endelse num2[3:0]<=num2[3:0]-1;if(num2==1) tim2<=0;endendelsebegintim2<=0;state2<=2'b00;light2<=3'b010;endendalways @(posedge qclk)begin //数码管扫描if(reset1)beginst1=0;st2=0;endelsebegincase({st2,st1})2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01; end2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10; end2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11; end2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00; end endcase endendalways @(posedge qclk)begin //数码管译码显示case(num)4'b0000: counter<=7'b0111111; //04'b0001: counter<=7'b0000110; //14'b0010: counter<=7'b1011011; //24'b0011: counter<=7'b1001111; //34'b0100: counter<=7'b1100110; //4 4'b0101: counter<=7'b1101101; //5 4'b0110: counter<=7'b1111101; //6 4'b0111: counter<=7'b0000111; //7 4'b1000: counter<=7'b1111111; //8 4'b1001: counter<=7'b1101111; //9 default: counter<=7'b0111111; //0 endcaseendendmodule三、系统实施3.1波形仿真在Quarturs H软件下创建工程,新建编辑设计文件,将程序输入,整体编译后, 新建波形仿真文件。