神经网络可能不是学习如何编程FPGA的最佳起点。我最初会尝试更简单的东西,如计数器驱动LED或数字显示器,并从那里建立起来。可能有用的网站包括:
您可能还想考虑在FPGA中使用软处理器来帮助您从C转换到VHDL或Verilog。这将允许您将小代码模块从一个移动到另一个,以查看硬件的差异。语言的选择有点随意 - 我在大多数时候使用VHDL(在语法上类似于ADA)编码,但我的一些同事更喜欢Verilog(语法上类似于C)。我们偶尔会讨论它,但它确实是个人选择。
至于买家/学员指南,您需要:
的 耐心:) 强> - 由于构建中额外的“自由参数”数量,FPGA的设计周期比软件长得多,因此如果需要一段时间才能使设计按照您想要的方式工作,请不要感到惊讶。
的 开发板 强> - 为了学习,我会从三个更大的FPGA供应商之一购买一个:Xilinx,Altera或Lattice。我的偏好是Xilinx,但三者都很好。对于学习,不要购买基于高端部件的部件 - 开始使用FPGA时不需要。对于Xilinx,请根据Spartan系列获得一个,例如SP601(我自己有一个)。对于Altera,购买一个Cyclone。开发板将比高端部件便宜得多。
的 编程电缆 强> - 大多数公司生产带有特殊连接器的USB编程电缆,用于对电路板上的器件进行编程(通常使用JTAG)。有些电路板内置了编程接口(例如Xilinx的SP601),因此您无需花费额外的资金。
的 构建工具 强> - 这些品种有很多种,但大多数大型FPGA供应商都提供了自己的解决方案。请记住,这些工具仅适用于较小的低性能FPGA,例如Xilinx ISE Webpack。
该软件包含您可能不熟悉的来自软件世界的阶段。工具流程的细节总是在变化,但您使用的任何工具都应该能够从您的代码到您的特定设备。该设计流程的最后一部分通常由FPGA供应商提供,因为它是特定于硬件和专有的。 为了给您一个简短的例子,您需要的软件应该使用您的VHDL和Verilog代码(这是Xilinx版本):
它已经过时了,因为近20年来我对FPGA的考虑并不多,而且它使用了一种相当模糊的并发编程语言,但是Page& Luk,1991, 将Occam编译为FPGA 以一种很好的方式涵盖了一些重要的主题,我认为,就你的目的而言。尝试填充的两个链接:
Occam-> FPGA不是行动的地方,但它可能是比Verilog更好的起点。
在FPGA上构建“文字”神经网络的大多数尝试都非常快地达到了路由限制,在P& R拉动完成所需的时间比你的问题值得等待之前,你可能会得到几百个单元。大多数关于NN和NN的研究FPGA采用这种方法,专注于最小的“节点”实现,并建议缩放现在是微不足道的。
使合理大小的神经网络实际工作的方法是使用FPGA构建专用的神经网络数字运算机。获取内存芯片中的初始节点值,为下一个时间戳结果提供第二个内存芯片,以及存储连接权重的第三个区域。通过使用技术来泵送节点值和连接数据以保持存储器总线饱和(按CAS线顺序节点加载,使用管道预读)。当您将权重与先前值配对时,将通过先前的数据集进行大量传递,通过DSP MAC单元运行它们以评估新节点权重,然后在评估所有连接后推送到结果存储区域。完成整个时间步后,反转流向,以便下一个时间步写回原始存储区。
我将给你第三个建议:使用VHDL。是的,从表面看它看起来像ADA。虽然Verilog与C有相似之处。但是,使用Verilog,您只能获得开箱即用的类型。使用VHDL,您可以定义自己的新类型,使您可以在更高级别进行编程(当然还是RTL)。我很确定Xilinx和Altera免费工具同时支持VHDL和Verilog。 Ashenden的“VHDL设计师指南”是一本很好的VHDL书籍。
VHDL有一个标准的定点数学包,可以使NN实现更容易。
我想指出在FPGA中实现神经网络的潜在问题。 FPGA具有有限的路由资源。与逻辑资源(触发器,查找表,存储器)不同,路由资源难以量化。也许一个简单的神经网络可以工作,但是具有网状互连的“大规模并行”可能不会。
我建议从OpenCores.org的一个简单核心开始,只是为了熟悉FPGA流程,然后继续进行神经网络的原型设计。下载免费的Xilinx WebPack,包括ISIM模拟器,是一个良好的开端。稍后您可以购买便宜的开发。使用小型FPGA(例如Xilinx Spartan 3)来运行您的设计。
我建议调查一下 xilinx高级综合 ,特别是如果你来自C背景。它使用hdl抽象出技术细节,因此设计人员可以专注于算法实现。
您可以编写的C代码类型的限制。例如,您不能使用动态大小的数据结构,因为这会推断动态大小的硬件。