I'm doing some timing tests using MicroZed board.
I need to know the maximum data rate from PS to GPIO or EGPIO.
I have a logic analyzer connected to PIO.J5.
I written a C program that writes directly to MIO.DATA_0 regiseters (see code below)
I measure 60ns-120ns per access (write to GPIO0->DATA_0)
This is less than 10 Mhz!!
How can I acheive sustained 100Mhz data rate to PL if
the fastest I can push data from PS is < 10Mhz?
What am I doing wrong???
How do I speed up the STR command ???
//------------ C code source ------------------------
fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
// mmap the MicroZed GPIO page
target = GPIO_BASEADDR ; // physical ARM IO registers
map_base = mmap(
0, // caddr_t addr
GPIO_SIZE, // size_t len = 4K =4096 = 0x1000 Bytes
PROT_READ | PROT_WRITE, // int prot
MAP_SHARED, // int flags
fd, // int filehandle
target & ~GPIO_MASK // off_t offset
);
microzed_gpio = (microzed_gpio_t *)(map_base) ;
volatile unsigned long *gpio_dout0 = &(microzed_gpio->dout0) ;
volatile unsigned long *gpio_dout1 = &(microzed_gpio->dout1) ;
...
...
while( microzed_gpio->DIN1.b19 != 1 ) {
*(gpio_dout0) = D0_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D1_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D2_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D3_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D4_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D5_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D6_MASK ;
*(gpio_dout0) = 0 ;
*(gpio_dout0) = D7_MASK ;
*(gpio_dout0) = 0 ;
}
//-------while loop dissambled code -------------
198 .L19:
199 01ac 40B084E5 str fp, [r4, #64] // 60nS
200 01b0 403084E5 str r3, [r4, #64] // 60ns
201 01b4 40A084E5 str r10, [r4, #64]
202 01b8 403084E5 str r3, [r4, #64]
203 01bc 409084E5 str r9, [r4, #64]
204 01c0 403084E5 str r3, [r4, #64]
205 01c4 408084E5 str r8, [r4, #64]
206 01c8 403084E5 str r3, [r4, #64]
207 01cc 407084E5 str r7, [r4, #64]
208 01d0 403084E5 str r3, [r4, #64]
209 01d4 400084E5 str r0, [r4, #64]
210 01d8 403084E5 str r3, [r4, #64]
211 01dc 40E084E5 str lr, [r4, #64]
212 01e0 403084E5 str r3, [r4, #64]
213 01e4 40C084E5 str ip, [r4, #64]
214 01e8 403084E5 str r3, [r4, #64]
215 01ec 641092E5 ldr r1, [r2, #100]
216 01f0 020711E3 tst r1, #524288
217 01f4 ECFFFF0A beq .L19