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).