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