【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我们之前在学校学习c、c++的时候,其实学校漏掉了很重要的一个教学环节,那就是调试、测试。很多时候我们代码写出来了,不知道怎么测试、调试。其实fpga也是一样的。fpga本质上还是信号的处理,我们与其说是写代码,不如说是设计电路。这个电路以寄存器和时序电路为基础,以组合电路为辅,通过状态机、协议和流程共同实现一个模块的开发。那么这个模块写的对不对,就需要通过调试来进行判别了。

1、做好设计

        设计是我们所有工作的起点,这个设计的来源,一方面是需求,一方面是标准协议,还有一方面来自于fpga的现实接口约束。在开发之前,就要想好解决什么问题,系统的协议、交互逻辑和状态机是什么样的。子模块的信号,甚至可以提前把波形设计好,这样就可以直接转化成verilog代码了。后续的调试就变成对这个波形的确认。

2、仿真调试

        仿真是很重要的一个环节。fpga相比较c语言编程有一个缺点,那就是综合、编译的速度会比较慢。在前期开发调试的时候,没有必要直接上板子测试,这和嵌入式开发是一样的。能仿真的部分,尽量用仿真来解决。简单一点的iverilog+gtkwave仿真,复杂一点的modelsim仿真,都是可以去做的。仿真的部分,尽可能做成自动化测试,用类似python之类的脚本串起来,这样效率会比较高。仿真本身解决的是逻辑层面的问题,如果逻辑层面都有问题,直接上fpga基本就是浪费时间。

3、会查看时序报告

        前面说过,仿真只是解决功能层面是否正确,但是时序层面是不是正确,需要通过综合时得到的时序报告,去进行判断。实际fpga验证的时候,最好把这些关键路径做一个时序优化。这里面最主要的方法,就是组合逻辑拆分、case优化、做延时tap。修改后,通常需要回头重新做一下仿真测试。测试没问题之后,继续修正时序,直到得到想要的结果。毕竟我们总是希望频率越高越好,而频率收到关键路径的约束,所以只好通过识别关键路劲,通过优化来不断提高处理频率。

        时序的本质,其实就在于两个clock之间的组合逻辑,是否可以满足时钟约束的要求。我们编写时序电路的时候,中间会有很多的判断条件。这些判断条件综合出来,很多都是组合逻辑。这些组合逻辑如果过于复杂和冗长,其实是需要进行优化和拆分的,这就是时序分析的根本来源。

4、添加串口打印

        串口本身还是非常方便的,一个fifo模块,再加一个uart,就可以通过循环打印的方式,不停把状态机里面的信号读出来,非常方便。如果奢侈一点的话,可以自己准备一个软核cpu,这样还可以通过软核+串口的方式,直接编程解决ip内部的调试问题。要做到这一点,就要对编译器、链接器、汇编、二进制代码有所了解。某种意义上,这就相当于一个小型的mcu开发了。

5、output pin

        这里的outpin就不仅仅是串口打印,而是内部的register、wire信号查看,绑定到外部的pin而已。原理是比较简单,就是开发效率比较低。因为想看什么信号,每次都需要通过重新综合+外部示波器查看的办法来解决。当然如果对cpu软核和嵌入式软件不算太了解,这也是很有效的一种调试方式。

6、signal tap

        signal tap的本意就是通过内置signal ram的方式,把一部分运行信号锁到ram里面,再通过jtag的方式把信号送出来。因为signal tap本身是占有一定资源的,所以实际使用的时候,必须有选择性地去挑选一些信号进行debug处理。本质上,signal tap就是一个藏在fpga里面的小示波器。挑选哪些信号,怎么触发,都是可以通过ide进行设置的。和output pin一样,它也需要在每次调试的时候,重新进行综合处理。

7、其他

        对fpga的调试,其实很大程度上取决于自己对于软件的理解、对于数字电路的理解。实际开发的时候,要把自己想象成一个cpu、一个时序和组合逻辑模块,而不是单纯的verilog代码,这样会调试起来好很多。出现问题,优先从原理入手,原理没问题再看电路、看信号、看打印,这样一步步去解决,最终肯定会找到问题的所在。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的数据结构--栈和队列(1)

前言本届开始我们将对数据结构中栈的内容进行讲解,那么废话不多说,我们正式进入今天的学习栈栈是一种很特殊的线性表,它只能在固定的一端进行插入和删除操作,进行数据的插入和删除的一端叫做栈顶,另外一端叫做栈底,栈中的元素遵守…

字符串是数据结构还是数据类型?

比较纠结的一个问题,以下是在网上查到后总结的,不知道对不对,欢迎讨论。这是个触及计算机科学核心概念的精妙问题!字符串既可以被视为一种数据类型,也可以被视为一种数据结构,这取决于你观察的视角和讨论的…

Cline与Cursor深度实战指南:AI编程助手的革命性应用

引言 在AI编程工具快速发展的今天,Cline和Cursor作为两款备受瞩目的AI编程助手,正在重新定义开发者的工作方式。作为一名深度使用这两款工具的开发者,我在过去一年的实践中积累了丰富的经验和独到的见解。本文将从技术角度深入分析Cline和Cur…

根本是什么

根本是什么 根本没有了,枝叶还在么? 没有了内涵,外延还有么? 丢弃了根本,再嗨也是无意义,无根据空虚之乐罢了。 人之所行所言所思所想所念皆欲念、历程感怀,情思。所谓得失过往,时空…

springboot基于Java的人力资源管理系统设计与实现

管理员:登录,个人中心,部门管理,员工管理,培训信息管理,员工奖励管理,员工惩罚管理员工考核管理,调薪信息管理,员工调动管理,员工工资管理员工:注…

金字塔降低采样

文章目录image_scale.hppimage_scale.cppmainimage_scale.hpp #ifndef IMAGE_SCALE_HPP #define IMAGE_SCALE_HPP#include <vector> #include <cstdint> #include <utility> // for std::pair #include <algorithm> #include <string> enum cl…

Filament引擎(四)——光照渲染Froxelizer实现分析

Froxelizer主要是用于filament光照效果的实现&#xff0c;生成光照渲染时所需的必要信息&#xff0c;帮助渲染过程中明确哪些区域受哪些光源所影响&#xff0c;是Filament中保证光照效果渲染效率的核心所在。这部分的源码&#xff0c;可以结合filament官方文档中Light Path部分…

2025 环法对决,VELO Angel Glide 坐垫轻装上阵

2025环法第16赛段的风秃山之巅&#xff0c;当最后一缕夕阳沉入云层&#xff0c;山风裹挟着砾石的气息掠过赛道&#xff0c;一场足以载入史册的激战正酣。帕雷-潘特的肌肉在汗水里贲张&#xff0c;链条与齿轮的咬合声混着粗重喘息&#xff0c;在171.5公里赛程的最后3公里陡坡上&…

Linux程序->进度条

进度条最终效果&#xff1a; 目录 进度条最终效果&#xff1a; 一&#xff1a;两个须知 1&#xff1a;缓冲区 ①&#xff1a;C语言自带缓冲区 ②&#xff1a;缓冲区的刷新策略 2&#xff1a;回车和换行的区别 二&#xff1a;倒计时程序 三&#xff1a;入门板进度条的实…

Python爬虫实战:研究tldextract库相关技术构建新闻网站域名分析爬虫系统

1. 引言 网络爬虫作为一种自动获取互联网信息的技术,在数据挖掘、信息检索、舆情分析等领域有着广泛的应用。Python 因其丰富的库和简洁的语法,成为了开发爬虫的首选语言。tldextract 是 Python 中一个强大的域名解析库,能够准确地从 URL 中提取顶级域名、二级域名等关键信…

【算法-华为机试-火星基地改造】

基地改造题目描述目标输入输出代码实现题目描述 在2XXX年&#xff0c;人们发现了一块火星地区&#xff0c;这里看起来很适合建设新家园。但问题是&#xff0c;我们不能一次性将这片地区的空气变得适合人类居住&#xff0c;得分步骤来。 把这片火星地区想象成一个巨大的棋盘。棋…

C++入门自学Day1-- C语言的宏函数和C++内联函数

一、函数调用开销函数调用会涉及&#xff1a;参数压栈&#xff08;或寄存器传参&#xff09;跳转到函数体返回值处理栈帧销毁这个过程对小函数来说可能非常浪费&#xff0c;因此&#xff0c;宏函数和内联函数的目的就是避免“函数调用的开销”&#xff0c;通过代码展开&#xf…

Pytorch混合精度训练最佳实践

混合精度训练&#xff08;Mixed Precision Training&#xff09;是一种通过结合单精度&#xff08;FP32&#xff09;和半精度&#xff08;FP16/FP8&#xff09;计算来加速训练、减少显存占用的技术。它在保持模型精度的同时&#xff0c;通常能带来 2-3 倍的训练速度提升&#x…

Qt C++动态库SDK在Visual Studio 2022使用(C++/C#版本)

01 将C SDK 集成到 IDE 中以下是在 Microsoft Visual Studio 平台下 SDK 的集成。2.1 Visual Studio 平台下 C/C环境配置及集成到 IDE 中xxx.lib 和 xxx.dll 适合在 Windows 操作系统平台使用&#xff0c;这里以 VS2022 环境为例。2.1.1 C/C 工程环境配置与集成1、C# SDK 接口…

大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(2):LangChain + LlamaIndex 实现

文章大纲 1 技术原理总览 2 详细实现步骤(含代码) 2.1 环境准备 2.2 Excel → LlamaIndex 节点 2.3 构建向量索引(FAISS 本地) 2.4 Google Cloud 向量检索(可选替换 FAISS) 2.5 LangChain 问答链 A. RAG 模式(向量检索 + LLM 生成) B. SQL 模式(无 RAG,直接查表) 2.…

提升ARM Cortex-M系统性能的关键技术:TCM技术解析与实战指南

文章目录引言一、TCM基础架构与工作原理1.1 TCM的物理特性1.2 与缓存机制的对比1.3 ARM Cortex-M系列对TCM的支持二、TCM的典型应用场景2.1 实时中断处理2.2 低功耗模式下的待机代码2.3 高性能算法执行2.4 系统初始化阶段的关键代码三、实战指南&#xff1a;在STM32H7上配置和优…

大数据之路:阿里巴巴大数据实践——大数据领域建模综述

为什么需要数据建模 核心痛点 数据冗余&#xff1a;不同业务重复存储相同数据&#xff08;如用户基础信息&#xff09;&#xff0c;导致存储成本激增。计算资源浪费&#xff1a;未经聚合的明细数据直接参与计算&#xff08;如全表扫描&#xff09;&#xff0c;消耗大量CPU/内存…

实战演练1:实战演练之命名实体识别

实战演练1:实战演练之命名实体识别 命名实体识别简介 代码 命名实体识别简介 什么是命名实体识别任务 命名实体识别(Named Entity Recognition,简称NER)是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。通常包括两部分: (1)实体边界识别。(2)确定…

数据结构基础内容(第七篇:堆、哈夫曼树)

# 堆 Heap 优先队列(Priority Queue) 结构性:用 *数组* 表示的完全二叉树; 有序性:任一结点的关键字是其子树所有结点的最大值(或最小值) * “最大堆(MaxHeap)”,也称“大顶堆”:最大值 * “最小堆(MinHeap)”,也称“小顶堆” :最小值 主要操作有: • MaxHeap Create( i…

CS231n-2017 Lecture7训练神经网络(二)笔记

本节主要是神经网络的动态部分&#xff0c;也就是神经网络学习参数和搜索最优超参数的过程梯度检查&#xff1a;进行梯度检查&#xff0c;就是简单地把解析梯度与数值计算梯度进行比较&#xff0c;防止反向传播的逻辑出错&#xff0c;仅在调试过程中使用。有如下技巧 &#xff…