opiviqo 发表于 2023-12-22 11:39:52

请教一下PCIE读DDR的逻辑

请教各位一个问题,FPGA一直往DDR里面写数据(按照地址从头写到尾),PCIE接口往DDR里面一直读数据(按照地址读)。
这一套逻辑是怎么样的?我怎么才能判断我写的数据没有覆盖我还没有读的数据呢?(就是读慢了,写的话已经覆盖了上一次的数据),用个寄存器报错?

wye11083 发表于 2023-12-22 12:32:50

有条件就加地址管理,满了就不要写了。要么就加片断,数据按块存放,每次读一块数据。

opiviqo 发表于 2023-12-22 14:04:52

wye11083 发表于 2023-12-22 12:32
有条件就加地址管理,满了就不要写了。要么就加片断,数据按块存放,每次读一块数据。 ...
(引用自2楼)

谢谢!
再请教一下,如果按块存放的话,每次写完一个块,PC端读完一个块,是否要加个寄存器之类的做判断呢?
另外地址管理指的是啥?

wye11083 发表于 2023-12-22 16:07:59

opiviqo 发表于 2023-12-22 14:04
谢谢!
再请教一下,如果按块存放的话,每次写完一个块,PC端读完一个块,是否要加个寄存器之类的做判断 ...
(引用自3楼)

写完之后没有空块就等着。

david9895 发表于 2023-12-25 10:48:06

测试了一下ChatGPT{:lol:},以下是ChatGPT回答的内容:
------
在描述的场景中,FPGA(现场可编程门阵列)不断地向DDR内存写入数据,而通过PCIe接口,系统则不断地从DDR内存中读取数据。这种场景通常出现在高速数据采集、处理和传输应用中。为了确保写入的数据不会覆盖还未被读取的数据,可以采用以下策略:

环形缓冲区(Ring Buffer)

    定义环形缓冲区:在DDR内存中设置一个环形缓冲区。这意味着内存被划分为多个区块(比如称为“框架”或“页”)。

    写指针和读指针:使用两个指针(或地址寄存器),一个用于FPGA写操作(写指针),另一个用于PCIe读操作(读指针)。

    写入和读取逻辑:
      FPGA按顺序写入数据到当前的写指针指向的区块,完成一个区块后移动到下一个。
      PCIe从读指针指向的区块读取数据,完成后移动到下一个。

    检测和处理覆盖情况:
      在每次写操作前,检查写指针是否即将“追上”读指针。如果是,这意味着写入速度快于读取速度,可能会覆盖未读数据。
      如果检测到覆盖风险,可以采取措施,如暂停写操作、发出警告或将数据写入备用区域。

状态寄存器

设置一个状态寄存器或标志位来监控每个区块的状态(例如,“空闲”,“已写入”,“已读取”)。这可以帮助协调读写操作,确保数据一旦被读取,相应的区块状态会更新,从而避免数据被覆盖。
实现

    编写逻辑代码:在FPGA中实现上述逻辑,通常使用硬件描述语言(HDL)如VHDL或Verilog。

    测试和调试:在实际硬件上或使用仿真工具测试和调试逻辑,确保读写操作按预期运行。

    优化性能:根据实际需求调整缓冲区大小、数据块大小等参数,以优化性能和资源使用。

注意事项

    同步机制:确保读写操作之间正确的同步,尤其是在多线程或多进程环境中。
    缓冲区管理:合理管理缓冲区大小和数量,以避免内存浪费和性能瓶颈。
    硬件资源:注意FPGA和内存的硬件资源限制。

通过这样的设计,可以有效地管理FPGA到DDR的写操作和PCIe到DDR的读操作,确保数据的完整性和高效处理。
页: [1]
查看完整版本: 请教一下PCIE读DDR的逻辑