双口BRAM的使用

打算在zynq的逻辑侧缓冲1-page数据。直接调用IP,使用内部的block ram,配置成双口BRAM。ARM一侧通过AXI总线读写Port-A,逻辑侧代码读写Port-B。

调用IP:
M_AXI_GP0 <-> AXI_Interconnect <-> AXI_BRAM_Controller <->

Port_A <->Block_Memory_Generator <-> Port_B <-> User_Logic

Mode里面可以选择Stand Alone和BRAM Controller,差别在Alone的可以配置位宽,Controller两侧都是32bit位宽。我们在Port-B侧需要8bit的byte位宽,所以选择Alone。如果是32位宽2K深度,那么A端地址是11位的,B端是13位的。当然也可以勾选右上的Generate address interface with 32 bit,都配置成32bit的。

Memory Type选项基本有single口/dual口可选,如果选带simple则是某侧port只写或只读。 我们需要两侧都能读写的,多以这里选择True Dual Port RAM。

两个port都能配置Operating Mode,默认是Write First Mode,这个也是我们实际需要的。user这侧需要连续发生random data写入bram,bram同步把数据output给flash。以及逐个把对应addr的数据out出来跟flash对此,同时把flash的这个数据write到bram的这个addr,就是逐位对比再加存储。

从这个时序图完全可以看出满足需求:

在T2写入bram,T3即可输出到flash;反过来,T1出来的data,在T2即可与flash出来的data对比,同时可在T2写入bram;每个写操作的下个节拍都会自动输出data。

附录:
PG058 - Block Memory Generator v8.3 Product Guide
https://www.xilinx.com/support/documentation/ip_documentation/blk_mem_ge...

PG078 - AXI Block RAM (BRAM) Controller v4.0 Product Guide
https://www.xilinx.com/support/documentation/ip_documentation/axi_bram_c...

本文 转载自:kevinc的博客