¿Puede Nios II leer direcciones en incrementos de 1 o solo incrementos de 4?

0

Hay algo de confusión aquí. Creo que el Nios II tiene un bus de datos de 32 bits. Por lo tanto, no es capaz de direccionamiento de bytes individuales. Por lo tanto, el bus de direcciones aumenta como 0, 4, 8 e.t.c y no 0, 1, 2 e.t.c. La señal de activación de bytes se puede usar para seleccionar bytes individuales para escribir, pero no tiene ningún efecto en la lectura.

Dicho esto, cuando observo los archivos .v de los módulos sintetizados después de la generación del sistema Qsys, parece que esperan que la entrada de la dirección aumente en 1 para que el desplazamiento acceda a los diferentes registros asignados en memoria, y no en 4. Aquí hay un código del núcleo del temporizador.

  assign irq = timeout_occurred && control_interrupt_enable;
  //s1, which is an e_avalon_slave
  assign read_mux_out = ({16 {(address == 2)}} & period_l_register) |
    ({16 {(address == 3)}} & period_h_register) |
    ({16 {(address == 4)}} & snap_read_value[15 : 0]) |
    ({16 {(address == 5)}} & snap_read_value[31 : 16]) |
    ({16 {(address == 1)}} & control_register) |
    ({16 {(address == 0)}} & {counter_is_running,
    timeout_occurred});

Este código crea un multiplexor para que podamos leer los diferentes registros en la memoria. El desplazamiento de la dirección para acceder a los diferentes registros es 1 y no 4. La misma información se encuentra en la Guía de usuario IP de Qsys Embedded Peripherals. Presenta una tabla que describe el mapa de memoria, los valores de desplazamiento son enteros consecutivos.

Editar:

Eldocumento"Making Qsys Components" encontrado en la búsqueda de Google está fechado en "octubre de 2015" en el pie de página. En la página 8 dice:

  

"Las direcciones utilizadas por los dispositivos maestros están alineadas con la palabra de 32 bits   fronteras Por ejemplo, la Figura 8 ilustra cuatro direcciones de 32 bits   que podría utilizarse para seleccionar cuatro registros en un dispositivo esclavo. los   La dirección del primer registro es 0x10000000, la dirección del segundo registro.   el registro es 0x10000004, etc. "

¿Cuál es la verdad?

    
pregunta quantum231

1 respuesta

1

Su conclusión de que un bus de datos de 32 bits prohíbe el direccionamiento de bytes es incorrecta. El ARM Cortex-M, por ejemplo, tiene un bus de direcciones de 32 bits y un bus de datos de 32 bits, pero es capaz de leer / escribir bytes en cualquier dirección de 32 bits, lectura / escritura de media palabra en direcciones donde el mínimo el bit significativo es cero, y la lectura / escritura de palabra completa en la dirección donde los dos bits menos significativos son cero. No queda claro en su código de ejemplo, pero el NiosII podría permitir el acceso a medias palabras y palabras completas.

El hardware sabe a qué tamaño se accede el objeto y desplaza los bytes según sea necesario.

Editar: El procesador Nios II utiliza un puerto maestro Avalon-MM para el bus de datos. El bus tiene habilitaciones separadas para los cuatro bytes en una palabra. Un periférico determinado podría diseñarse para registros de 16 bits, pero eso no significa que los accesos de bytes no sean posibles en general. De la guía de referencia del procesador:

  

El bus de datos del procesador tiene 32 bits de ancho. Instrucciones estan disponibles   para leer y escribir datos de bytes, medias palabras (16 bits) o palabras (32 bits).

    
respondido por el Elliot Alderson

Lea otras preguntas en las etiquetas