Nios与FPGA如何交互?
How to interact between Nios and FPGA?
示例:
假设 FPGA 上有一个 Nios 运行,它通过 SPI 接口随机(或每秒)发送一个字符串到连接的显示器。另一方面,有监控按钮的 FPGA 代码。每次按下此按钮都应将一个字符串发送到同一个附加显示器。
问题:
一般情况下或在上述情况下,FPGA 和 Nios 之间的交互(或通信)如何工作?当这段代码在FPGA代码下是运行时,Nios怎么可能'inform'按下按钮呢?也许有关于这个主题的文档来了解它是如何工作的...
提前致谢
低速还是高速?
对于低速,在NIOS系统中插入一个足够I/O "pins"的GPIO内核,然后重建它。将您的硬件连接到这些引脚,并使用 GPIO 驱动程序代码访问它们。完毕。按钮算作低速。 SPI 也可以,尽管您可能会找到更好的 NIOS SPI 外围设备,所以我会使用它。
为了高速,您需要设计一个外围设备(IP 内核),它可以连接到 NIOS 系统使用的任何总线,并提供连接到 VHDL 硬件所需的所有寄存器、内存、中断源等。您可以使用大量示例外围设备作为起点。然后您再次从示例代码开始编写驱动程序软件以访问该外设。
这是一个复杂得多的项目,虽然它比 GPIO 快得多,但您会发现 "high speed" 是相对的;与自定义硬件相比,任何嵌入式 CPU 都慢得惊人。我们这里讨论的不是 2 的因数,而是数量级。
编辑:如上所述,无论您使用哪种方法,最好通过驱动程序软件从软件方面与硬件交互。
如果您处于必须编写自己的驱动程序的情况,那么您声明变量以匹配每个可访问的寄存器或内存块(由数组变量表示)。供应商工具通常可以根据 VHDL 代码或其他一些描述为您创建框架驱动程序。我不知道 Altera/Nios 工具是如何设置的,但他们肯定有教程来教你他们的方法。
如果您有 Ada 编译器,您可以在包范围内声明这些变量,以保持适当的抽象和信息隐藏。但是如果你必须使用没有包的 C,你可能会被全局变量困住。
您将每个变量固定在您的硬件将它们映射到的任何物理地址,并且您必须声明它们 "volatile" 以便对它们的访问永远不会优化到寄存器中。
如果您的硬件可以中断 CPU,您必须编写一个中断处理函数,使用 pragma 告诉编译器它应该连接到哪个中断向量。您需要从您自己的编译器文档和其他外围设备的驱动程序代码示例中获取确切的详细信息。
带有示例代码和简短的 "Guidelines" 文档
并使用 NIOS software handbook 以获得更多深度。
为了帮助找到您要查找的内容,显然 Altera 使用术语 "HAL"(硬件抽象层)来描述直接访问硬件的驱动程序部分,并且 "BSP"( Board Support Package)用于允许您向工具和您的软件团队描述您的硬件的设施。构建框架驱动程序的任何工具都将与 BSP 相关联:我在软件手册中看到一个名为 "Creating a new BSP" 的部分。
示例: 假设 FPGA 上有一个 Nios 运行,它通过 SPI 接口随机(或每秒)发送一个字符串到连接的显示器。另一方面,有监控按钮的 FPGA 代码。每次按下此按钮都应将一个字符串发送到同一个附加显示器。
问题: 一般情况下或在上述情况下,FPGA 和 Nios 之间的交互(或通信)如何工作?当这段代码在FPGA代码下是运行时,Nios怎么可能'inform'按下按钮呢?也许有关于这个主题的文档来了解它是如何工作的...
提前致谢
低速还是高速?
对于低速,在NIOS系统中插入一个足够I/O "pins"的GPIO内核,然后重建它。将您的硬件连接到这些引脚,并使用 GPIO 驱动程序代码访问它们。完毕。按钮算作低速。 SPI 也可以,尽管您可能会找到更好的 NIOS SPI 外围设备,所以我会使用它。
为了高速,您需要设计一个外围设备(IP 内核),它可以连接到 NIOS 系统使用的任何总线,并提供连接到 VHDL 硬件所需的所有寄存器、内存、中断源等。您可以使用大量示例外围设备作为起点。然后您再次从示例代码开始编写驱动程序软件以访问该外设。
这是一个复杂得多的项目,虽然它比 GPIO 快得多,但您会发现 "high speed" 是相对的;与自定义硬件相比,任何嵌入式 CPU 都慢得惊人。我们这里讨论的不是 2 的因数,而是数量级。
编辑:如上所述,无论您使用哪种方法,最好通过驱动程序软件从软件方面与硬件交互。
如果您处于必须编写自己的驱动程序的情况,那么您声明变量以匹配每个可访问的寄存器或内存块(由数组变量表示)。供应商工具通常可以根据 VHDL 代码或其他一些描述为您创建框架驱动程序。我不知道 Altera/Nios 工具是如何设置的,但他们肯定有教程来教你他们的方法。
如果您有 Ada 编译器,您可以在包范围内声明这些变量,以保持适当的抽象和信息隐藏。但是如果你必须使用没有包的 C,你可能会被全局变量困住。
您将每个变量固定在您的硬件将它们映射到的任何物理地址,并且您必须声明它们 "volatile" 以便对它们的访问永远不会优化到寄存器中。
如果您的硬件可以中断 CPU,您必须编写一个中断处理函数,使用 pragma 告诉编译器它应该连接到哪个中断向量。您需要从您自己的编译器文档和其他外围设备的驱动程序代码示例中获取确切的详细信息。
带有示例代码和简短的 "Guidelines" 文档
并使用 NIOS software handbook 以获得更多深度。
为了帮助找到您要查找的内容,显然 Altera 使用术语 "HAL"(硬件抽象层)来描述直接访问硬件的驱动程序部分,并且 "BSP"( Board Support Package)用于允许您向工具和您的软件团队描述您的硬件的设施。构建框架驱动程序的任何工具都将与 BSP 相关联:我在软件手册中看到一个名为 "Creating a new BSP" 的部分。