交通控制器
Verilog 课程设计 交通信号灯控制器交通信号灯控制器 一、设计要求 本次作业设计是一个交通控制器, 该交通信号灯控制器是设计十字路口的红绿灯, 用 LED 作为红绿黄的指示灯的模拟,用数码管来显示当前的亮灯倒计时秒数。 为了便于解释程序,把本次十字路口的道路分为主干道和支干道。主、支干道的红绿灯 交替亮灭,中间是穿插黄灯的亮灭。主干道放行 40s,即支干道禁行 40 秒,然后主干道和 支干道同时亮起黄灯 5 秒,5 秒黄灯后,支干道绿灯30 秒,即主干道的红灯亮起30 秒,然 后在主干道绿灯亮起之前再亮5 秒黄灯,依次循环下去。 二、设计思路 本次设计需要用到数码管, led 等外围设备。因为本设计是交通信号灯的控制器, 需要知 道具体的秒数, 并且需要数码管显示倒计时间, 所以需要一个分频模块来通过分频来生成一 个 1Hz 的频率作为数码管倒计时控制时钟,并且用来计时。 首先,我是应用到状态机来控制红绿黄灯之间的状态转换,转换图如下: 主绿/支红 40s 主黄/主黄 5 秒 主黄/支黄 5s 主红/支绿 30 秒 该状态图为交通灯在正常情况下的状态转化图, 进入控制后, 状态00时主干道绿灯及支 干道红灯亮起40s,进入状态01后两路黄灯亮起5s,状态11时主干道红灯及支干道绿灯亮起 30s。进入10状态两路黄灯亮起5秒。结束一个循环,从00状态重新开始循环。 为了显示其中的功能,需要用数码管进行倒计时显示,并且我用六个LED来模拟主干道 和支干道的红绿黄灯。 三、程序流程图如下: 开始 rst 按下 N Y 两绿灯亮 Y hold 按下 N 主红/支绿 40s 两红灯亮 两黄 5s 主绿/支红 30s 两黄 5s 四、各个模块的设计介绍 分频模块,本次设计是基于 fpga 开发板的,所以默认时钟输入时 50M,次模块是 经过分频以后输出 clk_out2 为 1Hz 的时钟,作为整个交通控制器的时钟。 分频模块如下: 分频模块的程序如下: module fenpin(clk_in,clk_out2,en); clk_in,en; output clk_out2; reg[15:0] cnt1; reg[9:0] cnt2; reg[9:0] cnt3; reg clk_out1,clk_out2; always@(posedge clk_in) begin if(cnt125000) begin // clk_out1=0; cnt1=cnt1+1 b1; end else begin cnt1=0; clk_out1=~clk_out1; end end always@(posedge clk_out1) begin if(en) begin if(cnt2500) begin //clk_out2=0; cnt2=cnt2+1 b1; end else begin cnt2=0; clk_out2=~clk_out2; //led=~clk_out2; end end end endmodule 主干道模块,主干道模块的输入时钟即为分频模块输出的1Hz 的时钟,rst 为复位 信号,hold 是让所有干道红灯都亮起的按键,en 为使能按键。输出为 light1 为控制主 干道上的三个灯,num1 为控制数码管的倒计时。 主干道模块如下: 程序如下: module street(clk,light1,num1,rst,hold,en); clk; rst,hold,en; output[2:0] light1;//红黄绿 output[7:0] num1; reg[2:0] light1; reg[7:0] num1; reg tim1; reg[7:0] green1,red1,yellow1; reg[1:0] state1; always @(en) if(!en) begin //设置计数初值 green1=8 b01000000;// 40 秒 red1=8 b00110000;//30 秒 yellow1=8 b00000101;//5 秒 end always @(posedge clk ) begin if(!rst) //复位与特殊情况控制 begin light1=3 b001; num1=green1; end else if(!hold) begin light1=3 b100; num1=red1; end else if(en) begin //使能有效开始控制计数 if(!tim1) //开始控制 begin //主干道交通灯点亮控制 tim1=1; case(state1) 2 b00:begin num1=green1; light1=3 b001; state1=2 b01; end//绿 2 b01:begin num1=yellow1;light1=3 b010; state1=2 b11; end//黄 2 b11:begin num1=red1;light1=3 b100; state1=2 b10; end//红 2 b10:begin num1=yellow1;light1=3 b010; state1=2 b00; end//黄 default:begin light10) 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 end else begin light1=3 b010; num1=2 b00; tim1=0; end end endmodule 支干道模块设计方法和主干道一致,只是红绿灯的亮灭的主干道的相反而已。 支干道模块如下 数码管模块控制四个数码管来显示主干道和支干道的数字倒计时 datain0、datain1 分别主干道和支干道的倒计时数字信号输入, 输出即为数码管的段选和位选, 数码管程 序设计是用的动态扫描。 数码管模块如下: 数码管程序如下: module shumaguan ( sys_clk, [7:0]datain0, [7:0]datain1, //片选信号 output wireseg_c1, output wireseg_c2, output wireseg_c3 output wireseg_c4 //位选信号 output regseg_a output regseg_b output regseg_c output regseg_d output regseg_e output regseg_f output regseg_g output regseg_h ); parameter WIDTH2 = 26; parameter WIDTH = 5; parameter SIZE= 8; reg[WIDTH2-1:0]count reg[ 3:0]disp_data reg[SIZE-1:0]dat regdisp_clk