DE2-115板子上用 Verilog編程實現一個分秒計數器

一、實驗目的

  1. 掌握 Verilog 語言在硬件描述中的應用,通過編程實現分秒計數器的邏輯功能。

  2. 學習并實踐按鍵消抖的原理與實現方法,提升對硬件電路中信號處理的理解。

  3. 熟悉在 DE2-115 開發板上進行 Verilog 程序的開發、調試及下載驗證流程,將理論知識與實際硬件相結合 。

二、實驗環境

  1. 硬件平臺:DE2-115 開發板,該開發板搭載 Altera Cyclone IV E 系列 FPGA 芯片,提供豐富的外設資源,包括按鍵、數碼管等,便于進行各類數字邏輯實驗。

  2. 軟件工具: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 = 16'd250000; // 10ms @ 25MHzreg [15:0] cnt;reg btn_reg1, btn_reg2;// 同步輸入信號到時鐘域always @(posedge clk or negedge rst_n) beginif (!rst_n) beginbtn_reg1 <= 1'b0;btn_reg2 <= 1'b0;endelse beginbtn_reg1 <= btn_in;btn_reg2 <= btn_reg1;endend// 消抖計數器always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 16'd0;btn_out <= 1'b0;endelse beginif (btn_reg2 != btn_out) begincnt <= cnt + 1'b1;if (cnt >= DEBOUNCE_TIME) beginbtn_out <= btn_reg2;cnt <= 16'd0;endendelsecnt <= 16'd0;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 <= 6'd0;min <= 6'd0;endelse if (!pause) beginif (sec == 6'd59) beginsec <= 6'd0;if (min == 6'd59)min <= 6'd0;elsemin <= min + 1'b1;endelsesec <= sec + 1'b1;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})4'b1110: beginan = 4'b1110;case(min[5:4])2'b00: seg = 7'b0000001;2'b01: seg = 7'b1001111;2'b10: seg = 7'b0010010;2'b11: seg = 7'b0000110;endcaseend4'b1101: beginan = 4'b1101;case(min[3:0])4'b0000: seg = 7'b0000001;4'b0001: seg = 7'b1001111;4'b0010: seg = 7'b0010010;4'b0011: seg = 7'b0000110;4'b0100: seg = 7'b1001100;4'b0101: seg = 7'b0100100;4'b0110: seg = 7'b0100000;4'b0111: seg = 7'b0001111;4'b1000: seg = 7'b0000000;4'b1001: seg = 7'b0000100;endcaseend4'b1011: beginan = 4'b1011;case(sec[5:4])2'b00: seg = 7'b0000001;2'b01: seg = 7'b1001111;2'b10: seg = 7'b0010010;2'b11: seg = 7'b0000110;endcaseend4'b0111: beginan = 4'b0111;case(sec[3:0])4'b0000: seg = 7'b0000001;4'b0001: seg = 7'b1001111;4'b0010: seg = 7'b0010010;4'b0011: seg = 7'b0000110;4'b0100: seg = 7'b1001100;4'b0101: seg = 7'b0100100;4'b0110: seg = 7'b0100000;4'b0111: seg = 7'b0001111;4'b1000: seg = 7'b0000000;4'b1001: seg = 7'b0000100;endcaseenddefault: beginan = 4'b1111;seg = 7'b1111111;endendcaseendendmodule

頂層模塊將按鍵消抖模塊和分秒計數器模塊實例化并連接,同時實現數碼管動態顯示邏輯,通過掃描不同位的數碼管,分時顯示分和秒的數值。

五、實驗結果與分析

程序在quartus上編譯無誤后,燒錄到板子上運行

在這里插入圖片描述

將編譯后的程序下載到 DE2-115 開發板中,通過實際操作按鍵進行測試。按下復位按鍵,數碼管顯示 “00:00”;按下暫停按鍵,計數器暫停計數,數碼管數值保持不變;再次按下暫停按鍵,計數器繼續計數。數碼管能夠穩定、正確地顯示分和秒的數值,實驗功能成功實現。

六、總結

本次實驗成功在 DE2-115 板子上使用 Verilog 實現了具有按鍵暫停和按鍵消抖功能的分秒計數器。通過實驗,深入理解了 Verilog 語言的編程方法、按鍵消抖的原理以及 FPGA 開發流程。在實驗過程中,也遇到了如數碼管顯示編碼錯誤、時序匹配等問題,通過查閱資料和調試得以解決。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910170.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

R4 LSTM-火災溫度預測

import tensorflow as tf import pandas as pd import numpy as npgpus tf.config.list_physical_devices("GPU") if gpus:tf.config.experimental.set_memory_growth(gpus[0], True) #設置GPU顯存用量按需使用tf.config.set_visible_devices([gpus[0]],&…

什么是跨域問題?后端如何解決跨域問題?

跨域問題是指瀏覽器為了安全&#xff0c;對不同域&#xff08;包含不同協議、不同端口或不同主機名&#xff09;的請求進行限制&#xff0c;從而導致請求無法正常訪問后端接口。 跨域問題的產生源于瀏覽器的同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;這…

vue | rollup 打包 | 配置 rollup.config.js 文件,更改 rollup的行為

原因&#xff1a;將入口文件 轉為 esm 和 umd 兩種格式&#xff0c;要配置 rollup Rollup 已內置到 vite 工具中&#xff0c; 命令行打包&#xff0c;參數多&#xff0c;麻煩——》解決&#xff1a;創建配置文件&#xff0c;js 寫的&#xff0c;rollup.config.js 配置 rollup.…

服務器中物理處理器和邏輯處理器的區別?

在服務器或任何計算機系統中&#xff0c;**物理處理器&#xff08;Physical Processor&#xff09;和邏輯處理器&#xff08;Logical Processor&#xff09;**是兩個不同的概念&#xff0c;它們分別代表了硬件層面和操作系統層面的處理能力。 物理處理器&#xff08;Physical P…

【Gin框架】中間件

1. 什么是中間件 (Middleware)&#xff1f; 在 Web 框架的語境下&#xff0c;中間件 (Middleware) 是一種可重用的軟件組件或函數&#xff0c;它被設計用來在 HTTP 請求-響應生命周期中的特定點攔截和處理請求或響應。在 Gin 框架中&#xff0c;中間件特指符合 gin.HandlerFun…

STUN (Session Traversal Utilities for NAT) 服務器是一種網絡協議

STUN (Session Traversal Utilities for NAT) 服務器是一種網絡協議&#xff0c;主要用于幫助位于網絡地址轉換 (NAT) 設備&#xff08;如路由器&#xff09;后面的客戶端發現自己的公共 IP 地址和端口號。這對于建立點對點 (P2P) 通信至關重要&#xff0c;尤其是在 VoIP&#…

AQS詳解

概念 AQS&#xff08;AbstractQueuedSynchronizer&#xff09; 是并發包&#xff08;java.util.concurrent&#xff09;的核心組件&#xff0c;用于構建鎖和同步器&#xff08;如 ReentrantLock、Semaphore、CountDownLatch 等&#xff09;。它通過維護一個 CLH 隊列 和 同步狀…

python實戰項目76:51job數據采集與分析

python實戰項目76:51job數據采集與分析 一、數據采集二、數據預處理2.1 導入相關庫、讀取數據2.2 查看數據2.3 處理數據、刪除重復值、刪除空值2.4 處理薪資水平字段數據三、數據可視化3.1 不同公司規模招聘崗位數量分布3.2 不同公司性質招聘崗位數量分布3.3 不同年限要求招聘崗…

每天一個前端小知識 Day 7 - 現代前端工程化與構建工具體系

現代前端工程化與構建工具體系 1. 為什么要工程化&#xff1f;&#xff08;面試高頻問題&#xff09; 問題痛點&#xff1a; 模塊太多、無法組織&#xff1b;代碼冗長、性能差&#xff1b;瀏覽器兼容性差&#xff1b;團隊協作混亂&#xff0c;缺少規范與自動化。 工程化目標…

shell腳本--變量及特殊變量,算術邏輯運算

1.變量是什么 2.變量類型 3.動態&#xff0c;靜態&#xff0c;強弱類型 4.變量的命名 5.變量的定義和引用 5.1三種變量類型 普通變量 環境變量 局部變量 5.2單引號&#xff0c;雙引號&#xff0c;強弱引用 雙引號對變量賦值的影響01:59&#xff1a;給變量加雙引號&#x…

Python粒子群優化算法結合熱力圖TIFF文件案例

Python粒子群優化算法結合熱力圖TIFF文件案例 1. 項目概述 本項目使用粒子群優化算法(PSO)在熱力圖TIFF文件中尋找溫度最高點。熱力圖通常以地理空間數據形式存儲(TIFF格式),包含溫度分布信息。PSO算法模擬鳥群覓食行為,通過粒子協作在搜索空間中尋找最優解。 import …

使用Mambaout替換YOLObackbone 整合全局信息,提升遮擋目標檢測中定位能力,以及小目標、多尺度

近年來&#xff0c;Transformer 架構雖在各類任務中成為主流&#xff0c;但注意力機制的二次復雜度對長序列處理構成挑戰。為此&#xff0c;類似 RNN 的模型如 Mamba 被引入&#xff0c;其核心是狀態空間模型&#xff08;SSM&#xff09;&#xff0c;旨在以線性復雜度處理長序列…

力扣網C語言編程題:接雨水(動態規劃實現)

一. 簡介 本文記錄力扣網上的邏輯編程題&#xff0c;涉及數組方面的&#xff0c;這里記錄一下 C語言實現和Python實現。 二. 力扣網C語言編程題&#xff1a;接雨水 題目&#xff1a;接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子…

關于ubuntu環境下vscode進行debug的隨筆

CMakeLists.txt的編寫 頂層目錄的CMakelists.txt 目錄&#xff1a;./CMakeLists.txt #./CMakeLists.txt cmake_minimum_required(VERSION 3.10) project(xxx_project_name LANGUAGES CXX) #設置工程名# 設置 C 標準和編譯選項 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_ST…

技術演進中的開發沉思-9:window編程系列-內核對象線程同步(下)

今天我們繼續走進 Windows 內核的世界&#xff0c;就昨天沒說完的內核對象與線程同步內容接著繼續&#xff0c;它們就像精密儀器里的齒輪&#xff0c;雖不顯眼&#xff0c;卻至關重要。 異步設備 I/O 在 Windows 系統中&#xff0c;異步設備 I/O 就像是一場精心編排的接力賽。…

用AI從0開始量化交易-Anaconda環境(env)和緩存(pkg)更改儲存位置

之前介紹了Anaconda的安裝和環境建立&#xff0c;最近自己的量化交易工具開發的差不多了&#xff0c;卻發生了尷尬的問題&#xff0c;C盤被不斷增大的conda環境和緩存占據得快滿了。 在網上找了些教程&#xff0c;大多是講遷移的&#xff0c;專門講改本地改儲存位置的比較少&am…

Python爬蟲工作基本流程及urllib模塊詳解

在2025年的數據驅動時代&#xff0c;網絡數據成為企業與個人的“金礦”&#xff0c;而Python爬蟲則是挖掘這金礦的“利器”&#xff01;無論是抓取電商價格、分析社交媒體趨勢&#xff0c;還是構建知識庫&#xff0c;Python爬蟲都能讓你事半功倍。然而&#xff0c;爬蟲開發并非…

thinkphp8 模型-一對一,一對多,多對多 學習

thinkphp 命令創建模型&#xff08;和laravel基本一樣&#xff09; php think make:model User 在模型里創建字段 protected $table User; protected $pk id; // 定義返回哪些字段 protected $field [id, name]; // 返回字段的類型 protected $schema [id > int] 模…

非線性方程組求解:復雜情況下的數值方法

在科學研究和工程應用中&#xff0c;非線性方程組的求解是一個常見的挑戰。尤其當方程組包含復雜函數&#xff08;如特殊函數、積分、微分等&#xff09;&#xff0c;使得雅可比矩陣難以解析求導時&#xff0c;傳統的基于解析雅可比矩陣的 Newton-Raphson 方法難以直接應用。本…

邊緣計算網關EG8200Mini首發開箱視頻丨破解工業互聯“協議孤島”,重塑數據價值核心引擎行業痛點直擊|低代碼開發

數據采集4G邊緣計算網關plc 工業現場設備品牌林立&#xff08;西門子、三菱、歐姆龍等30品牌PLC&#xff09;、協議碎片化&#xff08;Modbus/OPC UA/BACnet等&#xff09;、網絡環境復雜&#xff08;戶外無光纖、車間電磁干擾&#xff09;——傳統網關難以實現多源異構設備統一…