新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Altera MAX10: 計時控制

Altera MAX10: 計時控制

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

計時控制

在之前的實驗中我們掌握了如何進行時鐘分頻、如何進行數碼管顯示與按鍵消抖的處理,那么在本節(jié)實驗之中,我們將會實現一個籃球賽場上常見的24秒。

本文引用地址:http://m.butianyuan.cn/article/202311/452860.htm

====硬件說明====

在之前的實驗中我們?yōu)樽x者詳細介紹過MXO2板卡上的按鍵、數碼管、LED等硬件外設,在此不再贅述。本節(jié)將實現由數碼管作為顯示模塊,按鍵作為控制信號的輸入(包含復位信號和暫停信號),Altera MAX10作為控制核心的籃球讀秒系統(tǒng),實現框圖如下:

====Verilog代碼====

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : debounce.v
// Module name  : debounce
// Author       : STEP
// Description  : 
// 
// --------------------------------------------------------------------
// Code Revision History : 
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2017/03/02   |Initial ver
// --------------------------------------------------------------------
// Module Function: 
module segment_counter(
	clk				,
	rst				,
	hold			,
	seg_led_1		,
	seg_led_2		,); 	
	input 	clk,rst;
	input	hold; 	
	output reg	[8:0]	seg_led_1,seg_led_2; 	
	reg			clk_divided;
	reg			hold_flag;
	reg					back_to_zero_flag	=	0;
	reg   		[6:0]   seg		[9:0];  
	reg 		[23:0]	cnt;
	reg			[3:0]	cnt_ge;
	reg			[3:0]	cnt_shi; 	
	parameter	PERIOD=6000000;	//1秒 	
	initial 
	begin
		seg[0] = 7'h3f;	   //  0
		seg[1] = 7'h06;	   //  1
		seg[2] = 7'h5b;	   //  2
		seg[3] = 7'h4f;	   //  3
		seg[4] = 7'h66;	   //  4
		seg[5] = 7'h6d;	   //  5
		seg[6] = 7'h7d;	   //  6
		seg[7] = 7'h07;	   //  7
		seg[8] = 7'h7f;	   //  8
		seg[9] = 7'h6f;	   //  9/*若需要顯示A-F,解除此段注釋即可
		seg[10]= 7'hf7;	   //  A
		seg[11]= 7'h7c;	   //  b
		seg[12]= 7'h39;    //  C
		seg[13]= 7'h5e;    //  d
		seg[14]= 7'h79;    //  E
		seg[15]= 7'h71;    //  F*/
	end 	
	always @ (posedge clk) begin		// 用于分出一個1Hz的頻率
			if (!rst == 1) begin
				cnt <= 0;
				clk_divided <= 0; end
			else begin
				if (cnt < PERIOD-1)
					cnt <= cnt + 1;
				else begin
					cnt <= 0;
					clk_divided <= ~clk_divided; end
				end
		end 	
		always @ (*) begin
		if (!rst == 1)
			back_to_zero_flag <= 1;
		else if (((cnt_shi*10) + cnt_ge)==24)
			back_to_zero_flag <= 1;
		else
			back_to_zero_flag <= 0;
		end 	
		always @ (posedge hold)
		hold_flag <= ~hold_flag; 	
		always @ (posedge clk_divided or posedge back_to_zero_flag) begin
		if (back_to_zero_flag == 1) begin
			cnt_ge <= 0;
			cnt_shi <= 0; end
		else if (cnt_ge == 9) begin
			cnt_ge <= 0;
			cnt_shi <= cnt_shi + 1; end
		else if (hold_flag == 1)
			cnt_ge <= cnt_ge;
		else
			cnt_ge <= cnt_ge + 1;
		end 	
		always @ (cnt_ge) begin
		seg_led_1[8:0] <= {2'b00,seg[cnt_ge]};
	 	end 	
	 	always @ (cnt_shi) begin
		seg_led_2[8:0] <= {2'b00,seg[cnt_shi]};
	 	end 
	 	endmodule

====引腳分配====

設置好復位鍵可消抖的按鍵,編譯完成后下載,通過按鍵就可以翻轉LED。你也可以定義多個按鍵控制多個LED,還可以比較不加按鍵消抖情況下實際的效果對比如何。

信號引腳
clkJ5
rstJ9
holdK14
segled1[0]E1
segled1[1]D2
segled1[2]K2
segled1[3]J2
segled1[4]G2
segled1[5]F5
segled1[6]G5
segled1[7]L1
segled1[8]E2
segled2[0]A3
segled2[1]A2
segled2[2]P2
segled2[3]P1
segled2[4]N1
segled2[5]C1
segled2[6]C2
segled2[7]R2
segled2[8]B1


====小結====

本實驗主要介紹了的實現方式,并且包含了復位與暫停功能,讀者可自行修改程序內部的時鐘參數來調節(jié)計時時間。下一節(jié)將介紹PWM調制技術的應用 呼吸燈。



評論


相關推薦

技術專區(qū)

關閉