您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > verilog语言-设计一个交通灯信号控制电路
西北工业大学《FPGA》实验报告学院:软件与微电子学院学号:2011303596姓名:杨清山专业:微电子学实验时间:2013/11/11实验地点:毅字楼335指导教师:韩兵西北工业大学2013年11月大作业设计一个交通灯信号控制电路一、实验目的及要求实验目的:通过交通灯的设计与仿真综合,体会复杂时序的实现方法,学会用框图表示程序的设计思想,掌握中小规模集成电路的系统综合设计方法。实验要求:设计一个交通灯信号控制电路。具体要求为:输入为50MHz的时钟和复位信号,输出为红、绿、黄三个信号(高电平为亮)。复位信号(高电平)有效,红、绿、黄灯灭;接着进行如下循环:绿灯亮1分钟,黄灯闪烁10秒,红灯亮1分钟。在此基础上再加两个数码管,对倒计时的数显示。二、实验设备(环境)及要求实验EDA工具为:预装了SynplifyPro9.6.2和ModelSimSE6.2b的PC机。三、实验内容与步骤1.设计思路概述总体上分为三个大模块,即:顶层模块、分频模块、控制模块、译码显示模块。作用如下:顶层及控制模块:此模块做例化,和控制,是本程序的主体,对底层的分频模块和译码显示模块进行例化,并且做控制设计。控制设计如下:采用同步时序逻辑。包括一个循环计数器,三个比较器,always控制。通过分频后的CLK1新号(1Hz),进行对一个循环变量“k”的周期为130的循环,进而控制三个灯的控制;具体循环为:clk1每进行一次跳变,k值减1;当K=0时,重新复值为129。通过比较器,每个灯的条件不同,当129=k=70时绿灯亮,69=k=60黄灯闪烁,59=k=0红灯亮。对于数码管输出,当129=k=70时,数码管个位输出=(k-70)%10,十位输出为(k-70-个位)/10;当69=k=60数码管个位输出=(k-60)%10,十位输出为(k-60-个位)/10,当59=k=0时,数码管个位输出=k%10十位输出为(k-个位)/10。分频模块:分频模块用以把输入的50MHz的信号转换为1Hz信号,便于其后的交通灯控制及数码管输出。译码模块:考虑到数字显示需要两个七段译码器,且在数字系统中,数字的表示都是采用二进制,因为两个管子分别输入,所以需要把循环变量k转换为有用的十位和各位输出。为了方便,把循环变量k减去各状态的基数值后,用数学方法取十位和各位分别做输入。如绿灯时,129=k=70时,数码管个位输出=(k-70)%10,十位输出为(k-70-个位)/10。七段译码器的设计原理如图:2.总体设计框图及说明:图一输入:clk全局时钟信号,50MHzrst全局复位端,高电平有效输出:ctrl_1s倒计时个位上数字ctrl_10s倒计时十位上数字blu,yel,red各个灯状态框图说明:状态机的输入,只有时钟信号clk和复位信号reset.输出为数码管十位和个位的二进制显示状态以及三个灯的颜色显示(blu,yel,red,分别是绿黄红灯,“1”表示灯亮,“0”表示灭)。输入clk的频率很大,需要通过计数器对其进行分频。首先计数产生一个1Hz的输出,通过该输出再次循环计数,产生周期为130的计数变量,从而控制各个灯的亮灭。而控制黄灯闪烁的分频,为方便起见,仍以1s为单位,每秒钟改变一次。用if嵌套语句来控制三灯亮与灭,同时间接地进行倒计时的过程,输出个位和十位上的数,redClk11Hz循环变量k129~0yel控制Clk50Hzrstblu直接用两个七段译码显示倒计时数。Rst信号是清零用的,为“1”时,三个信号灯及循环变量k复位置“0”。流程图图四3.时序说明:开始输入50MHzclk1:1Hz循环变量k计数70≤k≤12960≤k≤69blu=1yel=~yel0≤k≤59red=1显示输出整段程序共有四个状态:初始状态、绿灯状态、黄灯状态、红灯状态。如果有rst的“1”状态,则要进行清零,恢复到初始状态;这是在控制模块的计数器会清零,倒计时不再进行,三个灯都是灭的状态,Rst为“1”状态跳转为初始状态的,等待着清零结束,开始工作;此时七段译码也不会显示。清零结束后,系统开始正常工作。首先是分频时钟开始工作,此时循环变量开始循环,绿灯亮60s,译码器开始显示倒计时的输出,直到k=70。当循环变量k=69时,黄灯闪烁10s,同时译码倒计时,直到k=60;当循环变量k=59时,红灯亮,同时译码倒计时直到k=0。至此一个周期已经完成,沿此过程循环进行,直到reset信号的出现。图二4.模块设计框图、相关时序本程序分为三个模块,顶层模块、控制模块、译码模块,各模块的设计框图以及相关时序说明如下:K=K-1K≤59绿灯状态初始K=K-1红灯状态黄灯状态K=K-1K≤69K<0使K=129顶层及控制模块框图图三输入:clk全局时钟信号,50MHzrst全局复位端,高电平有效输出:led1个位七段译码led10十位七段译码时序说明:加上时钟信号之后,首先用reset清零,然后分频模块会分频产生分频时钟clk1,根据分频时钟的高与低,进而进行变量循环,然后会控制3个状态之间的跳转,译码显示模块会同步通过数码管来显示倒计时数;灯控信号blu,yel,red同时输出对交通灯的控制。分频模块:输入50MHz的信号,rst为“1”时,计数器j置“0”,并在以后每经历一个系统时钟周期时加1,知道k=49999999时,clk1=~clk1,同时k=0.到此分频完成。(在实际代码编写中,为了代码的精简,此模块已经集成入顶层及控制模块)顶层控制分频译码显示块图四译码显示模块:输入端口:din_1s显示器个位数据,由控制模块输入din_10s显示器十位数据,由控制模块输入输出端口:led_data_1s显示器个位数据的译码led_data_10s显示器十位数据的译码时序说明:此模块接受主模块输出的个位和十位的数值控制,并间接受(系统时钟)clk(50MHz)和clk50MHz计数器显示计数rstJ=49999999clk=~clk(全局复位)rst,及分频时钟clk1的控制,均为上升沿触发,当rst为高电平时,电路复位,重新开始工作。当rst为低电平时,电路正常。5.仿真及综合结果表1仿真结果信号解释说明信号解释备注clk系统时钟,50MHz为了方便,这里取2nsblu,yel,red最终三灯状态分别绿红灯,“1”为亮“0”为灭k循环计数变量用以状态判断控制led10倒计时十位七段译码数码管十位显示led1倒计时个位七段译码数码管个位显示out1倒计时个位上的数字控制模块的输出out10倒计时十位上的数字控制模块的输出rst系统控制变量高电平有效上图中blu,yel,red,三个信号反映的绿黄红交通灯的状态,其中包括绿灯亮60秒,黄灯以2HZ为周期闪烁,红灯亮60s,总周期为130s。上图为循环控制变量的值随分频后信号从129到0的循环计数。综合结果:顶层及控制,分频模块的综合RTL级电路如图:译码显示模块的综合如下:RTL级门级6.代码及注释此为顶层及控制模块代码:`include./decode.vmodulebulb(clk,rst,red,blu,yel,led1,led10);inputclk,rst;outputblu,yel,red,led1,led10;regred,yel,blu;wire[6:0]led1;wire[6:0]led10;reg[3:0]out10,out1;reg[5:0]j;reg[7:0]k;//j,kregclk1;//initialbegink='d129;blu=0;yel=0;red=0;//j=0;//clk1=0;end//******************************************//这是分频部分功能实现//**************??**************************always@(posedgeclkorposedgerst)beginif(rst)beginclk1=0;j=0;endelseif(j==4)//beginj=0;clk1=~clk1;endelsebeginj=j+1;endendalways@(posedgeclk1)beginif(k=='d0)k='d129;elsek=k-1;end//****************************************************//此为控制部分//**************??**************************always@(posedgeclk1)if(!rst)//??res???1???????beginif(k='d70&&k='d129)beginred=0;blu=1;out1=(k-70)%10;out10=(k-70-out1)/10;endelseif(k='d60&&k='d69)beginyel=~yel;//黄灯闪烁blu=0;out1=(k-60)%10;out10=(k-60-out1)/10;endelsered=1;//yel=0;out1=k%10;out10=(k-out1)/10;endelsebeginblu=0;yel=0;red=0;enddecoded(.din_1s(out1),.din_10s(out10),.led_data_1s(led1),.led_data_10s(led10));Endmodule以下是译码及显示模块代码:moduledecode(din_1s,//个位输入din_10s,//十位输入led_data_1s,//数码管个位输出led_data_10s//数码管十位输出);inputdin_1s;inputdin_10s;output[6:0]led_data_1s;output[6:0]led_data_10s;reg[6:0]led_data_1s;reg[6:0]led_data_10s;always@(din_1s)begincase(din_1s)0:led_data_1s=7'b0001000;1:led_data_1s=7'b1101101;2:led_data_1s=7'b0100010;3:led_data_1s=7'b0100100;4:led_data_1s=7'b1000101;5:led_data_1s=7'b0010100;6:led_data_1s=7'b0010000;7:led_data_1s=7'b0101101;8:led_data_1s=7'b0000000;9:led_data_1s=7'b0000100;default:led_data_1s=7'b1111111;endcaseendalways@(din_10s)begincase(din_10s)0:led_data_10s=7'b0001000;1:led_data_10s=7'b1101101;2:led_data_10s=7'b0100010;3:led_data_10s=7'b0100100;4:led_data_10s=7'b1000101;5:led_data_10s=7'b0010100;6:led_data_10s=7'b0010000;7:led_data_10s=7'b0101101;8:led_data_10s=7'b0000000;9:led_data_10s=7'b0000100;default:led_data_10s=7'b1111111;endcaseendendmodule测试模块代码:`timescale1ns/1ns`includebulb.vmoduletop;regclk,rst;wirered,blu,yel,led1,led10;//regclk1,red,blu,yel;initialbeginrst=1;clk=1;#500rst=0;#500rst=1;#500r
本文标题:verilog语言-设计一个交通灯信号控制电路
链接地址:https://www.777doc.com/doc-5048387 .html