新闻中心

EEPW首页>嵌入式系统>设计应用> Altera MAX10: 计时控制

Altera MAX10: 计时控制

作者: 时间:2023-11-14 来源:电子森林 收藏

计时控制

在之前的实验中我们掌握了如何进行时钟分频、如何进行数码管显示与按键消抖的处理,那么在本节实验之中,我们将会实现一个篮球赛场上常见的24秒

本文引用地址: //m.amcfsurvey.com/article/202311/452860.htm

====硬件说明====

在之前的实验中我们为读者详细介绍过MXO2板卡上的按键、数码管、LED等硬件外设,在此不再赘述。本节将实现由数码管作为显示模块,按键作为控制信号的输入(包含复位信号和暂停信号),Altera MAX10作为控制核心的篮球读秒系统,实现框图如下:

====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,还可以比较不加按键消抖情况下实际的效果对比如何。

信号 引脚
clk J5
rst J9
hold K14
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


====小结====

本实验主要介绍了的实现方式,并且包含了复位与暂停功能,读者可自行修改程序内部的时钟参数来调节计时时间。下一节将介绍PWM调制技术的应用 呼吸灯。



评论


相关推荐

技术专区

关闭