Un simple buffer FIFO en verilog

1

He decidido implementar un búfer FIFO en verilog (por diversión). Aquí está mi prototipo principal que puedes decir:

  • Consistirá en un banco o memoria de registro.
  • Cada registro será de tamaño N y habrá M registros tales / registros de desplazamiento.
  • Los registros admiten solo escritura en serie y solo lectura en serie, es decir, topología de entrada en serie de salida en serie.
  • Se utilizarán dos registros 'leer' y 'escribir' que actúan como señales de habilitación.
  • Se utiliza un registro 'writeLoc' que indica dónde se escribieron los datos por última vez. Su tamaño debe ser M. Se decrementa con cada escritura.
  • Se utiliza un registro 'readLoc' que indica de dónde se leyeron los datos por última vez. Su tamaño debe ser M. Se incrementa con cada lectura.

  • Si readloc = writeloc,

    • si se leyó la última operación, entonces el búfer está vacío.
    • si la última operación fue de escritura, entonces el búfer está lleno.
  • Se utiliza un registro 'lastOp' para indicar la última operación. Se establece cada vez que la última escritura fue exitosa. Se restablece cuando la última lectura fue exitosa.

  • Se utiliza un registro 'isEmpty' para indicar que el búfer está vacío. Se establece cuando el búfer está vacío.
  • Se usa un registro 'isFull' para indicar que el búfer está lleno. Se establece cuando el búfer está lleno.

  • Característica experimental 1: se puede usar un 'bloqueo' de registro para evitar la lectura de datos mientras se escribe y viceversa. 'bloqueo' se establece siempre que se establece 'escritura', es decir, cuando se escriben datos. El 'bloqueo' se restablece cuando no se escriben datos. El lector puede leer desde el búfer cuando se restablece el 'bloqueo'. Del mismo modo, el escritor puede escribir en el búfer siempre que se establezca el bloqueo.

Sin embargo, tengo algunas preocupaciones:

1) En primer lugar, ¿he dejado de lado algún componente crítico? ¿Y hay algún defecto hasta ahora? Tenga en cuenta que está pensado para ser un diseño simple, con funcionalidad 'esencial'.

2) Mi primera preocupación es si las condiciones de búfer lleno y vacío son correctas o no. Lo he intentado todo lo posible, pero no estoy seguro.

3) ¿Se pueden prescindir de los registros isEmpty e isFull?

4) Al final del receptor, los datos pueden venir en cualquier momento. Siento que si implemento la función de bloqueo, si en el momento en que llegan los datos y el lector retiene el bloqueo, los datos se perderán. Por otro lado, el bloqueo también es necesario para evitar leer mientras se escribe y viceversa. ¿Me puede indicar la dirección correcta en cuanto a cómo superar este problema?

(Disculpe si esta pregunta no pertenece aquí. Por favor, tenga la amabilidad de sugerir un lugar apropiado).

    

1 respuesta

2

Tanto el puntero de lectura como el puntero de escritura deben viajar en la misma dirección. Por lo general, se incrementan, pero la reducción también funciona, siempre y cuando hagas lo mismo para ambos. Un método para la detección completa / vacía es usar registros de bit M + 1 para el puntero de lectura y escritura. Si todos los bits M + 1 coinciden, entonces el FIFO está vacío. Sin embargo, si todos los bits coinciden excepto el MSB, entonces el FIFO está lleno. Suponiendo que utiliza una verdadera memoria de doble puerto para el almacenamiento (es decir, una RAM de bloque FPGA), no es necesario bloquearla, ya que la RAM de doble puerto admite la lectura y escritura simultáneas. No es necesario ningún registro isEmpty e isFull o un registro lastOp si puede recopilar toda esa información de los punteros de lectura y escritura con lógica combinatoria simple. Sin embargo, necesitará lógica para evitar que se modifique el puntero de escritura cuando la FIFO esté llena o que el puntero de lectura se modifique cuando la FIFO esté vacía.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas