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