¿esto asegura que estoy leyendo desde el ram?

0

En este momento estoy tratando de hacer ingeniería inversa de algo que hice hace mucho tiempo pero nunca entendí por qué está funcionando tan lentamente.

Tengo una placa Zybo, con un chip Zynq 7010s, que tiene un procesador dual AX-A9 y un FPGA muy compacto.

En el lado de la CPU, hice un juego, que para cada iteración genera una serie de valores que representan el valor en píxeles de la imagen del juego.

= > primera pregunta = > esta matriz es bastante grande, y no estoy seguro de dónde se almacenaría esta variable? ... Acabo de crear una variable que tenía este valor.

A continuación, la imagen del juego tenía que mostrarse en el puerto vga, para lo cual, i cómo transferir los datos del lado del PS al PL Utilicé el AXI DMA y lo transferí así:

void send_data(char c_map, u32 target){
    //xil_printf("\r\nStarting sending data\r\n");


    /* Initialize the XAxiDma device.
     */
    CfgPtr = XAxiDma_LookupConfig(DMA_DEV_ID);
    if (!CfgPtr) {
        xil_printf("No config found for %d\r\n", DMA_DEV_ID);
        //return XST_FAILURE;
    }

    Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);
    if (Status != XST_SUCCESS) {
        xil_printf("Initialization failed %d\r\n", Status);
        //return XST_FAILURE;
    }

    if(XAxiDma_HasSg(&AxiDma)){
        xil_printf("Device configured as SG mode \r\n");
        //return XST_FAILURE;
    }

    //Value = 0b11110000000000000000000101000000;

    if(c_map == WALL){
        //bbbbggggrrrr
        Value = 0b11111111111100000000000000000000;
        //Value = 0b00000100000000000000000000000000;
        Value = Value + target;
    }else if(c_map == BALL){
        //Value = 0b10000000000000000000000000000000;
        Value = 0b00000000111100000000000000000000;
        Value = Value + target;
    }else{
        Value = 0b00000000000000000000000000000000;
        Value = Value + target;
    }

    for(Index = 0; Index < MAX_PKT_LEN; Index ++) {
        TxBufferPtr[Index] = Value;
    }

    Xil_DCacheFlushRange((UINTPTR)TxBufferPtr, MAX_PKT_LEN);

    Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) TxBufferPtr,
            MAX_PKT_LEN, XAXIDMA_DMA_TO_DEVICE);

    if (Status != XST_SUCCESS) {
        xil_printf("No XST_SUCCESS \r\n");
        //return XST_FAILURE;
    }

    while (XAxiDma_Busy(&AxiDma,XAXIDMA_DMA_TO_DEVICE)) {} //wait
}

En el PL creo un bloque ram como tal

type RAM is array (0 to ADDR_WIDTH+1) of std_logic_vector (DATA_WIDTH-1 downto 0);
signal mem : RAM := (others => (others => '1'));

Que supuestamente debería ser un bloque de memoria, y luego, dentro de mi controlador VGA, complete mi bloque de memoria con los datos recibidos como entrada del zynq como tal.

MEM_READ:
process(clk)
begin
   if (rising_edge(clk)) then
        if ((hSyncCounter > hBackPorch) and (hSyncCounter <= hBackPorch+hDataLen)) then
            mem(conv_integer(data(19 downto 0))) <= data(31 downto 20);--"111100000000";
       end if;
   end if;
end process; 

Los datos son una señal de entrada. 31 hasta 20 consisten en el valor RGB del píxel. y el 19 hasta el 0 es la dirección de la c.

19 downto 0 es solo la posición de la cuadrícula en la imagen y no una ubicación específica del ram o algo así, pero ¿dónde está el mem que creo en el PL almacenado, o está hecho de? ¿Es solo un gran mux gigante?

    
pregunta Sorrow

1 respuesta

1

Debería poder usar sus herramientas de diseño para comprobar qué ha hecho el sintetizador con mem .

Verifique primero el esquema RTL, y asegúrese de que se vea "sano" (es decir, asegúrese de que mem aparezca como algún tipo de RAM). El esquema RTL muestra el HDL sintetizado no específico de la arquitectura.

Luego verifique el "Esquema de la tecnología" (creo que así lo llama Xilinx, al menos en ISE), que le muestra lo que la síntesis específica de optimización / arquitectura ha hecho con su diseño. Esto debería mostrar un mem asignado al bloque RAM (s), o explicar qué ha decidido hacer el sintetizador con su construcción.

    
respondido por el uint128_t

Lea otras preguntas en las etiquetas