0

我已经完成了我的项目,并且在我的项目中添加了一个 microblaze 处理器。我还在我的项目中添加了一个具有 FIFO 的 H/W 内核。我想从处理器读取和写入 FIFO(通过编写 ac 代码在 SDK 中)。我该怎么办?

4

2 回答 2

2

我已将 Microblazed 与使用 FIFO 与 Microblaze (EDK 14.7) 通信的海关 IP 一起使用。

当您设置 Microblaze 时,它​​会要求您指定一些“软件寄存器”。该软件寄存器位于“ user_logic.vhd ”中,当您尝试“导入为外围设备”您的自定义 IP(例如您的 FIFO)时自动创建。选择适合您项目的软件寄存器数量并将它们(在user_logic.vhd中)与您的 FIFO(输入/输出/空/满)信号连接,以控制 FIFO 的内容(读取和写交易)。当您生成硬件实现的比特流并将其下载到您的 FPGA 时,在您的项目文件中还将创建一个名为“驱动程序”的文件" 其中包含所有库文件,其中包含在 Microblaze 的软件寄存器中实现读取和写入功能的所有库文件。

现在您可以在 SDK 环境中的 C 项目中导入这些驱动程序,以便使用这些自动实现的功能并访问软件寄存器(并通过它们访问您的 FIFO)。

纳索斯

于 2016-12-14T12:03:00.237 回答
1

通常,一个 I/O 设备,如您的 FIFO,内存映射到一个地址或内存地址范围。

如果它映射到一个地址,您应该使用多个读取或写入指令到同一地址,如下所示:

// example address for the FIFO
void myFifo = 0x0000AB00;
// write
*myFifo = dataToWrite;
//read
dataFromFifo = *myFifo;

如果您的 FIFO 映射到地址范围,则myFifo表示 FIFO 的基地址,您可以使用memcpy将多个字节/字复制到 FIFO。

地址映射可以通过这个伪代码完成:

  1. 单一地址:

    fifo_write <= '1' when (bus_address = x"0000AB00") and (bus_we = '1') else '0';
    
  2. 地址范围:

    fifo_write <= '1' when (bus_address(31 downto 8) = x"0000AB") and (bus_we = '1') else '0';
    

在情况 2. 最低 8 位无关紧要,任何写访问都转换为 FIFO 写操作。

于 2014-08-15T22:06:37.767 回答