主頁 >  其他 > 【正點原子FPGA連載】第九章按鍵控制LED燈實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

【正點原子FPGA連載】第九章按鍵控制LED燈實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

2021-10-24 08:20:54 其他

1)實驗平臺:正點原子新起點V2開發板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套實驗原始碼+手冊+視頻下載地址:http://www.openedv.com/thread-300792-1-1.html
3)對正點原子FPGA感興趣的同學可以加群討論:994244016
4)關注正點原子公眾號,獲取最新資料更新

第九章按鍵控制LED燈實驗

按鍵是常用的一種控制器件,生活中我們可以見到各種形式的按鍵,由于其結構簡單,成本低廉等特點,在家電、數碼產品、玩具等方面有廣泛的應用,本章我們將介紹如何使用按鍵控制多個LED的亮滅,
本章包括以下幾個部分

99.1簡介
9.2實驗任務
9.3硬體設計
9.4程式設計
9.5下載驗證

9.1簡介
按鍵開關是一種電子開關,屬于電子元器件類,我們的開發板上有兩種按鍵開關:第一種是本實驗所使用的輕觸式按鍵開關(如圖 9.1.1),簡稱輕觸開關,使用時以向開關的操作方向施加壓力使內部電路閉合接通,當撤銷壓力時開關斷開,其內部結構是靠金屬彈片受力后發生形變來實作通斷的;第二種是自鎖按鍵(如圖 9.1.2),自鎖按鍵第一次按下后保持接通,即自鎖,第二次按下后,開關斷開,同時開關按鈕彈出來,開發板上的電源鍵就是這種開關,

圖 9.1.1 輕觸式按鍵

圖 9.1.2 自鎖式按鍵
9.2實驗任務
使用新起點開發板上的四個按鍵控制四個LED燈,不同按鍵按下時,四個LED燈顯示不同效果,
9.3硬體設計
如圖 9.3.1所示,本實驗使用四個按鍵開關控制四個LED燈,

圖 9.3.1 按鍵電路原理圖
如上圖所示,開發板上的5個按鍵未按下時,輸出高電平,按下后,輸出低電平,
本實驗中,系統時鐘、復位按鍵、按鍵和LED燈的管腳如下表所示,
表 9.3.1 觸摸按鍵控制LED管腳分配圖

對應的TCL約束檔案如下:
set_location_assignment PIN_M2 -to sys_clk
set_location_assignment PIN_M1 -to sys_rst_n
set_location_assignment PIN_E16 -to key[0]
set_location_assignment PIN_E15 -to key[1]
set_location_assignment PIN_M15 -to key[2]
set_location_assignment PIN_M16 -to key[3]
set_location_assignment PIN_D11 -to led[0]
set_location_assignment PIN_C11 -to led[1]
set_location_assignment PIN_E10 -to led[2]
set_location_assignment PIN_F9 -to led[3]
9.4程式設計
我們程式設計最終實作的效果為:無按鍵按下時,LED燈全滅;按鍵1按下時,LED燈顯示自右向左的流水效果;按鍵2按下時,LED燈顯示自左向右的流水效果;按鍵3按下時,四個LED燈同時閃爍;按鍵4按下時,LED燈全亮,
LED在流水效果和閃爍效果在時間間隔均為0.2秒,因此需要在程式中定義一個0.2s的計數器,即每隔0.2s,狀態計數器加一,根據當前按鍵的狀態選擇不同的顯示模式,不同的顯示模式下四個led燈的亮滅隨狀態計數器的值改變,從而呈現出不同的顯示效果,

圖 9.4.1 系統框圖
按鍵控制led模塊的代碼如下所示:

1   module key_led(
2       input               sys_clk  ,    //50Mhz系統時鐘
3       input               sys_rst_n,    //系統復位,低有效
4       input        [3:0]  key,          //按鍵輸入信號
5       output  reg  [3:0]  led           //LED輸出信號
6       );
7   
8   //reg define     
9   reg  [23:0] cnt;
10  reg  [1:0]  led_control;
11  
12  //用于計數0.2s的計數器
13  always @ (posedge sys_clk or negedge sys_rst_n) begin
14      if(!sys_rst_n)
15          cnt<=24'd9_999_999;
16      else if(cnt<24'd9_999_999)
17          cnt<=cnt+1;
18      else
19          cnt<=0;
20  end 
21  
22  //用于led燈狀態的選擇
23  always @(posedge sys_clk or negedge sys_rst_n) begin
24      if (!sys_rst_n)
25          led_control <= 2'b00;
26      else if(cnt == 24'd9_999_999) 
27          led_control <= led_control + 1'b1;
28      else
29          led_control <= led_control;
30  end
31  
32  //識別按鍵,切換顯示模式
33  always @(posedge sys_clk or negedge sys_rst_n) begin
34      if(!sys_rst_n) begin
35          led<=4'b 0000;
36      end
37      else if(key[0]== 0)  //按鍵1按下時,從右向左的流水燈效果
38          case (led_control)
39              2'b00   : led<=4'b1000;
40              2'b01   : led<=4'b0100;
41              2'b10   : led<=4'b0010;
42              2'b11   : led<=4'b0001;
43              default  : led<=4'b0000;
44          endcase
45      else if (key[1]==0)  //按鍵2按下時,從左向右的流水燈效果
46          case (led_control)
47              2'b00   : led<=4'b0001;
48              2'b01   : led<=4'b0010;
49              2'b10   : led<=4'b0100;
50              2'b11   : led<=4'b1000;
51              default  : led<=4'b0000;
52          endcase
53      else if (key[2]==0)  //按鍵3按下時,LED閃爍
54          case (led_control)
55              2'b00   : led<=4'b1111;
56              2'b01   : led<=4'b0000;
57              2'b10   : led<=4'b1111;
58              2'b11   : led<=4'b0000;
59              default  : led<=4'b0000;
60          endcase
61      else if (key[3]==0)  //按鍵4按下時,LED全亮
62          led=4'b1111;
63      else
64          led<=4'b0000;    //無按鍵按下時,LED熄滅     
65  end
66  
67  endmodule 

代碼主要分為三個部分,第12至20行對系統時鐘計數,當計數時間達0.2s時,計數器清零,同時使led_control在四個狀態(00,01,10,11)內依次變化,第33至65行利用case陳述句實作對按鍵狀態的檢測,當不同的按鍵按下時,led隨著led_control的變化,被賦予不同的值,
大家可以發現,本次實驗和流水燈實驗計數時間都是0.2s,本次實驗的計數器最大可以計數到9_999_999,而流水燈實驗中計數器的值最大可以計數到10_000_000,事實上,這兩個實驗計數器都是從0開始計數的,本次實驗從0計數到9_999_999,需要10_000_000個時鐘周期,而系統時鐘為20ns,所以計數的時間為0.2s,而流水燈實驗從0計數到10_000_000需要10_000_001個時鐘周期,因此其計數時間實際上比0.2s要多出20ns,
為了驗證我們的程式,我們在modelsim內對代碼進行仿真,
Testbench模塊代碼如下:

1   `timescale 1 ns/ 1 ns
2   module tb_key_led();
3   
4   parameter T = 20;
5   
6   reg  [3:0]  key      ;
7   reg         sys_clk  ;
8   reg         sys_rst_n;
9   
10  wire [3:0]  led;
11  
12  initial begin   
13      key                <=4'b1111;//按鍵初始狀態為全斷開
14      sys_clk            <=1'b0;   //初始時鐘為低電平
15      sys_rst_n          <=1'b0;   //復位信號初始為低電平
16  #T   sys_rst_n          <=1'b1;   //一個時鐘周期后復位信號拉高
17  
18  #600_000_020 key[0]     <=0;      //0.6s時按下按鍵1
19  #800_000_000 key[0]     <=1;    
20  key[1]                  <=0;      //0.8s后松開按鍵1,按下按鍵2
21  #800_000_000 key[1]     <=1;   
22  key[2]                  <=0;      //0.8s后松開按鍵2,按下按鍵3
23  #800_000_000 key[2]     <=1;   
24  key[3]                  <=0;      //0.8s后松開按鍵3,按下按鍵4    
25  #800_000_000 key[3]     <=1;      //0.8s后松開按鍵4
26  
27  end 
28  
29  always # (T/2) sys_clk <= ~sys_clk;
30  key_led   u_key_led(
31      .sys_clk(sys_clk),       
32      .sys_rst_n(sys_rst_n),     
33      .key(key),                  
34      .led(led)          
35      );
36  
37  endmodule

圖 9.4.2 仿真影像
觀察代碼,結合波形分析可知,14至16行代碼為對時鐘信號、復位信號、按鍵信號賦初始值,默認為按鍵全斷開,第0.6s時按下按鍵key0(kye[0]由高電平變為低電平),可觀察到led3至led0依次點亮,呈現自右向左的流水效果;按鍵key1斷開的同時按下按鍵key2,可觀察到led0至led3依次點亮,呈現自左向右的流水效果;按鍵key2斷開的同時按下按鍵key3s,可觀察到led0至led3呈現閃爍效果;按鍵key3斷開的同時按下按鍵key4,可觀察到led0至led3保持全亮,
9.5下載驗證
首先我們打開按鍵控制LED工程,在工程所在的路徑下打開key_led/par檔案夾,在里面找到“key_led.qpf”并雙擊打開,注意工程所在的路徑名只能由字母、數字以及下劃線組成,不能出現中文、空格以及特殊字符等,key_led工程打開后如圖 9.5.1所示,

圖 9.5.1 打開工程
工程打開后通過點擊工具列中的“Programmer”圖示(圖中紅框位置)打開下載界面,
下載界面如圖 9.5.2所示,查看圖中是否已經加載下載檔案(sof檔案),如果沒有,則需要通過點擊“Add File”按鈕添加流水燈工程中key_led/par/output_files目錄下的“key_led.sof”檔案,

圖 9.5.2 下載界面
如下圖 9.5.3所示,將下載器一端連接電腦,另一端與開發板上的JTAG下載口相連接,如下圖所示,然后連接電源線并打開電源開關,

圖 9.5.3 開發板按鍵
開發板電源打開后,在程式下載界面點擊“Hardware Setup”,在彈出的對話框中選擇當前的硬體連接為“USB-Blaster”,然后點擊“Start”將工程編譯完成后得到的sof檔案下載到開發板中,
下載完成后,就可以利用按鍵來控制LED了,如圖 9.5.3所示,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333498.html

標籤:其他

上一篇:tools - 低代碼開發平臺

下一篇:(嵌入式系統開發)stm32串口通信與RS-232

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more