我在 Xilinx Platform Studio 工作,我真正想做的是让 VHDL 模块输出一些值,然后我希望能够从另一个用 C 编写的程序中读取该值。
我想我想要做的是将我的 VHDL 模块中的特定端口映射到内存中的某个位置,然后在我的 C 程序中从内存中的那个位置读取。
有人可以指出我将如何做到这一点的正确方向吗?
这是 microblaze 还是 power pc 处理器?最简单的方法可能是一个 gpio 外围设备。
http://www.xilinx.com/support/documentation/ip_documentation/plb_gpio.pdf
如果您需要更快的速度,您可以使用 FSL Link。
http://www.xilinx.com/support/documentation/ip_documentation/plb2fsl_bridge.pdf
其他想法和方法:
块内存接口。 http://www.xilinx.com/support/documentation/ip_documentation/plb_bram_if_cntlr.pdf
编写自定义 plb 外设。查找“创建和导入外围设备向导”。
我从您的要求中了解到,您想要创建一个自定义 ip 内核(VHDL),然后将其添加为 XPS MicroBlaze/PowerPC 系统的一部分,处理器应该可以访问您的内核(C 编程)。
在这里,您必须使用 Xilinx XPS EDK 工具执行以下主要步骤:
首先从Base System Builder开始创建基于处理器的系统。为您的系统选择必要的处理器、外围设备和其他组件。
调用创建导入向导来创建自定义 IPCore。此工具将引导您完成自定义核心的功能选择过程。选择处理器可访问的2-4软件可访问寄存器功能(C 编程)。最后,向导将生成一组 ipcore 文件,包括 HDL 源代码。可以在 *xps_prj/pcores/yourcore_v1_00_a* 中找到模板源。
这是一大步。生成的 HDL 模板(*yourcore_v1_00_a/hdl/vhdl*)主要包含一个总线接口单元(PLB/FSL)和一个示例逻辑。在这里,您必须编辑 HDL 模板源以删除示例逻辑并实例化您的自定义核心逻辑。您可以将核心实例的 IO 端口分为两组。第一个包含处理器可访问的 IO 端口(通过 C 编程)应连接到HDL 模板中的软件可访问寄存器。您要从 FPGA 中引出的第二组核心 IO 端口,应进行必要的端口映射到顶部模块的外部端口连接。
编辑 PAO 文件 (*yourcore_v1_00_a/data/yourcore_v1_00_a.pao*) 并按您想要合成的顺序添加您的自定义核心源。
在模板文件中进行所有必要的更改后,调用创建和导入向导工具并将所有核心更改导入 XPS 环境。
您的自定义 ipcore 现在将显示在IP 目录中。将其添加为系统的一部分,并为系统中的自定义 IPCore 进行必要的端口连接、总线接口和地址生成。
使用PlatGen生成系统的网表和比特流。
创建一个 C 应用程序项目。使用LibGen生成库并编译 C 应用程序以生成 ELF文件。
使用Data2Mem工具合并硬件比特流和软件 ELF 以下载.bit文件。使用Impact工具将比特流下载到平台。
仅供参考,这对于电气工程堆栈交换来说可能也是一个好问题。
我对这个话题的记忆有点模糊,如果没有更多关于你的设计的细节,很难提出建议,因此这个解释将是非常高级的。
我会将您的新 VHDL 模块实现为外围设备。
您可能已经知道这一点,但执行此操作的两个广泛主题/技术是内存映射 IO 和端口映射 IO。端口映射 IO 需要引入一些新指令,并需要一条来自 CPU 的芯片选择线来指示该读/写操作将去往何处。地址空间可以由内存和外设共享。(CPU 是您的 VHDL 设计的一部分吗?)
可能更简单的方法是通过内存映射 IO。这需要硬件保留地址空间,您的新设备将位于地址和数据总线上,监听其地址范围。您的新模块需要遵守所有时序和协议要求才能在总线上通话。在您的 C 代码中,将变量声明为volatile
并将其指向您的设备用于读取和写入的地址。