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图

  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vuko-wxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值