Showing results for 
Show  only  | Search instead for 
Did you mean: 
Registered: ‎05-06-2015

Sending data from PL to DDR3 without using stream/burst


I need to move some amount of data packets to the DDR3 memory of my ZC702 evaluation kit. The problem appears if this data is not aligned, I mean the packet number 2 doesn't go next to packet 1 or packet 3, it can goes to other position in the DDR3. This position change is generated by a vhdl module that I have created and it works well. I have uploaded a picture for better understanding the situation.



At the moment I have written one VHDL module with AXI4-Lite interface (I have chosen that option because I can't use the burst of the AXI4 specification) which is connected to the AXI4 memory map. It works but it generates some glitches in the DDR3 final data (Corruption of some data and also misalignment problems).

My question is: can I use a IP core for doing transfers but not as they have used typically because I need to change the address for each transaction? How can do that? Any idea about why my AXI4-Lite module is generating some glitches?


Thank you very much!

0 Kudos
3 Replies
Community Manager
Community Manager
Registered: ‎07-23-2012

You can try AXI DMA or AXI Data mover for this purpose.
Please mark the post as "Accept as solution" if the information provided answers your query/resolves your issue.

Give Kudos to a post which you think is helpful.
0 Kudos
Registered: ‎03-31-2012

why can't you use burst? coding a master with burst capability is easy. In your list of options, you can use the first and third. Or you can code an axi master in C and use HLS.

Your problems about data corruption can be due to caching. When you write to memory through HPx ports, the processor doesn't know that the memory has changed. You need to manage cache properly.
Another option is to connect your master to ACP and set ACP to coherent mode. This might get rid of the glitches if caching is your problem.
- Please mark the Answer as "Accept as solution" if information provided is helpful.
Give Kudos to a post which you think is helpful and reply oriented.
0 Kudos
Registered: ‎08-29-2016

I use BRAM for this purpose:




Here's my process in my blockmem_tester_v1_0 IP:



variable addr : integer := 0;


if rising_edge(CLK) then

addra <= std_logic_vector(to_unsigned(addr, 32));
dina <= x"efbeadde";
addr := addr + 4;
if addr = 8192 then
addr := 0;
end if;
ena <= '1';
wea <= "1111";

end if;
end process;

In address editor my axi_bram_ctrl_0 starts at address 0x40000000 with an 8KB range.  On the PS side I use /dev/mem in Linux:


int m = open("/dev/mem", O_RDWR | O_SYNC);
unsigned long* addr = mmap(NULL, 8192, PROT_READ | PROT_WRITE, MAP_SHARED, m, 0x40000000);

I can now read/write to *addr.


Hope this helps.  Took me a long time to achieve this so I hope it provides a short cut for some.


0 Kudos