Update ROM authored by Adrian Ghignone's avatar Adrian Ghignone
# Memorias de solo lectura (ROM) # Memorias de solo lectura (ROM)
Como su nombre indica, una ROM almacena información cuyo propósito no es ser modificada una vez escrita, sino almacenar valores de referencia para algún proceso del sistema. Por ejemplo : Como su nombre indica, una ROM almacena información cuyo propósito no es ser modificada una vez escrita, sino guardar valores de referencia para algún proceso del sistema. Por ejemplo :
- Look-Up Table (LUT) con valores precalculados para acelerar cálculos matemáticos - Look-Up Table (LUT) con valores precalculados para acelerar cálculos matemáticos
- Valores de configuracion o inicializacion del sistema (como una [ROM-BIOS](https://es.wikipedia.org/wiki/BIOS)) - Valores de configuracion o inicializacion del sistema (como una [ROM-BIOS](https://es.wikipedia.org/wiki/BIOS))
En el caso de valores de configuración, es fundamental guardar su integridad, por lo que tiene sentido usar una ROM para ellos.
A diferencia de una RAM o una memoria secuencial, las ROM pueden implementarse como circuitos **combinacionales**. Simplemente se definen cuatro elementos:
- Un vector de registros (**reg[][]**) que almacena los valores de la memoria
- Una entrada de dirección de lectura
- Una salida con el dato leído
- Un bloque combinacional que asigna el valor almacenado a cada posición
```verilog ```verilog
module ROM (
//Direccionamiento de 4 bits
input wire[3 : 0] address,
//Cada palabra en memoria tiene 4 bits
output reg[3 : 0] out
);
//Como la memoria es de solo lectura, su tamaño y contenido
//son fijos y se definen al momento de crear el módulo
//En este caso, se implementa un codificador BCD / Aiken
always @(address) begin
case (address)
4'b0000 : out = 4'b1111;
4'b0001 : out = 4'b1110;
4'b0010 : out = 4'b1101;
4'b0011 : out = 4'b1100;
4'b0100 : out = 4'b1011;
4'b0101 : out = 4'b1010;
4'b0110 : out = 4'b1001;
4'b0111 : out = 4'b1000;
4'b1000 : out = 4'b0111;
4'b1001 : out = 4'b0110;
4'b1010 : out = 4'b0101;
4'b1011 : out = 4'b0100;
4'b1100 : out = 4'b0011;
4'b1101 : out = 4'b0010;
4'b1110 : out = 4'b0001;
4'b1111 : out = 4'b0000;
endcase
end
endmodule
``` ```
## Código sintetizado
El sintetizador **Synplify Pro** reconoce que la estructura descrita corresponde a una memoria ROM:
![rom_rtl](uploads/906dc8478d10ba2441af22c96a022114/rom_rtl.png)
A nivel fisico, la ROM se implementa a traves de una de las LUT disponibles en la FPGA **iCE40**:
![rom_fpga](uploads/71504323454179744905a2bebb6607a7/rom_fpga.png)
\ No newline at end of file