当前位置:文档之家› Verilog交通灯

Verilog交通灯

实验报告班级:微电2班组员:刘家豪门珺学号:11180102目录一、概述 (4)二、任务功能 (5)三.系统设计 (5)1.工作原理 (5)2.系统设计方案 (6)四、程序设计 (7)1.verilog源程序 (7)2.设备选择 (11)3引脚绑定 (12)五、结束语 (13)一:概述HDL(Hardware Description Language,硬件描述语言)是一种描述硬件所做工作的语言。

目前,电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,HDL在这种形势下显示出了巨大的优势,展望将来HDL在硬件设计领域的地位将与C和C++在软件设计领域地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法而成为主要的硬件描述工具。

Verilog HDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另一种是VHDL。

现在它们都已成为IEEE标准。

两者各有特点,但Verilog HDL 拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。

Quartus简介:Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL 以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。

具有运行速度快,界面统一,功能集中,易学易用等特点。

Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。

对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。

此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

二、任务功能交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制。

在现代化的大城市中,十字交叉路口越来越多,在每个交叉路口都需要使用红绿灯进行交通指挥和管理,红、黄、绿灯的转换要有一个准确的时间间隔和转换顺序,这就需要有一个安全、自动的系统对红、黄、绿灯的转换进行管理,本系统就是基于此目的而开发的。

基本要求:1. 模拟一个交通灯系统2.正常的时候东西路口分别计时30秒和45秒的绿灯时间3.需要用七段数码管来显示剩余的时间三、系统设计1.工作原理:城市十字交叉路口红绿灯控制系统主要负责控制主干道走向和从干道走向的红绿灯的状态和转换顺序,关键是各个状态之间的转换和进行适当的时间延时,正是基于以上考虑,采用如下设计:S0:当主干道走向的绿灯亮时,从干道走向的红灯亮,并保持30sS1:当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5sS2:当主干道走向的红灯亮时,从干道走向的绿灯亮,并保持20sS3:当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5s在S3结束后又回到(1)状态,并周期重复进行。

状态图如下:30秒5秒5秒20秒2.系统设计方案:根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图所示:四、程序设计1.verilog源程序:module diplay (seg,wh,disdata,diswh);output [7:0] seg;output [3:0] wh;input [3:0] disdata;input [1:0] diswh;segdecoder u1 (.outdata(seg),.indata(disdata));decoder2_4 u2 (.sel(wh),.dat(diswh));Endmodulemodule dvi1hz(clkout,clk,rst);//in:50MHz,out:1Hzinput clk,rst;output clkout;reg [24:0] cnt;reg clkout;always@(posedge clk or negedge rst)beginif(rst==1'b0) begincnt<=25'd0;clkout<=1'b0;endelse if(cnt==25'd2*******) begincnt<=25'd0;clkout<=~clkout;endelsecnt<=cnt+1'b1;endendmodulemodule cnt4(dclk,outdata,rst);input dclk,rst;output [1:0] outdata;reg [1:0] outdata;always@(posedge dclk or negedge rst)beginif(rst==1'b0)outdata<=2'b00;//else if(outdata==1'b11)// outdata<=4'b0000;elseoutdata<=outdata+1'b1;endendmodulemodule dvi200hz(clkout,clk,rst);//in:50MHz,out:100Hzinput clk,rst;output clkout;reg [18:0] cnt;reg clkout;always@(posedge clk or negedge rst)beginif(rst==1'b0) begincnt<=19'd0;clkout<=1'b0;endelse if(cnt==19'd124999) begincnt<=19'd0;clkout<=~clkout;endelsecnt<=cnt+1'b1;endendmodulemodule shuzi (bin,state,acount,bcount);output [3:0] bin;input [1:0] state;input [7:0] acount,bcount;reg [3:0] bin;wire [3:0]gewei,shiwei,baiwei,qianwei;assign qianwei=acount/10%10;assign baiwei =acount%10;assign shiwei =bcount/10%10;assign gewei =bcount%10;always@(state)case(state)2'b00 : bin<=qianwei;2'b01 : bin<=baiwei;2'b10 : bin<=shiwei;2'b11 : bin<=gewei;default bin<=4'd0;endcaseendmoduleclk: 同步时钟;en: 使能信号,高电平有效,则控制器开始工作;pointa: 控制A 方向四盏灯的亮灭;其中,pointa0~pointa3,分别控制A 方向的左拐灯、绿灯、黄灯和红灯;pointb: 控制B 方向四盏灯的亮灭;其中,pointb0 ~ pointb3,分别控制B 方向的左拐灯、绿灯、黄灯和红灯;acount:用于A 方向灯的时间显示,8 位,可驱动两个数码管;bcount:用于B 方向灯的时间显示,8 位,可驱动两个数码管。

*/module traffic(rst,clk,en,pointa,pointb,acount,bcount);output [6:0] acount,bcount;output [3:0] pointa,pointb;input rst,clk,en;reg [6:0] numa,numb;reg tempa,tempb;reg [2:0] counta,countb;reg [6:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;reg [3:0] pointa,pointb;always @(en)if(!en)begin //设置各种灯的计数器的预置数ared <=7'd55; //55 秒ayellow <=7'd5; //5 秒agreen <=7'd45; //45 秒aleft <=7'd15; //15 秒bred <=7'd70; //70 秒byellow <=7'd5; //5 秒bleft <=7'd15; //15 秒bgreen <=7'd30; //30 秒endassign acount=numa;assign bcount=numb;always @(posedge clk) //该进程控制A方向的四种灯beginif(en)beginif(rst==1'b0)numa<=7'd0;if(!tempa)begintempa<=1;case(counta) //控制亮灯的顺序0: begin numa<=agreen; pointa<=2; counta<=1; end1: begin numa<=ayellow; pointa<=4; counta<=2; end2: begin numa<=aleft; pointa<=1; counta<=3; end3: begin numa<=ayellow; pointa<=4; counta<=4; end4: begin numa<=ared; pointa<=8; counta<=0; enddefault: pointa<=8;endcaseendelse begin //倒计时if(numa>1)if(numa[3:0]==4'd0) beginnuma[3:0]<=4'b1111;numa[6:4]<=numa[6:4]-1;endelse numa[3:0]<=numa[3:0]-1;if (numa==2) tempa<=0;endendelse beginpointa<=4'b1000;counta<=0; tempa<=0;endendalways @(posedge clk) //该进程控制B方向的四种灯beginif (en)beginif(!tempb)begintempb<=1;case (countb) //控制亮灯的顺序0: begin numb<=bred; pointb<=8; countb<=1; end1: begin numb<=bgreen; pointb<=2; countb<=2; end2: begin numb<=byellow; pointb<=4; countb<=3; end3: begin numb<=bleft; pointb<=1; countb<=4; end4: begin numb<=byellow; pointb<=4; countb<=0; enddefault: pointb<=8;endcaseendelse begin //倒计时if(numb>1'b1)if(!numb[3:0]) beginnumb[3:0]<=4'b1111;numb[6:4]<=numb[6:4]-1'b1;endelse numb[3:0]<=numb[3:0]-1'b1;if(numb==2'd2) tempb<=0;endendelse beginpointb<=4'b1000;tempb<=0; countb<=0;endendendmodule2.设备选择:3.引脚绑定六、结束语这次课程设计让我学到了很多,不仅是巩固了先前学的verilog的理论知识,而且也培养了我的动手能力,更加熟悉了Quartus的使用和EDA的设计流程,更令我的创造性思维得到拓展。

相关主题