VHDL 的开源库是否像 C++ 或 python 那样存在?

电器工程 视频文件 图书馆 开源的 代码设计
2022-01-12 03:26:48

当我处理 C++ 或 python 中的问题时,存在许多库来完成我的代码的繁重工作。我正在考虑C++ 的GNU GSLBOOST或 FFTW 以及 python 的 NumPy 或 SciPy。在许多方面,存在这些资源的事实使得用这些各自的语言进行编码是值得的,因为这些库可以防止您从头开始重写所有低级的东西。

IEEE 标准库似乎只涵盖最基本的内容,例如数据类型(类似于 C 标准库)。

似乎在 VHDL 中,您可以购买/找到一些可以解决问题的“IP 内核”,而不是使用开源库。在 python 中,如果我想与串行设备通信,我就import serial完成了。在 VHDL 中,我要么被困在从头开始编写串行协议,要么我不得不在各种存储库上搜索,直到我发现有人制作了这样的作品。然后我会将一些代码修补到我的项目中,而不仅仅是包含一些东西并调用它。以类似的方式,如果我想执行 FFT,我可以通过 google 找到 VHDL 中的 FFT 示例,但是我找不到像 FFTW 这样简单的东西。

是否有任何全面的开源库可供我导入到我的项目中?为什么每个人似乎都为这么多相同的事情编写自己的代码?

4个回答

我是“ The PoC Library ”的开发人员和维护人员。我们尝试提供这样一个由包(新类型和功能的集合)和模块组成的库。它带有常见的 fifo、算术、跨时钟组件、低速 I/O 组件和以太网/IP/UDP 堆栈(下一个版本)。

正如@crgrace 所述,设计模块非常复杂,其中:

  • 在许多平台上工作
  • 支持大多数供应商工具链
  • 不增加/减少开销

我们的库有一个内部配置机制 (PoC.config) 来区分供应商、设备甚至设备子系列,以选择正确的代码或优化的实现。它还在某些方面区分了综合代码和仿真代码。

例如PoC.fifo_cc_got,一个具有“公共时钟”(cc) 接口和 put/got 信号来控制 fifo 的 FIFO。fifo 在宽度、深度、填充状态位和实现类型方面是可配置的。可以选择基于 LUT 的 RAM 或 On-Chip-RAM (ocram) 实现类型。如果这个 fifo 是用 Altera 的 ocram 选项综合的,它使用 altsyncram;如果选择 Xilinx,它会使用通用 BlockRAM 描述并通过显式进位链实例化来实现指针运算(Xilinx XST 没有找到最佳解决方案,因此需要手动完成)。

还有其他 2 种具有“依赖时钟”(dc) 和独立时钟 (ic) 接口的 fifo 类型。因此,如果需要从普通 fifo 切换到跨时钟 fifo (PoC.fifo_ic_got),请更改实体名称并为第二个时钟域添加时钟和重置,仅此而已。

我认为这证明了,可以编写通用模块,这些模块可以在多个平台上工作并在不同的工具中编译(Spartan->Virtex、Cyclone -> Stratix;ISE、Vivado、Quartus)。

除了 PoC,还有其他开源库:


GitHub 上的“Discover Free and Open Source Silicon” ( FOSSi ) 项目提供了所有 GitHub 项目的可浏览数据库,这些项目主要使用,,,或任何其他重要的硬件描述语言()。

也可以看看:

像您描述的开源库对 VHDL 或 Verilog 的用处不如它们对通用编程语言的用处。这是因为你如何实现一个给定的函数很大程度上取决于你想要做什么。对 FPGA 有利的代码可能对 ASIC 不太有利,反之亦然。

此外,由于我们描述的是硬件,因此执行 FFT 的功能需要诸如字宽、时钟和复位策略等细节,这会束缚您的手脚并限制您的整个设计。如果您使该功能非常灵活,则会产生巨大的开销。

最后,例如,当您在 C 中包含大量库时,请查看可执行文件的大小。那里有很多膨胀。这对软件开发(大多数时候)无关紧要,但对 FPGA 尤其是 ASIC 开发很重要。合成一堆你不需要的开销是没有意义的。

所以底线是没有这样的库,你目前的方法是合理的。

VHDL 和 Verilog 是描述性语言,它们描述硬件块。C++ 中的串行驱动程序可能会转换为 VHDL/Verilog 中的串行 IP。

opencores.org 是迄今为止最大的开源数据库。

为了促进搜索、下载和代码浏览(通过 Github)的过程,您可以使用这个现代界面:

http://freerangefactory.org/cores.html

例如,如果您搜索串行,您可以在这里结束:

http://freerangefactory.org/cores/communication_controller/serial_uart_2/index.html

并直接跳转到GitHub中的代码。在那里你会看到你可以很容易地实例化串行模块并将你自己的电路连接到它并开始发送和接收数据。这就像 C++ 中的串行库一样简单。

我希望这有帮助。

我去的第一个网站(正如@MarkU 提到的)是 opencores.org。

例如,有一个参数化的 FFT 引擎,用 VHDL 编写,在 BSD 许可下发布。状态为“测试版”。