PL端:LED闪烁

实验环境

vivado2024.1

实验任务

LED闪烁

引脚关系

在这里插入图片描述

硬件配置

新建一个vivado实验
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建 Verilog HDL 文件点亮 LED

点击 Project Manager 下的 Add Sources 图标(或者使用快捷键 Alt+A)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编辑led.v

module led(
 input sys_clk,
 input rst_n,
 output reg [3:0] led
 );
reg[31:0] timer_cnt;
always@(posedge sys_clk or negedge rst_n)
begin
 if (!rst_n)
 begin
 led <= 4'd0 ;
 timer_cnt <= 32'd0 ;
 end
 else if(timer_cnt >= 32'd49_999_999)
 begin
 led <= ~led;
 timer_cnt <= 32'd0;
 end
 else
 begin
 led <= led;
 timer_cnt <= timer_cnt + 32'd1;
 end
 
end
endmodule

这是一个对系统时钟上升沿和复位信号下降沿敏感的always块。
当复位信号rst_n为低电平时:
将输出led初始化为 4’b0000。
将计数器timer_cnt初始化为 32’b0。
当计数器timer_cnt的值大于等于 32’d49_999_999 时:
对输出led取反,实现 LED 状态的切换。
将计数器timer_cnt重新初始化为 32’b0。
其他情况下:
保持输出led不变。
计数器timer_cnt自增 1。
总体来说,这个模块实现了一个基于计数器的 LED 闪烁功能。每当计数器达到特定值(49999999)时,LED 的状态就会切换一次。复位时,LED 熄灭且计数器清零。

添加管脚约束

Vivado 使用的约束文件格式为 xdc 文件。xdc 文件里主要是完成管脚的约束,时钟的约束, 以及组的约束。
点击“Open Elaborated Design”
在这里插入图片描述
将复位信号 rst_n 绑定到 PL 端的按键,给 LED 和时钟分配管脚、电平标准,完成后点击保存图标

在这里插入图片描述
ctrl+S 保存
在这里插入图片描述
在这里插入图片描述
普通 IO 口只需约束引脚号和电压,管脚约束如下:
set_property PACKAGE_PIN “引脚编号” [get_ports “端口名称”]
电平信号的约束如下:
set_property IOSTANDARD “电平标准” [get_ports “端口名称”]

电平标准中“LVCMOS33”后面的数字指 FPGA 的 BANK 电压,LED 所在 BANK 电压为 3.3伏,所以电平标准为“LVCMOS33”

添加时序约束

点击“Run Synthesis”开始综合
在这里插入图片描述
在这里插入图片描述
点击“Constraints Wizard”,在弹出的窗口中点击“Next”
在这里插入图片描述
时序约束向导分析出设计中的时钟,这里把“sys_clk”频率设置为 50Mhz,然后点击“Skip to Finish”结束时序约束向导
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个时候 led.xdc 文件已经更新,点击“Reload”重新加载文件,并保存文件

在这里插入图片描述

生成 BIT 文件

编译的过程可以细分为综合、布局布线、生成 bit 文件等,直接点击“Generate Bitstream”,直接生成 bit 文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Vivado 仿真

设置 Vivado 的仿真配置,右击 SIMULATION 中 Simulation Settings。
在这里插入图片描述
在这里插入图片描述

添加激励测试文件,点击 Project Manager 下的 Add Sources 图标,按下图设置后单击 Next。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

编写激励文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/11/05 18:16:41
// Design Name: 
// Module Name: tb_led
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_led;
// Inputs
reg sys_clk;
reg rst_n ;
// Outputs
wire [3:0] led;

// Instantiate the Unit Under Test (UUT)
led uut (
 .sys_clk(sys_clk), 
 .rst_n(rst_n),
 .led(led)
);

initial
begin
// Initialize Inputs
 sys_clk = 0;
 rst_n = 0 ;
 #1000 ;
 rst_n = 1;
end
//Create clock
always #10 sys_clk = ~ sys_clk;


endmodule

ctrl+s保存文件

在这里插入图片描述
点击 Run Simulation 按钮,再选择 Run Behavioral Simulation
在这里插入图片描述
Vivado 中的仿真软件开始工作了,需要耐心等待,才能看到实验变化
在这里插入图片描述

下载验证

  1. 连接好开发板的 JTAG 接口,给开发板上电
  2. 在“HARDWARE MANAGER”界面点击“Auto Connect”,自动连接设备

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在线调试

Vivado 中的 Integrated Logic Analyzer(ILA)是强大的调试工具。主要功能包括信号监测与分析,可同时监测多个信号并设置触发条件以特定信号状态捕获数据;触发条件设置灵活,基于单个信号值、组合逻辑或特定序列等;数据存储深度可配置,便于平衡资源利用与调试效果;与 Vivado 设计流程完全集成,使用方便且捕获数据可直接分析查看。使用步骤为添加 ILA IP 核并配置参数,连接需监测信号,设置触发条件,生成比特流下载到 FPGA 后开始工作,最后在 Vivado 中分析数据。其优势明显,高效调试,无需额外硬件设备,降低成本和复杂性,快速定位问题缩短设计周期;灵活性强,适应复杂场景,多种触发和显示方式满足不同需求;集成性好,紧密融入设计流程,提高工作效率。

添加 ILA IP 核

在这里插入图片描述
修改名称为 ila,由于要采样两个信号,Probes 的数量设置为 2,Sample Data Depth 指的是
采样深度,设置的越高,采集的信号越多,同样消耗的资源也会越多
在这里插入图片描述

在 Probe_Ports 页面,设置 Probe 的宽度,设置 PROBE0 位宽为 32,用于采样 timer_cnt,设置 PROBE1 位宽为 4,用于采样 led。点击 OK
在这里插入图片描述

在这里插入图片描述

在 led.v 中例化 ila,并保存

ila ila_inst(
    .clk(sys_clk),
    .probe0(timer_cnt),
    .probe1 (led)
 );

在这里插入图片描述
重新生成 Bitstream
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载程序

在这里插入图片描述

这时候看到有 bit 和 ltx 文件,点击 program
在这里插入图片描述

此时弹出在线调试窗口,出现了我们添加的信号
在这里插入图片描述

点击运行按钮,出现信号的数据

在这里插入图片描述

也可以触发采集,在 Trigger Setup 窗口点击“+”,深度选择 timer_cnt 信号

在这里插入图片描述
将 Radix 改为 U,也就是十进制,在 Value 中设置为 49999999,也就是 timer_cnt 计数的最大值
在这里插入图片描述

添加MARK DEBUG

在 Vivado 等 FPGA 开发环境中,“MARK DEBUG” 是一个非常重要的功能。
基本含义
“MARK DEBUG” 的主要目的是标记那些需要在调试过程中重点关注的信号、网线(nets)或模块等设计元素。当你在设计中使用这个功能标记了特定的对象后,开发工具就会知道这些是需要特殊处理用于调试的部分。
与调试工具的关联
它和调试工具(如 ILA)紧密相关。例如,在 Vivado 中,当你使用 “MARK DEBUG” 标记了信号后,这些被标记的信号可以很方便地被连接到诸如 Integrated Logic Analyzer(ILA)这样的调试核上。这样一来,在调试阶段,你就能够通过 ILA 等工具捕获和观察这些标记信号的行为,有助于对设计中的问题进行定位和分析。
使用方式和好处
从使用方式上,一般是在设计的图形化界面或者代码编辑环境中,通过特定的操作(如右键菜单选项等)来对信号等进行 “MARK DEBUG” 标记。其好处在于,它提供了一种有针对性的调试手段。在复杂的 FPGA 设计中,可能有成千上万的信号,通过 “MARK DEBUG” 可以挑选出那些与当前调试任务最相关的信号,避免在无关信号的观察和分析上浪费时间,从而更高效地进行设计调试。

上面介绍了添加 ILA IP 的方式在线调试,下面介绍在代码中添加综合属性,实现在线调试。
首先打开 led.v,将 ila 的例化部分注释掉
在这里插入图片描述
在 led 和 timer_cnt 的定义前面添加(* MARK_DEBUG=”true” *),保存文件。
在这里插入图片描述

点击综合
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

综合结束后,点击 Set Up Debug
在这里插入图片描述

弹出的窗口点击 Next
在这里插入图片描述

按照默认点击 Next
在这里插入图片描述

采样深度窗口,选择 Next
在这里插入图片描述

点击 Finish

在这里插入图片描述

ctrl+s保存
在这里插入图片描述

重新生成 bitstream

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调试
在这里插入图片描述

此时弹出在线调试窗口,出现了我们添加的信号
在这里插入图片描述
点击运行按钮,出现信号的数据
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

摘要、数字签名、对称加密、非对称加密综合应用示例以及技术原理说明

图&#xff1a;介绍了数字信封的安全传输过程 关键术语 散列&#xff1a;Hash&#xff08;哈希&#xff09;&#xff0c;一般翻译做散列、杂凑&#xff0c;是把任意长度的输入&#xff08;数据信息&#xff09;通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值…

美股集体收跌:汇盈策略股票交易特朗普、哈里斯概念股一同上涨

查查配分析随着美国大选进入最后倒计时,三大指数在多数投资者保持观望的状态下集体收跌。美债收益率集体回落,十年期美债收益率跌超8个基点至4.29%。 截至周一收盘,标普500指数跌0.28%,报5712.69点;纳斯达克指数跌0.33%,报18179.98点;道琼斯工业指数跌0.61%,报41794.6点。 汇…

力扣最热一百题——验证二叉搜索树

目录 题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 二叉搜索树的要求 解法一&#xff1a;采用中序遍历 中序遍历的定义 为什么二叉搜索树的中序遍历是严格递增的 二叉搜索树&#xff08;BST&#x…

golang 实现 bitcoin内核:编码实现椭圆曲线上的点

比特币在很大程度上依赖于一个称为椭圆曲线的数学对象&#xff0c;如果没有这个数学结构&#xff0c;比特币就像海滩上的城堡&#xff0c;随时可能崩溃。什么是椭圆曲线&#xff0c;它的方程是这样的&#xff1a;y^2 x^3 ax b&#xff0c;它的形状就像下面这样&#xff1a; …

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的DjangoVue3在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…

API网关 - JWT认证 ; 原理概述与具体实践样例

API网关主要提供的能力&#xff0c;就是协议转换&#xff0c;安全&#xff0c;限流等能力。 本文主要是分享 如何基于API网关实现 JWT 认证 。 包含了JWT认证的流程&#xff0c;原理&#xff0c;与具体的配置样例 API网关认证的重要性 在现代Web应用和微服务架构中&#x…

【保姆级教程】实操 Linux 磁盘管理:硬盘选型 分区挂载

最近&#xff0c;Linux 服务器自带的固态硬盘&#xff0c;空间告警&#xff0c;急需加上一块新的硬盘来救急。 今日分享&#xff0c;系统梳理下 Linux 下挂载磁盘的详细步骤和注意事项&#xff0c;方便日后翻阅&#xff0c;也给有类似需求的小伙伴一点帮助。 1. SSD&#xff…

平衡二叉树(递归)

给定一个二叉树&#xff0c;判断它是否是 平衡二叉树.平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4…

雷池社区版新版本功能防绕过人机验证解析

前两天&#xff0c;2024.10.31&#xff0c;雷池社区版更新7.1版本&#xff0c;其中有一个功能&#xff0c;新增请求防重放 更新记录&#xff1a;hhttps://docs.waf-ce.chaitin.cn/zh/%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95 仔细研究了这个需求&#xff0c;…

黑龙江某涝区泵闸站自动化、信息化改造项目案例

项目背景 黑龙江某地区紧邻松花江&#xff0c;雨季时降雨量增大&#xff0c;排水渠水位上涨&#xff0c;如果出现排涝不及时&#xff0c;水位过高时会漫入周边农田&#xff0c;引发洪涝灾害&#xff0c;对作物生长造成重大损害。为应对这一问题&#xff0c;自今年起&#xff0c…

Java 多线程(八)—— 锁策略,synchronized 的优化,JVM 与编译器的锁优化,ReentrantLock,CAS

前言 本文为 Java 面试小八股&#xff0c;一句话&#xff0c;理解性记忆&#xff0c;不能理解就死背吧。 锁策略 悲观锁与乐观锁 悲观锁和乐观锁是锁的特性&#xff0c;并不是特指某个具体的锁。 我们知道在多线程中&#xff0c;锁是会被竞争的&#xff0c;悲观锁就是指锁…

【Spring IOC】实现一个简单的 Spring 容器

1. 理解知识 Spring 容器的作用 Spring 容器是Spring的核心&#xff0c;用来管理Bean对象的。容器将创建对象&#xff0c;把它们连接在一起&#xff0c;配置它们&#xff0c;并管理他们的整个生命周期从创建到销毁。 Bean 对象的管理 当一个 Bean 对象交给 Spring 容器管理…

非线性数据结构之图

一、有向图&#xff08;Directed Graph&#xff09; 1. 定义 有向图是一个由顶点&#xff08;节点&#xff09;和有方向的边&#xff08;弧&#xff09;组成的图。在有向图中&#xff0c;每条边都有一个起点和一个终点&#xff0c;表示从一个顶点到另一个顶点的关系。 2. 特…

【算法】——滑动窗口专题

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;长度最小的子数组 二&#xff1a;无重复字符的最长子串 三&#xff1a;最大连续1的个…

目前主流的人工智能学习框架有哪些?

随着人工智能&#xff08;AI&#xff09;技术的蓬勃发展&#xff0c;越来越多的AI学习框架相继推出&#xff0c;成为开发者、研究人员和企业构建机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;模型的首选工具。AI学习框架不仅提供了丰富的工具库和函…

揭开自然语言处理(NLP)的神秘面纱

时间&#xff1a;2024年 11月 05日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术” &#xff0c;我是小蒋&#xff01;。小蒋最近在学习清华大模型课程&…

C#:强大而优雅的编程语言

在当今的软件开发领域&#xff0c;C#作为一种广泛应用的编程语言&#xff0c;以其强大的功能、优雅的语法和丰富的生态系统&#xff0c;受到了众多开发者的喜爱。本文将深入探讨 C#的各个方面&#xff0c;展示它的魅力和优势。 一、C#的历史与发展 C#是由微软公司开发的一种面…

SQL CASE表达式与窗口函数

CASE 表达式是一种通用的条件表达式&#xff0c;类似于其他编程语言中的if/else语句。 窗口函数类似于group by&#xff0c;但是不会改变记录行数&#xff0c;能扫描所有行&#xff0c;能对每一行执行聚合计算或其他复杂计算&#xff0c;并把结果填到每一行中。 1 CASE 表达式…

C++之位算法

位算法 常见位运算总结 位1的个数 给定一个正整数 n&#xff0c;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;3 解释…

【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案

&#x1f984;个人主页: 起名字真南 &#x1f984;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 题目分析示例&#xff1a; 3. 解题思路4. C代码实现5. 代码详解6. 时间和空间复杂度分析7. 边界情况分析8. 总结 1. 引言 在开发中&#xff0c;有时我们…