基於FPGA的可控倒計時計數器

實現的效果:

(1)、能夠自動倒計時,初始值可以在程序中設置;

(2)、能夠通過按鍵改變初始值(秒、分、時都可以);

(3)、可以根據時鐘進行相應的LED燈閃爍;

相應參數:

(1)、使用芯片:Cyclone IV EP4CE10F17C8N

(2)、輸入時鐘:50MHz

首先我們先來看一看設計流程圖(從左到右):

輸入:(1)、時鐘輸入;(2)、按鍵輸入;(3)、復位鍵輸入;

模塊:(1)鎖相環模塊;(2)、按鍵轉換模塊;(3)、計數模塊;(4)、譯碼模塊;(5)、位選模塊;(6)、時鐘閃爍模塊;

輸出:(1)、位選;(2)、段選;(3)、LED

設計思路:

(1)、首先我們將輸入的時鐘通過鎖相環,(50MHz->50MHz),以此來獲得一個更加穩定的時鐘;

(2)、我們將按鍵的值傳入按鍵轉換模塊,將鍵值轉換爲,對秒的加or減,分的加or減,時的加or減;

(3)、然後將相應的值傳入計數模塊來改變計數的值;

(4)、然後將相應的計數值傳入譯碼模塊,以此來獲得數碼管需要的段選值;

(5)、通過1KHz的時鐘來位選,顯示時鐘到數碼管上;

(6)、將計數值輸入到LED燈模塊,根據相應的要求進行閃爍;

硬件設計:

段選是低電平有效,那麼相應的數字轉換爲數碼管的顯示就如下:


                            1:1111_1001;
                            2:1010_0100;
                            3:1011_0000;
                            4:1001_1001;
                            5:1001_0010;
                            6:1000_0010;
                            7:1111_1000;
                            8:1000_0000;
                            9:1001_0000;

我們發現位選模塊是通過PNP三極管來控制的,所以低電平時有效。

程序源碼:

(1)、鎖相環,鎖相環通過如下的IP核創建即可,這裏不再詳細介紹。(鎖相環可以去除掉)。

(2)、按鍵轉換模塊

module key_set(
		input clk,
		input reset,
		input [2:0] key,
		output reg [1:0] count,      //定義對秒、分、時的控制
		output reg [1:0] key_choose  //定義控制加、減
);

reg [31:0] cnt;
reg clk_Hz;
//產生一個5Hz的時鐘,用來檢測按鍵的按下,這樣可以去除抖動帶來的誤差
always@(posedge clk or negedge reset)   		
                begin
				if(!reset)
					begin
						cnt <= 32'd0;
						clk_Hz <= 1'b0;
					end
				else if(cnt == 32'd5000_000)
					begin
						clk_Hz <= ~clk_Hz;
						cnt <= 32'd0;
					end
				else
					begin
						cnt <= cnt + 32'd1;
					end
		end
	
reg key_flag; 
//鍵值的轉換
always@(posedge clk_Hz or negedge reset)
	begin
		if(!reset)
			begin
				key_flag <= 1'b1;
				key_choose <= 2'b00;
				count <= 2'b00;
			end
		else if(key_flag && key!=3'b111)
			begin
				case(key)
					3'b110:
						begin
							count <= count+2'b1;
							key_flag <= 1'b0;
						end
					3'b101:
						begin
							key_choose <= 2'b10;
							key_flag <= 1'b0;
						end
					3'b011:
						begin
							key_choose <= 2'b11;
							key_flag <= 1'b0;
						end
					default:
						begin
							key_choose <= 2'b00;
							key_flag <= 1'b1;
						end
				endcase
			end
		else if(key == 3'b111)
			begin
				key_flag <= 1'b1;	
				key_choose <= 2'b00;
			end
		else
			begin
				key_choose <= 2'b00;
				key_flag <= 1'b1;
			end
	end
endmodule

count:代表的是選擇秒、分、時;

choose:代表的加or減;

(3)、計數模塊

module count(
		input clk,
		input reset,
		input [1:0]choose,
		input [1:0]count,
		output [3:0] count_miao_ge,
		output [2:0] count_miao_shi,
		output [3:0] count_fen_ge,
		output [2:0] count_fen_shi,
		output [3:0] count_shi_ge,
		output [1:0] count_shi_shi
);




reg [31:0]cnt_1;
reg flag_1_second;
//該模塊用來控制加減的速度變化
always@(posedge clk or negedge reset)
		begin
			if(!reset)
				begin
					cnt_1 <= 32'd0;
					flag_1_second <= 1'b0;
				end
			else if(cnt_1 == 32'd1200_0000)
				begin
					flag_1_second <= 1'b1;
					cnt_1 <= 32'd0;
				end
			else
				begin
					flag_1_second <= 1'b0;
					cnt_1 <= cnt_1 + 32'd1;
				end
		end
		

reg [31:0] cnt;
reg [3:0] count_miao_ge_reg;
reg [2:0] count_miao_shi_reg;
reg [3:0] count_fen_ge_reg;
reg [2:0] count_fen_shi_reg;
reg [3:0] count_shi_ge_reg;
reg [1:0] count_shi_shi_reg;

assign count_miao_ge = count_miao_ge_reg;  //秒的個位
assign count_miao_shi = count_miao_shi_reg;//秒的十位
assign count_fen_ge = count_fen_ge_reg;//分的個位
assign count_fen_shi = count_fen_shi_reg;//分的十位
assign count_shi_ge = count_shi_ge_reg;//時的個位
assign count_shi_shi = count_shi_shi_reg;//時的十位

always@(posedge clk or negedge reset)
		begin
				if(!reset)
					begin
							cnt <= 32'd0;
							count_miao_ge_reg <= 4'd5;
							count_miao_shi_reg <= 3'd4;
							count_fen_ge_reg <= 4'd6;
							count_fen_shi_reg <= 3'd5;
							count_shi_ge_reg <= 4'd8;
							count_shi_shi_reg <= 2'd1;
					end	
					//當計滿一秒並且秒的個位小於0時,秒的個位減一
					else if(cnt == 32'd5000_0000 && count_miao_ge_reg>4'd0 && count == 2'b00)
						begin
							count_miao_ge_reg <= count_miao_ge_reg - 4'd1;
							cnt <= 32'd0;
						end
					//當計滿一秒並且秒的個位等於0時,秒的十位減一,秒的個位變九
					else if(cnt == 32'd5000_0000 && count_miao_ge_reg==4'd0 && count_miao_shi_reg>3'd0 && count == 2'b00)
						begin
							count_miao_shi_reg <= count_miao_shi_reg - 3'd1;
							count_miao_ge_reg <= 4'd9;
							cnt <= 32'd0;
						end
					//當計滿一秒,秒到達00並且分的個位大於0時,分的個位減1	
					else if(cnt == 32'd5000_0000 && count_miao_ge_reg==4'd0 && count_miao_shi_reg==3'd0 && count_fen_ge_reg>4'd0 && count == 2'b00)
						begin
							count_fen_ge_reg <= count_fen_ge_reg - 4'd1;	
							count_miao_shi_reg <= 3'd5;
							count_miao_ge_reg <= 4'd9;
							cnt <= 32'd0;
						end
					//當計滿一秒,秒到達00並且分的個位等於0時,分的十位減1	
					else if(cnt == 32'd5000_0000 && count_miao_ge_reg==4'd0 && count_miao_shi_reg==3'd0 && count_fen_ge_reg==4'd0 && count_fen_shi_reg > 3'd0 && count == 2'b00)
						begin
						   count_fen_shi_reg <= count_fen_shi_reg - 3'd1;
							count_fen_ge_reg <= 4'd9;
							count_miao_shi_reg <= 3'd5;
							count_miao_ge_reg <= 4'd9;
							cnt <= 32'd0;
						end
						//當計滿一秒,秒到達00,分等於00時,時的個位>0,時的個位減一	
					else if(cnt == 32'd5000_0000 && count_miao_ge_reg==4'd0 && count_miao_shi_reg==3'd0 && count_fen_ge_reg==4'd0 && count_fen_shi_reg ==3'd0 && count_shi_ge_reg >4'd0 && count == 2'b00)
						begin
							count_shi_ge_reg <= count_shi_ge_reg - 4'd1;
							count_fen_shi_reg <= 3'd5;
							count_fen_ge_reg <= 4'd9;
							count_miao_shi_reg <= 3'd5;
							count_miao_ge_reg <= 4'd9;
							cnt <= 32'd0;
						end
						//當計滿一秒,秒到達00,分等於00時,時的個位等於0時,時的十位>0,時的十位減一	
						else if(cnt == 32'd5000_0000 && count_miao_ge_reg==4'd0 && count_miao_shi_reg==3'd0&& count_fen_ge_reg==4'd0 && count_fen_shi_reg ==3'd0 && count_shi_ge_reg == 4'd0 && count_shi_shi_reg > 2'd0 && count_shi_shi_reg< 2'd2 && count == 2'b00)
						begin
							count_shi_shi_reg <= count_shi_shi_reg - 2'd1;
						   count_shi_ge_reg <= 4'd9;
							count_fen_shi_reg <= 3'd5;
							count_fen_ge_reg <= 4'd9;
							count_miao_shi_reg <= 3'd5;
							count_miao_ge_reg <= 4'd9;
							cnt <= 32'd0;
						end
					//當計滿一秒,秒到達00,分等於00時,時等於00,所有變回初值
					else if(cnt == 32'd5000_0000 && count_miao_ge_reg==4'd0 && count_miao_shi_reg==3'd0 && count_fen_ge_reg==4'd0 && count_fen_shi_reg ==3'd0 && count_shi_ge_reg == 4'd0 && count_shi_shi_reg == 2'd0 && count == 2'b00)
						begin
							count_shi_shi_reg <= 2'd2;
							count_shi_ge_reg <= 4'd3;
							count_fen_shi_reg <= 3'd5;
							count_fen_ge_reg <= 4'd9;
							count_miao_shi_reg <= 3'd5;
							count_miao_ge_reg <= 4'd9;
							cnt <= 32'd0;
						end
					/**用按鍵進行秒的控制加**/		
					else if(count == 2'b01 && choose == 2'b10 && flag_1_second && count_miao_ge_reg < 4'd9 )
						begin
							count_miao_ge_reg <= count_miao_ge_reg + 4'd1;
						end
					else if(count == 2'b01 && choose == 2'b10 && flag_1_second && count_miao_ge_reg==4'd9 && count_miao_shi_reg<3'd5)
						begin
							count_miao_shi_reg <= count_miao_shi_reg + 3'd1;
							count_miao_ge_reg <= 4'd0;
						end
					else if(count == 2'b01 && choose == 2'b10 && flag_1_second && count_miao_ge_reg==4'd9 && count_miao_shi_reg==3'd5)
						begin
							count_miao_shi_reg <= 3'd0;
							count_miao_ge_reg <= 4'd0;
						end
					/**用按鍵進行秒的控制減**/					
					else if(count == 2'b01 && choose == 2'b11 && flag_1_second && count_miao_ge_reg>4'd0 )
						begin
							count_miao_ge_reg <= count_miao_ge_reg - 4'd1;
						end
					else if(count == 2'b01 && choose == 2'b11 && flag_1_second && count_miao_ge_reg==4'd0 && count_miao_shi_reg>3'd0)
						begin
							count_miao_shi_reg <= count_miao_shi_reg - 3'd1;
							count_miao_ge_reg <= 4'd9;
						end
					else if(count == 2'b01 && choose == 2'b11 && flag_1_second && count_miao_ge_reg==4'd0 && count_miao_shi_reg==3'd0)
						begin
							count_miao_shi_reg <= 3'd5;
							count_miao_ge_reg <= 4'd9;
						end
					/**用按鍵進行分的控制加**/
					else if(count == 2'b10 && choose == 2'b10 && flag_1_second && count_fen_ge_reg<4'd9)
						begin
							count_fen_ge_reg <= count_fen_ge_reg + 4'd1;	
						end
					else if(count == 2'b10 && choose == 2'b10 && flag_1_second  && count_fen_ge_reg==4'd9 && count_fen_shi_reg < 3'd5)
						begin
						   count_fen_shi_reg <= count_fen_shi_reg + 3'd1;
							count_fen_ge_reg <= 4'd0;
						end
					else if(count == 2'b10 && choose == 2'b10 && flag_1_second  && count_fen_ge_reg==4'd9)
						begin
							count_fen_shi_reg <= 3'd0;
							count_fen_ge_reg <= 4'd0;
						end
					/**用按鍵進行分的控制減**/				
					else if(count == 2'b10 && choose == 2'b11 && flag_1_second  && count_fen_ge_reg> 4'd0)
						begin
							count_fen_ge_reg <= count_fen_ge_reg - 4'd1;	
						end
					else if(count == 2'b10 && choose == 2'b11 && flag_1_second && count_fen_ge_reg== 4'd0 && count_fen_shi_reg > 3'd0 )
						begin
						   count_fen_shi_reg <= count_fen_shi_reg - 3'd1;
							count_fen_ge_reg <= 4'd9;
						end
					else if(count == 2'b10 && choose == 2'b11 && flag_1_second  && count_fen_ge_reg== 4'd0 && count_fen_shi_reg ==3'd0)
						begin
							count_fen_shi_reg <= 3'd5;
							count_fen_ge_reg <= 4'd9;
						end
					/**用按鍵進行時的控制加**/	
					else if(count == 2'b11 && choose == 2'b10 && flag_1_second  && count_shi_ge_reg < 4'd9 && count_shi_shi_reg < 2'd2)
						begin
							count_shi_ge_reg <= count_shi_ge_reg + 4'd1;
						end
					else if(count == 2'b11 && choose == 2'b10 && flag_1_second  && count_shi_ge_reg == 4'd9 && count_shi_shi_reg < 2'd2)
						begin
							count_shi_shi_reg <= count_shi_shi_reg + 2'd1;
						   count_shi_ge_reg <= 4'd0;
						end
					else if(count == 2'b11 && choose == 2'b10 && flag_1_second  && count_shi_ge_reg < 4'd3 && count_shi_shi_reg == 2'd2)
						begin
							count_shi_ge_reg <= count_shi_ge_reg + 4'd1;
						end
					else if(count == 2'b11 && choose == 2'b10  && flag_1_second && count_shi_ge_reg == 4'd3 && count_shi_shi_reg == 2'd2)
						begin
							count_shi_shi_reg <= 2'd0;
							count_shi_ge_reg <= 4'd0;
						end
					/**用按鍵進行時的控制減**/
						else if(count == 2'b11 && choose == 2'b11 && flag_1_second && count_shi_ge_reg >4'd0 )
						begin
							count_shi_ge_reg <= count_shi_ge_reg - 4'd1;
						end				
						else if(count == 2'b11 && choose == 2'b11 && flag_1_second  && count_shi_ge_reg == 4'd0 && count_shi_shi_reg > 2'd0)
						begin
							count_shi_shi_reg <= count_shi_shi_reg - 2'd1;
						   count_shi_ge_reg <= 4'd9;
						end
					else if(count == 2'b11 && choose == 2'b11 && flag_1_second && count_shi_ge_reg == 4'd0 && count_shi_shi_reg == 2'd0)
						begin
							count_shi_shi_reg <= 2'd2;
							count_shi_ge_reg <= 4'd3;
						end
					else if(count == 2'b00)
						begin
							cnt <= cnt + 32'd1;
						end
					else
						begin
							cnt <= cnt; 
						end
		end
endmodule

(4)、譯碼模塊

module decoding(
		input clk,
		input reset,
		input [3:0] count_miao_ge,
		input [2:0] count_miao_shi,
		input [3:0] count_fen_ge,
		input [2:0] count_fen_shi,
		input [3:0] count_shi_ge,
		input [1:0] count_shi_shi,
		output reg [7:0] code_miao_ge,
		output reg [7:0] code_miao_shi,
		output reg [7:0] code_fen_ge,
		output reg [7:0] code_fen_shi,
		output reg [7:0] code_shi_ge,
		output reg [7:0] code_shi_shi
);

always@(posedge clk or negedge reset)
		begin
			if(!reset)
				code_miao_ge <= 8'b1111_1111;
			else
					begin
						case(count_miao_ge)
							4'd0:code_miao_ge <= 8'b1100_0000;
							4'd1:code_miao_ge <= 8'b1111_1001;
							4'd2:code_miao_ge <= 8'b1010_0100;
							4'd3:code_miao_ge <= 8'b1011_0000;
							4'd4:code_miao_ge <= 8'b1001_1001;
							4'd5:code_miao_ge <= 8'b1001_0010;
							4'd6:code_miao_ge <= 8'b1000_0010;
							4'd7:code_miao_ge <= 8'b1111_1000;
							4'd8:code_miao_ge <= 8'b1000_0000;
							4'd9:code_miao_ge <= 8'b1001_0000;
							default:code_miao_ge <= 8'b1011_1111;
						endcase
					end
				
		end

always@(posedge clk or negedge reset)
		begin
			if(!reset)
				code_miao_shi <= 8'b1111_1111;
			else
					begin
						case(count_miao_shi)
							3'd0:code_miao_shi <= 8'b1100_0000;
							3'd1:code_miao_shi <= 8'b1111_1001;
							3'd2:code_miao_shi <= 8'b1010_0100;
							3'd3:code_miao_shi <= 8'b1011_0000;
							3'd4:code_miao_shi <= 8'b1001_1001;
							3'd5:code_miao_shi <= 8'b1001_0010;
							default:code_miao_shi <= 8'b1011_1111;
						endcase
					end
				
		end
		
always@(posedge clk or negedge reset)
		begin
			if(!reset)
				code_fen_ge <= 8'b1111_1111;
			else
					begin
						case(count_fen_ge)
							4'd0:code_fen_ge <= 8'b0100_0000;
							4'd1:code_fen_ge <= 8'b0111_1001;
							4'd2:code_fen_ge <= 8'b0010_0100;
							4'd3:code_fen_ge <= 8'b0011_0000;
							4'd4:code_fen_ge <= 8'b0001_1001;
							4'd5:code_fen_ge <= 8'b0001_0010;
							4'd6:code_fen_ge <= 8'b0000_0010;
							4'd7:code_fen_ge <= 8'b0111_1000;
							4'd8:code_fen_ge <= 8'b0000_0000;
							4'd9:code_fen_ge <= 8'b0001_0000;
							default:code_fen_ge <= 8'b1011_1111;
						endcase
					end
				
		end

always@(posedge clk or negedge reset)
		begin
			if(!reset)
				code_fen_shi <= 8'b1111_1111;
		   else
					begin
						case(count_fen_shi)
							3'd0:code_fen_shi <= 8'b1100_0000;
							3'd1:code_fen_shi <= 8'b1111_1001;
							3'd2:code_fen_shi <= 8'b1010_0100;
							3'd3:code_fen_shi <= 8'b1011_0000;
							3'd4:code_fen_shi <= 8'b1001_1001;
							3'd5:code_fen_shi <= 8'b1001_0010;
							default:code_fen_shi <= 8'b1011_1111;
						endcase
				end
		
	  end

	  
always@(posedge clk or negedge reset)
		begin
			if(!reset)
				code_shi_ge <= 8'b1111_1111;
			else
					begin
						case(count_shi_ge)
							4'd0:code_shi_ge <= 8'b0100_0000;
							4'd1:code_shi_ge <= 8'b0111_1001;
							4'd2:code_shi_ge <= 8'b0010_0100;
							4'd3:code_shi_ge <= 8'b0011_0000;
							4'd4:code_shi_ge <= 8'b0001_1001;
							4'd5:code_shi_ge <= 8'b0001_0010;
							4'd6:code_shi_ge <= 8'b0000_0010;
							4'd7:code_shi_ge <= 8'b0111_1000;
							4'd8:code_shi_ge <= 8'b0000_0000;
							4'd9:code_shi_ge <= 8'b0001_0000;
							default:code_shi_ge <= 8'b1011_1111;
						endcase
					end
				
		end
		
always@(posedge clk or negedge reset)
		begin
			if(!reset)
				code_shi_shi <= 8'b1111_1111;
		   else
					begin
						case(count_shi_shi)
							2'd0:code_shi_shi <= 8'b1100_0000;
							2'd1:code_shi_shi <= 8'b1111_1001;
							2'd2:code_shi_shi <= 8'b1010_0100;
							default:code_shi_shi <= 8'b1011_1111;
						endcase
				end
		
	  end
endmodule

(5)、位選模塊

module sel_show(
		input clk,
		input reset,
		input [7:0] code_miao_ge,
		input [7:0] code_miao_shi,
		input [7:0] code_fen_ge,
		input [7:0] code_fen_shi,
		input [7:0] code_shi_ge,
		input [7:0] code_shi_shi,
		output reg [7:0] led,
		output reg [5:0] sel
);

reg [15:0] cnt;
reg flag;
//產生1000Hz的時鐘
always@(posedge clk or negedge reset)
		begin
			if(!reset)
					begin
						cnt <=16'd0;
						flag <= 1'b0;
					end
				
			else if(cnt == 16'd500_00)
					begin
					   cnt <= 16'd0;
						flag <= 1'b1;
					end
			else
					begin
						cnt <= cnt + 16'd1;
						flag <= 1'b0;
					end
		end

reg [2:0] state;
parameter start = 3'd0; //開始狀態
parameter sel_1 = 3'd1; //位選1
parameter sel_2 = 3'd2; //位選2
parameter sel_3 = 3'd3; //位選3
parameter sel_4 = 3'd4; //位選4
parameter sel_5 = 3'd5; //位選5
parameter sel_6 = 3'd6; //位選6
parameter ending = 3'd7;//結束
always@(posedge clk or negedge reset)
		begin
			if(!reset)
				begin
					state <= 3'd0;
					sel <= 6'b000_000;
				end
			else
			case(state)
				start:
					begin
						if(flag == 1'b1)
							state <= sel_1;
						else
							state <= state;
					end
				sel_1:
					begin
						if(flag == 1'b1)
							begin
								state <= sel_2;
								sel <= 6'b111_110;
								led <= code_miao_ge;
							end
						else
							state <= state;
					end
				sel_2:
					begin
						if(flag == 1'b1)
							begin
								state <= sel_3;
								sel <= 6'b111_101;
								led <= code_miao_shi;
							end
						else
							state <= state;
					end
				sel_3:
					begin
						if(flag == 1'b1)
							begin
								state <= sel_4;
								sel <= 6'b111_011;
								led <= code_fen_ge;
							end
						else
							state <= state;
					end
				sel_4:
					begin
						if(flag == 1'b1)
							begin
								state <= sel_5;
								sel <= 6'b110_111;
								led <= code_fen_shi;
							end
						else
							state <= state;
					end
				sel_5:
					begin
						if(flag == 1'b1)
							begin
								state <= sel_6;
								sel <= 6'b101_111;
								led <= code_shi_ge;
							end
						else
							state <= state;
					end
				sel_6:
					begin
						if(flag == 1'b1)
							begin
								state <= ending;
								sel <= 6'b011_111;
								led <= code_shi_shi;
							end
						else
							state <= state;
					end
				ending:
					state <= start;
				default:
					state <= start;
			endcase
		end
endmodule
		

通過一個簡單的狀態機來進行位選。

(6)、LED燈閃爍模塊

module led_flash(
		input clk,
		input reset,
	   input [3:0] count_miao_ge,
		input [2:0] count_miao_shi,
		input [3:0] count_fen_ge,
		input [2:0] count_fen_shi,
		output reg Led
);
reg [31:0] cnt_2Hz;
reg [31:0] cnt_5Hz;
reg clk_2Hz;
reg clk_5Hz;
parameter flash_2Hz = 32'd1250_0000;
parameter flash_5Hz = 32'd5000_000;
//產生2Hz的時鐘5000_0000/2/2 = 1250_0000
always@(posedge clk or negedge reset)
		begin
				if(!reset)
					begin
						cnt_2Hz <= 32'd0;
					end
				else if(cnt_2Hz == flash_2Hz)
					begin
						clk_2Hz <= ~clk_2Hz;
						cnt_2Hz <= 32'd0;
					end
				else
					cnt_2Hz <= cnt_2Hz + 32'd1;
		end

//產生5Hz的時鐘5000_0000/5/2 = 500_0000
always@(posedge clk or negedge reset)
		begin
				if(!reset)
					begin
						cnt_5Hz <= 32'd0;
					end
				else if(cnt_5Hz == flash_5Hz)
					begin
						clk_5Hz <= ~clk_5Hz;
						cnt_5Hz <= 32'd0;
					end
				else
					cnt_5Hz <= cnt_5Hz + 32'd1;
		end		
	
//判斷相應的範圍並且選取相應的時鐘。
always@(posedge clk or negedge reset)
		begin
			if(!reset)
				begin
					Led <= 1'b0;
				end
			else if(count_fen_shi == 3'd5 && count_fen_ge == 4'd9 && count_miao_shi == 3'd5 && count_miao_ge >= 4'd0 && count_miao_ge < 4'd5)
					Led <= clk_2Hz;
			else if(count_fen_shi == 3'd5 && count_fen_ge == 4'd9 && count_miao_shi == 3'd5 && count_miao_ge >= 4'd5 && count_miao_ge <= 4'd9)
					Led <= clk_5Hz;
			else
					Led <= 1'b0;
		end

endmodule

(7)、頂層函數

module top(
		input clk,
		input reset,
		input [2:0]key,
		output [7:0] led,
		output [5:0] sel,
		output Led
);


wire clk_50MHz;
wire locked;
pll u1(
	.inclk0(clk),
	.c0(clk_50MHz),
	.locked(locked)
);

wire [1:0] count;
wire [1:0] key_choose;
key_set u2(
		.clk(clk_50MHz),
		.reset(reset),
		.key(key),
		.count(count),
		.key_choose(key_choose)
);

wire [3:0]  count_miao_ge;
wire [2:0]  count_miao_shi;
wire [3:0]  count_fen_ge;
wire [2:0]  count_fen_shi;
wire [3:0]  count_shi_ge;
wire [1:0]  count_shi_shi;
count u3(
		.clk(clk_50MHz),
		.reset(reset),
		.choose(key_choose),
		.count(count),
		.count_miao_ge(count_miao_ge),
		.count_miao_shi(count_miao_shi),
		.count_fen_ge(count_fen_ge),
		.count_fen_shi(count_fen_shi),
		.count_shi_ge(count_shi_ge),
		.count_shi_shi(count_shi_shi)
		
);

wire [7:0] code_miao_ge;
wire [7:0] code_miao_shi;
wire [7:0] code_fen_ge;
wire [7:0] code_fen_shi;
wire [7:0] code_shi_ge;
wire [7:0] code_shi_shi;
decoding u4(
		.clk(clk_50MHz),
		.reset(reset),
		.count_miao_ge(count_miao_ge),
		.count_miao_shi(count_miao_shi),
		.count_fen_ge(count_fen_ge),
		.count_fen_shi(count_fen_shi),
		.count_shi_ge(count_shi_ge),
		.count_shi_shi(count_shi_shi),
		.code_miao_ge(code_miao_ge),
		.code_miao_shi(code_miao_shi),
		.code_fen_ge(code_fen_ge),
		.code_fen_shi(code_fen_shi),
		.code_shi_ge(code_shi_ge),
		.code_shi_shi(code_shi_shi)
);

sel_show u5(
		.clk(clk_50MHz),
		.reset(reset),
		.code_miao_ge(code_miao_ge),
		.code_miao_shi(code_miao_shi),
		.code_fen_ge(code_fen_ge),
		.code_fen_shi(code_fen_shi),
		.code_shi_ge(code_shi_ge),
		.code_shi_shi(code_shi_shi),
		.led(led),
		.sel(sel)
);

led_flash u6(
		.clk(clk),
		.reset(reset),
	   .count_miao_ge(count_miao_ge),
		.count_miao_shi(count_miao_shi),
		.count_fen_ge(count_fen_ge),
		.count_fen_shi(count_fen_shi),
		.Led(Led)
);
endmodule

下載代碼之後,我們通過Signal Tap進行簡單的仿真。

觀察這個我們可以看到程序運行正確。

 

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