创建一个虚拟项目,添加了基本计数器,连接并配置了一个GAO探针,增加BRS-100-GW1NR999 对FPGA调试内核的支持
我们都经历过这种情况:模拟器看起来完美无缺,比特流第一次加载就成功了,可板子却……静止不动,做着奇怪的事,又不肯解释。这时你只能拿起厂商的调试工具,接受被绑在他们IDE上的命运,或者干脆在设计上撒满LED灯,像撒 breadcrumbs 一样。
两者都不太有趣。
我们非常激动地宣布,我们的 BRS-100-GW1NR9 FPGA 开发板现已原生支持 fpgacapZero — 由 Leonardo Capossio 开发的开源、跨厂商的 FPGA FPGA FPGA 调试内核。如果你之前未曾了解过,fpgacapZero(简称“fcapZ”)可将一个小巧精悍的嵌入式逻辑分析器和嵌入式 I/O/O/O 块直接集成到你的 FPGA FPGA FPGA 硬件中,并通过 OpenOCD 的 JTAGTAG 接口让你轻松访问。无需任何厂商专有代码,也无需复杂的图形界面操作——只需开放工具与开放工具之间通信即可。
发展
为BRS-100-GW1NR9添加对fpgacapZero的支持的第一步,是确定如何将JTAG连接到通用的FPGA结构上。为了保持与BRS-100-GW1NR9示例项目中“完全脚本化工作流”的理念一致,必须以纯HDL的方式实现这一功能。我们了解到一些工具,例如GoWIN分析仪示波器(GAO),虽然需要用户通过图形界面操作,但或许可以利用它来确定如何让GoWIN FPGA进行JTAG通信……
沿着这条路径,我们创建了一个虚拟项目,添加了基本计数器,连接并配置了一个GAO探针,然后对项目进行了综合。浏览生成的文件后,我们发现了一个名为GW_JTAG的IP模块!其接口定义如下:
考虑到其他JTAG IP核,这个设计看起来相当熟悉……主要区别似乎是将“移位”和“捕获”功能合并为一个脉冲信号,并需要确定如何连接*_pad_*接口,因为实际的JTAG引脚/位置并未在约束文件中定义。因此,下一步是实例化该模块,将脉冲输出到一个引脚头,然后使用示波器或逻辑分析仪进行采样(为了确保准确性,JTAG时钟频率设置为一个合理的数值)。
遗憾的是,最初尝试使用“GW_JTAG”合成项目时失败了——该项目中未找到该模块。这让我们一度感到困惑:起初我们以为它是GoWIN默认库的一部分,会自动包含进来。于是我们重新翻阅之前创建的示例项目,结果发现了一个声明为“synthesis syn_black_box”的模块占位符。GoWIN EDA在PnR阶段必须能自动神奇地连接JTAG IP核……事实证明,确实如此!
因此,下一阶段的工作已完成,并确定了GW_JTAG的闪烁模式。这促使我们开发出专用的GoWIN JTAG TAP模块“jtag_tap_gowin.v”,该模块将“GW_JTAG” IP与(相对)通用的JTAG寄存器接口模块连接起来。这个模块是JTAG TAP与fpgacapZero调试核心之间的数据流水线!
之后,我们进入了最后阶段!剩下的工作只剩下一些样板代码(例如切换构建开关以启用ELA、将修改内容迁移至Windows、将“fpgacapZero”设置为Git子模块以避免HDL重复等),以及按照下方“尝试一下”部分中的要求进行测试。
我们遇到的另一个问题只是 OpenOCD 不支持默认的 FTDIII 驱动,于是我们用 Zadigig 将其替换为 WINUSB,一切顺利。
尝试一下
从用户的角度来看,整个过程就是一个构建标志。只需拉取仓库,初始化 fpgaCapZeroZero 子模块,然后运行以下命令,即可将 ELAA 核心烧录到比特流中:
为了方便您使用,我们已预先连接好几个在初始阶段就非常实用的信号:
•一个8位自由运行计数器
•按钮2的状态
•GPIOGPIOGPIO 端口组。
接下来,编程电路板:
使用附带的 brs_100_gw1nr9.cfg.cfg 启动 OpenOCD:
现在你可以让核心自我介绍一下:
它会输出一个JSON格式的数据块,告诉你核心的深度、通道数量、触发功能等所有需要用于规划采集的信息。接下来只需运行fcapz capture命令并设置你的触发参数,获取VCD文件,然后用你常用的波形查看器打开即可:
我们比较喜欢Surfer,但只要是能读VCD的设备都可以:
整个流程——构建、编程、调试、捕获、查看——只需在 Linux 或 Windows 上输入几个终端命令即可。无需使用 IDE,无需点击繁琐操作,也无需受限于特定的硅片厂商。这一点对我们至关重要:如果调试工具只能存在于某个厂商的图形界面中,那么每次更换电路板、共享项目或一年后重新打开项目时,它都会悄然失效。
本文编译自hackster.io





