交通控制器
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 fenpinclk_in,clk_out2,en; clk_in,en; output clk_out2; reg[150] cnt1; reg[90] cnt2; reg[90] cnt3; reg clk_out1,clk_out2; alwaysposedge clk_in begin ifcnt125000 begin // clk_out10; cnt1cnt11b1; end else begin cnt10; clk_out1clk_out1; end end alwaysposedge clk_out1 begin ifen begin ifcnt2500 begin //clk_out20; cnt2cnt21b1; end else begin cnt20; clk_out2clk_out2; //ledclk_out2; end end end endmodule 主干道模块,主干道模块的输入时钟即为分频模块输出的1Hz 的时钟,rst 为复位 信号,hold 是让所有干道红灯都亮起的按键,en 为使能按键。输出为 light1 为控制主 干道上的三个灯,num1 为控制数码管的倒计时。 主干道模块如下 程序如下 module streetclk,light1,num1,rst,hold,en; clk; rst,hold,en; output[20] light1;//红黄绿 output[70] num1; reg[20] light1; reg[70] num1; reg tim1; reg[70] green1,red1,yellow1; reg[10] state1; always en ifen begin //设置计数初值 green18b01000000;// 40 秒 red18b00110000;//30 秒 yellow18b00000101;//5 秒 end always posedge clk begin ifrst //复位与特殊情况控制 begin light13b001; num1green1; end else ifhold begin light13b100; num1red1; end else ifen begin //使能有效开始控制计数 iftim1 //开始控制 begin //主干道交通灯点亮控制 tim11; casestate1 2b00begin num1green1; light13b001; state12b01; end//绿 2b01begin num1yellow1;light13b010; state12b11; end//黄 2b11begin num1red1;light13b100; state12b10; end//红 2b10begin num1yellow1;light13b010; state12b00; end//黄 defaultbegin light10 ifnum1[30]0 begin num1[30]4b1001; num1[74]num1[74]-1; end else num1[30]num1[30]-1; ifnum11 tim10; end end else begin light13b010; num12b00; tim10; end end endmodule 支干道模块设计方法和主干道一致,只是红绿灯的亮灭的主干道的相反而已。 支干道模块如下 数码管模块控制四个数码管来显示主干道和支干道的数字倒计时 datain0、datain1 分别主干道和支干道的倒计时数字信号输入, 输出即为数码管的段选和位选, 数码管程 序设计是用的动态扫描。 数码管模块如下 数码管程序如下 module shumaguan sys_clk, [70]datain0, [70]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-10]count reg[ 30]disp_data reg[SIZE-10]dat regdisp_clk