新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Lattice MXO2: 交通燈控制

        Lattice MXO2: 交通燈控制

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

        簡易本節將向您介紹Verilog語法之中的精髓內容——,并且將利用實現十字路口的

        硬件說明與實現項目框圖


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

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

        根據上述要求,設計框架分析如下: * S1:主路綠燈點亮,支路紅燈點亮,持續15s的時間; * S2:主路黃燈點亮,支路紅燈點亮,持續3s的時間; * S3:主路紅燈點亮,支路綠燈點亮,持續10s的時間; * S4:主路紅燈點亮,支路黃燈點亮,持續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

        接下來就是利用三段式狀態機實現的交通燈部分:

        // ********************************************************************
        // >>>>>>>>>>>>>>>>>>>>>>>>> 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,    //狀態機狀態編碼
        			S2 = 4'b01,
        			S3 = 4'b10,
        			S4 = 4'b11; 	
        			parameter	time_s1 = 4'd15, //計時參數
        			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;  //現態、次態 	
        	wire			clk1h;  //1Hz時鐘 	//產生1秒的時鐘周期
        	divide #(.WIDTH(32),.N(12000000)) CLK1H (
        					.clk(clk),
        					.rst_n(rst_n),
        					.clkout(clk1h));
        	//第一段 同步邏輯 描述次態到現態的轉移
        	always @ (posedge clk1h or negedge rst_n)
        	begin
        		if(!rst_n) 
        			cur_state <= S1;
                else 
        			cur_state <= next_state;
        	end
        	//第二段 組合邏輯描述狀態轉移的判斷
        	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
        	//第三段  同步邏輯 描述次態的輸出動作
        	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路開關,可以用來作為輸入信號分別控制數碼管的輸出。按照下面表格定義輸入輸出信號

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

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

        小結


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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 永清县| 忻州市| 高阳县| 嵊泗县| 调兵山市| 武威市| 农安县| 会理县| 图片| 繁昌县| 洪江市| 丰顺县| 柳州市| 左贡县| 定日县| 荥经县| 正宁县| 墨脱县| 泾阳县| 富源县| 新乡县| 胶州市| 辉南县| 五台县| 安龙县| 牡丹江市| 和田县| 宁化县| 垦利县| 泾川县| 丽水市| 边坝县| 吴桥县| 麻江县| 观塘区| 启东市| 阳谷县| 宜昌市| 神农架林区| 平度市| 万年县|