Skip to content
Update ROM authored by Adrian Ghignone's avatar Adrian Ghignone
...@@ -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
library ieee;
use ieee.std_logic_1164.all;
entity ROM is
port (
--Direccionamiento de 4 bits
address : in std_logic_vector(3 downto 0);
--Cada palabra en memoria tiene 4 bits
out_dat : out std_logic_vector(3 downto 0) );
end entity 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
architecture ROM_ARQ of ROM is
begin
process (address) begin
case address is
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";
when others => out_dat <= "0000";
end case;
end process;
end architecture ROM_ARQ;
```
```verilog ```verilog
//VERILOG
module ROM ( module ROM (
//Direccionamiento de 4 bits //Direccionamiento de 4 bits
input wire[3 : 0] address, input wire[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
always @(address) begin always @(address) begin
case (address) case (address)
... ...
......