当前位置:文档之家› verilog课程设计—交通灯

verilog课程设计—交通灯

课程论文论文题目基于DE2的交通灯设计完成时间课程名称Verilog语言设计任课老师专业年级1.交通信号控制器设计要求与思路1.1设计背景FPGA是一种用户根据各自需要而自行构造逻辑功能的数字集成电路,其种类很多,内部结构也不同,但共同的特点是体积小、使用方便。

本文介绍了用VerilogHDL语言设计交通灯控制器的方法,并在QuartusII系统对FPGA芯片进行编译下载,由于生成的是集成化的数字电路,没有传统设计中的接线问题,所以故障率低、可靠性高,而且体积非常小。

本文通过EDA设计,利用VerilogHDL语言模拟仿真交通灯控制电路。

1.2设计要求根据交通灯控制器要实现的功能,考虑用两个并行执行的always语句来分别控制A方向和B方向的3盏灯。

这两个always语句使用同一个时钟信号,以进行同步,也就是说,两个进程的敏感信号是同一个。

每个always语句控制一个方向的3种灯按如下顺序点亮,并往复循环:绿灯----黄灯----红灯,每种灯亮的时间采用一个减法计数器进行计数,计数器用同步预置数法设计,这样只需改变预置数据,就能改变计数器的模,因此每个方向只要一个计数器进行预置数就可以。

为便于显示灯亮的时间,计数器的输出均采用BCD码,显示由4个数码管来完成,A方向和B方向各用两个数码管。

设定A方向红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s,B方向的红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s。

假如要改变这些时间,只需要改变计数器的预置数即可。

1.3设计思路两个方向各种灯亮的时间能够进行设置和修改,此外,假设B方向是主干道,车流量大,因此B方向通行的时间应该比A方向长。

交通灯控制器的状态转换表见下表。

表中,1表示灯亮,0表示灯不亮。

A方向和B方向的红黄绿分别用R1、Y1、G1、R2、Y2、G2来表示。

交通灯控制器状态转换表从状态表中可以看出,每个方向3盏灯依次按如下顺序点亮,并不断循环:绿灯----黄灯----红灯,并且每个方向红灯亮的时间应该与另一个方向绿灯、黄灯亮的时间相等。

黄灯所起的作用是用来在绿灯后进行缓冲,以提醒行人该方向马上要禁行了。

在使能控制信号(EN)控制时系统工作,并且要求有两个控制输入信号:即复位信号(Reset)和备用模式设置信号(Standby),在复位信号控制时,两个方向均为红灯,在备用模式设置信号控制时,两个方向均为黄灯。

1.4系统设计框图系统采用的时钟频率为10KHZ,经分频为1HZ后送入控制计时电路,同时送入控制计时电路的还有控制信号M2M1M0以及复位信号RST,控制交通灯的运行状态。

经处理后输出LED灯以及数码管显示电路的控制信号,从而完成整个电路的控制与实现。

时钟CLK10K 分频CLK1复位RST M2M1M0复位RST复位RST时钟CLK10K B 组信号灯A 组信号灯分频clk1控制计时电路数码管显示电路AL AR AY AGBL BR BY BG图1 系统设计示意图2.交通信号控制器具体模块设计2.1时钟分频模块设计系统的时钟输入为10KHZ的脉冲,而系统时钟计时模块需要1HZ的脉冲。

分频模块主要为系统提供所需的时钟计时脉冲。

该模块将10KHZ的脉冲信号进行分频,产生1S的方波(占空比为50%),作为系统时钟计时信号。

计时模块用来设定路口计时器的初值,并为扫描显示译码模块提供倒计时时间。

Verilog HDL源代码如下:module fenpin(clk10k,rst,clk1); //将10K的频率分频为1input clk10k,rst;output clk1;reg [7:0]j;reg clk1;always@(posedge clk10k or posedge rst)if(rst)beginclk1<=0;j<=0;endelse if(j==9999)beginj<=0;clk1<=~clk1;endelse j<=j+1;Endmodule2.2控制模块设计Verilog HDL源代码如下:module control(EN_in,SW1,RST,Red1,Red2,Yellow1,Yellow2,Green1,Green2);output Red1;output Red2;output Yellow1;output Yellow2;output Green1;output Green2;input [1:0] EN_in;input SW1;input RST;reg Red1,Red2,Yellow1,Yellow2,Green1,Green2,D_out;always @(EN_in,RST,SW1)beginif(SW1==0||RST==0) {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b0;elsebegincase(EN_in)2'b00 : {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b010010;2'b01 : {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b011000;2'b10 : {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b100001;2'b11 : {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b100100;default : {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b0;endcaseendendEndmodule2.3倒计时选择模块Verilog HDL源代码如下:module counter55(C_CLK,RST,C_EN,D_OUT1,D_OUT0,C_out);output C_out;output [3:0] D_OUT1;output [3:0] D_OUT0;input C_CLK;input RST;input C_EN;reg [3:0] D_OUT1;reg [3:0] D_OUT0;reg C_out;reg [3:0] CData1;reg [3:0] CData0;reg [7:0] DATA;always @(posedge C_CLK)beginif(RST==0||C_EN==0)beginC_out <= 1'b0;CData1 <= 4'b0000;CData0 <= 4'b0000;endelsebeginif(CData0 == 4'b0101 && CData1 == 4'b0101)beginCData1 <= 4'b0000;CData0 <= 4'b0000;C_out = 1'b1;endelse if(CData0 != 4'b1001)beginCData0 <= CData0 + 1;C_out <= 1'b0;endelse if(CData0 == 4'b1001 && CData1 != 4'b0110)beginCData1 <= CData1 + 1;CData0 <= 4'b0000;C_out <= 1'b0;endelsebeginCData1 <= 4'b0000;CData0 <= 4'b0000;C_out = 1'b1;endendendalwaysbeginDATA <= 8'b01010101-((CData1<<4)+CData0);if(((DATA>>4)&4'b1111)>4'b0101)D_OUT1 <= (DATA>>4)&4'b1111-4'b1111;elseD_OUT1 <= (DATA>>4)&4'b1111;if((DATA&4'b1111)>4'b1001)D_OUT0 <= (DATA&4'b1111)-4'b0110;elseD_OUT0 <= DATA&4'b1111; endendmodule2.4 倒计时数码管的动态显示Verilog HDL源代码如下:module dispselect(CLK,D_OUT); output [1:0] D_OUT;input CLK;reg [1:0] D_OUT;always @(posedge CLK)beginif(D_OUT < 2'b10)D_OUT <= D_OUT + 2'b01;elseD_OUT <= 2'b01;endendmodule2.5扫描显示译码模块设计Verilog HDL源代码如下:module dispdecoder (data_in,data_out); input [3:0]data_in;output [6:0] data_out;reg [6:0] r_seg;assign data_out = r_seg;always @(*)begincase(data_in)4'd0: r_seg = 7'b0000001;4'd1: r_seg = 7'b1001111;4'd2: r_seg = 7'b0010010;4'd3: r_seg = 7'b0000110;4'd4: r_seg = 7'b1001100;4'd5: r_seg = 7'b0100100;4'd6: r_seg = 7'b0100000;4'd7: r_seg = 7'b0001111;4'd8: r_seg = 7'b0000000;4'd9: r_seg = 7'b0000100;4'd10: r_seg = 7'b0001000;default r_seg = 7'b1111111;endcaseendEndmodule2.5.顶层文件设计Verilog HDL源代码如下:module jtd(Reset,SW,CLK,Red1,Red2,Yellow1,Yellow2,Green1,Green2,SEG_Data1,SEG_Data2,SEG_Data3,SEG_Data4,//SEG_Sel);input Reset;input SW;input CLK;output Red1;output Red2;output Yellow1;output Yellow2;output Green1;output Green2;output [6:0] SEG_Data1;output [6:0] SEG_Data2;output [6:0] SEG_Data3;output [6:0] SEG_Data4;//output [1:0] SEG_Sel;wire SYNTHESIZED_WIRE_0; wire SYNTHESIZED_WIRE_1; wire SYNTHESIZED_WIRE_19;wire SYNTHESIZED_WIRE_3;wire SYNTHESIZED_WIRE_20;wire [1:0] SYNTHESIZED_WIRE_21;wire SYNTHESIZED_WIRE_7;wire [3:0] SYNTHESIZED_WIRE_9;wire [3:0] SYNTHESIZED_WIRE_10;wire [3:0] SYNTHESIZED_WIRE_11;wire [3:0] SYNTHESIZED_WIRE_12;//wire [3:0] SYNTHESIZED_WIRE_14;wire [3:0] SYNTHESIZED_WIRE_15;wire [3:0] SYNTHESIZED_WIRE_16;//wire [1:0] SYNTHESIZED_WIRE_17;//assign SEG_Sel = SYNTHESIZED_WIRE_17;scan b2v_inst(.EN_in1(SYNTHESIZED_WIRE_0),.EN_in0(SYNTHESIZED_WIRE_1),.sdata(SYNTHESIZED_WIRE_21));counter05 b2v_inst1(.C_CLK(SYNTHESIZED_WIRE_19),.RST(Reset),.C_EN(SYNTHESIZED_WIRE_3),.C_out(SYNTHESIZED_WIRE_1),.D_OUT0(SY NTHESIZED_WIRE_11),.D_OUT1(SYNTHESIZED_WIRE_12));fdiv1hz b2v_inst11(.clk_in(SYNTHESIZED_WIRE_20),.clk_out(SYNTHESIZED_WIRE_19));fdiv1khz b2v_inst12(.clk_in(CLK),.clk_out(SYNTHESIZED_WIRE_20));control b2v_inst14(.SW1(SW),.RST(Reset),.EN_in(SYNTHESIZED_WIRE_21),.Red1(Red1),.Red2(Red2),.Yellow1(Yellow1),.Y ellow2(Yellow2),.Green1(Green1),.Green2(Green2));counter55 b2v_inst2(.C_CLK(SYNTHESIZED_WIRE_19),.RST(Reset),.C_EN(SYNTHESIZED_WIRE_7),.C_out(SYNTHESIZED_WIRE_0),.D_OUT0(SY NTHESIZED_WIRE_9),.D_OUT1(SYNTHESIZED_WIRE_10));countersel b2v_inst3(.D_IN(SYNTHESIZED_WIRE_21),.D_OUT1(SYNTHESIZED_WIRE_7),.D_OUT0(SYNTHESIZED_WIRE_3));datamux b2v_inst6(.D_IN0(SYNTHESIZED_WIRE_9),.D_IN1(SYNTHESIZED_WIRE_10),.D_IN2(SYNTHESIZED_WIRE_11),.D_IN3(SYNTHESIZE D_WIRE_12),.SEL(SYNTHESIZED_WIRE_21),.D_OUT0(SYNTHESIZED_WIRE_15),.D_OUT1 (SYNTHESIZED_WIRE_16));//dispdecoder b2v_inst7(.data_in(SYNTHESIZED_WIRE_14),//.data_out(SEG_Data));//dispmux b2v_inst8(.D_IN0(SYNTHESIZED_WIRE_15),//.D_IN1(SYNTHESIZED_WIRE_16),.SEL(SYNTHESIZED_WIRE_17),.D_OUT(SYNTHESIZE D_WIRE_14));//dispselect b2v_inst9(.CLK(SYNTHESIZED_WIRE_20),//.D_OUT(SYNTHESIZED_WIRE_17));dispdecoder u0(.data_in(SYNTHESIZED_WIRE_11),.data_out(SEG_Data2));dispdecoder u1(.data_in(SYNTHESIZED_WIRE_12),.data_out(SEG_Data1));dispdecoder u2(.data_in(SYNTHESIZED_WIRE_9),.data_out(SEG_Data4));dispdecoder u3(.data_in(SYNTHESIZED_WIRE_10),.data_out(SEG_Data3));endmodule3 小结再一次的体验到了细心对一个编程者的重要性和程序的规范性对于程序的重要。

相关主题