FPGA学习-基于 DE2-115 板的 Verilog 分秒计数器设计与按键功能实现

一、核心功能设计

按键暂停/继续:通过KEY1控制计时状态

按键消抖处理:20ms消抖周期消除机械抖动

硬件资源分配:符合DE2-115开发板引脚规范

二、核心模块实现详解

1. 顶层模块(counter)

bash 复制代码
module counter(
    input  CLOCK_50,     // 50MHz时钟(PIN_Y2)
    input  KEY0,         // 复位按键(低有效,PIN_M23)
    input  KEY1,         // 暂停按键(低有效,PIN_M21)
    output [6:0] hex0,   // 秒个位(PIN_AF10~AG16)
    output [6:0] hex1,   // 秒十位
    output [6:0] hex2,   // 分个位
    output [6:0] hex3    // 分十位

2. 时钟分频模块(clock_divider)

bash 复制代码
module clock_divider #(
    parameter DIVIDER = 24_999_999 // 50MHz→1Hz
)(
    input  clk,
    input  reset,
    output reg clk_out
);
reg [31:0] counter;  // 32位计数器

always @(posedge clk or posedge reset) begin
    if (reset) begin
        counter <= 0;
        clk_out <= 0;
    end else if (counter == DIVIDER) begin
        counter <= 0;
        clk_out <= ~clk_out;  // 输出翻转
    end else
        counter <= counter + 1;
end
endmodule

参数计算
T c y c l e = D I V I D E R + 1 f c l k = 25 , 000 , 000 50 , 000 , 000 = 0.5 s T_{cycle} = \frac{DIVIDER+1}{f_{clk}} = \frac{25,000,000}{50,000,000} = 0.5s Tcycle=fclkDIVIDER+1=50,000,00025,000,000=0.5s
f o u t = 1 2 × 0.5 s = 1 H z f_{out} = \frac{1}{2 \times 0.5s} = 1Hz fout=2×0.5s1=1Hz


3. 优化版按键消抖模块(key_debounce)

bash 复制代码
module key_debounce #(
    parameter DEBOUNCE_MS = 20,    // 消抖时间
    parameter CLK_FREQ = 50_000_000 
)(
    input  clk,
    input  key_n,         // 低有效
    output reg key_pulse  // 输出脉冲
);

4. 七段译码器(seg7_decoder)

bash 复制代码
module seg7_decoder(
    input [3:0] num,
    output reg [6:0] seg
);
always @(*) begin
    case(num)
        4'd0: seg = 7'b1000000; // 共阳极编码
        // ...其他数字编码
        default: seg = 7'b1111111; // 全灭
    endcase
end
endmodule

显示优化

  • 十进制拆分逻辑:
verilog 复制代码
seg0(.num(seconds%10),  // 个位
seg1(.num(seconds/10)   // 十位
  • 错误状态自动灭灯

三、关键电路设计

1. 复位信号展宽电路

verilog 复制代码
reg [5:0] reset_hold = 0;  // 6位展宽寄存器
always @(posedge CLOCK_50) begin
    if (reset_pulse) 
        reset_hold <= 6'b111111;  // 64周期展宽
    else if (reset_hold > 0)
        reset_hold <= reset_hold - 1;
end

时序特性

  • 展宽时间: t = 64 50 M H z = 1.28 μ s t = \frac{64}{50MHz} = 1.28\mu s t=50MHz64=1.28μs
  • 确保计数器稳定复位

2. 状态控制FSM

verilog 复制代码
always @(posedge CLOCK_50) begin
    if (reset_extended)          // 复位优先
        running <= 1'b1;
    else if (pause_pulse)        // 暂停切换
        running <= ~running;
end

四、工程文件结构

复制代码
/fpga_counter
├── quartus/
│   ├── counter.qpf       
│   └── DE2_115.qsf       
├── modelsim/
│   ├── tb_counter.v     
│   └── wave.do          
└── src/
    ├── counter.v         
    └── seg7_decoder.v    

五.实验结果

fpga3

六.总结

本次实验在 DE2 - 115 板子上使用 Verilog 完成分秒计数器设计。通过代码实现精准计数,同时加入按键暂停与消抖功能。经多次测试,计数器运行稳定,按键操作能有效控制,为后续数字电路设计积累了实践经验。

相关推荐
我爱C编程6 小时前
【仿真测试】基于FPGA的完整16QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·帧同步·卷积编码·viterbi译码·维特比译码·频偏锁定
s09071361 天前
ZYNQ DMA to UDP 数据传输系统设计文档
网络协议·fpga开发·udp
燎原星火*1 天前
QSPI IP核 基本参数
fpga开发
XINVRY-FPGA1 天前
XCVU9P-2FLGC2104I Xilinx AMD Virtex UltraScale+ FPGA
嵌入式硬件·机器学习·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
FPGA_小田老师1 天前
FPGA Debug:PCIE一直自动重启(link up一直高低切换)
fpga开发·pcie debug·pcie初始化问题
hexiaoyan8271 天前
视频信号检测板卡:208-Base Camera Link 图像信号模拟器
fpga开发·图像信号模拟器·视频信号检测·视频信号分析·智能图像分析
竹君子1 天前
新能源知识库(151) RTDS和RT-LAB比较
fpga开发
brave and determined1 天前
可编程逻辑器件学习(day34):半导体编年史:从法拉第的意外发现到塑造现代文明的硅基浪潮
人工智能·深度学习·fpga开发·verilog·fpga·设计规范·嵌入式设计
FPGA_Linuxer1 天前
RFSOC PCIE 4.0读写测试
fpga开发
坏孩子的诺亚方舟1 天前
FPGA系统架构设计实践8_复位参考设计
fpga开发·系统架构·复位