一、核心功能設計
按鍵暫停/繼續:通過KEY1控制計時狀態
按鍵消抖處理:20ms消抖周期消除機械抖動
硬件資源分配:符合DE2-115開發板引腳規范
二、核心模塊實現詳解
1. 頂層模塊(counter)
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)
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) beginif (reset) begincounter <= 0;clk_out <= 0;end else if (counter == DIVIDER) begincounter <= 0;clk_out <= ~clk_out; // 輸出翻轉end elsecounter <= 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?=fclk?DIVIDER+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)
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)
module seg7_decoder(input [3:0] num,output reg [6:0] seg
);
always @(*) begincase(num)4'd0: seg = 7'b1000000; // 共陽極編碼// ...其他數字編碼default: seg = 7'b1111111; // 全滅endcase
end
endmodule
顯示優化:
- 十進制拆分邏輯:
seg0(.num(seconds%10), // 個位
seg1(.num(seconds/10) // 十位
- 錯誤狀態自動滅燈
三、關鍵電路設計
1. 復位信號展寬電路
reg [5:0] reset_hold = 0; // 6位展寬寄存器
always @(posedge CLOCK_50) beginif (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
always @(posedge CLOCK_50) beginif (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 完成分秒計數器設計。通過代碼實現精準計數,同時加入按鍵暫停與消抖功能。經多次測試,計數器運行穩定,按鍵操作能有效控制,為后續數字電路設計積累了實踐經驗。