Verilog HDL交通灯设计实验
《FPGA设计与应用》交通灯实验一
《FPGA设计与应用》交通灯实验
一、实验目的和要求
实验目的:
1. 综合运用 Verilog HDL 语言进行时序设计。
实验要求:
1. 两个方向各种灯亮的时间能够进行设置和修改
二、实验内容和原理
1. 编写时间控制程序,利用交通灯实验子板,实现东西,南北向的交通灯计数并亮灯的程序;
2.子板实现所有显示方面的功能,包括十进制倒数计数和红绿黄三色灯的轮流点亮。
三、主要仪器设备
电脑、VIVADO软件
四、操作方法与实验步骤
1.为了在八段数码管上正确显示十进制数据,设计一个函数,程序即上述实验五中的数码管封装模块。
2、将实验板上电,下载程序到 FPGA 芯片中。
3、观察实验结果。
五、实验数据记录和处理
综合:
程序:
六、实验结果与分析
实验仿真结果:
实物操作:
七、讨论和心得
通过这次实验,我加深了用Verilog语言来进行时序设计方法的理解,能够编写简单的时间控制程序,让我verilog语法的运用更加熟练,在实验中还用到了之前学到的模块调用,加深了我对之前知识的理解。
通过本次实验,我不仅学到了关于Verilog的知识,同时也让我感觉到了思考的重要性。
基于verilog的交通灯设计(状态机)
实验课题:基于verilog的交通灯设计(状态机)一、Verilog程序(主程序+激励)1)主程序/*顶层模块*/module traffic_light(clk,rst,out);input clk,rst;output [5:0]out;wire [4:0] x;delay D(.clk(clk),.rst(rst),.cnt(x));state S(.in(x),.rst(rst),.clk(clk),.out(out));endmodule/*延时模块*/module delay(clk,rst,cnt);input clk,rst;output[4:0]cnt;reg[4:0]cnt;always@(posedge clk)beginif(!rst)cnt<=0;else if(cnt<29)cnt<=cnt+1;else cnt<=0;endendmodule/*状态机模块*/module state(clk,in,rst,out);input clk,rst;input[4:0]in;output [5:0]out;reg [5:0]out;reg[3:0]state;parameter r1_g2or1_2_y=6'b100010,r1_y2og1_r2=6'b001100,g1_r2oy1_r2=6'b010100, y1_r2or1_g2=6'b100001,A='b0001,B='b0010,C='b0100,D='b1000;always@(posedge clk)beginif(!rst)beginstate<=A;out<= y1_r2or1_g2;endelsebegincase(state)A: beginif(in<25)state<=A;elsebeginstate<=B;out<=r1_g2or1_2_y;endendB: beginif(in>24)state<=B;elsebeginstate<=C;out<=r1_y2og1_r2;endendC: beginif(in<25)state<=C;elsebeginstate<=D;out<=g1_r2oy1_r2;endendD: beginif(in>24)state<=D;elsebeginstate<=A;out<=y1_r2or1_g2;endendendcaseendendendmodule2)激励module test;reg clk,rst;wire [5:0]out;traffic_light test(clk,rst,out);initialbeginclk='b1;forever #5 clk=~clk;endinitialbeginrst='b0;#10 rst='b1;#500 rst='b0;#10 rst='b1;endendmodule二、实验波形图截图三、波形分析输出out[5:0]分别对应:out[5]:主干道红灯out[4]:主干道黄灯out[3]:主干道绿灯out[2]:支干道红灯out[1]:支干道黄灯out[0]:支干道绿灯初始状态为:主干道红灯亮,支干道绿灯亮。
FPGA 交通灯控制器实验
交通灯控制器一、实验目的熟练掌握EDA软件quartus 2的应用环境,加强利用verilog语言解决生活中实际问题的能力。
二、实验原理和内容利用软件quartus 2进行编写程序实现十字路口交通灯控制器,达到A方向和B方向红、黄、绿三盏灯按合理的顺序亮或灭,并能将灯亮的时间用倒计时的形式显示在数码管上,最后通过软件自带的工具将交通灯控制器的门级电路和RTL级电路自动生成。
三、实验步骤1:首先分析交通灯的原理,整理出所需要的模块,设定每个灯的亮灯时间。
2:运行quartus 2软件、新建工程,然后新建verilog HDL文件,利用verilog语言编写程序实现A和B方向的红黄绿三盏灯合理的交替亮灭,通过对应数码管显示亮灯倒计时。
3:编译程序,若有错误根据错误提示对程序进行修改,直到编译通过,然后设置LED 灯和数码管的引脚,以达到控制A和B那盏灯亮和与之相对应的数码管做倒计时,倒计时结束,亮灯状态转换的效果。
4:将程序烧入FPGA开发板,观察开发板上的LED和数码管显示状况,看是否达到实验目的,若达到则记录实验结果并整理,反之继续修改,直到达到预期效果为止。
5:关闭电源,拆除实验器材。
四、实验数据A方向红灯40s,黄灯10s,绿灯30sB方向红灯40s,黄灯10s,绿灯30s五、实验代码module traffic(clk,en,seg,dig,lampa,lampb);input clk;//时钟信号,50Mhzinput en;// 使能信号,当为高电平时控制器工作,当为低电平时,进行初始化设置。
output[7:0] dig;//数码管位选output[7:0] seg;//数码管段选output[2:0] lampa;//A方向灯亮的情况output[2:0] lampb;//B方向灯亮的情况reg clk_out1;reg clk_out2;reg[15:0] count1;reg[31:0] count2;reg[1:0] a;reg[2:0] lampa;reg[2:0] lampb;reg[3:0] disp_dat;reg[7:0] dig;reg[7:0] seg;reg[7:0] ared,ayellow,agreen,bred,byellow,bgreen;reg[7:0] numa,numb;reg tempa,tempb;reg[1:0] counta, countb;always @(posedge clk)begincount1<=count1+1;if(count1==16'd25000)beginclk_out1<=~clk_out1;count1<=0;endendalways @(posedge clk)begincount2<=count2+1;if(count2==32'd2*******)beginclk_out2<=~clk_out2;count2<=0;endendalways @(en) //给各种灯亮的时间预置数,注意此处为十六进制的数beginif (!en)beginared <= 8'h40;ayellow <= 8'h10;agreen <= 8'h30;bred <=8'h40;byellow <= 8'h10;bgreen <= 8'h30;endendalways @(posedge clk_out2) //控制A方向的四种灯的亮灭及亮的时间beginif(en)beginif(!tempa)begintempa <= 1;case(counta)2'd0:begin numa <= ared; lampa <= 3'b011; counta <= 2'd1;end2'd1:begin numa <= agreen; lampa <= 3'b110; counta <= 2'd2;end2'd2:begin numa <= ayellow; lampa <= 3'b101; counta <= 2'd0;endendcaseendelsebeginif(numa[3:0]==0)beginnuma[3:0] <= 4'd9;numa[7:4] <= numa[7:4]-1;endelse numa[3:0] <= numa[3:0]-1;if (numa == 8'd2)tempa <= 0;endendelsebeginlampa <= 3'b000;counta <= 0; tempa <= 0;endendalways @(posedge clk_out2) //控制B方向的四种灯的亮灭及亮的时间beginif(en)beginif(!tempb)begintempb <= 1;case(countb)2'd0:begin numb <= bgreen; lampb <= 3'b110; countb <= 2'd1;end2'd1:begin numb <= byellow; lampb <= 3'b101; countb <= 2'd2;end2'd2:begin numb <= bred; lampb <= 3'b011; countb <= 2'd0;endendcaseendelsebeginif(numb[3:0]==0)beginnumb[3:0] <= 4'd9;numb[7:4] <= numb[7:4]-1;endelse numb[3:0] <= numb[3:0]-1;if (numb == 8'd2)tempb <= 0;endendelsebeginlampb <= 3'b000;countb <= 0; tempb <= 0;endendalways @(posedge clk_out1)begina<=a+1;endalways @(posedge clk_out1)begincase(a) //数码管显示什么样的数2'd0:disp_dat = numa[3:0];2'd1:disp_dat = numa[7:4];2'd2:disp_dat = numb[3:0];2'd3:disp_dat = numb[7:4];endcasecase(a) //数码管位选2'd0:dig = 8'b10111111;2'd1:dig = 8'b01111111;2'd2:dig = 8'b11111110;2'd3:dig = 8'b11111101;endcaseendalways @(disp_dat)begincase(disp_dat) //数码管译码4'h0:seg = 8'hc0; //显示04'h1:seg = 8'hf9; //显示14'h2:seg = 8'ha4; //显示24'h3:seg = 8'hb0; //显示34'h4:seg = 8'h99; //显示44'h5:seg = 8'h92; //显示54'h6:seg = 8'h82; //显示64'h7:seg = 8'hf8; //显示74'h8:seg = 8'h80; //显示84'h9:seg = 8'h90;endcaseendendmodule交通灯RTL电路交通灯门级网表实际效果。
FPGA交通灯实验报告
交通灯实验报告一,实验目的实现两路信号灯交替亮起,并利用两组数码管分别对两路信号进行倒计时。
两路信号时间分别为:V:绿灯(30S)H:红灯(35S)黄灯(5s)绿灯(30S)红灯(35S)黄灯(5S)二,实验步骤建立工程可在欢迎界面点击“Creat a New Project”进入工程建立界面,亦可关闭欢迎界面,点击菜单栏的“File”,点击“New Project Wizard”进入建立工程界面。
右侧为建立工程界面,点击next。
在此界面选定工程路径,取好工程名,点击“Next”。
注意:路径中不能有中文,工程名也不能有中文。
一直点击“Next”进入器件设置界面,DE2-70开发工具采用的Cyclone II系列的EP2C70F896C6N。
点击“Finish”,完成工程建立1、点击“File”,点击“New”选择“Verilog HDL”2,点击主界面工具栏中的选择“Verilog HDL”3、写入verilog代码。
代码如下:moduletraffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always(posedge Clk_50M or negedge Rst)beginif(!Rst)beginCnt_1Hz<=1;Clk_1Hz<=1;endelsebeginif(Cnt_1Hz>=25000000)beginCnt_1Hz<=1;Clk_1Hz<=~Clk_1Hz;endelseCnt_1Hz<=Cnt_1Hz + 1;endend//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always(posedge Clk_1Hz)begincase(state)S1:beginif(Cnt30>=30)Cnt30<=1;elseCnt30<=Cnt30 + 1;endS2:beginif(Cnt30>=5)Cnt30<=1;elseCnt30<=Cnt30 + 1;endS3:beginif(Cnt30>=30)Cnt30<=1;elseCnt30<=Cnt30 + 1;endS4:beginif(Cnt30>=5)Cnt30<=1;elseCnt30<=Cnt30 + 1;endendcaseendalways(posedge Clk_1Hz) begincase(stateV)S1:beginif(CntV>=30)CntV<=1;elseCntV<=CntV + 1;endS2:beginif(CntV>=5)CntV<=1;elseCntV<=CntV + 1;endS3:beginif(CntV>=35)CntV<=1;elseCntV<=CntV + 1;endendcaseendalways(posedge Clk_1Hz)begincase(stateH)S1:beginif(CntH>=35)CntH<=1;elseCntH<=CntH + 1;endS2:beginif(CntH>=30)CntH<=1;elseCntH<=CntH + 1;endS3:beginif(CntH>=5)CntH<=1;elseCntH<=CntH + 1;endendcaseendalways(negedge Clk_50M or negedge Rst) begincase(state)S1:CntVV=30-CntV;S2:CntVV=5-CntV;S3:CntVV=35-CntV;S4:CntVV=35-CntV;endcaseendalways(negedge Clk_50M or negedge Rst)begincase(state)S1:CntHH=35-CntH;S2:CntHH=35-CntH;S3:CntHH=30-CntH;S4:CntHH=5-CntH;endcaseend//16进制计数器转换为用于显示的10进制计数器always(posedge Clk_50M)beginif(CntVV>29)beginCntDis[7:4]<=3;CntDis[3:0]<=CntVV - 30;endelse if(CntVV>19)beginCntDis[7:4]<=2;CntDis[3:0]<=CntVV - 20;endelse if(CntVV>9)beginCntDis[7:4]<=1;CntDis[3:0]<=CntVV - 10;elseCntDis<=CntVV;endSEG7_LUT hex4(Seg7_VL,CntDis[3:0]); SEG7_LUT hex5(Seg7_VH,CntDis[7:4]);always(posedge Clk_50M)beginif(CntHH>29)beginCntDiss[7:4]<=3;CntDiss[3:0]<=CntHH - 30;endelse if(CntHH>19)beginCntDiss[7:4]<=2;CntDiss[3:0]<=CntHH - 20;endelse if(CntHH>9)beginCntDiss[7:4]<=1;CntDiss[3:0]<=CntHH - 10;endelseCntDiss<=CntHH;endSEG7_LUT hex1(Seg7_HL,CntDiss[3:0]); SEG7_LUT hex2(Seg7_HH,CntDiss[7:4]); //-----------30 counter and seg7----end---- reg [1:0]state,stateH,stateV;always(posedge Clk_1Hz)begincase(state)S1:if(Cnt30>=30)beginstate<=S2;endS2:if(Cnt30>=5)beginstate<=S3;S3:if(Cnt30>=30)beginstate<=S4;endS4:if(Cnt30>=5)beginstate<=S1;enddefault:beginstate<=S1;endendcaseendalways(posedge Clk_1Hz)begincase(state)S1:beginstateH<=S1;stateV<=S1;endS2:beginstateH<=S1;stateV<=S2;endS3:beginstateH<=S2;stateV<=S3;endS4:beginstateH<=S3;stateV<=S3;endendcaseendalways(posedge Clk_50M or negedge Rst)beginif(!Rst)beginLedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;endelsebegincase(state)S1:beginLedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;endS2:beginLedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;endS3:beginLedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;endS4:beginLedR_H<=0;LedG_H<=0;LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;enddefault:beginLedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;endendcaseendendassign led15=state;endmodulemodule SEG7_LUT ( oSEG,iDIG );input [3:0] iDIG;output [6:0] oSEG;reg [6:0] oSEG;always (iDIG)begincase(iDIG)4'h1: oSEG = 7'b1111001; // ---t----4'h2: oSEG = 7'b0100100; // | |4'h3: oSEG = 7'b0110000; // lt rt4'h4: oSEG = 7'b0011001; // | |4'h5: oSEG = 7'b0010010; // ---m----4'h6: oSEG = 7'b0000010; // | |4'h7: oSEG = 7'b1111000; // lb rb4'h8: oSEG = 7'b0000000; // | |4'h9: oSEG = 7'b0011000; // ---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcaseendendmodule编译工程保存文件,将文件放在所建工程所在路径下点击主界面工具栏中的图标也可点击菜单栏中“Pro cessing”,点击“Start Compilation”分配关键如下:Clk_50M Input PIN_AD15LedG_H Output PIN_AD9LedG_V Output PIN_AJ6LedR_H Output PIN_AJ7 )LedR_V Output PIN_AJ5 )LedY_H Output PIN_AD8LedY_V Output PIN_AK5Rst Input PIN_AA23Seg7_HH[6] Output PIN_G1Seg7_HH[5] Output PIN_H3Seg7_HH[4] Output PIN_H2Seg7_HH[3] Output PIN_H1Seg7_HH[2] Output PIN_J2Seg7_HH[1] Output PIN_J1Seg7_HH[0] Output PIN_K3Seg7_HL[6] Output PIN_E4Seg7_HL[5] Output PIN_F4Seg7_HL[4] Output PIN_G4Seg7_HL[3] Output PIN_H8Seg7_HL[2] Output PIN_H7Seg7_HL[1] Output PIN_H4Seg7_HL[0] Output PIN_H6Seg7_VH[6] Output PIN_AD17Seg7_VH[5] Output PIN_AF17 7Seg7_VH[4] Output PIN_AE17 7Seg7_VH[3] Output PIN_AG16Seg7_VH[2] Output PIN_AF16 7Seg7_VH[1] Output PIN_AE16 7Seg7_VH[0] Output PIN_AG13Seg7_VL[6] Output PIN_AD12Seg7_VL[5] Output PIN_AD11Seg7_VL[4] Output PIN_AF10 8Seg7_VL[3] Output PIN_AD10Seg7_VL[2] Output PIN_AH9 8Seg7_VL[1] Output PIN_AF9 8Seg7_VL[0] Output PIN_AE8 8烧写代码在管脚配置完成后,还需将工程再编译一次,成功后,点击主界面工具栏中的亦可点击主界面菜单栏中“Tools”,点击“Programmer”进入代码烧写界面后,点击“Start”,当“Progress”为100%时,表示烧写完成,这是可观察DE2-70板现象获得预期的效果,两组的信号红黄绿灯交替切换,计数器记为零时信号灯切换状态,红灯35s,黄灯5s,绿灯30s。
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盏灯依次按如下顺序点亮,并不断循环:绿灯----黄灯----红灯,并且每个方向红灯亮的时间应该与另一个方向绿灯、黄灯亮的时间相等。
基于VerilogHDL的交通灯控制器设计
目录第一章设计原理 (1)1.1设计要求 (1)1.2设计思路和原理 (1)1.3实现方法 (1)第二章Verilog 程序设计 (2)2.1整体设计 (2)2.2 具体设计 (3)第三章仿真 (7)3.1 波形仿真 (7)第四章设计总结 (9)4.1 总结 (9)4.2参考资料 (9)程序清单 (10)交通灯控制器设计第一章 设计原理1.1设计要求设计一个交通控制器,用LED 显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s ,支干道每次放行25s 。
每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s 。
能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED 灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
1.2设计思路和原理本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S 后,主干道和支干道上的黄灯都亮启,持续5S 后,主干道上红灯亮启,支干道上绿灯亮启持续25S ,之后主干道和支干道上的黄灯都亮启5s ,一个循环完成。
循环往复的直行这个过程。
其过程如下图所示:0s30s25s主干道方向支干道方向图1.交通灯点亮时间控制说明1.3实现方法本次采用文本编辑法,即利用Verilog 语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED 模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
第二章 Verilog 程序设计2.1整体设计根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:状状状状状状状状状状状状00状状10状状11状状01状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状状001100010010001010100010图2.交通灯控制状态转化说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。
verilog实验报告流水灯数码管秒表交通灯
流水灯实验目的:在basys2开发板上实现LED灯的花样流水的显示,如隔位显示,依次向左移位显示,依次向右移位显示,两边同时靠中间显示。
实验仪器:FPGA开发板一块,计算机一台。
实验原理:当一个正向的电流通过LED时,LED就会发光。
当阳极的电压高于阴极的电压时,LED就会有电流通过。
当在LED上增添一个典型值为1.5V—2.0V之间的电压时,LED就会有电流通过并发光。
实验内容:顶层模块:输入信号:clk_50MHz(主时钟信号),rst(重置信号),输出信号:[7:0] led(LED灯控制信号)。
module led_top(clkin,rst,led_out);input clkin, rst;output [7:0] led_out;wire clk_1hz;divider_1hz d0(clkin, rst, clk_1hz);led l0(clk_1hz, rst, led_out);endmodule分频模块:module divider_1hz(clkin,rst,clkout);input clkin,rst;output reg clkout;reg [24:0] cnt;always@(posedge clkin, posedge rst)beginif(rst) begincnt<=0;clkout<=0; endelse if(cnt==24999999) begincnt<=0;clkout=!clkout; endelse cnt<=cnt+1;endendmodule亮灯信号模块:module led(clkin,rst,led_out);input clkin,rst;output [7:0] led_out;reg [2:0] state;always@(posedge clkin, posedge rst)if(rst) state<=0;else state<=state+1;always@(state)case(state)3'b000:ledout<=8'b0000_0001;3'b001:ledout<=8'b0000_0010;3'b010:ledout<=8'b0000_0100;3'b011:ledout<=8'b0000_1000;3'b100:ledout<=8'b0001_0000;3'b101:ledout<=8'b0010_0000;3'b110:ledout<=8'b0100_0000;3'b111:ledout<=8'b1000_0000;endcaseendmodule实验中存在的问题:1 芯片选择问题automotive spartan3EXA3S100E XA3S250E CPG132spartan3EXC3S100E XC3S250E CP1322 时序逻辑部分,阻塞赋值和非阻塞赋值混用always@(posedge clk)begina=b+c;d<=e+f;end3 UCF文件格式错误NET “CLK” LOC = “B8”;NET “a” LOC = “N11”;NET “b” LOC = “G13”;NET “c[0]”LOC =“K11;数码管实验目的:设计一个数码管动态扫描程序,实现在四位数码管上动态循环显示“1”、“2”“3”“4”;实验仪器:FPGA开发板一块,计算机一台。
交通信号灯控制器的verilog实现
H a r b i n I n s t i t u t e o f T e c h n o l o g yV e r i l o g实验报告(2)实验内容:交通信号灯控制器班级:姓名:学号:哈尔滨工业大学2015年6月一、功能描述本设计利用Verilog HDL 语言,对一个十字路口的交通信号灯进行控制,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。
并通过ModelSim软件对系统进行了仿真。
仿真结果表明系统可自动实现十字路口红绿灯及左转弯信号灯的控制。
实现设计目标如下:(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿、左转四盏交通信号灯。
通过控制器对四个路口的四组交通灯的状态实现自动循环控制;(2)实现两主干道车辆交替运行,每次通行直行时间为30 秒;左转时间为10秒,右转不受信号灯控制。
(3)黄灯作为绿灯转为左转灯,左转灯转为红灯的过渡信号灯,过渡时间为5s。
(4)系统设有总复位开关,可在任意时间对系统进行复位。
二、设计方案1.设计思路我们对图1所示的十字路口进行设计,路口A和路口C的车辆同时行驶,路口B和路口D的车辆同时行驶,所以虽然要控制4组信号灯,但其实它们可以俩俩合并,这样大大简化了设计。
由于我们采用自动控制方式,两个方向的灯按照顺序依次交替循环显示,每种灯亮的时间结合实际生活合理设定。
系统设有复位开关,可在任意时间内对系统进行复位。
图1 十字路口示意图由以上分析可知,该系统可视为一个状态机,而且共有8种状态,如表1所示。
表1 交通灯状态示意表由上表我们还可以得到状态转换图,如图2所示:图2 状态转移示意图该状态机共有两个输入信号rstn和clk,rstn为复位信号,当该信号为低电平时,状态机处于S0,且状态不发生改变。
当rstn为高电平时,这8个状态依次按时间顺序发生变化,每个状态保持多长时间由clk信号控制。
三、关键代码1.我们通过宏定义来设置每个状态保持的时间,这样既增强了代码的可读性,又方便以后的更改。
基于Verilog HDL语言的带左转复杂交通灯设计
基于Verilog HDL语言的带左转复杂交通灯设计1 引言EDA技术是依靠功能强大的电子计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编辑、化简、分割、综合、优化和仿真,直至下载到可编程逻辑器件CPLD/FPGA或专用集成电路ASIC(Application Specific Integrated Circuit)芯片中,实现既定的电子电路设计功能。
EDA技术使得电子电路设计者的工作仅限于利用硬件描述语言和EDA软件平台来完成对系统硬件功能的实现,极大地提高了设计效率,缩短了设计周期,节省了设计成本。
实现路口交通灯系统的控制方法很多,可以用标准逻辑器件,可编程控制器PLC,单片机等方案来实现。
但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统调试的困难。
因此,在设计中采用EDA技术,应用目前广泛应用的Verilog HDL硬件电路描述语言,实现交通灯系统控制器的设计,利用MAX+PLUS 集成开发环境进行综合、仿真,并下载到CPLD可编程逻辑器件中,完成系统的控制作用。
2 Verilog HDL硬件描述语言的介绍Verilog HDL是目前应用最广泛的一种硬件描述语言。
Verilog HDL是在1983年由GDA(GateWay Design Automation)公司的Phil Moorby首创的。
1986年,他对Verilog HDL 的发展又作出了另一个巨大贡献:提出了用于快速门级仿真的XL算法。
Verilog-XL算法的成功,使Verilog HDL语言得到迅速发展。
基于Verilog HDL的优越性,IEEE于1995年制定了Verilog HDL 的IEEE标准,即Verilog HDL1364-1995。
Verilog HDL语言具有以下特点:基本逻辑门,例如and,or和nand等都内置在语言中。
Verilog实验报告交通灯
Verilog实验报告---第四次交通灯班级:集电0802班姓名:张鹏学号: 04086057序号: 16一、规范(1)具有开关功能:当reset=0时红绿灯关闭,使主支干道六个灯全灭;(2)具有四个功能:当reset=1且func=2’b00时,主干道和支路正常计数;且func=2’b01时,支干道一直绿灯,主干道一直红灯;且func=2’b10时,主干道一直绿灯,支干道一直红灯;且func=2’b11时,主干道和支干道一直黄灯闪;(3)计数器频率:运行频率2Hz计数器;(4)信号灯种类:红、黄、绿;(5)信号灯计执行时间关系:主干道:绿灯常亮+绿灯闪+黄灯=支干道:红灯常亮;此设计中:主干道:绿灯常亮=57s,T绿灯闪=3s,T黄灯亮=3s支干道:绿灯常亮=15s,T绿灯闪=3s,T黄灯亮=3s(6)信号灯到计时功能:信号灯预置后,开始执行2Hz计数器;(7)信号灯跳转功能:当各信号灯计时至T时在下一个时钟信号上升沿到来时自动转为下一状态;(8)信号灯各状态跳转关系:绿-黄-红-绿;二、输入输出定义reset,clk, func[1:0] ,green[1:0],red[1:0],yellow[1:0]信号名宽度输入/输出管脚描述reset 1 input L13 红绿灯总开关clk 1 input C9 freq:50MHz func 2 input N17/H18 控制红绿灯功能green[1] 1 output D11 主绿green[0] 1 output E11 支绿red[1] 1 output F11 主红red[0] 1 output F12 支红yellow[1] 1 output C11 主黄yellow[0] 1 output E12 支黄三、模块设计状态转移图:四、测试代码module frequency_divider_small(reset,clk,out); //重写一个小分频模块测试交通灯主模块功能input reset,clk;output out;reg [1:0] temp;reg out;always @ (posedge clk or negedge reset)if (!reset)temp<=2'b00;elsetemp<=(temp==2'b11)?2'b00:temp+2'b01;always @ (temp)out=(temp==2'b11);endmodulemodule test_traffic_light;reg reset,clk;reg [1:0] func;wire [1:0] green;wire [1:0] red;wire [1:0] yellow;traffic_lightsimulation(.reset(reset),.clk(clk),.func(func),.green(green),.red(red),.yellow(yellow));always #10 clk=~clk;initialbeginreset=0;clk=1;func=2'b00;#20 reset=1;#21000 func=2'b01;#10000 func=2'b10;#10000 func=2'b11;endendmodule波形:五、源代码module frequency_divider(reset,clk,out);//分频模块,把50MHz时钟分成半秒计时器input reset,clk;output out;reg [5:0] mol1,mol2;reg [6:0] mol3,mol4;reg out1,out2,out3,out;always @ (posedge clk or negedge reset)//把25000000分成40*40*125*125if(!reset)mol1<=6'd0;elsemol1<=(mol1==6'd39)?6'd0:mol1+6'd1;always @ (posedge clk or negedge reset)if(!reset)mol2<=6'd0;else if(out1)mol2<=(mol2==6'd39)?6'd0:mol2+6'd1;always @ (posedge clk or negedge reset)if(!reset)mol3<=7'd0;else if(out2)mol3<=(mol3==7'd124)?7'd0:mol3+7'd1;always @ (posedge clk or negedge reset)if(!reset)mol4<=7'd0;else if(out3)mol4<=(mol4==7'd124)?7'd0:mol4+7'd1;always @ (mol1 or mol2 or mol3 or mol4)beginout1=(mol1==6'd39);out2=((mol2==6'd39)&&out1);out3=((mol3==7'd124)&&out2);out=((mol4==7'd124)&&out3);endendmodulemodule traffic_light(reset,clk,func,green,red,yellow);//交通灯主模块input reset,clk;input [1:0] func;output [1:0] green,red,yellow;reg [1:0] green,red,yellow;reg [2:0] state;reg [6:0] cnt;wire in;parameter greentime1=6'd57;//主干道绿灯时间parameter greentime0=6'd27;//支干道绿灯时间parameter yellowtime=3'd3;//黄灯时间,绿灯闪时间frequency_divider fenpin(.reset(reset),.clk(clk),.out(in));//调用分频模块always @ (posedge clk or negedge reset)if(!reset)begincnt<=7'd0;state<=3'd1;green<=2'b00;red<=2'b00;yellow<=2'b00;endelseif(in)//分频器结果当主模块始能if(func==2'b00)//选择不同功能控制开关if(cnt==7'd0)case(state)//选择不同状态3'd1:begincnt<=greentime1<<1;state<=3'd2;green<=2'b10;red<=2'b01;yellow<=2'b00;end3'd2:begincnt<=yellowtime<<1;state<=3'd3;end3'd3:begincnt<=yellowtime<<1;state<=3'd4;green<=2'b00;red<=2'b01;yellow<=2'b10;end3'd4:begincnt<=greentime1<<1;state<=3'd5;green<=2'b01;red<=2'b10;yellow<=2'b00;end3'd5:begincnt<=yellowtime<<1;state<=3'd6;end3'd6:begincnt<=yellowtime<<1;state<=3'd1;green<=2'b00;red<=2'b10;yellow<=2'b01;endendcaseelsebegincnt<=cnt-7'd1;//倒计数,计数结束进入下一状态case(state)3'd3:green[1]<=cnt[0];//主干道绿灯闪3'd6:green[0]<=cnt[0];//支干道绿灯闪endcaseendelse if(func==2'b10)//主干道常绿,支干道常红begincnt<=0;state<=3'd1;green<=2'b10;red<=2'b01;yellow<=2'b00;endelse if(func==2'b01)//主干道常红,支干道常绿begincnt<=0;state<=3'd1;green<=2'b01;red<=2'b10;yellow<=2'b00;endelse if(func==2'b11)//主干道,支干道黄灯一直闪begincnt<=0;state<=3'd1;green<=2'b00;red<=2'b00;yellow[1]<=~yellow[1];yellow[0]<=~yellow[1];endendmodule。
FPGA交通灯实验报告
交通灯实验报告一,实验目的实现两路信号灯交替亮起,并利用两组数码管分别对两路信号进行倒计时。
两路信号时间分别为:V:绿灯(30S)H:红灯(35S)黄灯(5s)绿灯(30S)红灯(35S)黄灯(5S)二,实验步骤建立工程可在欢迎界面点击“Creat a New Project”进入工程建立界面,亦可关闭欢迎界面,点击菜单栏的“File”,点击“New Project Wizard”进入建立工程界面。
右侧为建立工程界面,点击next。
在此界面选定工程路径,取好工程名,点击“Next”。
注意:路径中不能有中文,工程名也不能有中文。
一直点击“Next”进入器件设置界面,DE2-70开发工具采用的Cyclone II系列的EP2C70F896C6N。
点击“Finish”,完成工程建立1、点击“File”,点击“New”选择“Verilog HDL”2,点击主界面工具栏中的选择“Verilog HDL”3、写入verilog代码。
代码如下:moduletraffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always@(posedge Clk_50M or negedge Rst)beginif(!Rst)beginCnt_1Hz<=1;Clk_1Hz<=1;endelsebeginif(Cnt_1Hz>=25000000)beginCnt_1Hz<=1;Clk_1Hz<=~Clk_1Hz;endelseCnt_1Hz<=Cnt_1Hz + 1;endend//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always@(posedge Clk_1Hz)begincase(state)S1:beginif(Cnt30>=30)Cnt30<=1;elseCnt30<=Cnt30 + 1;endS2:beginif(Cnt30>=5)Cnt30<=1;elseCnt30<=Cnt30 + 1;endS3:beginif(Cnt30>=30)Cnt30<=1;elseCnt30<=Cnt30 + 1;endS4:beginif(Cnt30>=5)Cnt30<=1;elseCnt30<=Cnt30 + 1;endendcaseendalways@(posedge Clk_1Hz) begincase(stateV)S1:beginif(CntV>=30)CntV<=1;elseCntV<=CntV + 1;endS2:beginif(CntV>=5)CntV<=1;elseCntV<=CntV + 1;endS3:beginif(CntV>=35)CntV<=1;elseCntV<=CntV + 1;endendcaseendalways@(posedge Clk_1Hz)begincase(stateH)S1:beginif(CntH>=35)CntH<=1;elseCntH<=CntH + 1;endS2:beginif(CntH>=30)CntH<=1;elseCntH<=CntH + 1;endS3:beginif(CntH>=5)CntH<=1;elseCntH<=CntH + 1;endendcaseendalways@(negedge Clk_50M or negedge Rst) begincase(state)S1:CntVV=30-CntV;S2:CntVV=5-CntV;S3:CntVV=35-CntV;S4:CntVV=35-CntV;endcaseendalways@(negedge Clk_50M or negedge Rst) begincase(state)S1:CntHH=35-CntH;S2:CntHH=35-CntH;S3:CntHH=30-CntH;S4:CntHH=5-CntH;endcaseend//16进制计数器转换为用于显示的10进制计数器always@(posedge Clk_50M)beginif(CntVV>29)beginCntDis[7:4]<=3;CntDis[3:0]<=CntVV - 30;endelse if(CntVV>19)beginCntDis[7:4]<=2;CntDis[3:0]<=CntVV - 20;endelse if(CntVV>9)beginCntDis[7:4]<=1;CntDis[3:0]<=CntVV - 10;elseCntDis<=CntVV;endSEG7_LUT hex4(Seg7_VL,CntDis[3:0]); SEG7_LUT hex5(Seg7_VH,CntDis[7:4]);always@(posedge Clk_50M)beginif(CntHH>29)beginCntDiss[7:4]<=3;CntDiss[3:0]<=CntHH - 30;endelse if(CntHH>19)beginCntDiss[7:4]<=2;CntDiss[3:0]<=CntHH - 20;endelse if(CntHH>9)beginCntDiss[7:4]<=1;CntDiss[3:0]<=CntHH - 10;endelseCntDiss<=CntHH;endSEG7_LUT hex1(Seg7_HL,CntDiss[3:0]); SEG7_LUT hex2(Seg7_HH,CntDiss[7:4]); //-----------30 counter and seg7----end---- reg [1:0]state,stateH,stateV;always@(posedge Clk_1Hz)begincase(state)S1:if(Cnt30>=30)beginstate<=S2;endS2:if(Cnt30>=5)beginstate<=S3;S3:if(Cnt30>=30)beginstate<=S4;endS4:if(Cnt30>=5)beginstate<=S1;enddefault:beginstate<=S1;endendcaseendalways@(posedge Clk_1Hz)begincase(state)S1:beginstateH<=S1;stateV<=S1;endS2:beginstateH<=S1;stateV<=S2;endS3:beginstateH<=S2;stateV<=S3;endS4:beginstateH<=S3;stateV<=S3;endendcaseendalways@(posedge Clk_50M or negedge Rst)beginif(!Rst)beginLedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;endelsebegincase(state)S1:beginLedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;endS2:beginLedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;endS3:beginLedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;endS4:beginLedR_H<=0;LedG_H<=0;LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;enddefault:beginLedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;endendcaseendendassign led15=state;endmodulemodule SEG7_LUT ( oSEG,iDIG );input [3:0] iDIG;output [6:0] oSEG;reg [6:0] oSEG;always @(iDIG)begincase(iDIG)4'h1: oSEG = 7'b1111001; // ---t----4'h2: oSEG = 7'b0100100; // | |4'h3: oSEG = 7'b0110000; // lt rt4'h4: oSEG = 7'b0011001; // | |4'h5: oSEG = 7'b0010010; // ---m----4'h6: oSEG = 7'b0000010; // | |4'h7: oSEG = 7'b1111000; // lb rb4'h8: oSEG = 7'b0000000; // | |4'h9: oSEG = 7'b0011000; // ---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcaseendendmodule编译工程保存文件,将文件放在所建工程所在路径下点击主界面工具栏中的图标也可点击菜单栏中“Processing”,点击“Start Compilation”分配关键如下:Clk_50M Input PIN_AD15LedG_H Output PIN_AD9LedG_V Output PIN_AJ6LedR_H Output PIN_AJ7 )LedR_V Output PIN_AJ5 )LedY_H Output PIN_AD8LedY_V Output PIN_AK5Rst Input PIN_AA23Seg7_HH[6] Output PIN_G1Seg7_HH[5] Output PIN_H3Seg7_HH[4] Output PIN_H2Seg7_HH[3] Output PIN_H1Seg7_HH[2] Output PIN_J2Seg7_HH[1] Output PIN_J1Seg7_HH[0] Output PIN_K3Seg7_HL[6] Output PIN_E4Seg7_HL[5] Output PIN_F4Seg7_HL[4] Output PIN_G4Seg7_HL[3] Output PIN_H8Seg7_HL[2] Output PIN_H7Seg7_HL[1] Output PIN_H4Seg7_HL[0] Output PIN_H6Seg7_VH[6] Output PIN_AD17Seg7_VH[5] Output PIN_AF17 7Seg7_VH[4] Output PIN_AE17 7Seg7_VH[3] Output PIN_AG16Seg7_VH[2] Output PIN_AF16 7Seg7_VH[1] Output PIN_AE16 7Seg7_VH[0] Output PIN_AG13Seg7_VL[6] Output PIN_AD12Seg7_VL[5] Output PIN_AD11Seg7_VL[4] Output PIN_AF10 8Seg7_VL[3] Output PIN_AD10Seg7_VL[2] Output PIN_AH9 8Seg7_VL[1] Output PIN_AF9 8Seg7_VL[0] Output PIN_AE8 8烧写代码在管脚配置完成后,还需将工程再编译一次,成功后,点击主界面工具栏中的亦可点击主界面菜单栏中“Tools”,点击“Programmer”进入代码烧写界面后,点击“Start”,当“Progress”为100%时,表示烧写完成,这是可观察DE2-70板现象获得预期的效果,两组的信号红黄绿灯交替切换,计数器记为零时信号灯切换状态,红灯35s,黄灯5s,绿灯30s。
VerilogHDL编写的交通灯
1. module trafficlight(clk,lx,lx_l,lx_r,ly,ly_l,ly_r,c,done,m);input clk,c;//始终和初始化控制output done;output [5:0]m;//倒计时寄存器output lx,lx_l,lx_r,ly,ly_l,ly_r;//指示灯(分别是X、Y方向的直行、左转和右转)reg lx,lx_l,lx_r,ly,ly_l,ly_r;reg [5:0]m;reg [1:0]state;//状态机reg done;parameters0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;//-------------------------------------------//状态模块always@(posedge clk)if(c)begin done<=1;state<=2'b00;endelsebegincase(state)s0:if(done)begin m<=6'd44;done<=0;endelse if(m>1) m<=m-1;elsebegin state<=s1;done<=1;m<=0;ends1:if(done)begin m<=6'd24;done<=0;endelse if(m>1) m<=m-1;elsebegin state<=s2;done<=1;m<=0;ends2:if(done)begin m<=6'd29;done<=0;endelse if(m>1) m<=m-1;elsebegin state<=s3;done<=1;m<=0;ends3:if(done)begin m<=6'd14;done<=0;endelse if(m>1) m<=m-1;elsebegin state<=s0;done<=1;m<=0;endendcaseend//-----------------------------------------//输出模块always@(posedge clk)begincase(state)s0:{lx,lx_l,lx_r,ly,ly_l,ly_r}<=6'b101001;s1:{lx,lx_l,lx_r,ly,ly_l,ly_r}<=6'b011001; s2:{lx,lx_l,lx_r,ly,ly_l,ly_r}<=6'b001101; s3:{lx,lx_l,lx_r,ly,ly_l,ly_r}<=6'b001011; endcaseend//-------------------------------------------- endmodule2.生成的状态机3.整体的图,四个状态都包括X方向由直行变左转,符合倒计时的要求。
基于verlilog hdl的交通信号灯电路设计
基于Verilog HDL的交通信号灯电路设计1. 引言交通信号灯是城市道路交通管理中不可或缺的一部分,它通过不同颜色的灯光来指示车辆和行人何时停止和通行。
本文将介绍基于Verilog HDL的交通信号灯电路设计。
2. 设计目标本次设计的目标是实现一个简单的交通信号灯电路,包括红、黄、绿三种状态。
具体要求如下:•红灯亮时,其他两个灯应熄灭。
•黄灯亮时,其他两个灯应熄灭。
•绿灯亮时,其他两个灯应熄灭。
•红、黄、绿三个状态按照固定时间间隔循环切换。
3. 电路设计3.1 总体结构本次设计采用有限状态机(FSM)来实现交通信号灯电路。
有限状态机是一种数学模型,可以描述系统在不同状态之间的转移和输出。
我们将使用Verilog HDL来描述并实现这个有限状态机。
3.2 状态定义根据设计目标,我们可以定义三种状态:红、黄、绿。
我们可以用二进制数来表示这三种状态,比如红色为00,黄色为01,绿色为10。
我们可以使用两个输出信号来表示当前状态:red和green。
3.3 状态转移根据设计目标,交通信号灯应该按照固定时间间隔循环切换状态。
我们可以使用一个计数器来实现这个功能。
当计数器的值达到一定阈值时,状态应该切换到下一个状态。
具体的状态转移如下:•当前状态为红色时(00),计数器的值递增。
–当计数器的值达到阈值时,切换到黄色状态(01),并重置计数器。
•当前状态为黄色时(01),计数器的值递增。
–当计数器的值达到阈值时,切换到绿色状态(10),并重置计数器。
•当前状态为绿色时(10),计数器的值递增。
–当计数器的值达到阈值时,切换到红色状态(00),并重置计数器。
3.4 Verilog HDL代码实现以下是基于Verilog HDL实现交通信号灯电路的代码:module traffic_light(input wire clk,output reg red,output reg yellow,output reg green);reg [1:0] state;reg [3:0] counter;parameter THRESHOLD = 4'b1010; // 阈值always @(posedge clk) begincase(state)2'b00: begin// 红灯状态if(counter == THRESHOLD) beginstate <= 2'b01; // 切换到黄灯状态counter <= 0;end else begincounter <= counter + 1;endend2'b01: begin// 黄灯状态if(counter == THRESHOLD) beginstate <= 2'b10; // 切换到绿灯状态counter <= 0;end else begincounter <= counter + 1;endend2'b10: begin// 绿灯状态if(counter == THRESHOLD) beginstate <= 2'b00; // 切换到红灯状态counter <= 0;end else begincounter <= counter + 1;endendendcaseendalways @(state) begincase(state)2'b00: begin// 红灯亮,其他两个灯熄灭red <= 1;yellow <= 0;green <= 0;end2'b01: begin// 黄灯亮,其他两个灯熄灭red <= 0;yellow <= 1;green <= 0;end2'b10: begin// 绿灯亮,其他两个灯熄灭red <= 0;yellow <= 0;green <= 1;endendcaseendendmodule4. 总结本文介绍了基于Verilog HDL的交通信号灯电路设计。
交通灯设计-verilog.
. . .. . .基于Verilog语言交通灯设计报告院系:工学院自动化系年级:14级班级:10班:周博学号:14032291这学期我学习了EDA技术及其创新实践这门课程,通过自己学习的容和自己查找的一些资料用Verilog语言编写交通灯的程序,并且完成了仿真。
Verilog HDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另一种是VHDL。
现在它们都已成为IEEE标准。
两者各有特点,但Verilog HDL拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。
一、设计背景和意义交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制。
在现代化的大城市中,十字交叉路口越来越多,在每个交叉路口都需要使用红绿灯进行交通指挥和管理,红、黄、绿灯的转换要有一个准确的时间间隔和转换顺序,这就需要有一个安全、自动的系统对红、黄、绿灯的转换进行管理,本系统就是基于此目的而开发的。
二、设计任务(1)设计一个交通红绿灯。
要求分主干道和支干道,每条道上安装红(主:red1,支:red2)绿(主:green1,支:green2)黄(主:yellow1,支:yellow2)三种颜色灯,由四种状态自动循环构成;(2)在交通灯处在不同的状态时,设计一个计时器以倒计时方式显示计时,主干道上绿灯亮30S,支干道上绿灯亮20S。
每个干道上,在绿灯转为红灯时,要求黄灯先亮5S。
在完成基本要求的基础上,可进一步增加功能、提高性能,如绿灯亮的时间可调。
三、设计方案1.工作原理:城市十字交叉路口红绿灯控制系统主要负责控制主干道走向和从干道走向的红绿灯的状态和转换顺序,关键是各个状态之间的转换和进行适当的时间延时,正是基于以上考虑,采用如下设计:S0:当主干道走向的绿灯亮时,从干道走向的红灯亮,并保持30sS1:当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5sS2:当主干道走向的红灯亮时,从干道走向的绿灯亮,并保持20sS3:当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5s在S3结束后又回到(1)状态,并周期重复进行。
基于verilog HDL数字系统设计--交通灯
交通灯控制器-------数字系统设计文档姓名:学号:一.课题简介:我在本课程中所选择的课题是用Verilog HDL 实现的交通灯控制器。
该交通灯控制器处在一个城乡结合处的十字路口,这个十字路口分为主干道和乡村公路,由于主干道的车流量远大于乡村公路的车流量,所以这个交通灯控制器不同于常见的交通灯控制器。
这个交通控制器的功能有如下几点:1.当乡村公路无车时,始终保持乡村公路红灯亮,主干道绿灯亮。
2.当乡村公路有车时,而主干道通车时间已经超过它的最短通车时间时,禁止主干道通行,让乡村公路通行。
主干道最短通车时间为25s 。
3.当乡村公路和主干道都有车时,按主干道通车25s,乡村公路通车16s交替进行。
4.不论主干道情况如何,乡村公路通车最长时间为16s。
5.在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s时间的黄灯作为过渡。
6.用开关代替传感器作为检测车辆是否到来的信号。
用红、绿、黄三种颜色的发光二极管作交通灯。
要求显示时间,倒计时。
二.控制框图和设计流程图:1.这个交通灯控制器由三个主要部分组成---核心控制器以及、译码器、分频器。
2.流程图的内容同上面交通灯的功能,这里不再多做解释。
三.各部分组件的具体实现和分析:1.核心控制器实现基本功能:(1)它的输入端有4个输入信号—C、RST、ST、CLK。
C信号是一个检测信号,检测乡村公路是否有车,C=0示无车,这种情况下乡村公路一直亮红灯,主干道一直亮红灯,并且两个计数器都同步30秒重复计数,直到C=1即乡村公路有车是才跳变到其他情况。
RST信号是复位信号,当RST=0时,这个交通灯控制器才能正常工作。
当RST=1时,所有计数器都立刻赋初值,并且乡村公路和主干道都亮红灯,表示交通灯控制器出了故障,为防止意外发生,禁止通行。
ST信号表示使能信号,当ST=1时,交通灯控制器才能正常工作。
ST=0时,所有计数器都停止计数,并且乡村公路和主干道都亮红灯,表示交通灯控制器出了故障,为防止意外发生,禁止通行。
交通灯设计实验报告-V1
交通灯设计实验报告-V1
(文章正文)
交通灯设计实验报告
一、实验目的
本实验旨在设计一个基于Verilog HDL硬件描述语言的交通灯控制电路,达到实现交通灯红绿灯切换的效果。
二、实验原理
本实验采用有限状态机(FSM)的设计方法,通过对红灯、绿灯和黄灯状态的转换来实现交通灯控制。
具体实现方法如下:
1. 初始化——初始状态下,所有灯均处于关闭状态。
2. 请求信号检测——检测到请求信号,进入下一状态。
3. 交通灯红灯状态——此状态下,绿灯关闭,黄灯关闭,红灯亮起。
4. 交通灯黄灯状态——此状态下,绿灯关闭,红灯关闭,黄灯亮起。
5. 交通灯绿灯状态——此状态下,红灯关闭,黄灯关闭,绿灯亮起。
6. 检测状态——状态周期循环完毕,回到初始化状态。
三、实验步骤
根据实验原理,设计并编写Verilog HDL代码,实现上述状态转换。
四、实验结果
在编译、综合和仿真的过程中,均未出现任何报错。
经过实验测试,交通灯控制电路能够按照要求实现红绿灯的切换。
五、实验总结
本实验通过有限状态机的设计方法,实现了一个基于Verilog HDL的交通灯控制电路。
同时,通过对代码的编写和仿真测试,进一步提高了对该硬件描述语言的理解和掌握。
我们还可通过使用FPGA实现该电路的物理实现,从而掌握硬件编程的基本技能和实际应用。
在今后的学习和研究中,我们可将这种硬件实现运用到图像处理、音频合成、逻辑控制等各个领域中,探究硬件与软件的融合之路,为未来的科技发展奠定坚实的基础。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四交通灯设计
一、实验目的和要求
1、了解交通灯控制原理
2、了解模块化设计方法
3、掌握数字系统设计的方法
4、通过仿真器观察输入输出波形,并能在FPGA开发板上实现交通灯控制系统
二、实验仪器
1、计算机
2、FPGA实验开发板
三、实验内容
(包括必要的步骤、原理,如状态图等)
1、完成系统的模块划分
2
3
十字路口交通灯程序代码: top(clk,rst,road1,road2);
clk, rst;
en5,en25,lin5,lin25;
u1(clk,rst,en5,lin5);
u2(clk,rst,en25,lin25);
u3(clk,rst,en5,en25,lin5,lin25,road1,road2);
clk,rst,en5;
lin5;
lin5;//对于timer 模块,lin5为输出口,所以用寄存器类型
count;
begin
count<=0;lin5<=0;
end
begin count<=count+1;
if(count==2_5000_0000) /*进行软件仿真时将数值改小,在实验时候跳转过快就是设置数值时少写了一个零*/
lin5<=1;
end
begin
count<=0 ; lin5<=0;
end
reg[31:0] count; //计数功能
//两句赋值语句间需用“;”号
//进行软件仿真时将数值改小
reg en5,en25;
reg[1:0] state; //状态分配,四个状态用2位即可满足
state<=0;/*刚将lin5<=0,lin25<=0;是不正确的,对寄存器才赋初值,en5,en25对于controller模块来说是输出端口,并且变量在always语句中,所以要用reg类型,对state预设零非常重要,不然就会出现像我在实验中六盏灯全亮的情况*/
/*对应红绿黄共阳极接法,出零灯亮*/
➢创建新的项目:[File]->[New Project] 选择器件属性
➢创建源文件:[Project]->[New Source]->Verilog Module 输入交通灯程序代码(上图所示)
➢设计综合:使用ISE自带的综合工具XST 检查程序是否有误
➢调试仿真波形仿真
✓创建测试矢量波形文件:[Project]->[New Source]->Test Bench Waveform ✓初始化输入波形
✓启动ModelSim进行行为仿真
➢设计实现
✓启动设计实现:[Implement Design]
✓可以在布局规划器(Floorplanner)中查看设计布局:[Place & Route]->[View/Edit Placed Design(Floorplanner)]
➢下载调试将Verilog程序完成的电路配置到芯片里,并让芯片运行,观察并调试结果
四:实验结果
(说明实验的结果显示,最好包括波形和文字的)
四、小结
(对实验的心得,以及在试验中碰到的问题,你是如何解决这个问题的)
➢进行软件仿真时要注意源程序代码的修改
✓if(!rst) begin en5<=0,en25<=0; state<=0;end /*刚将lin5<=0,lin25<=0;是不正确的,对寄存器才赋初值,en5,en25对于controller模块来说是输出端口,并且变
量在always语句中,所以要用reg类型,对state预设零非常重要,不然就会出
现像我在实验中六盏灯全亮的情况*/
✓if(!rst) begin
count<=0;lin25<=0;//两句赋值语句间需用“;”号
end
✓在进行程序设计时,一定先要分析系统的各个模块,以及各个模块之间的关系,画出模块之间的电路图。
✓在进行程序算法实现前,最好先分析一下各个状态,画出状态图,然后在根据分析特到的状态图进行程序编写。
娄水锋
08电信本。