交通信号灯控制器课程报告一.设计要求1、 设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外2、 主、支干道交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路3、 在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡提示:1、 选择1HZ时钟脉冲作为系统时钟2、 45秒、25秒、5秒定时信号用倒计时,计时起始信号由主控电路给出,每当计满所需时间,计数器清零,由主控电路启、闭三色信号灯或启动另一计时电路二. 设计思路 本设计针对一条主干道和一条支干道汇合成的十字路口,进行南北和东西直行情况下交通灯控制根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续45S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成循环往复的执行这个过程设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
根据状态机的设计规范,本次设计了四个状态之间的循环转化,其真值表及状态转化图如下所示目前状态下一状态输出Light1Light2S0=00S1=01001100S1=01S2=10010010S2=10S3=11100001S3=11S0=00010010 S0S3S1S2三. 程序说明1.各输入输出变量说明:clk:计数时钟qclk:扫描显示时钟rst:复位信号,当rst为1时,控制器和计数器回到初始状态en:使能信号,当en为1时控制器开始工作,en为0时hold:特殊情况控制信号,hold为1时,主、支干道方向无条件显示为红灯 seg:用于数码管的译码输出dig:用于选择显示的数码管(片选) num1:用于主干道方向灯的时间显示num2:用于支干道方向灯的时间显示light1:控制主干道方向四盏灯的亮灭,其中,light1[0]~light1[2]分别控制主干道方向的绿灯、黄灯和红灯light2:控制支干道方向四盏灯的亮灭,其中,light2[0]~light2[2]分别控制支干道方向的绿灯、黄灯和红灯2.输入输出及中间变量设置:module traffic(en,clk,qclk,rst,hold,num1,num2,light1,light2,seg,dig;input en,clk,qclk,rst,hold;output [5:0]dig;output[7:0] num1,num2;output[6:0]seg;output[2:0]light1,light2;reg tim1,tim2;reg[3:0]disp_dat;reg[6:0]seg;reg[7:0]num1,num2;reg[7:0]red1,red2,green1,green2,yellow1,yellow2;reg[5:0]dig;reg [1:0]count;reg[1:0]state1,state2;reg[2:0]light1,light2;3.初始状态设置:always @(en)if(!en)begingreen1<=8'b01000101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b01000101;yellow2<=8'b00000101;end4.主干道方向点亮顺序:always@(posedge clk) //主干道begin if(rst)beginlight1<=3'b001;num1<=green1;endelse if(hold) begin light1<=3'b100; num1<=green1; endelse if(en)beginif(!tim1)begintim1<=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;endcaseendelse //主干道倒数计时 begin if(num1>0) if(num1[3:0]==0) begin num1[3:0]<=4'b1001; num1[7:4]<=num1[7:4]-1; end else num1[3:0]<=num1[3:0]-1; if(num1==1)tim1<=0; end endelse begin light1<=3'b010; num1=2'b00; tim1<=0; endend5.支干道方向点亮顺序:always@(posedge clk) //支干道begin if(rst)beginlight2<=3'b100;num2<=red2;endelse 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<=yellow2; 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;endcaseend else //支干道倒数计时 begin if(num2>0) if(num2[3:0]==0) begin num2[3:0]<=4'b1001; num2[7:4]<=num2[7:4]-1; end else num2[3:0]<=num2[3:0]-1; if(num2==1)tim2<=0; end endelse begin light2<=3'b010; state2<=2'b00; tim2<=0; endend6.数码管译码及显示:always @(posedge qclk) //定义上升沿触发进程begin count <= count +1'b1;endalways @( count)begin case(count) //选择扫描显示数据 2'd0 : disp_dat <= num1[3:0]; //第一个数码管 2'd1 : disp_dat <= num1[7:4]; //第二个数码管 2'd2 : disp_dat <= num2[3:0]; //第三个数码管 2'd3 : disp_dat <= num2[7:4]; //第四个数码管 default : disp_dat <= 0; endcaseend always @(count) begin case(count) //选择数码管显示位 2'd0 : dig<= 6'b011111;//选择第一个数码管显示 2'd1 : dig<= 6'b101111;//选择第二个数码管显示 2'd2 : dig <= 6'b110111;//选择第三个数码管显示 2'd3 : dig<= 6'b111011;//选择第四个数码管显示 default : dig<= 6'b111111; endcase endalways @(disp_dat)begin case (disp_dat) //七段译码 4'b0000 : seg<= 7'b0111111; //显示"0" 4'b0001 : seg <= 7'b0000110; //显示"1" 4'b0010 : seg<= 7'b1011011; //显示"2" 4'b0011 : seg<= 7'b1001111; //显示"3" 4'b0100 : seg <= 7'b1100110; //显示"4" 4'b0101 : seg<= 7'b1101101; //显示"5" 4'b0110 : seg<= 7'b1111101; //显示"6" 4'b0111 : seg<= 7'b0000111; //显示"7" 4'b1000 : seg <= 7'b1111111; //显示"8" 4'b1001 : seg <= 7'b1101111; //显示"9" default: seg<= 7'b0111111;//不显示 endcase endendmodule三. 仿真波形图四. 实物图 。