手机在线编程网站,网络建站免费网址,wordpress拖拽主题,上传wordpress到服务器要多久一、实验目的 掌握 Verilog 语言在硬件描述中的应用#xff0c;通过编程实现分秒计数器的逻辑功能。 学习并实践按键消抖的原理与实现方法#xff0c;提升对硬件电路中信号处理的理解。 熟悉在 DE2-115 开发板上进行 Verilog 程序的开发、调试及下载验证流程#xff0c;将…一、实验目的 掌握 Verilog 语言在硬件描述中的应用通过编程实现分秒计数器的逻辑功能。 学习并实践按键消抖的原理与实现方法提升对硬件电路中信号处理的理解。 熟悉在 DE2-115 开发板上进行 Verilog 程序的开发、调试及下载验证流程将理论知识与实际硬件相结合 。
二、实验环境 硬件平台DE2-115 开发板该开发板搭载 Altera Cyclone IV E 系列 FPGA 芯片提供丰富的外设资源包括按键、数码管等便于进行各类数字逻辑实验。 软件工具Quartus Prime 开发套件用于 Verilog 代码的编写、综合、布局布线以及下载到 FPGA 芯片中ModelSim 用于 Verilog 代码的功能仿真验证设计逻辑的正确性。
三、实验原理
3.1 分秒计数器原理
分秒计数器本质是一个多级计数器。秒计数器以 1Hz 的时钟信号作为计数脉冲当秒计数器计数到 59 时产生一个进位信号触发分计数器加 1。分计数器同样在接收到进位信号时进行计数当分计数器计数到 59 时可根据需求选择是否继续进位或循环归零。
3.2 按键消抖原理
机械按键在按下和释放时由于触点的弹性作用会产生短暂的抖动导致信号不稳定。按键消抖通过在检测到按键状态变化后启动一个计数器当计数器达到一定时间如 10ms且按键状态未再变化时才认为按键状态有效从而消除抖动带来的干扰。
四、模块设计与实现
4.1 按键消抖模块debounce.v
module debounce (input wire clk,input wire rst_n,input wire btn_in,output reg btn_out
);parameter DEBOUNCE_TIME 16d250000; // 10ms 25MHzreg [15:0] cnt;reg btn_reg1, btn_reg2;// 同步输入信号到时钟域always (posedge clk or negedge rst_n) beginif (!rst_n) beginbtn_reg1 1b0;btn_reg2 1b0;endelse beginbtn_reg1 btn_in;btn_reg2 btn_reg1;endend// 消抖计数器always (posedge clk or negedge rst_n) beginif (!rst_n) begincnt 16d0;btn_out 1b0;endelse beginif (btn_reg2 ! btn_out) begincnt cnt 1b1;if (cnt DEBOUNCE_TIME) beginbtn_out btn_reg2;cnt 16d0;endendelsecnt 16d0;endendendmodule该模块通过两级触发器将按键输入信号同步到时钟域然后使用一个计数器在检测到按键状态变化时开始计数当计数达到设定的消抖时间且按键状态稳定时输出稳定的按键信号。
4.2 分秒计数器模块counter.v module counter (input wire clk,input wire rst_n,input wire pause,output reg [5:0] sec,output reg [5:0] min
);always (posedge clk or negedge rst_n) beginif (!rst_n) beginsec 6d0;min 6d0;endelse if (!pause) beginif (sec 6d59) beginsec 6d0;if (min 6d59)min 6d0;elsemin min 1b1;endelsesec sec 1b1;endend
endmodule在时钟上升沿或复位信号有效时对分秒计数器进行操作。当暂停信号无效时秒计数器在计数到 59 后归零并使分计数器加 1分计数器计数到 59 后归零实现循环计数当暂停信号有效时计数器停止计数。
4.3 顶层模块top_module.v
module top_module (input wire clk,input wire rst_n,input wire pause_btn,output reg [6:0] seg,output reg [3:0] an
);wire clean_pause;wire [5:0] sec;wire [5:0] min;debounce u1 (.clk(clk),.rst_n(rst_n),.btn_in(pause_btn),.btn_out(clean_pause));counter u2 (.clk(clk),.rst_n(rst_n),.pause(clean_pause),.sec(sec),.min(min));always (*) begincase({an})4b1110: beginan 4b1110;case(min[5:4])2b00: seg 7b0000001;2b01: seg 7b1001111;2b10: seg 7b0010010;2b11: seg 7b0000110;endcaseend4b1101: beginan 4b1101;case(min[3:0])4b0000: seg 7b0000001;4b0001: seg 7b1001111;4b0010: seg 7b0010010;4b0011: seg 7b0000110;4b0100: seg 7b1001100;4b0101: seg 7b0100100;4b0110: seg 7b0100000;4b0111: seg 7b0001111;4b1000: seg 7b0000000;4b1001: seg 7b0000100;endcaseend4b1011: beginan 4b1011;case(sec[5:4])2b00: seg 7b0000001;2b01: seg 7b1001111;2b10: seg 7b0010010;2b11: seg 7b0000110;endcaseend4b0111: beginan 4b0111;case(sec[3:0])4b0000: seg 7b0000001;4b0001: seg 7b1001111;4b0010: seg 7b0010010;4b0011: seg 7b0000110;4b0100: seg 7b1001100;4b0101: seg 7b0100100;4b0110: seg 7b0100000;4b0111: seg 7b0001111;4b1000: seg 7b0000000;4b1001: seg 7b0000100;endcaseenddefault: beginan 4b1111;seg 7b1111111;endendcaseendendmodule顶层模块将按键消抖模块和分秒计数器模块实例化并连接同时实现数码管动态显示逻辑通过扫描不同位的数码管分时显示分和秒的数值。
五、实验结果与分析
程序在quartus上编译无误后烧录到板子上运行 将编译后的程序下载到 DE2-115 开发板中通过实际操作按键进行测试。按下复位按键数码管显示 “00:00”按下暂停按键计数器暂停计数数码管数值保持不变再次按下暂停按键计数器继续计数。数码管能够稳定、正确地显示分和秒的数值实验功能成功实现。
六、总结
本次实验成功在 DE2-115 板子上使用 Verilog 实现了具有按键暂停和按键消抖功能的分秒计数器。通过实验深入理解了 Verilog 语言的编程方法、按键消抖的原理以及 FPGA 开发流程。在实验过程中也遇到了如数码管显示编码错误、时序匹配等问题通过查阅资料和调试得以解决。