Vivado 下 LED 灯闪烁实验

news2024/11/19 15:40:15

目录

Vivado 下 LED 灯闪烁实验

1、简介

2、实验环境

3、实验任务

4、硬件设计

5、程序设计

5.1、LED 闪烁模块代码

5.2、Vivado 仿真验证

5.2.1、编写 TB 仿真代码

6、下载验证

6.1、添加约束文件 .xdc

6.2、下载验证

注意:一定要先把下载器的一端连接到了电脑、另一端连接了 JTAG 接口之后,再给开发板上电!否则,对开发板的 JTAG 接口进行带电热插拔,有一定概率会损坏 JTAG 接口!!!


Vivado 下 LED 灯闪烁实验

       LED 灯闪烁作为一个经典的入门实验,其地位堪比编程界的“HelloWorld!”。对于很多电子工程师来说,LED 灯闪烁都是他们在硬件上观察到的第一个实验现象。本章我们同样通过 LED 灯闪烁实验,带你进入 FPGA 的精彩世界。

1、简介

       LED,又名发光二极管。LED 灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点,LED 灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。

       不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光。图 7.1.1 是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的一端是阴极。图 7.1.2 是开发板上用的贴片二极管实物图。贴片二极管的正面一般都有颜色标记,有标记的那端就是阴极。

       发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过 5mA 左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在 3~20mA 之间,否则电流过大就会烧坏二极管。

2、实验环境

  • Windows 10  64 位
  • vivado 2020.2
  • Xinlinx 黑金 FPGA 开发板(AX7A035t 开发板、AX7A100t 开发板、AX7A200t 开发板)

3、实验任务

       本节实验任务是使用 Xinlinx 黑金 FPGA 开发版上的 LED0 和 LED1 以固定的频率交替闪烁。

4、硬件设计

       四个 LED 灯均有连接三极管,这是由于 LED0~LED3 连接到了 FPGA IO,但是电压只有 1.35V,电压较低,所以此处连接三极管,起到放大信号的作用。当 FPGA 输出 LED0~LED3 为高电平时,三极管导通,点亮 LED 灯;当 FPGA 输出 LED0~LED3 为低电平时,三极管截止,LED 灯熄灭。

5、程序设计

       由于发光二极管的阳极与 FPGA 的管脚相连,只需要改变与 LED 灯相连的 FPGA 管脚的电平,LED 灯的亮灭状态就会发生变化。当 FPGA 管脚为高电平时,LED 灯点亮;为低电平时,LED 灯熄灭。

本次设计的模块端口及信号连接如下图所示:

       其中,计数器对 50MHz 时钟进行计数,从而达到计时的目的。计数器在每次计时到 1 秒之后清零,然后重新开始计数,计数的值用于控制 LED 的显示状态。当计数器的值小于 0.5s 时,就把 LED0 点亮并把 LED1 熄灭;每当计数器的值大于 0.5s 时,就把 LED0 熄灭并把 LED1 点亮,以此实现两个 LED 的交替闪烁。

5.1、LED 闪烁模块代码

LED 闪烁模块的代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/09 19:57:15
// Design Name: 
// Module Name: led_twinkle
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module led_twinkle(
//    input               sys_clk,       //50MHz系统时钟
    //differential system clocks//200MHz系统时钟
    input               sys_clk_p,       //system clock positive
    input               sys_clk_n,       //system clock negative
    input               sys_rst_n, //系统复位,低电平有效
    
    output [1:0] led //2位LED灯
    );
    
//FPGA板载50MHz时钟,所以一个时钟周期为:1/50MHz=20ns,
//计数器通过对50MHz系统时钟计数,计时到0.5s,需要累加0.5s/20ns=25000_000次。

//黑金Artix7A35t板载200MHz时钟,所以一个时钟周期为:1/200MHz=5ns,
//计时到0.5s,需要累加0.5s/5ns=100_000_000次。
   
//define the time counter
reg [31:0] cnt;  

//*********差分时钟这么处理***START******************
wire        sys_clk;
//差分输入时钟缓冲器-黑金FPGA
IBUFDS sys_clk_ibufgds //generate single end clock
(
	.O                          (sys_clk                  ),
	.I                          (sys_clk_p                ),
	.IB                         (sys_clk_n                )
);
//*********差分时钟这么处理*****END*******************

//************************************************
//**           main code
//************************************************

//对计数器的值进行判断,以输出LED的状态
assign led = (cnt<32'd10000_0000)?2'b01:2'b10;
//assign led = (cnt<32'd5)?2'b01:2'b10; //仅用于仿真

//计数器在0~5000_0000之间进行计数
always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt<=32'd0;
    else if(cnt<32'd20000_0000)
    //else if(cnt<32'd10) //仅用于仿真
        cnt<=cnt+1'b1;
    else
         cnt<=32'd0;
end
    
endmodule

       本程序中输入时钟为 200MHz,所以一个时钟周期为 5ns1/200MHz)。因此计数器 cnt 通过对 200MHz 系统时钟计数,计时到 1s,需要累加 1s/5ns=20000_0000 次。在代码第 67 行,每当计时到 1s 计数器清零一次。
       同时,在代码的第 58 行,对根据计数器的计数值来赋值两个 LED 的状态。当计数值小于 32'd1000_0000 即计时到 1s 中的前 500ms 时,LED0 点亮 LED1 熄灭;当计数值大于等于 32'd1000_0000,即计时到 1s 中的后 500ms 时,LED0 熄灭 LED1 点亮。当计数到 1s 时,计数器又会回 0,重复此过程。以此实现两个 LED 的交替闪烁。

5.2、Vivado 仿真验证

       为了验证我们的程序,我们在 Vivado 内对代码进行仿真。为了更容易地看到仿真现象,我们将源代码中的计数器的最大计数值修改为 5,然后再仿真,如下图所示:

        因为本实验我们只有系统时钟和系统复位这两个输入信号,以及两个LED 灯输出信号,所以仿真文件也只需要编写这四个信号的激励即可。

5.2.1、编写 TB 仿真代码

Testbench 模块仿真代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/09 20:40:24
// Design Name: 
// Module Name: tb_led_twinkle
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_led_twinkle();      //测试模块

//parameter T = 20; //50Mhz系统时钟,周期为20ns
parameter T = 5;  //黑金FPGA-差分时钟:200Mhz系统时钟,周期为5ns

//输入
//reg         sys_clk;
reg         sys_clk_p;   //时钟信号
wire        sys_clk_n;
reg         sys_rst_n;

//输出
wire    [1:0]   led;

//***************************************
//**        main code
//***************************************

//信号初始化
initial begin
//    sys_clk = 1'b0;
    sys_clk_p = 1'b0;
    sys_rst_n = 1'b0;
    #200    //延时200ns
    sys_rst_n = 1'b1;
end

//生成时钟
//always #(T/2) sys_clk =~sys_clk;
always #(T/2) sys_clk_p =~sys_clk_p;
assign sys_clk_n=~sys_clk_p;

//实例化待测设计
led_twinkle u_led_twinkle(
//    .sys_clk        (sys_clk),
	  .sys_clk_p      (sys_clk_p), 
	  .sys_clk_n      (sys_clk_n),
    .sys_rst_n      (sys_rst_n),
    .led            (led)
    );

endmodule

仿真得到的波形图如下图所示:

       从图中可以看到,计数器 cnt 的值在 0 10 之间循环计数。当 cnt 的值小于 5 时,led0 为高电平;大于 5 led0 为高电平。两个 LED 的状态随着计数器的计数循环翻转,实现 LED 闪烁的效果。

6、下载验证

6.1、添加约束文件 .xdc

添加约束文件 led_twinkle.xdc,添加约束文件.xdc 的详细步骤见: Vivado 下 LED 流水灯实验_OliverH-yishuihan的博客-CSDN博客 中的 “4.3、添加 XDC管脚约束文件

约束文件 breath_led.xdc 的具体内容如下:

############## clock define 时钟引脚、电平信号约束#####黑金-FPGA##################
create_clock -period 5.000 [get_ports sys_clk_p]
set_property PACKAGE_PIN R4 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
############## reset key define##########################
set_property -dict {PACKAGE_PIN F15 IOSTANDARD LVCMOS15} [get_ports sys_rst_n]
############## LED define ############################
set_property -dict {PACKAGE_PIN L13 IOSTANDARD LVCMOS15} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN M13 IOSTANDARD LVCMOS15} [get_ports {led[1]}]
##############SPI Configurate Setting##################
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]

6.2、下载验证

       编译工程并生成比特流.bit 文件后,点击 Vivado 左侧 “Flow Navigator” 窗口最下面的 “Open Hardware Manager” 按钮如下图所示。

       此时将 Xilinx 下载器一端连接电脑,另一端与开发板上的 JTAG 下载口连接,开发板连接电源线,如下图所示:

       经过前面的编译和仿真,我们可以把 bit 文件下载到 FPGA 芯片中,看一下 LED 实际运行的效果(两个 LED 灯交替闪烁)。下载和调试之前先连接硬件,把 JTAG 下载器和开发板连接(如下图是 AX7A200 开发板 JTAG 连接 作为参考),然后开发板上电。

注意:一定要先把下载器的一端连接到了电脑、另一端连接了 JTAG 接口之后,再给开发板上电!否则,对开发板的 JTAG 接口进行带电热插拔,有一定概率会损坏 JTAG 接口!!!

详细步骤见:“ Vivado 下 LED 流水灯实验_OliverH-yishuihan的博客-CSDN博客” 中的 “4.6 下载和调试”、“4.7、FLASH 程序固化” 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FDM3D打印系列——2、一些基础概念

大家好&#xff0c;我是阿赵。 在买3D打印机之前&#xff0c;一般都会很迷茫&#xff0c;不知道3D打印机是怎样工作的&#xff0c;也不知道有哪些地方需要注意。上一篇文章通过打印一个模型&#xff0c;完整的体验了一次FDM打印3D模型的过程。这里解释一些在3D打印里面的比较基…

PMP考试自学可以吗?

PMP考试不建议自学&#xff0c;听劝&#xff0c;不该省的别省。 PMP现在没有自学了&#xff0c;今年3月的考试报了培训班的同学都说难&#xff0c;培训班的资源老师的专业&#xff0c;怎么也比自己单打独斗强吧&#xff0c;真的报培训班省事很多。 PS&#xff1a;网上说包过的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构&#xff0c;X86架构的CPU是PC服务器行业的老大&#xff0c;ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别&#xff0c;很多用户不理解它们两个之间到底有哪些区别&#xff0c;实际就是它们的领域不太相同…

Liunx安装window中文字体解决中文变方框问题

问题现象描述 没安装中文字体&#xff0c;有可能导致你的程序在windows上运行的好好的&#xff0c;部署到linux上运行就可能出现汉字变成小方块的问题&#xff0c;场景举例&#xff1a;svg文件转png图片&#xff0c;原svg中的中文会变成方框 按如下方法安装中文字体后&#xf…

南卡OE骨传导开放式蓝牙耳机评测!舒适与音质并存!

平时买耳机的时候&#xff0c;你最先会关注什么方向呢&#xff1f;是舒适、美观&#xff0c;还是音质、防水&#xff1f; 对于我来说&#xff0c;首先是功能。作为一个经常健身、跑步的人&#xff0c;最讨厌的就是平时运动流汗进入耳朵之后那种粘腻感觉。时间长了还容易让耳道…

凹下去的白色按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>凹下去的按钮</title><style>import url("https://fonts.googleapis.com/css2?famil…

【SIGMOD 2023】深度学习弹性数据流水线系统GoldMiner,大幅提升任务和集群效率

第一板块&#xff1a;开篇 近日&#xff0c;阿里云机器学习平台PAI和北京大学杨智老师团队合作的论文《GoldMiner: Elastic Scaling of Training Data Pre-Processing Pipelines for Deep Learning》被数据库领域顶会SIGMOD 2023接收。 GoldMiner观察到深度学习任务中的数据预…

redis登录常见报错

第一次接触redis登录的时候遇见几个报错 一、使用以下两个命令报错&#xff1a; ./redis-cli -h 127.0.0.1 -p 6380 ./redis-cli -p 6380 报错&#xff1a;Could not connect to Redis at 127.0.0.1:6380: Connection refused 应该和redis.conf中配置的bind字段的IP有关…

一文全揽C/C++中所有指针相关知识点(从原理到示例,学不完根本学不完!!!!)

本篇会对C/C中【常见指针相关知识】一直进行总结迭代&#xff0c;记得收藏吃灰不迷路&#xff0c;一起学习分享喔 请大家批评指正&#xff0c;一起学习呀~ 一、指针基本知识1.1 指针的定义1.2 &#xff08;*&#xff09; 和&#xff08; &&#xff09; 运算符1.3 如何声明…

SM国密算法(四) -- SM3算法

一、简介 SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。适用于商用密码应用中的数字签名和验证。 SM3是在[SHA-256]基础上改进实现的一种算法&#xff0c;其安全性和SHA-256相当。SM3和MD5的迭代过程类似&#xff0c;也采用Merkle-Damgard结构。…

OpenCV(图像处理)-基于python-滤波器(低通、高通滤波器的使用方法)

1.概念介绍2. 图像卷积filter2D() 3. 低通滤波器3.1 方盒滤波和均值滤波boxFilter()blur() 3.2 高斯滤波&#xff08;高斯噪音&#xff09;3.3 中值滤波&#xff08;胡椒噪音&#xff09;3.4 双边滤波 4. 高通滤波器4.1Sobel&#xff08;索贝尔&#xff09;&#xff08;高斯&am…

STL之set和map

目录 一. 原型二. 模板参数适配三. 迭代器四. 插入函数的修改四. 代码 一. 原型 简单实现的红黑树 template<class K, class V> struct RBTreeNode {RBTreeNode<K, V>* _left;RBTreeNode<K, V>* _right;RBTreeNode<K, V>* _parent;pair<K, V> …

FPGA_学习_11_IP核_RAM_乒乓操作

本篇博客学习另一个IP核&#xff0c;RAM。 用RAM实现什么功能呢&#xff1f; 实现乒乓操作。 乒乓操作是什么呢&#xff1f; 参考&#xff1a; FPGA中的乒乓操作思想_fpga中乒乓操作的原因_小林家的龙小年的博客-CSDN博客 何为乒乓操作_fanyuandrj的博客-CSDN博客 以下是本人理…

Clion开发STM32之日志模块(参考RT-Thread)

前言 日志对于开发和排错方面有着很重要的影响。通过查看RT-Thread的源码&#xff0c;将日志的打印输出划分到具体的文件和通过宏定义对具体的日志等级进行划分&#xff0c;这样就比较方便。结合此源码的形式将其分离出来&#xff0c;作为自己项目的日志框架进行使用分为日志驱…

crossover软件下载2023最新版虚拟机

在Mac系统中一直存在一个比较令用户们头疼的问题&#xff0c;那就是安装不了想要的Windows软件。如果使用的第一台电脑就是MacBook那接触到的Windows软件想必并不是很多。但我们中的大多数人都是从小先学习了Windows的操作系统&#xff0c;再过渡到Mac系统上的。 那有小伙伴会…

最新基于MATLAB 2023a的机器学习、深度学习实践应用

MATLAB 2023版的深度学习工具箱&#xff0c;提供了完整的工具链&#xff0c;使您能够在一个集成的环境中进行深度学习的建模、训练和部署。与Python相比&#xff0c;MATLAB的语法简洁、易于上手&#xff0c;无需繁琐的配置和安装&#xff0c;能够更快地实现深度学习的任务。 M…

Flink流批一体计算(4):Flink功能模块

目录 Flink功能架构 Flink输入输出 Flink功能架构 Flink是分层架构的分布式计算引擎&#xff0c;每层的实现依赖下层提供的服务&#xff0c;同时提供抽象的接口和服务供上层使用。 Flink 架构可以分为4层&#xff0c;包括Deploy部署层、Core核心层、API层和Library层 部署层…

基于SSM的宠物领养系统的设计与实现

1.引言 动物作为人类的宠物已经有几千年的历史了&#xff0c;尤其是猫和狗因其天性被人类所喜爱和推崇&#xff0c;好多的成语故事、俗语等都及它们有关。但是&#xff0c;近几年来由于生活节奏的加快&#xff0c;人们的压力增大&#xff0c;没有时间和空间去照顾宠物&#xf…

ProGuard 进阶系列(三) Java 类文件解析

书接上文&#xff0c;当我们从用户的配置文件中读取到所有的配置信息后&#xff0c;下一步便是将配置中的指定的类文件进行读取&#xff0c;构建需要混淆的 Java 类文件的语法树。在阅读类文件之前&#xff0c;先来看一下输入输出参数中的内容&#xff0c;我使用的是一个 Andro…

大一下暑期计划 + 2023字节青训营预告直播

目录 &#x1f33c;前言 &#x1f339;后端学习方法 &#x1f333;1&#xff0c;层次 &#x1f333;2&#xff0c;体系 &#x1f333;3&#xff0c;算法和数据结构 &#x1f333;4&#xff0c;总结 &#x1f339;前端学习方法 &#x1f333;基础 &#x1f339;求职中如…