【FPGA】优雅地使用ILA进行FPGA硬件调试

news2024/9/21 6:17:04
  • Vivado(Vitis)版本:2020.2
  • FPGA开发板:Microphase Z7-Lite 7020开发板

FPGA设计调试流程

FPGA开发是一个不断迭代的过程,一般的FPGA设计流程一般包含下面几个步骤:

  • 硬件架构和算法验证:实现需要的功能需要哪几个模块,模块和模块之间如何进行通信和连接;硬件算法是否可行和稳定(以图像处理算法为例,一般可以采用MATLAB进行算法验证);
  • RTL代码编写;
  • 硬件调试与验证:一般这个过程会耗费大量的时间,如果没有一定的经验以及技巧,有可能会使得开发时间延长几倍,甚至开发失败;


调试,即Debug,有一定开发经验的人一定会明确这是设计中最复杂最磨人的部分。对于一个庞大复杂的FPGA工程而言,出现问题的概率极大,这时如果没有一个清晰的Debug思路,调试过程只能是像无头苍蝇一样四处乱撞。在FPGA设计中一般的调试思路如下所示:

首先排查硬件问题:在出现问题时,首先怀疑并排除硬件问题。首先检查开发板的供电和连接是否正常,是否有电子元件被烧毁,是否出现元件虚焊等问题。确认开发板以及供电没有问题后,使用例程或者已有的程序或者工程对出现问题的核心部件进行测试。例如,在读写DDR时,如果DDR没有反应,可以通过网络查找例程,或者使用开发板官方提供的例程对DDR读写进行测试,确认DDR可以正常工作;在读写SD卡时,可以尝试换一张SD卡操作,或者通过将SD卡切换到其他设备上,确保SD卡没有损坏等。实际工程应用中,需要灵活选择测试和排查方案,但是目的基本都是相同的。

其次排查全局信号:确认硬件连接没有问题后,排查全局信号可能出现的问题。全局信号一般指接在内部所有模块的信号,例如i_sys_clki_sys_rst_n等。需要确保这些信号正常工作,之后的RTL排查才有意义。

最后排查RTL代码:在确保硬件和全局信号没有问题后,再开始排查RTL代码。在RTL代码排查中也有一定的顺序可以参考,一般可以参考下面的顺序:

  • 检查主从设备(模块)之间的握手机制,或者说检查主从设备之间是否正常连接。很多时候可以参考设备的官方Datasheet检查主从模块之间的初始化指令是否书写正确。
  • 检查状态跳转是否正常:在初始化过程中,经常使用状态机进行RTL编程。
  • 检查读写数据是否正常:可以设计一些“假数据”,例如人为规定的一些有规律的数据,检查这些数据在从设备中的地址是否正常,数据是否正确。
  • 检查执行操作的触发信号:检查信号的Trigger是否正常工作。


总之,RTL调试是最枯燥的部分,很多时候需要“抽丝剥茧”、“追本溯源”才能找到问题所在。但是笔者认为这恰恰是体现一个FPGA工程师硬实力的必要技能和心境。

Vivado ILA IP 的使用

ILA,全称Integrated Logic Analyzer,是Xilinx FPGA芯片中设计的芯片内部集成逻辑分析仪。它可以在一定程度上替代外部的传统逻辑分析仪的作用。ILA通常和VIO(Vritual Input/Output)结合使用,VIO不仅可以实时监控内部的逻辑信号和端口信号,还可以充当模拟输入驱动内部端口。ILA监控内部信号输出给PC端,而VIO接收PC端的实时指令从而给内部端口提供输入信号。

ILA调试有多种方法,可以直接在代码中通过原语添加,也可以在原理图中通过Debug添加,也可以在网络列表Netlist中添加。

在这里先创建一个示例工程,使用一个呼吸灯模块作为顶层代码:

module Breath_LED (
    input sys_clk,
    input sys_rst_n,
    output reg led
);  
    parameter CNT_2US_MAX = 7'd100;
    parameter CNT_2MS_MAX = 10'd1000;
    parameter CNT_2S_MAX = 10'd1000;

    reg [6:0] cnt_2us;  // sys_clk = 50MHz, T = 20ns, cnt_2us: 0 ~ 99
    reg [9:0] cnt_2ms;
    reg [9:0] cnt_2s;  // cnt_2ms, cnt_2s: 0 ~ 999
    reg inc_dec_flag;   // 0: increase, 1: decrease

    // count to 2us 
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n)
            cnt_2us <= 7'd0;
        else if (cnt_2us == (CNT_2US_MAX - 7'd1))
            cnt_2us <= 7'd0;
        else 
            cnt_2us <= cnt_2us + 7'd1;
    end

    // count to 2ms by cnt_2us
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n)
            cnt_2ms <= 10'd0;
        else if ((cnt_2us == (CNT_2US_MAX - 7'd1)) && 
            (cnt_2ms == (CNT_2MS_MAX - 10'd1)))
            cnt_2ms <= 10'd0;
        else if (cnt_2us == (CNT_2US_MAX - 7'd1))
            cnt_2ms <= cnt_2ms + 10'd1;
    end

    // count to 2s by cnt_2ms
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n)
            cnt_2s <= 10'd0;
        else if ((cnt_2us == (CNT_2US_MAX - 7'd1)) && 
            (cnt_2ms == (CNT_2MS_MAX - 10'd1)) && 
            (cnt_2s == (CNT_2S_MAX - 10'd1)))
            cnt_2s <= 10'd0;
        else if ((cnt_2us == (CNT_2US_MAX - 7'd1)) && 
            (cnt_2ms == (CNT_2MS_MAX - 10'd1)))
            cnt_2s <= cnt_2s + 10'd1;
    end

    // inc_dec_flag
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n)
            inc_dec_flag <= 1'b0;
        else if ((cnt_2us == (CNT_2US_MAX - 7'd1)) && 
            (cnt_2ms == (CNT_2MS_MAX - 10'd1)) && 
            (cnt_2s == (CNT_2S_MAX - 10'd1)))
            inc_dec_flag <= ~inc_dec_flag;
        else 
            inc_dec_flag <= inc_dec_flag;
    end

    // led PWM configuration
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n)
            led <= 1'b0;
        else if ((inc_dec_flag == 1'b0) && (cnt_2ms <= cnt_2s)) // increase
            led <= 1'b1;
        else if ((inc_dec_flag == 1'b1) && (cnt_2ms >= cnt_2s)) // decrease
            led <= 1'b1;
        else 
            led <= 1'b0;
    end

endmodule

IP核配置

在IP Catalog中搜索ILA即可找到ILA IP核,双击之后就会跳出配置界面。

设置部件名称、探针数量(需要测量信号的数量)和采样深度。clk信号一般是系统的时钟信号,ILA IP会在每个clk上升沿(或下降沿、具体有待考量)采一次对应信号的数据,直到采信号的次数达到采样深度为止。

在这里,假设代码出现了问题,我们需要检测sys_clkledsys_rst_ncnt_2uscnt_2ms四个信号。四个信号的宽度分别为1,1,7,10。

完成设置后,点击OK,出现下面界面。如果综合选项选择Global,代码会在每次综合时都对ILA进行综合;如果选择Out of conext per IP(OOC模式),代码只会在ILA设置发生改变时对ILA进行综合。一般选择后者即可,可以加快综合速度。

点击【FPGA】优雅地使用ILA进行FPGA硬件调试——古月居可查看全文

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

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

相关文章

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例

近日&#xff0c;2024全球数字经济大会——数字安全生态建设专题论坛&#xff08;以下简称“论坛”&#xff09;在京成功举办。由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院及公安部第三研究所共同承办&#xff0c;论坛邀请多位专家和企业共同参与。 会上颁发…

【ollama】ollama运行GLM4-9B和CodeGeeX4-ALL-9B

一、GGUF模型链接 glm-4-9b-chat-GGUFcodegeex4-all-9b-GGUF 使用modelscope下载 先安装 pip install modelscope 命令1 modelscope download --modelLLM-Research/glm-4-9b-chat-GGUF --local_dir . glm-4-9b-chat.Q5_K.gguf命令2 modelscope download --modelLLM-Researc…

一图了解网络通信原理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

SHOT(方向直方图)

Salti等人在2014年提出一种表面匹配的局部三维描述子SHOT。Salti等人将现有三维局部特征描述方法分为两类&#xff0c;即基于特征的描述方法与基于直方图的描述方法&#xff0c;并分析了两种方法的优势&#xff0c;提出基于特征的局部特征描述方法要比后者在特征的描述能力上更…

Unity动画系统(3)---融合树

6.1 动画系统基础2-6_哔哩哔哩_bilibili Animator类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EthanController : MonoBehaviour { private Animator ani; private void Awake() { ani GetComponen…

Porfinet从转DeviceNet从总线协议转换网关

产品功能 1. 远创智控YC-DNT-PN型是Porfinet从转Devicenet从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Devicenet网络中&#xff0c;‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口&#xff0c;‌分别用于连接Po…

数学基础【俗说矩阵】:齐次线性方程和非齐次线性方程求解-学习笔记

一、矩阵基础知识 二元一次方程的传统解法 不论是代入消元法还是加减消元法都统称 【高斯消元法】。 齐次方程组和非齐次方程组 线性方程组的解 线性方程的向量展示 向量规则 矩阵的高斯消元和初等行变行及其规则 高斯消元规则 初等行变换 矩阵经初等行变换成阶梯矩阵&…

关于 Docker Registry (镜像仓库)

什么是镜像仓库 概念 镜像仓库&#xff08;Docker Registry&#xff09;负责存储、管理和分发镜像&#xff0c;并提供了登录认证能力&#xff0c;建立了仓库的索引。 镜像仓库管理多个 Repository&#xff0c;Repository 通过命名来区分。每个 Repository 包含一个或多个镜像…

启动EPLAN时出错,打开设置数据库出现错误 该怎么办?

EPLAN 2.9 突然打不开了&#xff0c;弹出 启动EPLAN时出错,打开设置数据库出现错误 提示框。 提示打开下面设置文件出错。 C:\Users\Public\EPLAN\Settings\Electric P8\2.9.4\x64\Cfg\STATION.Basic.DESKTOP-MUED161.xlk 按照文件路径查找&#xff0c;发现该文件没有丢失&a…

用Pytorch实现线性回归(Linear Regression with Pytorch)

使用pytorch写神经网络的第一步就是需要准备好数据集&#xff0c;设计模型&#xff08;用于计算y_hat&#xff08;y的预测值&#xff09;&#xff09;&#xff0c;构造损失函数和优化器&#xff08;使用PyTorch API&#xff09;&#xff0c;写训练周期&#xff08;前馈&#xf…

线性表的链式存储结构————单链表(java)

线性表的链式存储结构————单链表&#xff08;java&#xff09; 文章目录 线性表的链式存储结构————单链表&#xff08;java&#xff09;链表的概述单链表单链表的创建插入结点的操作尾插法头插法 求单链表的长度输出单链表查找单链表数据元素对应的索引值删除数据元素总…

「AI得贤招聘官」通过首批“AI产业创新场景应用案例”评估

近日&#xff0c;上海近屿智能科技有限公司的「AI得贤招聘官」&#xff0c;经过工业和信息化部工业文化发展中心数字科技中心的严格评估&#xff0c;荣获首批“AI产业创新场景应用案例”。 据官方介绍&#xff0c;为积极推进通用人工智能产业高质量发展&#xff0c;围绕人工智能…

HCNA VRP基础

交换机可以隔离冲突域&#xff0c;路由器可以隔离广播域&#xff0c;这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中&#xff0c;网络设备的负担也越来越重&#xff0c;这时网络设备可以通过专有的VRP系统来提升运行效率。通过路由平台VRP是华为公司数…

Large Language Model系列之二:Transformers和预训练语言模型

Large Language Model系列之二&#xff1a;Transformers和预训练语言模型 1 Transformer模型 Transformer模型是一种基于自注意力机制的深度学习模型&#xff0c;它最初由Vaswani等人在2017年的论文《Attention Is All You Need》中提出&#xff0c;主要用于机器翻译任务。随…

mac安装win10到外接固态硬盘

1、制作win10系统 1.1 下载 winToUSB&#xff0c;打开后选择第一个 1.2 选择本地下载镜像&#xff0c; 我用的分区方案是适用于UEFI的GPT模式 1.3 点右下角执行&#xff0c;等待执行完成即可 2、mac系统下载win驱动 2.1 comman空格 搜索启动转换助理&#xff0c;打开后选择…

Linux shell编程学习笔记64:vmstat命令 获取进程、内存、虚拟内存、IO、cpu等信息

0 前言 在系统安全检查中&#xff0c;通常要收集进程、内存、IO等信息。Linux提供了功能众多的命令来获取这些信息。今天我们先研究vmstat命令。 1.vmstat命令的功能、用法、选项说明和注意事项 1.1 vmstat命令的功能 vmstat是 Virtual Meomory Statistics&#xff08;虚拟内…

React 实现五子棋

简介 本文将会基于React 实现五子棋小游戏&#xff0c;游戏规则为先让5颗棋子连成1线的一方获胜。 实现效果 技术实现 页面布局 <div><table style{{border: 1px solid #000, borderCollapse: collapse, backgroundColor: lightgray}}><tbody>{squares.ma…

在 Windows 上运行 Linux:WSL2 完整指南(一)

系列文章目录 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;一&#xff09;&#x1f6aa; 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;二&#xff09; 文章目录 系列文章目录前言一、什么是 WSL&#xff1f;1.1 WSL 的主要特性1.2 WSL 的…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现&#xff1a;实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

【unity笔记】十、Obi绳索插件使用

一. 创建绳索 1.1 新建蓝图 在Assets中右键选择创建->Obi->Rope Blueprint&#xff0c;其属性如图所示 1.2 Obi solver 在场景下创建一个obi solver对象&#xff0c;在该对象下再创建Obi Rope对象。 随后将蓝图拖到Obi Rope对象下的Obi Rope组件&#xff0c;即可看到…