我已经完成了我的项目,并且已经在我的项目中添加了一个微型处理器。我还添加了一个H / W内核,它有一个FIFO到我的项目。我想从处理器读取和写入FIFO(通过在SDK中编写交流代码。。我该怎么办?
答案 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>
地址映射可以通过以下伪代码完成:
单一地址:
fifo_write <= '1' when (bus_address = x"0000AB00") and (bus_we = '1') else '0';
地址范围:
fifo_write <= '1' when (bus_address(31 downto 8) = x"0000AB") and (bus_we = '1') else '0';
在第2种情况下,最低8位并不在意,任何写访问都转换为FIFO写操作。