如何阅读&写信给Microblaze的fifo?

时间:2014-08-09 21:33:22

标签: fpga xilinx-edk

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

2 个答案:

答案 0 :(得分:2)

我使用Microblazed与海关IP使用FIFO与Microblaze(EDK 14.7)进行通信。

当您设置Microblaze时,它会要求您指定一些" 软件寄存器"。该软件寄存器位于" user_logic.vhd "当您尝试" 导入为外围设备"时会自动创建您的自定义IP(例如您的FIFO)。选择适合您项目的软件寄存器的数量,并将它们(在 user_logic.vhd 中)与FIFO的信号(Inpout / Output / Empty / Full)连接,以便控制FIFO的内容(读写事务)。当您生成硬件实现的比特流并将其下载到FPGA时,在项目文件中还会创建一个名为" drivers "的文件。其中包含所有库文件,这些库文件具有在Microblaze的软件寄存器中进行读写的实现功能。

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

Nassos

答案 1 :(得分:1)

通常情况下,I / O设备(如FIFO)会被内存映射到一个地址或内存地址范围。

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

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

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

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

  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';
    
  3. 在第2种情况下,最低8位并不在意,任何写访问都转换为FIFO写操作。