Acceso al registro / señal de varios módulos (memoria compartida)

2

Quiero implementar un registro de datos para almacenar hasta 256 fragmentos de 8 bits (VHDL). También necesito poder acceder y modificar estos valores desde varios módulos vhdl. Un módulo accederá al registro para modificar los valores del puerto spi. Luego, otro módulo que implementa el protocolo EPP para comunicarse con la PC eliminará los datos.

Ahora mismo solo tengo la señal que implementa el registro en uno de mis módulos:

type type_dataRegisterWithAddress is array (0 to generic_numRegisters-1) of std_logic_vector(7 downto 0); 
signal dataRegister: type_dataRegisterWithAddress;

No estoy seguro de los detalles técnicos de un registro, pero simplemente estoy almacenando vectores lógicos y accediendo con un to_integer(address) .

No sé cómo compartiría esto con otro módulo, ya que no puedo colocar el mapa de puertos ya que es una matriz. Incluso si estaba en el módulo de nivel superior, todavía no sé cómo lo compartiría.

¿Cuál es el mejor método para crear algunos registros a los que se puede acceder desde muchos módulos?

EDITAR: Para responder algunas de las preguntas de Dave ...

Quería implementarlo en el código como lo estoy haciendo, ya que es un almacenamiento pequeño y en realidad no voy a usar 256, es solo que la interfaz EPP puede tener 256 direcciones. Pero sí mencionas un buen punto.

Estoy usando la placa Basys2 que tiene 72Kbits de ram de bloque de doble puerto. Solo lo he usado usando la función IP Core en este tutorial / module . Creo que esto puede ser lo mejor a usar.

Ahora que tengo el término correcto. ¿Cuál es su enfoque personal de la memoria compartida?

    
pregunta MLM

1 respuesta

1

En primer lugar, el hecho de que sea una matriz no le impide utilizarla en la declaración del puerto.

Por ejemplo, podría crear un paquete que contenga los tipos comunes utilizados en su proyecto:

-- common_types.vhd
-- This package contains common types used in your project.

library ieee;
use ieee.std_logic_1164.all; 

package common_types is

    -- Example use of slv8_array: 
    -- signal a : slv8_array(0 to 3);
    type slv8_array  is array(integer range <>) of std_logic_vector( 7 downto 0); 

end package;

Dentro de cualquier módulo que quiera usar cualquiera de sus tipos, incluya el paquete escribiendo:

use work.common_types.all;

Luego, en su declaración de entidad, ahora puede usarla en su puerto o declaración genérica:

entity e is
port (      
    a   : out slv8_array(0 to 3)
);
end entity;

En segundo lugar, con respecto a compartir un recurso (como la memoria):

  • Si está utilizando el bloque ram, generalmente es compatible con doble puerto, por lo que tiene al menos dos puertos para compartir y son realmente simultáneos.
  • Si necesita más puertos, debe idear algún tipo de esquema de arbitraje de recursos. Este árbitro será el front end para todos los módulos que necesitan acceso al recurso. Esto significa que el árbitro tiene acceso al puerto real al recurso, pero declara otros puertos para los clientes que deseen usarlo. Luego otorga acceso a cada uno de ellos, uno a la vez, de acuerdo con algún tipo de algoritmo de intercambio de recursos, que puede ser tan simple como un round robin.

Para un ejemplo, aunque en verilog, vea la oferta de Altera (el código fuente se puede descargar libremente) enlace

  

El árbitro MPFE utiliza una versión mejorada del round-robin ponderado   Esquema que otorga acceso a puertos esclavos sucesivos en tamaño mediano.   bloques (hasta 64 latidos), pero tiene una asignación de ancho de banda de cubeta con pérdidas   Sistema para distribuir los accesos de manera más equitativa.

Esto probablemente será una exageración para ti. Si sus requisitos de ancho de banda no son excelentes, escriba su propio árbitro que sondea una señal de solicitud de escritura / lectura de cada cliente, una a la vez, y cuando encuentre una señal afirmada, luego la vincula con el recurso real. Cuando finalice la transacción, reanude el proceso de sondeo.

Finalmente, una última cosa que mencionar en el caso de un banco de registros relativamente pequeño, es que para los lectores usted podría proporcionar un gran mux para cada uno de ellos, de manera que varios clientes puedan leer cualquier registro simultáneamente, sin necesidad de un arbitro Sin embargo, manejar varios escritores es un poco diferente, tendrías un gran decodificador para cada escritor, pero necesitarías resolver colisiones. Una forma sería establecer la prioridad, de modo que los escritores puedan escribir en cualquier registro al mismo tiempo, pero si hay una colisión, solo uno de ellos tendría éxito, y sería hasta un nivel superior garantizar que esto sea No es un problema, o de alguna manera manejado. Esto utiliza una gran cantidad de lógica combinacional, por lo que solo tendría sentido para bancos de registros pequeños.

    
respondido por el apalopohapa

Lea otras preguntas en las etiquetas