[FPGA基礎學習]實現流水燈與按鍵暫停

FPGA實現LED流水燈

1.vscode的安裝和使用

vscode下載

Visual Studio Code - Code Editing. Redefined

vscode插件(Verilog-HDL/SystemVerilog)下載

image-20250315124141272

quartus綁定vscode

image-20250315122510088

image-20250315122531803

image-20250315122646581

2.用6個LED完成周期為1秒的跑馬燈效果

流水燈模塊設計

時鐘輸入

DE2-115開發板配備了一個固定的時鐘源。該開發板內置了一個50MHz的晶振,這意味著開發板上有一個能夠產生每秒50百萬個周期信號的振蕩器或時鐘發生器,用于驅動FPGA(現場可編程門陣列)芯片

時鐘周期

時鐘周期是時鐘信號的一個完整波形(從上升沿到下一個上升沿或下降沿到下一個下降沿)所需的時間,可以通過下面的公式計算:

image-20250312171741312

對于50MHz的時鐘頻率,時鐘周期為20納秒。

1s內點亮6個led,即等待前一個燈熄滅后1/6s=0.167s點亮下一個燈,所以代碼編寫如下

代碼編寫(計數器版本)
module led_test(input wire clk, ? ? // 50MHz時鐘輸入input wire rst_n, ? // 復位信號,低電平有效output reg [5:0] led // 6個LED燈的狀態
);
?
// 計數器,計數1s需要50_000_000個時鐘周期
reg [25:0] cnt; 
?
// 計數器模塊
always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 26'd0; // 復位時計數器歸零end else if (cnt == 50_000_000 - 1) begin // 計滿1秒后復位cnt <= 26'd0;end else begincnt <= cnt + 1'd1; // 使用非阻塞賦值end 
end 
?
// LED狀態更新邏輯:每次觸發時先清零所有LED
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginled <= 6'b000000; // 復位時關閉所有LEDend else begin// 默認保持當前狀態(非阻塞賦值)led <= led;if (cnt == 8_333_333 - 1) beginled <= 6'b000001; // 點亮第一個LEDendelse if (cnt == 16_666_666 - 1) beginled <= 6'b000010; // 點亮第二個LEDendelse if (cnt == 25_000_000 - 1) beginled <= 6'b000100; // 點亮第三個LEDendelse if (cnt == 33_333_333 - 1) beginled <= 6'b001000; // 點亮第四個LEDendelse if (cnt == 41_666_666 - 1) beginled <= 6'b010000; // 點亮第五個LEDendelse if (cnt == 50_000_000 - 1) beginled <= 6'b100000; // 點亮第六個LEDendend 
end 
?
endmodule

我需要將現有的代碼拆分為至少兩個模塊:一個計數器模塊和一個LED控制模塊,然后創建一個頂層模塊來連接這兩個模塊

頂層模塊

module led_test(input wire clk,input wire rst_n,output wire [5:0] led
);
// 連接計數器與LED控制器
wire [25:0] cnt_net;
?
counter counter_inst (.clk(clk),.rst_n(rst_n),.cnt(cnt_net)
);
?
led_controller led_ctrl_inst (.clk(clk),.rst_n(rst_n),.cnt_value(cnt_net),.led(led)
);
?
endmodule

LED控制模塊 (led_controller.v)

module led_controller(input wire clk,input wire rst_n,input wire [25:0] cnt_value,output reg [5:0] led
);
// LED狀態更新邏輯
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginled <= 6'b000000;end else beginled <= led; // 默認保持當前狀態// 順序點亮LED(每個LED間隔約1/6秒)case (1'b1)(cnt_value == 26'd8_333_332): led <= 6'b000001;(cnt_value == 26'd16_666_665): led <= 6'b000010;(cnt_value == 26'd24_999_998): led <= 6'b000100;(cnt_value == 26'd33_333_331): led <= 6'b001000;(cnt_value == 26'd41_666_664): led <= 6'b010000;(cnt_value == 26'd49_999_997): led <= 6'b100000;default: ;endcaseend
end
endmodule

計數器模塊

module counter(input wire clk,input wire rst_n,output reg [25:0] cnt
);
// 計數1秒(50MHz時鐘)
always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt <= 26'd0;else if (cnt == 26'd49_999_999) // 50M-1cnt <= 26'd0;elsecnt <= cnt + 1'b1;
end
endmodule
管腳綁定

使用的LEDR[0]~[5]這六個led燈來進行實驗,LED引腳配置說明如下:

image-20250312163700788

管腳綁定如下:

image-20250315122405289

效果展示

flow_led

2.(選做)增加流水燈的按鍵暫停、按鍵恢復功能

使用按鈕開關

DE2-115 提供了四個按鈕開關,每個按鈕開關都通過一個施 密特觸發器進行了去抖動處理。四個施密特觸發器的輸出信 號,分別為KEY0、KEY1、KEY2、KEY3,直接連接到了Cyclone IV E FPGA。當按鈕沒有 被按下的時候,它的輸出是高電平,按下去則給出一個低電平

image-20250312164218485

我選擇KEY0做為復位按鈕,KEY1作為控制led流水燈暫停的按鈕

代碼編寫
module flow_led_pause(input ? ? ? ? clk, ? ? ? // 50MHz時鐘input ? ? ? ? rst_n, ? ? // 異步復位(低有效)input ? ? ? ? key_pause, // 暫停/繼續按鍵(低有效)output reg [5:0] led ? ? // 6位LED輸出
);
?
// 參數定義
parameter CLK_FREQ = 50_000_000; // 50MHz時鐘
parameter LED_INTERVAL = CLK_FREQ / 6; // 每個LED亮0.1667秒
?
// 主計數器(1秒周期)
reg [25:0] cnt;
wire cnt_max = (cnt == LED_INTERVAL - 1);
?
// 按鍵消抖(兩級寄存器同步)
reg [1:0] key_sync;
always @(posedge clk or negedge rst_n) beginif (!rst_n) key_sync <= 2'b11;else key_sync <= {key_sync[0], key_pause};
end
wire pause_trig = (key_sync == 2'b10); // 下降沿檢測
?
// 暫停標志
reg pause_flag;
always @(posedge clk or negedge rst_n) beginif (!rst_n) pause_flag <= 1'b0;else if (pause_trig) pause_flag <= ~pause_flag; // 按鍵切換狀態
end
?
// LED狀態計數器(0~5循環)
reg [2:0] led_state;
always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 0;led_state <= 0;endelse if (!pause_flag) beginif (cnt_max) begincnt <= 0;led_state <= (led_state == 3'd5) ? 0 : led_state + 1;endelse cnt <= cnt + 1;end
end
?
// LED輸出邏輯
always @(posedge clk or negedge rst_n) beginif (!rst_n) led <= 6'b000001; // 復位后LED0亮else if (!pause_flag) begincase (led_state)3'd0: led <= 6'b000001; // LED03'd1: led <= 6'b000010; // LED13'd2: led <= 6'b000100; // LED23'd3: led <= 6'b001000; // LED33'd4: led <= 6'b010000; // LED43'd5: led <= 6'b100000; // LED5default: led <= led;endcaseend
end
?
endmodule
管腳綁定

按鈕開關配置說明如下:

image-20250312164415043

管腳綁定如下:

image-20250315140622394

效果展示

flow

參考鏈接:

vscode安裝+配置+使用+調試【保姆級教程】

VSCode配置Verilog/SystemVerilog環境(二)插件安裝

FPGA點亮led

led流水燈

FPGA學習——按鍵控制LED流水燈(附源碼 無按鍵消抖版本)

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

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

相關文章

【TensorRT】TensorRT從安裝到推理——Python 環境下 MobileNetV4 三分類任務

我想開發一個基于深度學習的分類小軟件&#xff0c;逐漸了解到了TensorRT在模型推理速度上的優勢&#xff0c;經過一下午資料的查找實現了將onnx模型轉為TensorRT格式模型的推理及測試過程。將實現過程記錄下來方便日后查看。 本文實驗設備是MX350顯卡 2G顯存 一 、安裝Tenso…

1.兩數之和(Java)

1. 題目描述 LeetCode 1. 兩數之和&#xff08;Two Sum&#xff09; 給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那兩個整數&#xff0c;并返回它們的索引。 示例 1&#xff1a; 輸入&#xff1a;nums [2,7,11,15], target 9 …

《深入探索 Python 數據分析:用 Pandas 高效處理與可視化大型數據集》

《深入探索 Python 數據分析:用 Pandas 高效處理與可視化大型數據集》 引言:從零到分析高手 數據是當代社會最寶貴的資源,而數據分析技能是現代職業人不可或缺的一部分。在數據科學的領域中,Python 已成為當之無愧的“首選語言”,其強大的生態系統和簡潔的語法讓人如虎添…

將樹莓派5當做Ollama服務器,C#調用generate的API的示例

其實完全沒這個必要&#xff0c;性能用腳后跟想都會很差。但基于上一篇文章的成果&#xff0c;來都來了就先簡單試試吧。 先來看看這個拼夕夕上五百多塊錢能達到的效果&#xff1a; 只要對速度沒要求&#xff0c;那感覺就還行。 Ollama默認只在本地回環&#xff08;127.0.0…

python基礎學習二(列表及字典的使用)

文章目錄 列表列表的創建獲取列表中的多個元素判斷列表中元素是否存在列表元素的添加操作列表元素的刪除操作列表元素的修改列表的排序列表生成式 字典字典的創建字典的常規操作字典的常用操作字典的視圖操作字典元素的遍歷字典的特點字典的生成式 列表 一個對象由id&#xff0…

Android設計模式之代理模式

一、定義&#xff1a; 為其他對象提供一種代理以控制對這個對象的訪問。 二、角色組成&#xff1a; Subject抽象主題&#xff1a;聲明真是主題與代理的共同接口方法&#xff0c;可以是一個抽象類或接口。 RealSubject真實主題&#xff1a;定義了代理表示的真實對象&#xff0c…

國外計算機證書推薦(考證)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)

文章目錄 證書推薦1. 六西格瑪 (6 Sigma)2. 亞馬遜網絡服務 (AWS)3. 美國生產與庫存控制學會 (APICS)4. 內部審計師協會 (IIA)5. 微軟 (Microsoft)6. 甲骨文 (Oracle)7. 項目管理協會 (PMI)8. 紅帽 (Red Hat) 證書推薦 1. 六西格瑪 (6 Sigma) 介紹&#xff1a;六西格瑪是一種…

用mkdocs寫文檔#自動更新github-page

https://wuyisheng.github.io/blog 背景是上一篇博客 使用mkdocs&#xff0c;最后提及可以部署github page。這里說明下怎么自動部署。 當然&#xff0c;這篇博客主要的目的還是提供下github page的鏈接 &#xff1a;&#xff09; 我是這樣做的&#xff1a; step 1: pip3 i…

QT五 文件系統,QFile,QfileInfo

總覽 QIODevice&#xff1a;所有 I/O 設備類的父類&#xff0c;提供了字節塊讀寫的通用操作以及基本接口&#xff1b;QFileDevice&#xff1a;Qt5新增加的類&#xff0c;提供了有關文件操作的通用實現。QFlie&#xff1a;訪問本地文件或者嵌入資源&#xff1b;QTemporaryFile&a…

EF Core表達式樹

文章目錄 前言一、表達式樹與委托的區別二、動態構建表達式樹示例1示例2示例3高級技巧&#xff1a;表達式合并 三、ExpressionTreeToString安裝方法基本用法支持的格式化風格 四、注意事項總結 前言 在 Entity Framework Core 中&#xff0c;表達式樹&#xff08;Expression T…

NVM安裝速通使用手冊(Windows版)NVM管理node版本命令手冊 NVM使用手冊

nvm&#xff08;Node Version Manager&#xff09;是一個用于管理Node.js版本的命令行工具。通過nvm&#xff0c;你可以在同一臺機器上安裝和切換多個Node.js版本&#xff0c;非常適合開發和測試在不同Node.js版本上運行的應用程序 一、安裝地址 1. 官方下載&#xff1a; &…

vLLM命令行使用方法詳解

vLLM 是一個針對大語言模型(LLMs)優化的高效推理和服務庫。以下是 vLLM 命令行工具的詳細使用方法解析,涵蓋常見場景和參數配置: 一、核心命令行工具 vLLM 提供兩個主要的命令行入口: 啟動 API 服務器 用于部署 HTTP/OpenAI 兼容的 API 服務: python -m vllm.entrypoint…

# 基于 OpenCV 的選擇題自動批改系統實現

在教育領域&#xff0c;選擇題的批改工作通常較為繁瑣且重復性高。為了提高批改效率&#xff0c;我們可以利用計算機視覺技術&#xff0c;通過 OpenCV 實現選擇題的自動批改。本文將詳細介紹如何使用 Python 和 OpenCV 實現一個簡單的選擇題自動批改系統。 1. 項目背景 選擇題…

python黑科技:無痛修改第三方庫源碼

需求不符合 很多時候&#xff0c;我們下載的 第三方庫 是不會有需求不滿足的情況&#xff0c;但也有極少的情況&#xff0c;第三方庫 沒有兼顧到需求&#xff0c;導致開發者無法實現相關功能。 如何通過一些操作將 第三方庫 源碼進行修改&#xff0c;是我們將要遇到的一個難點…

第十三章:優化內存管理_《C++性能優化指南》_notes

優化內存管理 一、內存管理基礎概念二、自定義分配器三、智能指針優化重點知識代碼示例&#xff1a;智能指針性能對比 四、性能優化關鍵點總結多選題設計題答案與詳解多選題答案設計題示例答案&#xff08;第1題&#xff09; 一、內存管理基礎概念 重點知識 動態內存分配開銷…

python筆記之函數

函數初探 python在要寫出函數很簡單&#xff0c;通過關鍵字def即可寫出&#xff0c;簡單示例如下 def add(a, b):return ab 以上即可以定義出一個簡單的函數&#xff1a;接收兩個變量a和b&#xff0c;返回a和b相加的結果&#xff0c;當然這么說也不全對&#xff0c;原因就是…

【服務器操作指南 - GPU 使用與文件傳輸】輕松掌握 GPU 狀態查看和服務器文件傳輸技巧

0. 引言 在使用服務器時&#xff0c;高效管理 GPU 和文件傳輸是兩項不可或缺的技能。 本指南旨在幫助您快速掌握服務器環境下的 GPU 使用狀態監測方法&#xff0c;并簡要介紹如何在服務器之間進行文件傳輸操作。 1. 查看服務器上的 gpu 使用狀態 1.1 安裝 gpustat 這條指令…

0330-YYYY-MM-DD格式日期比較大小

最簡單的&#xff08;python&#xff09; from datetime import datetime def compare_time(time1,time2): time1_t datetime.strptime(time1,“%Y-%m-%d”) time2_t datetime.strptime(time2,“%Y-%m-%d”) if time1_t < time2_t: return time1_t elif time1_t > ti…

QFlightInstruments飛行儀表控件庫

QFlightInstruments 是一個開源的飛行儀表控件庫&#xff0c;專為基于 Qt 的應用程序設計。它提供了一系列仿真實飛機儀表的組件&#xff0c;適用于飛行模擬軟件、航空電子系統或任何需要高仿真飛行儀表顯示的項目。 主要功能 高仿真飛行儀表&#xff1a;包括空速表、高度表、…

VSCode 市場發現惡意擴展正在傳播勒索軟件!

在VSCode 市場中發現了兩個隱藏著勒索軟件的惡意擴展。其中一個于去年 10 月出現在微軟商店&#xff0c;但很長時間沒有引起注意。 這些是擴展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已從商店中刪除。 此外&#xff0c;ahban.cychelloworld 擴展于 2024 年 10 月…