新聞中心

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

        Lattice MXO2: 計時控制

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

        Warning: file_get_contents(https://www.eetree.cn/wiki/_media/%E8%AE%A1%E6%97%B6%E5%99%A8%E6%A1%86%E5%9B%BE.png?w=800&tok=0acdce): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2057

        本文引用地址:http://www.104case.com/article/202311/452858.htm

        計時控制


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

        硬件說明


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

        Verilog代碼


        // ********************************************************************
        // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
        // ********************************************************************
        // File name    : counter.v
        // Module name  : counter
        // Author       : STEP
        // Description  : 
        // Web          :  
        // 
        // --------------------------------------------------------------------
        // Code Revision History : 
        // --------------------------------------------------------------------
        // Version: |Mod. Date:   |Changes Made:
        // V1.0     |2017/03/02   |Initial ver
        // --------------------------------------------------------------------
        // Module Function:24秒倒計時計數(shù)器 
        module counter(
        	clk				,    //時鐘
        	rst				,    //復位
        	hold			,    //啟動暫停按鍵
        	seg_led_1		,    //數(shù)碼管1
        	seg_led_2		,    //數(shù)碼管2
        	led                  //led); 	
        	input 	clk,rst;
        	input	hold; 	
        	output 	[8:0]	
        	seg_led_1,seg_led_2;
        	output 	reg	[7:0]	led; 	
        	wire		clk1h;        //1Hz時鐘
        	wire		hold_pulse;   //按鍵消抖后信號
        	reg			hold_flag;    //按鍵標志位
        	reg			back_to_zero_flag	; //計時完成信號
        	reg   		[6:0]   seg		[9:0];  
        	reg			[3:0]	cnt_ge;      //個位
        	reg			[3:0]	cnt_shi;     //十位 	
        	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 
         
         	// 啟動/暫停按鍵進行消抖
        	debounce  U2 (
        				.clk(clk),
        				.rst(rst),
        				.key(hold),
        				.key_pulse(hold_pulse)
        				);
        	// 用于分出一個1Hz的頻率	
        	divide #(.WIDTH(32),.N(12000000)) U1 ( 
        			.clk(clk),
        			.rst_n(rst),      
        			.clkout(clk1h)
        			);
            //按鍵動作標志信號產生
        	always @ (posedge hold_pulse)
        		if(!rst==1)
        			hold_flag <= 0;
        		else
        			hold_flag <= ~hold_flag;
        	//計時完成標志信號產生
        	always @ (*)
        		if(!rst == 1)
        			back_to_zero_flag <= 0;
        		else if(cnt_shi==0 && cnt_ge==0)
        			back_to_zero_flag <= 1;
        		else
        			back_to_zero_flag <= 0;
            //24秒倒計時控制
        	always @ (posedge clk1h or negedge rst) begin
        		if (!rst == 1) begin
        			cnt_ge <= 4'd4;
        			cnt_shi <= 4'd2; 
        			end
        		else if(hold_flag == 1)begin
        			cnt_ge <= cnt_ge;
        			cnt_shi <= cnt_shi;
        			end			
        		else if(cnt_shi==0 && cnt_ge==0) begin
        			cnt_shi <= cnt_shi;
        			cnt_ge <= cnt_ge;
        			end
        		else if(cnt_ge==0)begin
        			cnt_ge <= 4'd9;
        			cnt_shi <= cnt_shi-1;end
        		else
        			cnt_ge <= cnt_ge -1;
        		end
        	//計時完成點亮led
        	always @ ( back_to_zero_flag)begin
        		if (back_to_zero_flag==1)
        			led = 8'b0;
        		else
        			led = 8'b11111111;
        		end 	assign seg_led_1[8:0] = {2'b00,seg[cnt_ge]}; 	
        		assign seg_led_2[8:0] = {2'b00,seg[cnt_shi]}; 
         endmodule


        引腳分配


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

        信號引腳
        clkC1
        rstL14
        holdM13
        segled1[0]C12
        segled1[1]B14
        segled1[2]J1
        segled1[3]H1
        segled1[4]H2
        segled1[5]B12
        segled1[6]A11
        segled1[7]K1
        segled1[8]A12
        segled2[0]A10
        segled2[1]C11
        segled2[2]F2
        segled2[3]E1
        segled2[4]E2
        segled2[5]A9
        segled2[6]B9
        segled2[7]F1
        segled2[8]C9

        小結


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



        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 宜章县| 垦利县| 新竹市| 遂平县| 海宁市| 德安县| 蒙自县| 铜陵市| 东莞市| 台中市| 海伦市| 会昌县| 耒阳市| 巴东县| 荆门市| 泗水县| 贵阳市| 普宁市| 石城县| 新巴尔虎右旗| 缙云县| 台安县| 望都县| 康马县| 仁怀市| 柘荣县| 印江| 拉萨市| 兴宁市| 涡阳县| 通渭县| 安溪县| 霍城县| 虹口区| 石门县| 双流县| 杂多县| 阿尔山市| 武穴市| 四川省| 通江县|