交通信号灯控制器的verilog实现
- 格式:docx
- 大小:76.05 KB
- 文档页数:11
verilog课程设计交通灯一、教学目标本节课的教学目标是使学生掌握Verilog HDL的基本知识,能够使用Verilog编写简单的交通灯控制系统。
具体来说,知识目标包括理解Verilog的基本语法、模块化设计方法以及状态机的设计原理;技能目标包括能够使用Verilog编写交通灯控制器的代码,并能够进行仿真测试;情感态度价值观目标包括培养学生的团队合作意识,提高他们对电子工程的兴趣。
二、教学内容本节课的教学内容主要包括Verilog基础知识、模块化设计方法、状态机设计原理以及交通灯控制系统的实现。
具体来说,首先介绍Verilog的基本语法,包括数据类型、运算符、语句等;然后讲解模块化设计方法,如何将复杂的系统分解为简单的模块,并介绍模块的调用和连接;接着介绍状态机的设计原理,如何根据状态转移图编写状态机的Verilog代码;最后,通过实例讲解如何使用Verilog编写交通灯控制系统的代码,并进行仿真测试。
三、教学方法为了达到本节课的教学目标,将采用多种教学方法相结合的方式进行教学。
首先,通过讲授法,为学生讲解Verilog的基本语法、模块化设计方法和状态机设计原理;然后,通过案例分析法,分析交通灯控制系统的实现过程,让学生加深对知识的理解;接着,通过实验法,让学生动手编写交通灯控制器的Verilog代码,并进行仿真测试,提高他们的实践能力;最后,通过讨论法,让学生分享自己的学习心得,培养他们的团队合作意识。
四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源:教材《Verilog HDL Primer》和相关参考书,用于讲解Verilog的基本语法和设计方法;多媒体教学课件,用于展示交通灯控制系统的原理和实现过程;实验设备,包括计算机和仿真器,用于让学生动手编写代码并进行仿真测试。
此外,还将提供在线编程平台,让学生可以随时随地编写代码并进行调试。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观、公正地评价学生的学习成果。
1.声明一个名为oscillate的寄存器变量并将它初始化为0。
使其每30个时间单位进行一次取反操作。
不要使用always语句。
提示:使用forever循环。
答:代码如下:reg oscillate;initialbeginoscillate<=0;forever #30 oscillate<=~oscillate;end2.设计一个周期为40个时间单位的时钟信号,其占空比为25%。
使用always和initial块进行设计。
将其在仿真0时刻的值初始化为0。
答:代码如下:reg clock;initialclock<=0;alwaysbegin#30 clock<=1;#10 clock<=0;end3.给定下面含有阻塞过程赋值语句的initial块。
每条语句在什么仿真时刻开始执行?a,b,c 和d在仿真过程中的中间值和仿真结束时的值是什么?答:仿真输出结果:4.在第3题中,如果initial块中包括的是非阻塞过程赋值语句,那么各个问题的答案是什么?答:第7章行为级建模79最终d没有输出,因为d<= #20 {a,b,c};语句执行的是先将a,b,c取值存储,在20个时间单位后将存储的值赋给d,因为b,c在初始时刻没有值,所以d值也是不确定的。
5.指出在下面的Verilog代码中各条语句的执行顺序。
其中是否含有不确定的执行顺序?a,b,c和d的最终值是什么?答:先执行a=1’b0,b=1’b1,然后执行#0 c=b,#0 d=a,执行顺序不确定,最终输出结果a=0,b=1,c=1,d=0. 6.在下面的例子中,d的最终值是什么?答:仿真输出波形如下,最终输出结果d=1。
0时刻b|c的值是1,在25个时间刻度后赋给d。
7.使用带有同步清零端的D触发器(清零端高电平有效,在时钟下降沿执行清零操作)设计一个下降沿触发的D触发器,只能使用行为语句。
提示:D触发器的输出q应当声明为寄存器变量。
一、设计任务要求交通灯控制器:用于十字路口的交通灯控制器.实验要求:1.东西方向各有一组红,黄,绿灯用于指挥交通,红,黄,绿的持续时间分别为25s,5s,20s。
2.当有紧急情况(如消防车)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,正常工作。
3.组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间.二、设计思路及总体结构框图设计思路:1.硬件:由设计任务要求可知,总体输入电路有:(1)在开始计时之前的等待状态,复位键reset接低电位,接通电源后,首先要将它接高电位,表示计时开始。
(2)当按一下(on_off)键,表示紧急情况发生,两个方向均为红灯亮,计时停止,当再次按下(on_off)键时,控制器恢复原来状态,正常工作。
输出电路:(1)由于东西和南北方向都要显示时间,因此需要4个数码管,这样在设计中就需要四条输出线choose4,用来选通指定一个LED七段显示数码管。
(2)显示器的每一位都采用LED七段显示数码管进行显示,每一个LED七段显示数码管都要有七条输出线控制,一共使用4个七段数码管,故输出电路使用四个七位输出信号:showtime1,showtime2,showtime3,showtime4。
(3)东西和南北方向都有交通灯亮的情况,故输出电路中要有两个状态控制信号state1,state2分别控制东西和南北的灯,每个方向上有4个灯(增加了左、右转弯显示控制功能),所以state1,state2的类型应该是4位数组型的。
reset7/2.软件:(1)在VHDL设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:输入信号:复位开关信号reset;紧急情况控制信号on_off;外部时钟信号clk。
输出信号:LED七段显示数码管的选通信号choose4(3 downto 0);LED 七段显示数码管的输出信号showtime1(6 downto 0),showntime2(6 downto 0),showtime3(6 downto 0),showtome4(6 downto 0);交通灯状态控制信号state1(3 downto 0),state2(3 downto 0)。
fpga课程设计交通信号灯课程设计一、课程目标知识目标:1. 理解FPGA的基本原理和编程方法,掌握Verilog HDL语言的基本语法;2. 掌握交通信号灯的工作原理,了解其控制逻辑;3. 学会使用FPGA设计交通信号灯控制系统,并能进行基本的功能测试。
技能目标:1. 能够运用Verilog HDL语言设计基本的数字电路;2. 能够分析交通信号灯系统的需求,编写相应的控制代码;3. 能够在FPGA开发板上实现交通信号灯控制系统,并进行调试和优化。
情感态度价值观目标:1. 培养学生动手实践能力,提高解决实际问题的信心和兴趣;2. 培养学生团队协作精神,学会与他人共同分析和解决问题;3. 增强学生对交通安全的认识,树立遵守交通规则的意识。
课程性质:本课程为实践性课程,结合理论教学,注重培养学生的实际操作能力和创新意识。
学生特点:学生具备一定的电子技术基础知识,对FPGA和交通信号灯有一定了解,但实际操作能力有待提高。
教学要求:教师需结合学生特点,采用任务驱动法,引导学生自主探究和实践,确保学生能够达到课程目标。
在教学过程中,注重理论与实践相结合,关注学生的学习进度,及时调整教学方法和策略。
通过课程学习,使学生能够独立完成交通信号灯控制系统的设计与实现,提高学生的综合素养。
二、教学内容本课程教学内容主要包括以下三个方面:1. FPGA基础知识:讲解FPGA的基本原理、结构、编程方法和Verilog HDL 语言的基本语法。
参考教材相关章节,使学生掌握FPGA的基本使用方法。
- 教材章节:FPGA基本原理、Verilog HDL语言基础- 内容列举:FPGA结构、配置方法、Verilog语法、数据类型、运算符、基本语句2. 交通信号灯控制系统原理:分析交通信号灯的工作原理、控制逻辑和系统需求。
结合教材内容,使学生理解交通信号灯控制系统设计的关键环节。
- 教材章节:数字电路设计、交通信号灯控制系统- 内容列举:组合逻辑电路、时序逻辑电路、交通信号灯控制逻辑、系统需求分析3. 实践操作:指导学生运用FPGA和Verilog HDL语言设计并实现交通信号灯控制系统。
流水灯实验目的:在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开发板一块,计算机一台。
交通灯控制器+数字电路课程设计报告交通灯控制器是交通管理系统中的重要组成部分,其主要作用是控制道路上的交通信号灯。
随着数字电路技术的发展,交通灯控制器也逐渐向数字化、智能化方向发展。
本文将详细介绍一种基于数字电路的交通灯控制器设计,以及该设计方案的实现和效果。
一、设计方案1.硬件设计硬件设计方案主要包括数字电路的选择、交通灯的控制模块、传感器等。
本方案选用FPGA芯片作为控制芯片,该芯片具有先进的数字信号处理能力和可编程性,便于开发和定制。
交通灯的控制模块包括红灯、黄灯、绿灯三个信号灯的控制器,以及车辆、行人传感器等。
其中车辆传感器主要用来检测车流量,行人传感器主要用来检测行人通行情况。
2.软件设计软件设计方案主要包括程序的设计和调试,以及人机界面的设计和开发。
程序设计方案采用Verilog HDL语言进行实现,采用时序逻辑设计的思路来编写程序,实现红绿灯的控制和状态转移。
人机界面采用C语言进行编写,通过串口通信与控制芯片进行数据传输和控制。
二、实现过程在设计方案确定后,我们进一步开始实现。
首先是电路的焊接和测试,在确定电路正常无误后,再完成程序的编写和调试。
最后是人机接口的开发和完善。
具体实现流程如下:1.电路焊接首先进行电路布线和焊接,将FPGA芯片、光耦隔离器、电位器等元器件焊接到电路板上,以及信号灯、传感器等元器件的接入。
2.程序编写利用Verilog HDL语言编写程序,主要包括红绿灯状态的转移逻辑和相应的信号输出控制。
程序设计过程中,需要注意时序和状态的转移。
3.调试测试完成程序编写后,需要进行相应的调试测试。
通过仿真测试,检查程序逻辑是否正确,排除潜在问题。
在硬件实验平台上进行测试,确定系统能够正常工作。
4.人机界面开发利用C语言编写人机界面,实现与交通灯控制器的交互控制。
实现车辆、行人传感器的数据采集和显示,以及人手动控制交通灯的功能。
三、实现效果通过测试和实验验证,本文的交通灯控制器设计方案具有以下优势:1.使用FPGA芯片作为控制芯片,具有较强的可编程性和数字信号处理能力。
基于FPGA的智能交通信号灯的设计智能交通信号灯是一个重要的交通设施,能够引导道路上的交通流动,提高道路交通的效率和安全性。
传统的信号灯系统通常是固定的时间间隔来控制交通流量,但是这种方式无法根据实际道路情况做出灵活的调整,并且无法提前预测交通拥堵的情况。
基于FPGA的智能交通信号灯设计可以利用其高度可编程的特性,结合实时数据分析,实现智能的信号控制系统。
首先,设计智能交通信号灯需要采集道路上的实时交通数据。
可以利用传感器、视频监控等技术,获取车辆的数量、速度、流量等信息,以及行人的行走情况。
这些数据将作为信号灯系统的输入,用于实时分析和控制。
其次,设计一个智能交通信号灯的控制算法。
基于FPGA的灵活性,可以采用神经网络、遗传算法等方法,对采集到的实时数据进行分析和预测,进而生成相应的信号控制策略。
通过实时调整信号灯的绿灯时间,根据交通流量的情况的不断优化信号灯的控制算法,进一步提高交通效率。
接下来,利用FPGA实现智能交通信号灯的控制系统。
FPGA具有高度可编程的特性,可以根据设计需求进行灵活的硬件设计。
使用HDL语言(如Verilog或VHDL)来编写信号灯控制逻辑,并通过FPGA进行硬件设计与实现。
FPGA还可以与传感器、通信模块等其他硬件设备进行连接,实现与外部数据的交互。
最后,进行实际的实验和测试。
将设计好的智能交通信号灯系统应用于实际的道路交通场景中,收集实际使用情况下的数据,进一步改进和优化系统性能。
通过实验和测试,可以验证智能信号灯系统的可行性和实用性,并对系统进行改进和完善。
总结起来,基于FPGA的智能交通信号灯设计需要从数据采集、控制算法、硬件设计和实验测试等方面进行综合考虑。
通过充分利用FPGA的高度可编程性和实时性,结合实时数据分析和控制算法,可以实现更加智能和高效的交通信号灯系统,提高道路交通的流畅性和安全性。
交通灯控制器数字电路的设计及仿真随着城市化进程的加快,交通量越来越大,如何科学有效地管理交通成为一个重要的问题。
其中,交通灯控制器是一个涉及电子电路技术的重要设备。
基于数字电路的设计和仿真,进一步提高交通灯控制器的精度和稳定性,对于保障交通安全、提高城市交通效率至关重要。
一、设计方案1.计算时序交通灯控制器的每个阶段均有确定的时间,因此需要计算时序以确定各个信号时序是否正确,以及控制灯的开关时间是否正确。
2.设计状态机根据计算好的时序,可以通过 ISE 设计工具绘制状态图,然后再利用 Verilog HDL 语言编写出状态机。
交通灯控制器的每个阶段都有一个对应的状态,状态机会根据输入信号的状态来判断当前处于何种状态,并根据状态判断应该输出什么信号。
3.确定数字电路结构利用 ISE 设计工具,可以采用 Combinational Logic Circuit 来设计灯的开关逻辑电路,时序电路中以时钟触发器为主。
可以通过该工具绘制仿真波形来检测电路的正确性,检查信号间是否存在错误。
二、仿真过程1.绘制输入信号波形首先,需要绘制出输入信号的波形,并且在仿真时要按照相应的频率和占空比输出。
2.对仿真波形进行仿真分析仿真过程中,可以通过 Xilinx 仿真工具,对仿真波形进行分析,检测电路的正确性和稳定性。
同时,可以通过仿真过程中的输出信号波形,判断各阶段信号的状态。
3.检验仿真结果与设计方案借助仿真工具,可以非常直观地验证数字电路的设计方案是否合理、可靠。
此外,还可以通过不同的应用场景,不断优化和调整设计方案,以实现更高的效率与精度。
三、总结数字电路的设计和仿真,可以有效地提高交通灯控制器的精度和稳定性,在城市交通管理中起到关键的作用。
当前数字电路技术的不断推进,为实现更加高效安全的交通管理提供了强有力的支持。
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]t;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)begint<=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:begint<=greentime1<<1;state<=3'd2;green<=2'b10;red<=2'b01;yellow<=2'b00;end3'd2:begint<=yellowtime<<1;state<=3'd3;end3'd3:begint<=yellowtime<<1;state<=3'd4;green<=2'b00;red<=2'b01;yellow<=2'b10;end3'd4:begint<=greentime1<<1;state<=3'd5;green<=2'b01;red<=2'b10;yellow<=2'b00;endt<=yellowtime<<1;state<=3'd6;end3'd6:begint<=yellowtime<<1;state<=3'd1;green<=2'b00;red<=2'b10;yellow<=2'b01;endendcaseelsebegint<=cnt-7'd1;//倒计数,计数结束进入下一状态case(state)3'd3:green[1]<=cnt[0];//主干道绿灯闪3'd6:green[0]<=cnt[0];//支干道绿灯闪endcaseendelse if(func==2'b10)//主干道常绿,支干道常红begint<=0;state<=3'd1;green<=2'b10;red<=2'b01;yellow<=2'b00;endelse if(func==2'b01)//主干道常红,支干道常绿begint<=0;state<=3'd1;green<=2'b01;red<=2'b10;yellow<=2'b00;endelse if(func==2'b11)//主干道,支干道黄灯一直闪begint<=0;state<=3'd1;green<=2'b00;yellow[1]<=~yellow[1];yellow[0]<=~yellow[1];endendmodule。
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.我们通过宏定义来设置每个状态保持的时间,这样既增强了代码的可读性,又方便以后的更改。
由于此实验不做硬件设计,只是通过仿真来验证,所以为了方便看波形,我们用一个时钟周期代表5s,具体代码如下:`define G2YDELAY 6//绿灯亮转到红灯亮的延迟,用一个时钟周期代替5s,//则此延迟为30s,这样做是为了仿真时容易看波形`define Y2LDELAY 1//黄灯亮转到左转灯亮的延迟时间为5s`define L2YDELAY 2//左转灯亮转到黄灯亮的延迟时间为10s`define Y2RDELAY 1//黄灯亮转到红灯亮的延迟时间为5s2. 我们用一个16位的reg类型的向量light来代表16盏交通信号灯,light[15:12]代表A路口,light[11:8]代表B路口,light[7:4]代表C路口,light[3:0]代表D 路口,高位到低位依次表示左转灯,红灯,绿灯,黄灯且每一位用1代表亮,0代表灭。
3. 用state表示当前状态,用next_state代表下一个状态,当rstn被拉低时,让系统处于S0状态,否则在时钟上升沿到来时将next_state赋给state。
代码如下:always @(posedge clk)if(!rstn)beginstate<=S0;next_state<=S0;endelsestate<=next_state;//状态改变4. 当系统处于某种状态时必须有确定的输出,通过运用case语句代码可读性更强,而且简介。
代码如下:always @(state)begincase(state)S0:light<=16'b0010_0100_0010_0100;S1:light<=16'b0001_0100_0001_0100;S2:light<=16'b1000_0100_1000_0100;S3:light<=16'b0001_0100_0001_0100;S4:light<=16'b0100_0010_0100_0010;S5:light<=16'b0100_0001_0100_0001;S6:light<=16'b0100_1000_0100_1000;S7:light<=16'b0100_0001_0100_0001;endcaseend5.控制状态何时发生改变是关键,通过repeat语句来实现延时,而且只有当rstn 为高电平是,状态才可以发生改变,代码如下:always @(state or rstn)beginif(rstn)begincase(state)S0:beginrepeat(`G2YDELAY-1) @(posedge clk);next_state=S1;endS1:beginrepeat(`Y2LDELAY-1) @(posedge clk);next_state=S2;endS2:beginrepeat(`L2YDELAY-1) @(posedge clk);next_state=S3;endS3:beginrepeat(`Y2RDELAY-1) @(posedge clk);next_state=S4;endS4:beginrepeat(`G2YDELAY-1) @(posedge clk);next_state=S5;endS5:beginrepeat(`Y2LDELAY-1) @(posedge clk);next_state=S6;endS6:beginrepeat(`L2YDELAY-1) @(posedge clk);next_state=S7;endS7:beginrepeat(`Y2RDELAY-1) @(posedge clk);next_state=S0;endendcaseendend四、仿真与验证1.首先写一个test bench,由于输入信号少,而且状态是通过延时状态自动发生改变的,所以比较简单。
详细代码见附录2。
2.通过modelsim进行仿真,仿真时间设为500ns,波形图如图3,从图中我们可以看到该系统基本实现了功能。
图3 仿真波形图3.放大局部,我们更细致地观察,可以确保它的正确性,如图5。
图4 局部放大图五、结论通过对交通信号控制器进行功能仿真,本设计达到了预定设计的目的,实现了利用verilog语言设计自动控制十字路口交通灯这样一个简单的数字系统,各交通灯设计任务要求正常运行。
不过这是在理想状态下进行的仿真,如果考虑到实际门延时,该系统是否可靠,有待于进一步验证。
附录1交通信号灯的verilog代码:`define G2YDELAY 6//绿灯亮转到红灯亮的延迟,用一个时钟周期代替5s,//则此延迟为30s,这样做是为了仿真时容易看波形`define Y2LDELAY 1//黄灯亮转到左转灯亮的延迟时间为5s`define L2YDELAY 2//左转灯亮转到黄灯亮的延迟时间为10s`define Y2RDELAY 1//黄灯亮转到红灯亮的延迟时间为5smodule sign_control(light,rstn,clk);output[15:0] light;input rstn,clk;reg[15:0] light;//light[15:12]代表A路口//light[11:8]代表B路口//light[7:4]代表c路口//light[3:0]代表D路口//高位到低位依次表示左转灯,红灯,绿灯,黄灯且每一位用1//代表亮,0代表灭//状态定义parameter S0=3'd0,S1=3'd1,S2=3'd2,S3=3'd3,S4=3'd4,S5=3'd5,S6=3'd6,S7=3'd7;//内部状态变量reg[2:0] state;reg[2:0] next_state;//状态只能在时钟的上升沿改变always @(posedge clk)if(!rstn)beginstate<=S0;next_state<=S0;endelsestate<=next_state;//状态改变always @(state)begincase(state)S0:light<=16'b0010_0100_0010_0100;S1:light<=16'b0001_0100_0001_0100;S2:light<=16'b1000_0100_1000_0100;S3:light<=16'b0001_0100_0001_0100;S4:light<=16'b0100_0010_0100_0010;S5:light<=16'b0100_0001_0100_0001;S6:light<=16'b0100_1000_0100_1000;S7:light<=16'b0100_0001_0100_0001; endcaseendalways @(state)begincase(state)S0:beginrepeat(`G2YDELAY-1) @(posedge clk);next_state=S1;endS1:beginrepeat(`Y2LDELAY-1) @(posedge clk);next_state=S2;endS2:beginrepeat(`L2YDELAY-1) @(posedge clk);next_state=S3;endS3:beginrepeat(`Y2RDELAY-1) @(posedge clk);next_state=S4;endS4:beginrepeat(`G2YDELAY-1) @(posedge clk);next_state=S5;endS5:beginrepeat(`Y2LDELAY-1) @(posedge clk);next_state=S6;endS6:beginrepeat(`L2YDELAY-1) @(posedge clk);next_state=S7;endS7:beginrepeat(`Y2RDELAY-1) @(posedge clk);next_state=S0;endendcaseendendmodule附录2激励块代码如下:`timescale 1ns/100psmodule stimulus;reg clk,rstn;wire[15:0] light;sign_control il(light,rstn,clk);initialbeginclk=1'b1;forever #2.5 clk=~clk;endinitialbeginrstn=1'b0;#60 rstn=1'b1;#200 rstn=1'b0;#100 rstn=1'b1;endendmodule。