FPGA-任務五、十字路口交通控制燈器系統設計(二)

完整功能:

實現主幹道和支幹道的紅綠燈,並實現時間顯示功能;(前兩位顯示東西的     後兩位顯示南北的)

實現綠燈,黃燈,紅燈的持續時間固定的交通控制功能;
(狀態機切換三段的顯示 )

當東西或南北兩路中任一道上出現特殊情況,交通控制系統應可由交警手動控制立即進入特殊運行狀態的功能;(控制一個SW[0]---->  en 計數器計數半秒使能半秒)

實現綠燈,黃燈,紅燈的持續時間可調的交通控制功能
(按鍵key_up 控制加  按鍵key_down 控制減);
 

top.v改變爲:

module top(ext_clk_25m,ext_rst_n,switch1,switch2,key_upup,key_down,key_entr,dtube_cs_n,dtube_data,led
    );
//頂層控制模塊
	input ext_clk_25m; //時鐘信號25MHz
	input ext_rst_n;  //復位信號
	input switch1;
	input switch2; 
	input key_upup;
	input key_entr;
	input key_down;
	output [3:0] dtube_cs_n;	//段選數據位
	output [6:0] dtube_data;//位選數據位
	output [7:0] led;
	
	wire [3:0] TimeL;
	wire [3:0] TimeH;
	wire [3:0] TimeL1;
	wire [3:0] TimeH1;
	wire [7:0] red;
	wire [7:0] green;
	wire [7:0] yellow;
	wire [3:0] timesh;
	wire [3:0] timesl;
	wire en1;
	wire en2;
	wire set_en;
	wire clk;//中間變量
	
	//控制電路模塊
	control con1(
	.ext_clk_25m(ext_clk_25m),
	.ext_rst_n(ext_rst_n),
	.switch1(switch1),
	.switch2(switch2),
	.en1(en1),
	.en2(en2),
	.set_en(set_en)
    );
	//設置時間模塊
	set set1(
	.ext_clk_25m(ext_clk_25m),
	.ext_rst_n(ext_rst_n),
	.set_en(set_en),
	.key_upup(key_upup),
	.key_down(key_down),
	.key_entr(key_entr),
	.red(red),
	.yellow(yellow),
	.green(green),
	.led(led[7:6]),
	.times1(timesh),
	.times2(timesl)
    );
	//分頻25MHZ變爲1HZ
	div d1(
	.ext_clk_25m(ext_clk_25m),
	.ext_rst_n(ext_rst_n),
	.mclk(clk)
    );
	
	//倒計時計數模塊(東西)
	counter c1(
	.ext_clk_25m(ext_clk_25m),
	.mclk(clk),
	.ext_rst_n(ext_rst_n),
	.cnt_en(en2),
	.set_en(set_en),
	.red(red),
	.green(green),
	.yellow(yellow),
	.TimeH(TimeH),
	.TimeL(TimeL),
	.led(led[2:0])
    );
	//倒計時計數模塊(南北)
	counter1 c2(
	.ext_clk_25m(ext_clk_25m),
	.mclk(clk),
	.ext_rst_n(ext_rst_n),
	.cnt_en(en2),
	.set_en(set_en),
	.red(red),
	.green(green),
	.yellow(yellow),
	.TimeH1(TimeH1),
	.TimeL1(TimeL1),
	.led(led[5:3])
    );
	//數碼管顯示模塊(東西,南北)
	seg s1(
	.ext_clk_25m(ext_clk_25m),		
	.ext_rst_n(ext_rst_n),	
	.seg_en(en1),
	.set_en(set_en),
	.set_segh(timesh),
	.set_segl(timesl),
	.TimeH(TimeH),
	.TimeL(TimeL),
	.TimeH1(TimeH1),
	.TimeL1(TimeL1),
	.dtube_cs_n(dtube_cs_n),	
	.dtube_data(dtube_data)	
	);
endmodule

 

控制電路模塊:

module control(ext_clk_25m,ext_rst_n,switch1,switch2,en1,en2,set_en
    );
	input       ext_clk_25m;		//輸入時鐘
	input       ext_rst_n  ;		//復位信號
	input       switch1    ;		//特殊狀態開關
	input       switch2    ;        //設置狀態開關
	output  reg en1        ;		//數碼管使能位
	output  reg en2        ;		//交通燈使能位
	output  reg set_en     ;        //設置使能位
	reg  [24:0] cnt        ;        //存放計數器的值
	parameter TIME = 25'd2500_0000;
	//數碼管特殊狀態閃爍計數器模塊
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			cnt <=25'd0;
		end
		else if(cnt ==TIME-1'b1)begin
			cnt <=1'b0;
		end
		else begin
			cnt <=cnt + 1'b1;
		end
	end
	//開關控制設置的開啓
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			set_en <=1'b0;
		end
		else if(switch2==1'b0)begin
			set_en <=1'b1;
		end
		else begin
			set_en <=1'b0;
		end
	end
	//數碼管閃爍模塊
	always @(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			en1<=1'b0;
		end
		else if(switch1==1'b0)begin
			if(cnt<(TIME/2-1'b1))begin
				en1<=1'b1;
			end
			else begin
				en1<=1'b0;
			end
		end
		else begin
			en1<=1'b0;
		end
	end
	//停止計數器計時模塊
	always @(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			en2<=1'b0;
		end
		else if(switch1==1'b0)begin
			en2<=1'b1;
		end
		else begin
			en2<=1'b0;
		end
	end
	
endmodule

分頻模塊:

module div(ext_clk_25m,ext_rst_n,mclk
    );
	input           ext_clk_25m    ;//輸入時鐘
	input           ext_rst_n      ;//復位端口
	output      reg mclk           ;//輸出1Hz
	
	reg      [23:0] cnt            ;//存放計數器的值
	parameter TIME=   24'd1250_0000;//時鐘25MHz
//分頻模塊,使得輸入時鐘爲25MHz輸出時鐘爲1Hz
	always@ (posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			mclk <=1'b0;
			cnt <=24'd0;
		end
		else if(cnt ==TIME-1'b1)begin
			mclk <=~mclk;
			cnt <=1'b0;
		end
		else begin
			cnt <=cnt + 1'b1;
		end
	end
endmodule

counter.v

module counter(ext_clk_25m,mclk,ext_rst_n,cnt_en,set_en,red,green,yellow,TimeH,TimeL,led
    );
	input           ext_clk_25m       ;//系統時鐘
	input           mclk              ;//時鐘信號
	input           ext_rst_n         ;//復位信號
	input           cnt_en            ;
	input           set_en            ;
	input     [7:0] red               ;
	input     [7:0] green             ;
	input     [7:0] yellow            ;
	output reg[3:0] TimeH             ;//兩位數碼管顯示高位
	output reg[3:0] TimeL             ;//兩位數碼管顯示低位
	output reg[2:0] led               ;//led指示狀態
	
	reg       [2:0] state_c           ;
	reg       [2:0] state_n           ;
	reg       [7:0] times;
	parameter [2:0] IDLE =      3'b001,
					S1   =      3'b010,
					S2   =      3'b100;
	//狀態機實現三種狀態切換模塊
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			state_c <=IDLE;
		end
		else if(set_en==1'b1)begin
			state_c <= IDLE;
		end
		else if(cnt_en==1'b1)begin
			state_c <= state_c;
		end
		else begin
			state_c <= state_n;
		end
	end
	//狀態切換
	always@(*)
	begin
		case(state_c)
			IDLE:begin
				if({TimeH,TimeL}==8'h01)begin
					state_n=S1;
				end
				else begin
					state_n=IDLE;
				end
			end
			S1:begin
				if({TimeH,TimeL}==8'h01)begin
					state_n=S2;
				end
				else begin
					state_n=S1;
				end
			end
			S2:begin
				if({TimeH,TimeL}==8'h01)begin
					state_n=IDLE;
				end
				else begin
					state_n=S2;
				end
			end
			default:
				state_n=state_c;
		endcase
	end	
	
	always@(posedge ext_clk_25m or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			times <=8'd00;
		end
		else if(set_en==1'b1)begin
			times <=8'd00;
		end
		else if(state_c==IDLE)begin
			times <=red;
		end
		else if(state_c==S1)begin
			times <=green;
		end
		else if(state_c==S2)begin
			times <=yellow;
		end
		else ;
	end
	
	always@(posedge mclk or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			led <=3'b111;
		end
		else if(state_c==IDLE)begin
			led<=3'b110;
		end
		else if(state_c==S1)begin
			led<=3'b101;
		end
		else if(state_c==S2)begin
			led<=3'b011;
		end
		else begin
			led<=3'b111;
		end
	end
//計數器模塊高位
	always@(posedge mclk or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			TimeH <=times[7:4];		//計數器賦初值
		end
		else if(set_en==1'b1)begin
			TimeH <=times[7:4];
		end
		else if(cnt_en==1'b1)begin
			TimeH <=TimeH;
		end
		else if({TimeH,TimeL}==8'h00)begin
			TimeH <=times[7:4]; 
		end
		else if(TimeL==4'h0)begin
			TimeH <=TimeH-1'b1;
		end
		else begin
			TimeH <=TimeH;
		end
	end
	//計數器模塊低位
	always@(posedge mclk or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			TimeL <=times[3:0];
		end
		else if(set_en==1'b1)begin
		    TimeL <=times[3:0];
		end
		else if(cnt_en==1'b1)begin
		    TimeL <=TimeL;
		end
		else if({TimeH,TimeL}==8'h00) begin
			TimeL <=times[3:0];
		end
		else if(TimeL==4'h0)begin
			TimeL <=4'h9;
		end
		else begin
			TimeL <=TimeL-1'b1;
		end
	end
endmodule

counter1.v

module counter1(ext_clk_25m,mclk,ext_rst_n,cnt_en,set_en,red,green,yellow,TimeH1,TimeL1,led
    );
	input           ext_clk_25m       ;//系統時鐘
	input           mclk              ;//時鐘信號
	input           ext_rst_n         ;//復位信號
	input           cnt_en            ;//使能信號
	input           set_en            ;
	input     [7:0] red               ;
	input     [7:0] green             ;
	input     [7:0] yellow            ;
	output reg[3:0] TimeH1            ;//兩位數碼管顯示高位
	output reg[3:0] TimeL1            ;//兩位數碼管顯示低位
	output reg[5:3] led               ;
	
	reg       [2:0] state_c           ;
	reg       [2:0] state_n           ;
	reg       [7:0] times1            ;
	parameter [2:0] IDLE =      3'b001,
					S1   =      3'b010,
					S2   =      3'b100;
	//狀態切換模塊
	always@(posedge ext_clk_25m or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			state_c <=IDLE;
		end
		else if(set_en==1'b1)begin
			state_c <=IDLE;
		end
		else if(cnt_en==1'b1)begin
			state_c <= state_c;
		end
		else begin
			state_c <= state_n;
        end
	end
	//狀態切換
	always@(*)begin
		case(state_c)
			IDLE:begin
				if({TimeH1,TimeL1}==8'h01)begin
					state_n=S1;
				end
				else begin
					state_n=IDLE;
				end
			end
			S1:begin
				if({TimeH1,TimeL1}==8'h01)begin
					state_n=S2;
				end
				else begin
					state_n=S1;
				end
			end
			S2:begin
				if({TimeH1,TimeL1}==8'h01)begin
					state_n=IDLE;
				end
				else begin
					state_n=S2;
				end
			end
			default:
					state_n=state_c;
		endcase
	end		
	always@(posedge ext_clk_25m or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			times1 <=8'd00;
		end
		else if(set_en==1'b1)begin
			times1 <=8'd00;
		end
		else if(state_c==IDLE)begin
			times1 <=green;
		end
		else if(state_c==S1)begin
			times1 <=yellow;
		end
		else if(state_c==S2)begin
			times1 <=red;
		end
		else ;
	end
	always@(posedge mclk or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			led <=3'b111;
		end
		else if(state_c==IDLE)begin
			led<=3'b101;
		end
		else if(state_c==S1)begin
			led<=3'b011;
		end
		else if(state_c==S2)begin
			led<=3'b110;
		end
		else begin
			led<=3'b111;
		end
	end
	//計數器模塊高位
	always@(posedge mclk or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			TimeH1 <=times1[7:4]; //計數器賦初值
		end
		else if(set_en==1'b1)begin
			TimeH1<=TimeH1;
		end
		else if(cnt_en==1'b1)begin
			TimeH1<=TimeH1;
		end
		else if({TimeH1,TimeL1}==8'h00)begin
			TimeH1 <=times1[7:4]; //計數器賦初值
		end
		else if(TimeL1==4'h0)begin
			TimeH1 <=TimeH1-1'b1;
		end
		else begin
			TimeH1 <=TimeH1;
		end
	end
	//計數器模塊低位
	always@(posedge mclk or negedge ext_rst_n)
	begin
		if(!ext_rst_n)begin
			TimeL1 <=times1[3:0];
		end
		else if(set_en==1'b1)begin
			TimeL1 <=times1[3:0];
		end
		else if(cnt_en==1'b1)begin
			TimeL1 <=TimeL1;
		end
		else if({TimeH1,TimeL1}==8'h00)begin
			TimeL1 <=times1[3:0];
		end
		else if(TimeL1==4'h0)begin
			TimeL1 <=4'h9;
		end
		else begin
			TimeL1 <=TimeL1-1'b1;
		end
	end
endmodule

seg.v

module seg(ext_clk_25m,ext_rst_n,seg_en,set_en,set_segh,set_segl,TimeH,TimeL,TimeH1,TimeL1,dtube_cs_n,dtube_data
			
		);
	input           ext_clk_25m    ;//時鐘信號25MHz
	input           ext_rst_n      ;//復位信號
	input           seg_en         ;//使能信號
	input           set_en         ;//設置使能信號
	input    [ 3:0] set_segh       ;//設置信號顯示高位
	input    [ 3:0] set_segl       ;//設置信號顯示高位
	input    [ 3:0] TimeH          ;//兩位輸入高位  [0]
	input    [ 3:0] TimeL          ;//兩位輸入低位  [1]
	input    [ 3:0] TimeH1         ;//兩位輸入高位  [2]
	input    [ 3:0] TimeL1         ;//兩位輸入低位  [3]
	output   [ 3:0] dtube_cs_n     ;//段選數據位
	output   [ 6:0] dtube_data     ;//位選數據位
	
	reg      [ 3:0] dtube_cs_n     ;
	reg      [ 6:0] dtube_data     ;
	reg      [ 3:0] display_num    ;//當前顯示數據
	reg      [16:0] div_cnt        ;//延時計數器計數位
	
	//延時計數器模塊
	always@ (posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n) begin
			div_cnt <= 8'd0;
		end
		else if(seg_en==1'b1)begin
			div_cnt <= 8'd0;
		end
		else if(div_cnt==17'd80000)begin
			div_cnt <= 8'd0;		
		end
		else begin
			div_cnt <= div_cnt+1'b1;
		end
	end
	
	//顯示當前的數據模塊
	always @(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)begin 
			display_num <= 4'h0;
		end
		else if(div_cnt < 17'd20000)begin
			if(set_en==1'b0)begin
				display_num <= TimeL;
			end
			else begin
				display_num <=set_segl;
			end
		end
		else if((div_cnt>17'd20000)&(div_cnt <17'd40000))begin
			if(set_en==1'b0)begin
				display_num <= TimeH;
			end
			else begin
				display_num<=set_segh;
			end
		end
		else if((div_cnt>17'd40000)&(div_cnt < 17'd60000))begin
			display_num <=TimeL1;
		end
		else begin
			display_num <=TimeH1;
		end
	end
		
	//段選數據譯碼模塊(共陰數碼管)
	always @(*)begin
		if(!ext_rst_n)begin 
			dtube_data <= 8'h00;
		end
		else begin
			case(display_num) 
				4'h0: dtube_data <= 8'h3f;
				4'h1: dtube_data <= 8'h06;
				4'h2: dtube_data <= 8'h5b;
				4'h3: dtube_data <= 8'h4f;
				4'h4: dtube_data <= 8'h66;
				4'h5: dtube_data <= 8'h6d;
				4'h6: dtube_data <= 8'h7d;
				4'h7: dtube_data <= 8'h07;
				4'h8: dtube_data <= 8'h7f;
				4'h9: dtube_data <= 8'h6f;
				default:dtube_data <= 8'h00;
			endcase
		end
	end
//位選選譯模塊
	always @(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n) begin
			dtube_cs_n <=  4'b1111;
		end
		else if(seg_en==1'b1)begin
			dtube_cs_n <=  4'b1111;
		end
		else if(div_cnt <= 17'd20000)begin
			dtube_cs_n <= 4'b1110;
        end
		else if((div_cnt>17'd20000)&(div_cnt <=17'd40000))begin
			dtube_cs_n <= 4'b1101;
        end 
		else if((div_cnt>17'd40000)&(div_cnt <=17'd60000)&(set_en==1'b0))begin
			dtube_cs_n <= 4'b1011;
		end
		else if((div_cnt>17'd60000)&(div_cnt <=17'd80000)&(set_en==1'b0))begin
			dtube_cs_n <=4'b0111;
		end
		else begin
			dtube_cs_n <=  4'b1111;
		end
	end
		
endmodule

設置時間模塊

module set(ext_clk_25m,ext_rst_n,set_en,key_upup,key_down,key_entr,red,yellow,green,led,times1,times2
    );
	input ext_clk_25m;
	input ext_rst_n;
	input set_en;
	input key_down;
	input key_entr;
	input key_upup;
	output reg[7:0] red;
	output reg[7:0] green;
	output reg[7:0] yellow;
	output reg[3:0] times1;
	output reg[3:0] times2;
	output reg[7:6] led;
	//按鍵抖動判斷邏輯
	wire key;  //所有的按鍵相與的結果,用於按鍵觸發判斷
	reg[3:0]keyr ; //按鍵值key的緩衝寄存器
	assign key =key_down&key_entr&key_upup;
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)
			keyr <=4'b1111;
		else
			keyr <={keyr[2:0],key};
	end
	wire key_neg;
	wire key_pos;
	assign key_neg=~keyr[2] &keyr [3];//有按鍵被按下
	assign key_pos=keyr[2] &~keyr [3];//	有按鍵被釋放
	//定時器計數邏輯,用於對按鍵的消抖的判斷
	reg [19:0] cnt;
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			cnt <=20'd0;
		end
		else if(key_pos||key_neg)begin
			cnt <=20'd0;
		end
		else if(cnt <20'd999_999)begin
			cnt <= cnt +1'b1;
		end
		else begin
			cnt <=20'd0;
		end
	end
	reg[2:0]key_value_c;
	reg[2:0]key_value_n;
	//定時採取按鍵值
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			key_value_c <=3'b111;
			key_value_n <=3'b111;
		end
		else begin
			key_value_n <=key_value_c;
			if(cnt ==20'd999_999)begin
				key_value_c <={key_upup,key_entr,key_down};
			end
			else;
		end	
	end
	wire [2:0]key_press;
	assign key_press=key_value_n & ~key_value_c;
	always@(*)begin
		if(ext_rst_n==1'b0)begin
			times1=red[7:4];
		end
		else begin
			times1=times[7:4];
		end
	end
	always@(*)begin
		if(ext_rst_n==1'b0)begin
			times2=red[3:0];
		end
		else begin
			times2=times[3:0];
		end
	end
	//顯示控制模塊
	reg [1:0]state;
	//設置狀態
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			state<=2'b00;
		end
		else if((key_press[1]==1'b1)&set_en==1'b1)begin
			if(state==2'b10)begin
				state<=2'b00;
			end
			else begin
				state<=state+1'b1;
			end
		end
	end
	reg [7:0]times;
	//顯示的狀態模塊
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			times<=red;
		end
		else if(state==2'b00)begin
			times<=red;
		end
		else if(state==2'b01)begin
			times<=green;
		end
		else if(state==2'b10)begin
			times<=yellow;
		end
		else begin
			times<=8'h00;
		end
	end
	//led指示模式模式
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(!ext_rst_n)begin
			led <=2'b11;
		end
		else if(state==2'b00&set_en==1'b1)begin
			led<=2'b10;
		end
		else if(state==2'b01&set_en==1'b1)begin
			led<=2'b01;
		end
		else if(state==2'b10&set_en==1'b1)begin
			led<=2'b00;
		end
		else begin
			led<=2'b11;
		end
	end
	//按鍵加減控制模塊(低位)  紅
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			red[3:0]<=4'h0;
		end
		else if(state==2'b00)begin
			if(key_press[2]==1'b1)begin
				if(red==8'h99) begin
					red[3:0]<=4'h0;
				end
				else if(red[3:0]==4'h9)begin
					red[3:0]<=4'h0;
				end
				else begin
					red[3:0]<=red[3:0]+1'b1;
				end
			end
			else if(key_press[0]==1'b1)begin
				if(red==8'h00)begin
					red[3:0] <=4'h9; 
				end
				else if(red[3:0]==4'h0)begin
					red[3:0]<=4'h9;
				end
				else begin
					red[3:0]<=red[3:0]-1'b1;
				end
			end
			else begin
				red[3:0]<=red[3:0];
			end
		end
		else begin
			red[3:0]<=red[3:0];
		end
	end
	//按鍵加減控制模塊(高位)  紅
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			red[7:4]<=4'h2;
		end
		else if(state==2'b00)begin
			if(key_press[2]==1'b1)begin
				if(red==8'h99) begin
					red[7:4]<=4'h0;
				end
				else if(red[3:0]==4'h9)begin
					red[7:4]<=red[7:4]+1'b1;
				end
				else begin
					red[7:4]<=red[7:4];
				end
			end
			else if(key_press[0]==1'b1)begin
				if(red==8'h00)begin
					red[7:4]<=4'h9; 
				end
				else if(red[3:0]==4'h0)begin
					red[7:4] <=red[7:4]-1'b1;
				end
				else begin
					red[7:4] <=red[7:4];
				end
			end
			else begin
				red[7:4]<=red[7:4];
			end
		end
		else begin
			red[7:4]<=red[7:4];
		end
	end
	//按鍵加減控制模塊(低位)  綠
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			green[3:0]<=4'h5;
		end
		else if(state==2'b01)begin
			if(key_press[2]==1'b1)begin
				if(green==8'h99) begin
					green[3:0]<=4'h0;
				end
				else if(green[3:0]==4'h9)begin
					green[3:0]<=4'h0;
				end
				else begin
					green[3:0]<=green[3:0]+1'b1;
				end
			end
			else if(key_press[0]==1'b1)begin
				if(green==8'h00)begin
					green[3:0] <=4'h9; 
				end
				else if(green[3:0]==4'h0)begin
					green[3:0]<=4'h9;
				end
				else begin
					green[3:0]<=green[3:0]-1'b1;
				end
			end
			else begin
				green[3:0]<=green[3:0];
			end
		end
		else begin
			green[3:0]<=green[3:0];
		end
	end
	//按鍵加減控制模塊(高位)  綠
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			green[7:4]<=4'h1;
		end
		else if(state==2'b01)begin
			if(key_press[2]==1'b1)begin
				if(green==8'h99) begin
					green[7:4]<=4'h0;
				end
				else if(green[3:0]==4'h9)begin
					green[7:4]<=green[7:4]+1'b1;
				end
				else begin
					green[7:4]<=green[7:4];
				end
			end
			else if(key_press[0]==1'b1)begin
				if(green==8'h00)begin
					green[7:4]<=4'h9; 
				end
				else if(green[3:0]==4'h0)begin
					green[7:4] <=green[7:4]-1'b1;
				end
				else begin
					green[7:4] <=green[7:4];
				end
			end
			else begin
				green[7:4]<=green[7:4];
			end
		end
		else begin
			green[7:4]<=green[7:4];
		end
	end
	//按鍵加減控制模塊(低位)  黃
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			yellow[3:0]<=4'h5;
		end
		else if(state==2'b10)begin
			if(key_press[2]==1'b1)begin
				if(yellow==8'h99) begin
					yellow[3:0]<=4'h0;
				end
				else if(yellow[3:0]==4'h9)begin
					yellow[3:0]<=4'h0;
				end
				else begin
					yellow[3:0]<=yellow[3:0]+1'b1;
				end
			end
			else if(key_press[0]==1'b1)begin
				if(yellow==8'h00)begin
					yellow[3:0] <=4'h9; 
				end
				else if(yellow[3:0]==4'h0)begin
					yellow[3:0]<=4'h9;
				end
				else begin
					yellow[3:0]<=yellow[3:0]-1'b1;
				end
			end
			else begin
				yellow[3:0]<=yellow[3:0];
			end	
		end
		else begin
			yellow[3:0]<=yellow[3:0];
		end
	end
	//按鍵加控制模塊(高位)  黃
	always@(posedge ext_clk_25m or negedge ext_rst_n)begin
		if(ext_rst_n==1'b0)begin
			yellow[7:4]<=4'h0;
		end
		else if(state==2'b10)begin
			if(key_press[2]==1'b1)begin
				if(yellow==8'h99) begin
					yellow[7:4]<=4'h0;
				end
				else if(yellow[3:0]==4'h9)begin
					yellow[7:4]<=yellow[7:4]+1'b1;
				end
				else begin
					yellow[7:4]<=yellow[7:4];
				end
			end
			else if(key_press[0]==1'b1)begin
				if(yellow==8'h00)begin
					yellow[7:4]<=4'h9; 
				end
				else if(yellow[3:0]==4'h0)begin
					yellow[7:4] <=yellow[7:4]-1'b1;
				end
				else begin
					yellow[7:4] <=yellow[7:4];
				end
			end
			else begin
				yellow[7:4]<=yellow[7:4];
			end
		end
		else begin
			yellow[7:4]<=yellow[7:4];
		end
	end 
endmodule

設計頂層模塊的RTL圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章