• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

    Altera MAX10: 交通燈控制

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

    本文引用地址:http://www.czjhyjcfj.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進行開發的一項必會技能,本小節的交通燈程序即是利用三段式狀態機描述方法實現的,希望讀者能夠快速掌握這項技能。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 东乡| 安图县| 上饶县| 古丈县| 上饶县| 武胜县| 抚远县| 外汇| 山西省| 五莲县| 壤塘县| 江华| 仁寿县| 萍乡市| 建阳市| 布尔津县| 廊坊市| 手机| 南昌县| 白朗县| 突泉县| 临颍县| 若羌县| 景泰县| 洪雅县| 白水县| 张家口市| 芦溪县| 桦南县| 阿克陶县| 玉树县| 靖远县| 东丽区| 高要市| 江都市| 滦南县| 昌黎县| 商河县| 乌苏市| 亳州市| 社旗县|