【FPGA VerilogHDL】第一次嘗試:LED燈基礎實驗

0 實驗環境

0.1 軟件環境

  • ISE 14.7
  • win10
  • vivado 2017.4

0.2 硬件設備

  • ISE適用的FPGA開發板:ALINK AX309
    在這里插入圖片描述

1 需求

能夠靈活控制4個LED燈

2 Verilog實現

`timescale 1ns / 1ps
//
// Create Date:    14:18:20 08/08/2020 
// Module Name:    led 
// Revision 0.01 - File Created
//
module led(input clk,input rst,output reg led);//define the time counterreg [31:0]      timer;// cycle counter:from 0 to 4 secalways@(posedge clk or negedge rst)beginif (rst == 1'b0)timer <= 32'd0;                     //when the reset signal valid,time counter clearingelse if (timer == 32'd39_999_999)      //4 seconds count(50M*4-1=199999999)timer <= 32'd0;                     //count done,clearing the time counterelsetimer <= timer + 32'd1;             //timer counter = timer counter + 1end// LED controlalways@(posedge clk or negedge rst)begin								if (rst == 1'b0)					led <= 1'b0;                        //when the reset signal activeelse if (timer == 32'd49_999_999)       //time counter count to 1st sec,LED1 lightenled <= 1'b1;else if(timer == 32'd99_999_999)led <= 1'b0;endendmodule

功能說明:

  • 輸入:時鐘clk和復位鍵rst信號(clk是50MHz)
  • 輸出:發出控制一個led燈的信號
  • 對于led信號,初始為0,間隔1秒,變成1,再間隔1秒,變成0,循環往復

時間說明:

50MHz對應的時鐘周期是0.02μs,因此,1s需要 50 * 10^6個時鐘周期

初始的timer = 0,因此,實際的1s,對應timer = 32'd_49_999_999,也就是50_000_000個時鐘周期。

3 仿真測試(略)

不是本次實驗的重點,略。

4 綜合測試

直接在ISE軟件執行綜合即可。
在這里插入圖片描述

5 管腳分配

這是本文的重點。 需要理解

  1. Verilog代碼(.v文件)如何與ucf文件建立關聯
  2. 代碼如何與實際的硬件平臺管腳建立關聯

5.1 建立.ucf文件

我們先在ISE建立一個.ucf文件,然后分配管腳。

關于具體的管腳分配信息,需要參照開發板使用說明書

在這里插入圖片描述
在這里插入圖片描述

NET "clk" LOC = T8 | TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;##
NET rst                 LOC = L3 | IOSTANDARD = "LVCMOS33"; ## reset pushbutton
##########LED Pin define#####################
NET led                LOC = P5 | IOSTANDARD = "LVCMOS33";       ## LED1

重要的說明

  1. 以上代碼直接被開發板說明給出,不需要自己改,除非你有特定需求
  2. 需要注意的是自己編寫的Verilog代碼的信號名稱,必須與上述代碼的NET后面的信號保持一致。例如
  • 時鐘信號必須是clk
  • 復位信號必須是rst
  • LED燈信號必須是led
  1. NET后面的內容,是與Verilog代碼信號建立關聯,而LOC后面的內容,則是與硬件設備的引腳建立關聯,之后的部分是電壓,可以先不管。

重要的公式:NET “端口名稱” LOC = 引腳編號 | IOSTANDARD = “電壓” ;

這是非常重要的,我們在進行管腳分配的時候,就是按照這樣的方式分配的。

在這里插入圖片描述

  1. 代碼模擬的硬件設備,突出的就是輸入輸出端口,與Verilog設計有關
  2. 硬件設備,突出的就是引腳,與硬件有關
  3. 紅色的雙箭頭,就是二者的關聯,與.ucf文件有關,它的NET端口名必須和Verilog端口名一樣,LOC管腳編號以及電壓,必須和硬件設備一樣

對于以下ucf內容

########LED Pin define#####################
NET led<0>                LOC = P4 | IOSTANDARD = "LVCMOS33";       ## LED1
NET led<1>                LOC = N5 | IOSTANDARD = "LVCMOS33";       ## LED2
NET led<2>                LOC = P5 | IOSTANDARD = "LVCMOS33";       ## LED3
NET led<3>                LOC = M6 | IOSTANDARD = "LVCMOS33";       ## LED4

值得注意的是<0>這部分。

首先,led引腳的位寬是1,嗯,通常引腳是1位,這樣靈活性高(還是得參考對應的說明文檔)。

LED的說明如下
在這里插入圖片描述
在這里插入圖片描述
你很容易知道LED燈引腳位寬是1,為0的時候不亮,為1的時候點亮。

########LED Pin define#####################
NET led<0>                LOC = P4 | IOSTANDARD = "LVCMOS33";       ## LED1
NET led<1>                LOC = N5 | IOSTANDARD = "LVCMOS33";       ## LED2
NET led<2>                LOC = P5 | IOSTANDARD = "LVCMOS33";       ## LED3
NET led<3>                LOC = M6 | IOSTANDARD = "LVCMOS33";       ## LED4

但是這與<>無關,引腳的事情,是LOC后面內容的事情,<>是端口的事情,那么,尖括號對應端口究竟是怎么回事?

猜想,然后試一下就好了!

我們之前的led輸出信號是1位,現在我們改一下

output reg[1:0] led

然后再把LED control改改

// LED controlalways@(posedge clk or negedge rst)begin										if (rst == 1'b0)						led <= 1'b0;                     else if (timer == 32'd19_999_999)      led <= 2'b01;else if(timer == 32'd39_999_999)led <= 2'b10;end

注意變化,關注led <= 2'b01;

然后我們再改改.ucf文件

########LED Pin define#####################
NET led<0>                LOC = P4 | IOSTANDARD = "LVCMOS33";       ## LED1
NET led<1>                LOC = N5 | IOSTANDARD = "LVCMOS33";       ## LED2

之后上板測試,很容易得到結論。

如果你還沒有得到,不妨試一下3位寬,4位寬的led信號。

結論是:led<0>0對應的是output reg[1:0] led信號的led[0],而led<1>對應的是led[1]

分治思想:區分端口名與管腳編號

對于.ucf文件

  1. NET的值是端口名,與Verilog中的端口名稱完全一致,如果是多位寬,則按照上面的結論寫上<number>
  2. LOC的值是管腳編號,根據你的需求,你需要將合適的管腳(對應的器件)與合適的端口建立連接

對于同樣一個led<0>,它可以分配的引腳有多種選擇,不過,需要遵循的是

  1. 引腳對應的器件必須是LED燈
  2. 引腳不能發生沖突(例如2個端口接到了同一個引腳,并且端口信號同一時間發出不同信息)

需要注意:

對于沒有的端口號,不能分配管腳!

這是顯而易見的,不過還是得多提示一下。

實驗思維

很多時候,不管是書籍還是說明文檔,都不可能詳細描述所有細節,但是,你依然可以通過試驗程序,猜測得出結論,然后你需要多次驗證(通過實驗,資料等)

信息 = 位 + 上下文

以往,我們對于二進制數字10000001的反應可能是對應十進制81,但是對于本實驗(假設用了4個LED燈),它的含義就是只有LED4亮只有LED1亮

這也充分詮釋了二進制信息含義 = 位 + 上下文的含義。

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

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

相關文章

使用ISE一鍵生成bit文件

我們知道&#xff0c;這幾個&#xff0c;在第一次做好源文件之后&#xff0c;需要一個個進行右鍵單擊-->run&#xff0c;以發現錯誤。 但是之后的調試&#xff0c;只要一點點變化&#xff0c;哪怕是注釋變化&#xff0c;都需要重新run3次&#xff0c;太麻煩了。 不過經過實…

【FPGA Verilog】實驗二:key按鍵基礎實驗

只說一下經驗和教訓 1 必須按照設計流程走 不要因為實驗簡單&#xff0c;就直接進行綜合&#xff0c;比如按照 設計編碼RTL優化仿真綜合管腳分配&#xff0c;實現下載 一定要按照這個步驟來。 2 必須先查看開發板說明文檔 開始出了一個令人困惑的問題&#xff0c;后來發現…

【Java】字符串轉換為數字:Integer的parseInt方法

Java官方文檔[1]的解釋 public static int parseInt?(String s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus…

在win10上使用Vmware安裝Mac OS

安裝macOS 如何在Windows上VMware上安裝macOS Catalina 10.15 做一些提示&#xff1a; 如果您在第一次啟動mac的時候&#xff0c;在出現【語言選擇】之前&#xff0c;出現了連接藍牙內容。 您可以將教程中【修改為win10 x64】那一步跳過&#xff0c;請注意&#xff0c;如果您…

JDBC 防御性編程

防御性編程&#xff08;Defensive Programming&#xff09; 什么是Defensive Programming[1]&#xff1f; 原文&#xff1a;Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circu…

【Java】異常處理的目的

編程思維&#xff1a;Defensive Programming 我們寫好程序&#xff0c;將其打包&#xff0c;然后用戶就可以使用和運行&#xff0c;但是&#xff0c;外界的情況是未知的&#xff0c;我們的程序很可能因為某個因素的出現而崩潰&#xff0c;因此&#xff0c;對于我們可以預測到的…

【Coursera】Getting Started with Python:Week One - Reading: Welcome to The Class

原文 & 翻譯 Reading: Welcome to The Class Welcome to Getting Started with Python, the first class in our Python for Everybody Specialization. We have built this class specifically for those with no prior programming experience. With a relatively simpl…

【Java】獲取目錄及其子目錄文件的相關事宜

獲取目錄及其子目錄文件的代碼 public class Main {public static void main(String[] args) {String path "D:/"; File f new File(path);Main.getFile(f);}public static void getFile(File file){if(file ! null){File[] f file.listFiles();if(f ! null){for…

【計算機思維】面向人的開發 站在巨人的肩膀上

思維轉變&#xff1a;使用其他程序員開發的“黑箱”&#xff0c;不要重復造輪子 以Java舉例&#xff0c;從常用的集合框架開始&#xff0c;我們要產生新的思維轉變了&#xff0c;我們已經學會了基本的功能&#xff0c;但是在真正開發的時候&#xff0c;用基礎功能去做開發效率…

【Computer Organization】The Core Design Thinking of single cycle CPU

1 Overview This section introduces someting that maybe you need to know before learning. Note:This CPU is based on MIPS instruction set. 1.1 Tools LogisimCS 3410 ComponentsMARS MIPS simulatorWin10 or Mac OS 1.2 Courses 自己動手畫CPU《計算機組織與結構實…

【匯編語言】王爽 - 內中斷復習

0 前言 基于王爽《匯編語言》和Coursera的《計算機組成》課程。 1 中斷分類 CPU在執行指令的過程中&#xff0c;產生了一個異常/中斷&#xff0c;因為CPU只能同時執行一條指令&#xff0c;所以需要暫停該指令的執行&#xff0c;轉而去處理異常/中斷信息。 這個異常可以來…

【算法】蠻力法/窮舉法/枚舉法 的基本問題分析

炮兵問題的優化&#xff0c;設立邏輯數組 蠻力法設計思想 有策略地窮舉 驗證 制定窮舉策略避免重復 簡單來說&#xff0c;就是列舉問題所有可能的解&#xff0c;然后去看看是否滿足題目要求&#xff0c;是一種逆向解題方式。&#xff08;我也不知道答案是什么&#xff0c;…

如何高效學習算法【實例 + 可視化】

對于初學者來說&#xff0c;學習算法&#xff0c;不應該先學習抽象的理論&#xff0c;那樣沒有感覺&#xff0c;越學越暈&#xff0c;應該&#xff1a; 有具體的例子有可視化過程 同時需要結合理論知識對照學習&#xff0c;理論扎實、實踐有效&#xff0c;同時要有結果反饋。…

【計算機網絡實驗·北航】實驗一:網絡實驗入門(1)

1.3 遠程在線環境使用 PCA、PCB、PCC和PCD&#xff1a;4臺PC機S1、S2&#xff1a;2臺交換機R1、R2&#xff1a;2臺路由器中間的設備&#xff1a;組網連線器 遠程組網連線&#xff1a; 使用PCA上的組網連線軟件&#xff0c;配置組網連線器&#xff0c;實現組網連線。 PCA和PCB…

【C++】int與string轉換

頭文件&#xff1a;<string>&#xff0c;注意&#xff0c;這與<string.h>、<cstring>不是一回事兒語法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函數的基本使用

rand()函數用于生成偽隨機數&#xff0c;每次生成的隨機數都不變&#xff0c;方便我們調試程序。 重要是的隨機數的范圍公式&#xff08;適用整數&#xff09; 公式&#xff1a; 確定范圍加偏移量 例如&#xff1a;a和b是整數 [a,b]&#xff0c;范圍是b - a 1&#xff0c…

【操作系統】虛擬化CPU、Memory,共享文件

幾個概念 CPU、虛擬CPU進程內存、虛擬地址空間 物理的CPU被OS虛擬成了多個虛擬的CPU&#xff0c;這些虛擬CPU分別運行各自的程序&#xff0c;這些正在運行的程序被稱為進程。物理內存被OS虛擬成了多個虛擬地址空間&#xff0c;每個進程都有獨立的、自己的地址空間&#xff0c;…

【Linux】編譯C語言文件(-o -lpthread)

在gcc中使用-o編譯 對于一個一般的程序&#xff0c;直接使用gcc <C語言文件名> -o <編譯后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…

【Linux】Ubuntu下進行C語言編程

前言 需要您會使用Windows下cd切換目錄的基本命令&#xff0c;否則請先自學相關知識&#xff0c;之后再閱讀本文。 0 基礎命令 介紹最基礎的Linux終端命令。 su - root&#xff1a;切換到root用戶&#xff08;不用也可以&#xff09;ls&#xff1a;查看當前目錄位置cd&…

【Linux】Ubuntu 18下安裝Vim自動補全插件YouCompleteMe(可高速下載安裝)

前言 本文寫于2020年10月&#xff0c;如果你多年后看見這篇文章&#xff0c;方法可能已經失效&#xff0c;但是請牢記&#xff0c;盡量下載你所處時代的最新版本的軟件&#xff0c;會減少很多麻煩。 擺正心態 即便按照本文操作&#xff0c;由于你的系統狀態和我的不一樣&…