新聞中心

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

        Altera MAX10: 交通燈控制

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

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

        上圖為十字路口交通示意圖分之路與主路,要求如下:

        • 主路上綠燈持續15s的時間,黃燈3s的時間,紅燈10s的時間;
        • 交通燈支路上綠燈持續7s的時間, 黃燈持續3秒的時間,紅燈18秒的時間;

        根據上述要求,設計框架分析如下:

        • S1:主路綠燈點亮,支路紅燈點亮,持續15s的時間;
        • S2:主路黃燈點亮,支路紅燈點亮,持續3s的時間;
        • S3:主路紅燈點亮,支路綠燈點亮,持續10s的時間;
        • S4:主路紅燈點亮,支路黃燈點亮,持續3s的時間;

        首先是時鐘分頻部分:

        //********************************************************
        //   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(c)2016, STEP  
        //   All rights reserved
        //   File name       :   traffic.v
        //   Module name     :   traffic
        //   Author          :   STEP
        //   Email           :   info@stepfpga.com
        //   Data            :   2016/08/01
        //   Version         :   V1.0
        //   Description     :   
        ////   Modification history
        //   ----------------------------------------------------------------------------
        // Version       
        // Description
        //
        //******************************************************** 
        //*******************
        //DEFINE MODULE PORT
        //*******************
        module traffic(
        	//INPUT
        	clk			,
        	rst_n		,
        	//OUTPUT
        	out			
        );
        	//*******************
        	//DEFINE INPUT
        	//*******************
        	input 	clk,rst_n;          //*******************
        	//DEFINE OUTPUT
        	//*******************
        	output	reg[5:0]	out; 	//*******************
        	//DEFINE PARAMETER
        	//*******************    	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,
        					led_s2 = 6'b001011,
        					led_s3 = 6'b011101,
        					led_s4 = 6'b011001; 	//*********************
        	//INNER SIGNAL DECLARATION
        	//*********************
        	//REGS	
        	reg 	[3:0] 	timecont;
        	reg 	[1:0] 	cur_state,next_state;  	//WIRES
        	wire			clk1h; 
        	divide #(.WIDTH(32),.N(12000000)) CLK1H (
        								.clk(clk),
        								.rst_n(rst_n),
        								.clkout(clk1h));
        	//Sequential logic style
        	always @ (posedge clk1h)
        	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)
        	begin
        		if(!rst_n) 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路開關,可以用來作為輸入信號分別控制數碼管的輸出。按照下面表格定義輸入輸出信號

        信號引腳信號引腳
        clkJ5rstJ9
        out[0]E14out[1]E15
        out[2]G15out[3]D12
        out[4]C14out[5]C15

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

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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 西畴县| 云林县| 永德县| 乌苏市| 莎车县| 鹤壁市| 麦盖提县| 石柱| 通辽市| 开平市| 江孜县| 温宿县| 屏边| 崇文区| 娱乐| 长春市| 静乐县| 汾西县| 马公市| 延长县| 牟定县| 保靖县| 长泰县| 法库县| 门头沟区| 基隆市| 奉节县| 桦川县| 塔城市| 沂南县| 新晃| 铁岭县| 开江县| 新竹县| 吉水县| 巴塘县| 甘德县| 芷江| 禄劝| 滦平县| 芮城县|