@@ -7,12 +7,65 @@ Como su nombre indica, una ROM almacena información cuyo propósito no es ser m
...
@@ -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.
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:
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 entrada de dirección de lectura
- Una salida con el dato leído
- Una salida con el dato leído
- Un bloque combinacional que asigna el valor almacenado a cada posición
- 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
//VERILOG
moduleROM(
moduleROM(
//Direccionamiento de 4 bits
//Direccionamiento de 4 bits
inputwire[3:0]address,
inputwire[3:0]address,
...
@@ -22,7 +75,6 @@ module ROM (
...
@@ -22,7 +75,6 @@ module ROM (
//Como la memoria es de solo lectura, su tamaño y contenido
//Como la memoria es de solo lectura, su tamaño y contenido
//son fijos y se definen al momento de crear el módulo
//son fijos y se definen al momento de crear el módulo
//En este caso, se implementa un codificador BCD / Aiken