Memory read/write example for Xilinx external memory.
0
0
0
1
0
0
0
0
0
1
CODE
software part
#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include "co.h"
#define MICROBLAZE
#if defined(MICROBLAZE)
#include "xparameters.h"
#define printf xil_printf
#endif
// Support different memory names used by template EDK projects
#ifdef XPAR_MYDDR_BASEADDR
#define EXT0_BASEADDR XPAR_MYDDR_BASEADDR
#define EXT0_HIGHADDR XPAR_MYDDR_HIGHADDR
#endif
#ifdef XPAR_OPB_SDRAM_0_BASEADDR
#define EXT0_BASEADDR XPAR_OPB_SDRAM_0_BASEADDR
#define EXT0_HIGHADDR XPAR_OPB_SDRAM_0_HIGHADDR
#endif
#ifdef XPAR_OPB_MEMORYIO_0_BASEADDR
#define EXT0_BASEADDR XPAR_OPB_MEMORYIO_0_BASEADDR
#define EXT0_HIGHADDR XPAR_OPB_MEMORYIO_0_HIGHADDR
#endif
// The ext_alloc() function is required to set up the shared
// external memory resource, which is assumed for this example
// to be DDR memory available on the platform target.
#if defined(MICROBLAZE)
void *ext0_alloc(size_t size)
{
static unsigned int address = EXT0_BASEADDR;
void *ret;
if ((EXT0_HIGHADDR - address) < size) return(NULL);
ret=(void *)address;
address += size;
return(ret);
}
#endif
extern co_architecture co_initialize(void *);
// The producer process generates some data and initializes memory.
//
void producer(co_signal start,co_memory memblk,co_signal done)
{
int16 i,j;
int16 tmp[10];
int32 result;
// Initialize the memory with some values
for (i = 0; i < 10; i++)
tmp[i] = 3;
// Write the values to shared external memory
co_memory_writeblock(memblk, 0, tmp, 10*sizeof(int16));
// Send a signal to the hardware process (memory is ready)
co_signal_post(start,1);
co_memory_readblock(memblk, 0, tmp, 10*sizeof(int16));
for (j = 0; j < 10; j++)
{printf("%d\r\n", tmp[j]);}
co_signal_wait(done, &result);
printf("the signal is =%d\n",result);
}
int main(int argc, char *argv[]) {
co_architecture my_arch;
int c;
printf("Memory read/write example for Xilinx external memory.\n");
my_arch = co_initialize(NULL);
co_execute(my_arch);
printf("Memory read/write example complete.\n");
IF_SIM(printf("Press Enter key to continue...\n")
IF_SIM(c = getc(stdin)
return(0);
}
hardware file
#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include "co.h"
// See MemoryIO_sw.c
extern void producer(co_signal start,co_memory memblk,co_signal done);
// Hardware process
void pe_run(co_signal start, co_memory memblk, co_signal done)
{
int16 buffer[10];
int16 i;
int32 res;
// Specify synchronous RAM for the local array memory
co_array_config(buffer, co_kind, "sync");
// Wait for a signal from the producer process
co_signal_wait(start,&res);
// Read 10 words from the shared external memory to local buffer
co_memory_readblock(memblk, 0,buffer, 10*sizeof(int16));
// Perform a calculation on the buffer data
for (i = 0; i < 10; i++) {
buffer[i] += 1;
}
// Send a signal to consumer process (calculation complete)
// Write modified data from the local buffer to shared external memory
co_memory_writeblock(memblk, 0, buffer, 10*sizeof(int16));
// Send a signal to consumer process (memory write complete)
co_signal_post(done,1);
}
void config_memoryio(void *arg)
{
co_signal start_sig, done_sig;
co_memory bram_memory;
co_process producer_proc, consumer_proc;
co_process pe_proc;
start_sig = co_signal_create("start");
done_sig = co_signal_create("done");
bram_memory = co_memory_create("bram_mem", "bram0", 10*sizeof(int16));
producer_proc = co_process_create("producer_proc", (co_function)producer,3, start_sig,bram_memory, done_sig);
pe_proc = co_process_create("pe_proc", (co_function)pe_run,3, start_sig, bram_memory, done_sig);
// Assign pc_proc (pe_run) to hardware element PE0
co_process_config(pe_proc, co_loc, "PE0");
}
co_architecture co_initialize()
{
return(co_architecture_create("memoryio","xilinx_mb_opb",config_memoryio,NULL));
}
#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include "co.h"
#define MICROBLAZE
#if defined(MICROBLAZE)
#include "xparameters.h"
#define printf xil_printf
#endif
// Support different memory names used by template EDK projects
#ifdef XPAR_MYDDR_BASEADDR
#define EXT0_BASEADDR XPAR_MYDDR_BASEADDR
#define EXT0_HIGHADDR XPAR_MYDDR_HIGHADDR
#endif
#ifdef XPAR_OPB_SDRAM_0_BASEADDR
#define EXT0_BASEADDR XPAR_OPB_SDRAM_0_BASEADDR
#define EXT0_HIGHADDR XPAR_OPB_SDRAM_0_HIGHADDR
#endif
#ifdef XPAR_OPB_MEMORYIO_0_BASEADDR
#define EXT0_BASEADDR XPAR_OPB_MEMORYIO_0_BASEADDR
#define EXT0_HIGHADDR XPAR_OPB_MEMORYIO_0_HIGHADDR
#endif
// The ext_alloc() function is required to set up the shared
// external memory resource, which is assumed for this example
// to be DDR memory available on the platform target.
#if defined(MICROBLAZE)
void *ext0_alloc(size_t size)
{
static unsigned int address = EXT0_BASEADDR;
void *ret;
if ((EXT0_HIGHADDR - address) < size) return(NULL);
ret=(void *)address;
address += size;
return(ret);
}
#endif
extern co_architecture co_initialize(void *);
// The producer process generates some data and initializes memory.
//
void producer(co_signal start,co_memory memblk,co_signal done)
{
int16 i,j;
int16 tmp[10];
int32 result;
// Initialize the memory with some values
for (i = 0; i < 10; i++)
tmp[i] = 3;
// Write the values to shared external memory
co_memory_writeblock(memblk, 0, tmp, 10*sizeof(int16));
// Send a signal to the hardware process (memory is ready)
co_signal_post(start,1);
co_memory_readblock(memblk, 0, tmp, 10*sizeof(int16));
for (j = 0; j < 10; j++)
{printf("%d\r\n", tmp[j]);}
co_signal_wait(done, &result);
printf("the signal is =%d\n",result);
}
int main(int argc, char *argv[]) {
co_architecture my_arch;
int c;
printf("Memory read/write example for Xilinx external memory.\n");
my_arch = co_initialize(NULL);
co_execute(my_arch);
printf("Memory read/write example complete.\n");
IF_SIM(printf("Press Enter key to continue...\n")
IF_SIM(c = getc(stdin)
return(0);
}
hardware file
#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include "co.h"
// See MemoryIO_sw.c
extern void producer(co_signal start,co_memory memblk,co_signal done);
// Hardware process
void pe_run(co_signal start, co_memory memblk, co_signal done)
{
int16 buffer[10];
int16 i;
int32 res;
// Specify synchronous RAM for the local array memory
co_array_config(buffer, co_kind, "sync");
// Wait for a signal from the producer process
co_signal_wait(start,&res);
// Read 10 words from the shared external memory to local buffer
co_memory_readblock(memblk, 0,buffer, 10*sizeof(int16));
// Perform a calculation on the buffer data
for (i = 0; i < 10; i++) {
buffer[i] += 1;
}
// Send a signal to consumer process (calculation complete)
// Write modified data from the local buffer to shared external memory
co_memory_writeblock(memblk, 0, buffer, 10*sizeof(int16));
// Send a signal to consumer process (memory write complete)
co_signal_post(done,1);
}
void config_memoryio(void *arg)
{
co_signal start_sig, done_sig;
co_memory bram_memory;
co_process producer_proc, consumer_proc;
co_process pe_proc;
start_sig = co_signal_create("start");
done_sig = co_signal_create("done");
bram_memory = co_memory_create("bram_mem", "bram0", 10*sizeof(int16));
producer_proc = co_process_create("producer_proc", (co_function)producer,3, start_sig,bram_memory, done_sig);
pe_proc = co_process_create("pe_proc", (co_function)pe_run,3, start_sig, bram_memory, done_sig);
// Assign pc_proc (pe_run) to hardware element PE0
co_process_config(pe_proc, co_loc, "PE0");
}
co_architecture co_initialize()
{
return(co_architecture_create("memoryio","xilinx_mb_opb",config_memoryio,NULL));
}












