【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.mzph.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;由于你的系统状态和我的不一样&…