Hello All,
I have a C6678 configured as (RC) and interfaces with Spartan6 (EP). PCIe code based on the "pcie_sample" code in the pdk. I can successfully issue a memory read from the RC to the EP.
I have the EP interrupts the RC using a GPIO whenever the EP has a block of 3072 int (32-bit). The RC then issues a memory read to read the block from the FPGA Simple Dual Port RAM. The GPIO interrupt occurs every 6 ms and I thought the time it takes to read from the EP is very small as follows:
Payload = 4 bytes (SPARTAN6 supports 32-bit read only)
Header = 16 bytes
ECRC = 4 bytes
Link = 8 bytes
Percent Throughput - 4/44 = 9%
Max. Effective Throughput = 2.5 Gbps x 1 lane
= 2.5 Gbps x 8/10 (encoding)
= 2 Gbps
= 2000 Mbps
at 9%
= 2000 Mbps * 9/100
= 180 Mbps
180000000 bits <-------------> 1 sec
3072*32 bits <-------------> 546 microsec
My GPIO_ISR does the following to read the block of data:
rdPtr = (int *)&algInputBuff[0];
for (k = 0; k < (3072); k++)
*rdPtr++ = *((volatile uint32_t *)pcieDataBase + k);//3072 32-bit samples
Also, I kept the translation as in the example code.
The PROBLEM is that my ISR takes more time to process the block of samples than the 6 ms so I miss further gpio interrupts. When I change the code to read the same data from a dsp buffer, the ISR runs fast enough and no missing interrupts occur
I am planning to use EDMA, but I never used DMA before and I need sometime to do that...but what am I doing wrong... can I change the outbound translation to speed up the transfer before employing EDMA?
Regards,
Murad