Vivado 下按键控制 LED 实验

news2024/11/17 16:02:16

目录

Vivado 下按键控制 LED 实验

1、简介

2、实验环境

3、实验任务

4、硬件设计

5、程序设计

5.1、按键控制 led 模块代码

5.2、Vivado 仿真验证

5.2.1、Testbench 模块代码如下:

5.2.2、Vivado 仿真验证

6、下载验证

6.1、添加约束文件.xdc

6.2、板上下载验证

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


Vivado 下按键控制 LED 实验

       按键是常用的一种控制器件。生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等特点,在家电、数码产品、玩具等方面有广泛的应用。本章我们将介绍如何使用按键控制多个 LED 的亮灭。

1、简介

       按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关:第一种是本实验所使用的轻触式按键开关(如下图1.1 ),简称轻触开关。使用时以向开关的操作方向施加压力使内部电路闭合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;第二种是自锁按键(如下图1.2 ),自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来,开发板上的电源键就是这种开关。

2、实验环境

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

3、实验任务

       使用 Xinlinx 黑金 FPGA 开发板上的四个按键控制四个 LED 灯。不同按键按下时,四个 LED 灯显示不同效果。

4、硬件设计

如图 3.1 所示,本实验使用四个按键开关控制四个 LED 灯。

如上图所示,开发板上的 4 个按键未按下时,输出高电平,按下后,输出低电平。

5、程序设计

       我们程序设计最终实现的效果为:无按键按下时,LED 灯全灭;按键 1 按下时,LED 灯显示自右向左的流水效果;按键 2 按下时,LED 灯显示自左向右的流水效果;按键 3 按下时,四个 LED 灯同时闪烁;按键 4 按下时,LED 灯全亮。

       LED 在流水效果和闪烁效果在时间间隔均为 0.2 秒,因此需要在程序中定义一个 0.2s 的计数器,即每隔 0.2s,状态计数器加一。根据当前按键的状态选择不同的显示模式,不同的显示模式下四个 led 灯的亮灭随状态计数器的值改变,从而呈现出不同的显示效果。

5.1、按键控制 led 模块代码

按键控制 led 模块的代码如下所示:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/10 20:25:57
// Design Name: 
// Module Name: key_led
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//实验任务:按键控制LED灯
//使用开发板上的四个按键控制四个 LED 灯。不同按键按下时,四个 LED 灯显示不同效果。

module key_led(
//    input               sys_clk,       //50MHz系统时钟(一个周期是20ns:1/50MHz=0.02us=20ns)
    //differential system clocks //200MHz系统时钟(一个周期是5ns:1/200MHz=0.005us=5ns)
    input               sys_clk_p,       // Differential input clock 200Mhz
    input               sys_clk_n,       // Differential input clock 200Mhz
    input               sys_rst_n,       //reset ,low active //系统复位,低电平有效
    input       [3:0]   key,             //按键输入信号
    output reg  [3:0]   led              //LED输出信号
    );
    
//define the time counter
reg  [26:0] cnt;
reg  [1:0]  led_control;

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

//用于计数0.2s的计数器.
//(1/50MHz=0.02us=20ns)(0.2s需计数:0.2s/20ns=10_000_000次)
//(1/200MHz=0.005us=5ns)(0.2s需计数:0.2s/5ns=40_000_000次)
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        cnt <= 26'd0;
    //else if (cnt < 26'd9_999_999)
    else if (cnt < 26'd39_999_999)
    //else if (cnt < 26'd9)  //仅用于仿真
        cnt <= cnt + 1;
    else
        cnt <= 0;
end

//用于led灯状态的选择
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led_control <= 2'b00;
    else if (cnt == 26'd39_999_999)
    //else if (cnt == 26'd9)  //仅用于仿真
        led_control <= led_control + 1'b1;
    else
        led_control <= led_control;
end

//识别按键,切换显示模式
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        led <= 4'b0000;
    end
    else if (key[0]==0) //按键1 按下时,从右向左的流水灯效果
       case(led_control)
          2'b00 : led <= 4'b1000;
          2'b01 : led <= 4'b0100;
          2'b10 : led <= 4'b0010;
          2'b11 : led <= 4'b0001;
          default : led <= 4'b0000;
       endcase
    else if (key[1]==0) //按键2 按下时,从左向右的流水灯效果
       case(led_control)
          2'b00 : led <= 4'b0001;
          2'b01 : led <= 4'b0010;
          2'b10 : led <= 4'b0100;
          2'b11 : led <= 4'b1000;
          default :led <= 4'b0000;
       endcase
    else if (key[2]==0) //按键3 按下时,LED灯闪烁
       case(led_control)
          2'b00 : led <= 4'b1111;
          2'b01 : led <= 4'b0000;
          2'b10 : led <= 4'b1111;
          2'b11 : led <= 4'b0000;
          default :led <= 4'b0000;
       endcase
    else if (key[3]==0) //按键4 按下时,LED灯全亮
       led <= 4'b1111;
    else
      led <= 4'b0000;  //无按键按下时,LED全熄灭
end
    
endmodule

       代码主要分为三个部分,第 49 至 61 行对系统时钟计数,当计数时间达 0.2s 时,计数器清零,同时使led_control 在四个状态(00,01,10,11)内依次变化。第 74 至 107 行利用 case 语句实现对按键状态的检测,当不同的按键按下时,led 随着 led_control 的变化,被赋予不同的值。仿真时我们设为每 10 个时钟周期,进行一次状态转换一次,如代码第 57 和 68 行。

      大家可以发现,本次实验和流水灯实验计数时间都是0.2s,本次实验的计数器最大可以计数到39_999_999,而流水灯实验中计数器的值最大可以计数到 40_000_000。事实上,这两个实验计数器都是从 0 开始计数的,

       本次实验从 0 计数到 39_999_999,需要 40_000_000 个时钟周期,而系统时钟为 5ns,所以计数的时间为 0.2s, 而流水灯实验从 0 计数到 40_000_000 需要 40_000_001 个时钟周期,因此其计数时间实际上比 0.2s 要多出 5ns。

5.2、Vivado 仿真验证

为了验证我们的程序,我们使用 Vivado 对代码进行仿真。

5.2.1、Testbench 模块代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/10 21:08:42
// Design Name: 
// Module Name: tb_key_led
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//实验效果:无按键按下时,LED 灯全灭;按键 1 按下时,LED 灯显示自右向左的流水效果;
//按键 2 按下时,LED 灯显示自左向右的流水效果;
//按键 3 按下时,四个 LED 灯同时闪烁;按键 4 按下时,LED 灯全亮。

module tb_key_led();      //测试模块

//parameter T = 20; //时钟周期为20ns
parameter T = 5; //时钟周期为5ns

// Inputs
reg   [3:0]  key;       //按键信号
//reg          sys_clk;   //时钟信号
reg       sys_clk_p;   //时钟信号
wire      sys_clk_n;
reg          sys_rst_n; //复位信号

// Outputs
wire  [3:0]  led;

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

initial begin
       key           <=4'b1111; //按键初始状态全为断开
//       sys_clk       <=1'b0;  //初始时钟为低电平
       sys_clk_p     <=1'b0;    //初始时钟为低电平
       sys_rst_n     <=1'b0;    //复位信号初始为低电平
#50     sys_rst_n     <=1'b1;   //50个时间单位后后复位信号拉高  

       key[0]        <=0;     //50ns时按下按键1
#160   key[0]        <=1;
       key[1]        <=0;     //800ns后松开按键1,按下按键2
#160   key[1]        <=1;
       key[2]        <=0;     //800ns后松开按键2,按下按键3
#160   key[2]        <=1;
       key[3]        <=0;     //800ns后松开按键3,按下按键4
#160   key[3]        <=1;     //800ns后松开按键4

end

//always #(T/2) sys_clk <= ~sys_clk;  //每半个周期后,电平取反一次。
always #(T/2) sys_clk_p <= ~sys_clk_p;  //每半个周期后,电平取反一次。
assign sys_clk_n=~sys_clk_p;

//实例化key_led模块
key_led  u_key_led(
//      .sys_clk        (sys_clk),
	  .sys_clk_p      (sys_clk_p), 
	  .sys_clk_n      (sys_clk_n),
      .sys_rst_n      (sys_rst_n),
      .key            (key),
      .led            (led)
);

endmodule

5.2.2、Vivado 仿真验证

 仿真波形如下:

       观察代码,结合波形分析可知。43 至 49 行代码为对时钟信号、复位信号、按键信号赋初始值,默认为按键全断开。在第一个周期按下按键 key0kye[0]由高电平变为低电平),可观察到 led3 led0 依次点亮,呈现自右向左的流水效果;按键 key0 断开的同时按下按键 key1,可观察到 led0 led3 依次点亮,呈现自左向右的流水效果;按键 key1 断开的同时按下按键 key2,可观察到 led0 led3 呈现闪烁效果;按键 key2 断开的同时按下按键 key3,可观察到 led0 led3 保持全亮。

6、下载验证

6.1、添加约束文件.xdc

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

约束文件 key_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]}]
set_property -dict {PACKAGE_PIN K14 IOSTANDARD LVCMOS15} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN K13 IOSTANDARD LVCMOS15} [get_ports {led[3]}]
############## key define ############################
set_property -dict {PACKAGE_PIN L19 IOSTANDARD LVCMOS15} [get_ports {key[0]}]
set_property -dict {PACKAGE_PIN L20 IOSTANDARD LVCMOS15} [get_ports {key[1]}]
set_property -dict {PACKAGE_PIN K17 IOSTANDARD LVCMOS15} [get_ports {key[2]}]
set_property -dict {PACKAGE_PIN J17 IOSTANDARD LVCMOS15} [get_ports {key[3]}]
############ 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 文件后,接下来我们下载比特流.bit 文件,验证按键控制 LED 灯的功能。程序下载完成后,我们按 KEY0KEY1KEY2 KEY3,就可以看到按键对应的实验现象了。

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

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

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

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

相关文章

SPSSPRO数据分析之——CSI数据预处理、降维

目录 一、前言 二、数据准备 三、进行预处理 四、进行降维任务 五、正态性检测 六、代码功能 一、前言 SPSSPRO是一款全新的在线数据分析平台&#xff0c;可以用于科研数据的分析、数学建模等&#xff0c;对于那些不会编程或者刚进入科研的新人来说&#xff0c;这款工…

CDGA/CDGP——第八章 数据集成和互操作

加gzh“大数据食铁兽”&#xff0c; 回复“知识点” 获取《DMBOK知识梳理for CDGA/CDGP》常考知识点&#xff08;第八章 数据集成与互操作&#xff09; 第八章 数据集成和互操作 第八章在CDGA分值占比较少&#xff0c;CDGP不考核&#xff0c;主要考点包括&#xff1a;定义、…

电商数据分析方案:丰富经验护航,分析一步到位

如果做电商数据分析的每一步都从零开始&#xff0c;摸着石头过河&#xff0c;反复测试修改。一通忙活下来&#xff0c;成果没见多少&#xff0c;人力物力成本倒是节节攀升&#xff0c;试问又有多少企业承受得住&#xff1f;如果有一套一步到位的数据分析方案&#xff0c;是不是…

Excel根据颜色求和与计数

文章目录 一、需求二、实现方法1.代码2.创建自定义函数3.使用函数 三、参考资料 一、需求 一个Excel中有不同颜色标记的单元格&#xff0c;统计的时候&#xff0c;需要按照颜色进行统计。 人工来做肯定是不可能了&#xff0c;借助Excel的功能好像也没有思路&#xff0c;其实这…

【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeRF(LLFF格式)数据集

【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeRF(LLFF格式)数据集 提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeRF(LLFF格式)数据集前言下…

python复习第一章

什么是 Python&#xff1f; Python 是一门流行的编程语言。它由 Guido van Rossum 创建&#xff0c;于 1991 年发布。 它用于&#xff1a; Web 开发&#xff08;服务器端&#xff09;软件开发数学系统脚本 Python 可以做什么&#xff1f; 可以在服务器上使用 Python 来创建…

图解路由器处理报文全过程,值得一看!

你们好啊&#xff0c;我的网工朋友 只要有网络的地方&#xff0c;你很难不看到路由器的身影&#xff0c;各种低、中、高端的&#xff0c;种类繁多&#xff0c;所具备的功能和内部实现不完全一样。 要知道&#xff0c;路由器不断的在吞吐通信数据&#xff0c;就像鱼吐泡泡一样…

【有奖征文 】AI编程:华为云CodeArts Snap入门体验

了不起的开发者们&#xff0c;当你听到“编程”一词时&#xff0c;可能想到的是一行行复杂的代码和漫长的坐姿。但是&#xff0c;随着人工智能的飞速发展&#xff0c;AI编程正在成为一种全新的编程方式&#xff0c;使得编程变得更加简单和直观。现在&#xff0c;是时候跟大家分…

如何在ALPS系统上模拟MODBUS协议

Modbus协议介绍 请想象一下你有一个工厂&#xff0c;里面有许多机器和设备&#xff0c;比如传感器、电机、控制器等&#xff0c;这些设备需要相互通信以便共享数据和执行任务。Modbus协议就像是这些设备之间的一种语言或规则&#xff0c;确保机器和设备能够互相理解和交流。 在…

python数据可视化Mito安装配置

目录 遇见 Mito如何启动 Mito数据透视表Mito 令人印象深刻的功能可视化数据自动代码生成Mito 安装 JupyterLab 是 Jupyter 主打的最新数据科学生产工具&#xff0c;某种意义上&#xff0c;它的出现是为了取代Jupyter Notebook。 它作为一种基于 web 的集成开发环境&#xff…

SpringMvc学习——在idea中新建springWeb项目 浏览器请求 和 服务器响应 SpringMvc文件相关

目录 引出基础知识&#xff1a;三层架构和MVC1. 三层架构2.MVC模型 springWeb项目IDEA搭建1.新建一个普通的maven项目2.导入包&#xff0c;pom.xml文件3.写主启动类Main.java文件SpringBootApplication4.写application.yml文件spring的配置文件5.启动&#xff0c;运行main.java…

【分享】PowerPoint可以设置哪些密码保护?

想要给PPT设置密码保护&#xff1f;那我们来看看PowerPoint自带哪些密码功能。 PowerPoint可以设置两种密码保护&#xff0c;分别是“打开密码”和“限制密码”。 【打开密码】 PowerPoint设置“打开密码”后&#xff0c;就无法随意打开文件&#xff0c;需要输入正确密码才可…

4.地址转换,实现101012分页

实现内存检测&#xff0c;理解Linux内存管理&#xff0c;实现101012分页 参考&#xff1a; 检测内存容量 趣谈 Linux 操作系统 内存管理 《操作系统真相还原》 1.内存检测 BIOS 中断 0x15 的子功能够获取0xE820 能够获取系统的内存布局&#xff0c;由于系统内存各部分的类型属…

什么是版本控制系统?怎么学习? - 易智编译EaseEditing

版本控制系统&#xff08;Version Control System&#xff0c;简称VCS&#xff09;是一种用于管理和跟踪文件版本的工具或系统。它可以追踪文件的变更历史&#xff0c;记录每个版本的修改内容&#xff0c;以及支持多人协作开发。 学习版本控制系统可以帮助你更好地管理和控制你…

HTTPS加密:保障网站安全的重要手段

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是HTTPS加密&a…

由于找不到d3dx9_42.dll,无法继续执行代码怎么修复,这三个修复方法可以解决

是不是遇到过在打开软件或者游戏的时候&#xff0c;电脑提示“由于找不到d3dx9_42.dll,无法继续执行代码”&#xff0c;无法正常启动游戏程序&#xff0c;d3dx9_42.dll是一个DirectX相关的动态链接库文件&#xff0c;它是DirectX 9中的一个组件。DirectX是微软公司开发的一个多…

TC8:SOMEIP_ETS_001-003

SOMEIP_ETS_001: Array_Length_longer_as_message_length_allows_it 目的 当Tester发送的SOME/IP消息中,payload数据是序列化的数组时,数组的Length字段值比SOME/IP Length字段允许的要大时,DUT回复SOME/IP Error消息 如果DUT忽略SOME/IP Request消息,这条测试也是Pass的,…

Sentieon | 每周文献-Genetic Disease-第二期

遗传病系列文章-1 标题&#xff08;英文&#xff09;&#xff1a;Answer ALS, a large-scale resource for sporadic and familial ALS combining clinical and multi-omics data from induced pluripotent cell lines标题&#xff08;中文&#xff09;&#xff1a;Answer ALS&…

业务数据又多又杂,该如何高效开展数据治理?

某集团目前有近百套系统&#xff0c;数据分散在各个系统内&#xff0c;且业务范围广泛&#xff0c;数据来源复杂&#xff0c;随着集团业务系统的建设和推广应用&#xff0c;数据质量不高、数据标准不一、数据难以互通共享融合、系统之间存在数据壁垒等问题逐渐显现&#xff0c;…

Selenium教程__单选框和复选框的选中状态判定以及元素是否可用和可见判定(10)

简单写个单选框和复选框界面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>test</title></head><body bgcolor"burlywood"><form><input type"radio" name"sex&…