哈尔滨工业大学课程设计说明书(论文)HHaarrbbiinnIInnssttiittuutteeooffTTeecchhnnoollooggyy交交通通灯灯课课程程设设计计课程名称:集成电路课程设计设计题目:交通灯的实现与仿真验证院系:班级:设计者:学号:指导教师:设计时间:2015年6月13日-2015年6月21日哈尔滨工业大学哈尔滨工业大学课程设计说明书(论文)一、功能描述使用verilogHDL语言设计一个交通灯,能够完成实际生活中十字路口的交通灯的工作。我设计的交通灯一共有四种状态:绿灯,黄灯,左转弯,红灯。在设计中,两条路命名为line1和line2,(同在一条路上的两个路灯的颜色是相同的)。状态转化如图:(g-绿色,t-左转,y-黄色,r-红色,字母后面的数字表示相应的路1或2)每个路口的路灯的颜色转换顺序为绿灯------左转-----黄灯-----红灯,下面是每个路口的灯的颜色的持续时间,line1的车流量比较多,所以绿灯的持续时间比较长。灯的颜色持续时间绿灯左转黄灯红灯Line14015545Line23010560可以看出状态机一共有六种状态,六种状态循环出现,并且只受时间控制,将上面的时间相加得到一个循环的时间是105。则六种状态循环的时间是105。二、设计方案使用三段式状态机,状态更新部分,新的状态产生的逻辑,输出产生逻辑。状态更新部分:当reset=0时,状态复位,回到g1r2的状态,而reset为0时,状态更新。新的状态产生的逻辑:根据计数器的值来进行状态的转换,只有计数器的输出值作为状态变换的条件。输出产生逻辑:切换到每个状态时路灯的颜色都有相应的变化。通过一个计数器来完成计数,从而控制状态机状态变换。有一个en的变量来控制计数器是否计数,并通过if语句来实现计数器的循环计数。三、设计代码moduletrafficlight1(clk,reset,count,line1,line2);inputclk,reset;input[6:0]count;output[1:0]line1,line2;reg[1:0]line1,line2;reg[2:0]state,next_state;//line1状态line2状态parameterg1r2=3'd1,绿灯红灯t1r2=3'd2,左转红灯y1r2=3'd3,黄灯红灯r1g2=3'd4,红灯绿灯r1t2=3'd5,红灯左转r1y2=3'd6;红灯黄灯t1r2y1r2r1g2r1t2r1y2g1r2哈尔滨工业大学课程设计说明书(论文)always@(posedgeclk)//状态更新beginif(!reset)state=g1r2;elsestate=next_state;endalways@(posedgeclk)//新的状态产生的逻辑begincasex(state)g1r2:if(count==7'd40)beginnext_state=t1r2;endt1r2:if(count==7'd55)beginnext_state=y1r2;endy1r2:if(count==7'd60)beginnext_state=r1g2;endr1g2:if(count==7'd90)beginnext_state=r1t2;endr1t2:if(count==7'd100)beginnext_state=r1y2;endr1y2:if(count==7'd105)beginnext_state=g1r2;endendcaseendalways@(state)//2'd0红灯2'd1黄灯2'd2绿灯2'd3左转,输出产生逻辑beginline1=2'd0;line2=2'd0;casex(state)g1r2:begin哈尔滨工业大学课程设计说明书(论文)line1=2'd2;line2=2'd0;endt1r2:beginline1=2'd3;line2=2'd0;endy1r2:beginline1=2'd1;line2=2'd0;endr1g2:beginline1=2'd0;line2=2'd2;endr1t2:beginline1=2'd0;line2=2'd3;endr1y2:beginline1=2'd0;line2=2'd1;endendcaseendendmodulemodulecounter(en,clk,reset,pout);//计数器部分output[6:0]pout;inputclk,reset,en;reg[6:0]pout;always@(posedgeclkornegedgereset)beginif(!reset)pout='d0;elseif(!en&&pout'd105)pout=pout+1;elsepout='d1;end哈尔滨工业大学课程设计说明书(论文)endmodulemoduletrafficlight_top(pout,clk,reset,en,line1,line2);//顶层函数inputclk,reset,en;output[1:0]line1,line2;output[6:0]pout;wire[6:0]pout;counteru2(.en(en),.clk(clk),.reset(reset),.pout(pout));trafficlightu1(.clk(clk),.reset(reset),.count(pout),.line1(line1),.line2(line2));endmodule激励模块moduletb_trafficlight;regclk,reset,en;wire[1:0]line1,line2;wire[6:0]pout;trafficlight_topm(.clk(clk),.reset(reset),.en(en),.line1(line1),.line2(line2),.pout(pout));initialforkclk=1;forever#5clk=~clk;//每隔5ns时钟信号翻转en=1;哈尔滨工业大学课程设计说明书(论文)reset=0;//进行初始化#5en=0;#5reset=1;joinendmodule四、验证方案及结果分析从图像中可以看出,两条路上的路灯在规定的时间节点实现了g1r2,t1r2,y1r2,r1g2,r1t2,r1y2六种状态的转化,并得到了正确的输出,实现了日常生活中交通灯的功能。五、结果分析及性能评估:所设计的代码在modelsim软件中仿真出的波形符合预期的要求,完成了初始化、六种状态的转变、时间控制状态的转变,状态转变的时间正确,状态转换的顺序正确,实现了日常生活中交通灯所具有的功能。所设计的交通灯共有红灯、绿灯、黄灯、左转等四种状态,可以添加一些更复杂的道路控制信号,比如单行道的信号控制,行人过马路的优先权。六、结论:此次试验编写的交通灯的代码能够完成日常生活中十字路口交通等所具有的功能,测试的波形也反映了状态转换的顺序正确性、时间准确性。所设计的交通灯共有红灯、绿灯、黄灯、左转等四种状态。可以作为正常十字路口的交通灯使用,但是在更复杂的道路情况,比如单行道的信号控制,行人过马路的优先权。本次课程设计让我更加透彻的理解了moore、mealy两种状态机的工作方式,以及状态机代码的编写,激励测试的编写等工作,对于Verilog代码编写规则更深刻的认识。