@@ -7,12 +7,65 @@ Como su nombre indica, una ROM almacena información cuyo propósito no es ser m
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
- Un vector de registros 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
```vhdl
--VHDL
libraryieee;
useieee.std_logic_1164.all;
entityROMis
port(
--Direccionamiento de 4 bits
address:instd_logic_vector(3downto0);
--Cada palabra en memoria tiene 4 bits
out_dat:outstd_logic_vector(3downto0));
endentityROM;
--Como la memoria es de solo lectura, su tamaño y contenido
--son fijos y se definen al momento de crear el módulo
architectureROM_ARQofROMis
begin
process(address)begin
caseaddressis
when"0000"=>out_dat<="1111";
when"0001"=>out_dat<="1110";
when"0010"=>out_dat<="1101";
when"0011"=>out_dat<="1100";
when"0100"=>out_dat<="1011";
when"0101"=>out_dat<="1010";
when"0110"=>out_dat<="1001";
when"0111"=>out_dat<="1000";
when"1000"=>out_dat<="0111";
when"1001"=>out_dat<="0110";
when"1010"=>out_dat<="0101";
when"1011"=>out_dat<="0100";
when"1100"=>out_dat<="0011";
when"1101"=>out_dat<="0010";
when"1110"=>out_dat<="0001";
when"1111"=>out_dat<="0000";
whenothers=>out_dat<="0000";
endcase;
endprocess;
endarchitectureROM_ARQ;
```
```verilog
//VERILOG
moduleROM(
//Direccionamiento de 4 bits
inputwire[3:0]address,
...
...
@@ -22,7 +75,6 @@ module ROM (
//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