新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Lattice MXO2: 交通燈控制

        Lattice MXO2: 交通燈控制

        作者: 時間:2023-11-17 來源:電子森林 收藏

        簡易本節(jié)將向您介紹Verilog語法之中的精髓內(nèi)容——,并且將利用實現(xiàn)十字路口的

        硬件說明與實現(xiàn)項目框圖


        本文引用地址:http://www.104case.com/article/202311/453009.htm

        上圖為十字路口交通示意圖分之路與主路,要求如下: * 主路上綠燈持續(xù)15s的時間,黃燈3s的時間,紅燈10s的時間; * 交通燈支路上綠燈持續(xù)7s的時間, 黃燈持續(xù)3秒的時間,紅燈18秒的時間;

        根據(jù)上述要求,設(shè)計框架分析如下: * S1:主路綠燈點亮,支路紅燈點亮,持續(xù)15s的時間; * S2:主路黃燈點亮,支路紅燈點亮,持續(xù)3s的時間; * S3:主路紅燈點亮,支路綠燈點亮,持續(xù)10s的時間; * S4:主路紅燈點亮,支路黃燈點亮,持續(xù)3s的時間;


        Verilog代碼


        首先是時鐘分頻部分:

        //********************************************************
        //   Copyright(c)2016, STEP  
        //   All rights reserved
        //   File name       :   divide.v
        //   Module name     :   divide
        //   Author          :   STEP
        //   Email           :   info@stepfpga.com
        //   Data            :   2016/08/01
        //   Version         :   V1.0
        //   Description     :   
        //
        //   Modification history
        //   ----------------------------------------------------------------------------
        // Version       
        // Description
        //
        //******************************************************** 
        //*******************
        //DEFINE MODULE PORT
        //*******************
        module divide(
        	//INPUT
        	clk			,
        	rst_n			,
        	//OUTPUT
        	clkout			
        );
        	//*******************
        	//DEFINE PARAMETER
        	//*******************
        	parameter			WIDTH	=	3;
        	parameter			N		=	5; 	//*******************
        	//DEFINE INPUT
        	//*******************
        	input 	clk,rst_n;          //*******************
        	//DEFINE OUTPUT
        	//*******************
        	output	clkout; 	//********************
        	//OUTPUT ATTRIBUTE
        	//********************
        	//REGS
        	reg 	[WIDTH-1:0]		cnt_p,cnt_n;
        	reg						clk_p,clk_n; 	
        	assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; 	//Sequential logic style
        	always @ (posedge clk)
        		begin
        			if(!rst_n)
        				cnt_p<=0;
        			else if (cnt_p==(N-1))
        				cnt_p<=0;
        			else cnt_p<=cnt_p+1;
        		end 	always @ (negedge clk)
        		begin
        			if(!rst_n)
        				cnt_n<=0;
        			else if (cnt_n==(N-1))
        				cnt_n<=0;
        			else cnt_n<=cnt_n+1;
        		end 	always @ (posedge clk)
        		begin
        			if(!rst_n)
        				clk_p<=0;
        			else if (cnt_p<(N>>1))  
        				clk_p<=0;
        			else 
        				clk_p<=1;
        		end 	always @ (negedge clk)
        		begin
        			if(!rst_n)
        				clk_n<=0;
        			else if (cnt_n<(N>>1))  
        				clk_n<=0;
        			else 
        				clk_n<=1;
        		end
        		endmodule

        接下來就是利用三段式狀態(tài)機實現(xiàn)的交通燈部分:

        // ********************************************************************
        // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
        // ********************************************************************
        // File name    : traffic.v// Module name  : traffic
        // Author       : STE
        // Description  : 
        // 
        // --------------------------------------------------------------------
        // Code Revision History : 
        // --------------------------------------------------------------------
        // Version: |Mod. Date:   |Changes Made:
        // V1.0     |2017/03/02   |Initial ver
        // --------------------------------------------------------------------
        // Module Function:簡易交通燈 
         module traffic(
        	clk		,    //時鐘
        	rst_n		,    //復位
        	out		     //三色led代表交通燈); 	
        	input 	clk,rst_n;     
        	output	reg[5:0]	out; 	
        	parameter      	S1 = 4'b00,    //狀態(tài)機狀態(tài)編碼
        			S2 = 4'b01,
        			S3 = 4'b10,
        			S4 = 4'b11; 	
        			parameter	time_s1 = 4'd15, //計時參數(shù)
        			time_s2 = 4'd3,
        			time_s3 = 4'd10,
        			time_s4 = 4'd3;
        	//交通燈的控制
        	parameter	led_s1 = 6'b101011, // LED2 綠色 LED1 紅色
        			led_s2 = 6'b110011, // LED2 藍色 LED1 紅色
        			led_s3 = 6'b011101, // LED2 紅色 LED1 綠色
        			led_s4 = 6'b011110; // LED2 紅色 LED1 藍色 	
        			reg 	[3:0] 	timecont;
        	reg 	[1:0] 	cur_state,next_state;  //現(xiàn)態(tài)、次態(tài) 	
        	wire			clk1h;  //1Hz時鐘 	//產(chǎn)生1秒的時鐘周期
        	divide #(.WIDTH(32),.N(12000000)) CLK1H (
        					.clk(clk),
        					.rst_n(rst_n),
        					.clkout(clk1h));
        	//第一段 同步邏輯 描述次態(tài)到現(xiàn)態(tài)的轉(zhuǎn)移
        	always @ (posedge clk1h or negedge rst_n)
        	begin
        		if(!rst_n) 
        			cur_state <= S1;
                else 
        			cur_state <= next_state;
        	end
        	//第二段 組合邏輯描述狀態(tài)轉(zhuǎn)移的判斷
        	always @ (cur_state or rst_n or timecont)
        	begin
        		if(!rst_n) begin
        		        next_state = S1;
        			end
        		else begin
        			case(cur_state)
        				S1:begin
        					if(timecont==1) 
        						next_state = S2;
        					else 
        						next_state = S1;
        				end 
                        S2:begin
        					if(timecont==1) 
        						next_state = S3;
        					else 
        						next_state = S2;
        				end 
                        S3:begin
        					if(timecont==1) 
        						next_state = S4;
        					else 
        						next_state = S3;
        				end 
                        S4:begin
        					if(timecont==1) 
        						next_state = S1;
        					else 
        						next_state = S4;
        				end 				
        				default: next_state = S1;
        			endcase
        		end
        	end
        	//第三段  同步邏輯 描述次態(tài)的輸出動作
        	always @ (posedge clk1h or negedge rst_n)
        	begin
        		if(!rst_n==1) begin
        			out <= led_s1;
        			timecont <= time_s1;
        			end 
        		else begin
        			case(next_state)
        				S1:begin
        					out <= led_s1;
        					if(timecont == 1) 
        						timecont <= time_s1;
        					else 
        						timecont <= timecont - 1;
        				end 
        				S2:begin
        					out <= led_s2;
        					if(timecont == 1) 
        						timecont <= time_s2;
        					else 
        						timecont <= timecont - 1;
        				end 
        				S3:begin
        					out <= led_s3;
        					if(timecont == 1) 
        						timecont <= time_s3;
        					else 
        						timecont <= timecont - 1;
        				end 
        				S4:begin
        					out <= led_s4;
        					if(timecont == 1) 
        						timecont <= time_s4;
        					else 
        						timecont <= timecont - 1;
        				end 				
        				default:begin
        					out <= led_s1;
        					end
        			endcase
        		end
        	end
        	endmodule

        引腳分配


        上正好有4路按鍵和4路開關(guān),可以用來作為輸入信號分別控制數(shù)碼管的輸出。按照下面表格定義輸入輸出信號

        信號引腳信號引腳
        clkC1rstL14
        out[0]P2out[1]N2
        out[2]M2out[3]P4
        out[4]N3out[5]M3

        配置好以后編譯下載程序。您也可以試試修改程序,觀察修改代碼對于內(nèi)部電路所造成的影響。

        小結(jié)


        狀態(tài)機是一類很重要的時序邏輯電路,是許多數(shù)字系統(tǒng)的核心部件,掌握狀態(tài)機的使用是利用與CPLD進行開發(fā)的一項必會技能,本小節(jié)的交通燈程序即是利用三段式狀態(tài)機描述方法實現(xiàn)的,希望讀者能夠快速掌握這項技能。



        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 秦皇岛市| 射洪县| 闻喜县| 内乡县| 都昌县| 丹阳市| 汉中市| 苍梧县| 修文县| 泰兴市| 灵璧县| 扶风县| 寿阳县| 娄烦县| 吕梁市| 东辽县| 通辽市| 北京市| 格尔木市| 休宁县| 平阴县| 松原市| 中卫市| 那曲县| 饶平县| 淳安县| 手机| 湘潭市| 北宁市| 那曲县| 塔河县| 北辰区| 济宁市| 乐都县| 长丰县| 琼海市| 洛川县| 威宁| 宝山区| 当阳市| 江安县|