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