-
Notifications
You must be signed in to change notification settings - Fork 0
/
ram_16x4.vhd
109 lines (92 loc) · 4.05 KB
/
ram_16x4.vhd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
-------------------------------------------------------------------
-- Arquivo : ram_16x4.vhd
-- Projeto : Experiencia 2 - Um Fluxo de Dados Simples
-------------------------------------------------------------------
-- Descricao : módulo de memória RAM sincrona 16x4
-- sinais we e ce ativos em baixo
-- codigo ADAPTADO do código encontrado no livro
-- VHDL Descricao e Sintese de Circuitos Digitais
-- de Roberto D'Amore, LTC Editora.
-------------------------------------------------------------------
-- Revisoes :
-- Data Versao Autor Descricao
-- 08/01/2020 1.0 Edson Midorikawa criacao
-- 01/02/2020 2.0 Antonio V.S.Neto Atualizacao para
-- RAM sincrona para
-- minimizar problemas
-- com Quartus.
-- 02/02/2020 2.1 Edson Midorikawa revisao de codigo e
-- arquitetura para
-- simulacao com ModelSim
-- 07/01/2023 2.1.1 Edson Midorikawa revisao
-------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity ram_16x4 is
port (
clk : in std_logic;
endereco : in std_logic_vector(3 downto 0);
dado_entrada : in std_logic_vector(3 downto 0);
we : in std_logic;
ce : in std_logic;
dado_saida : out std_logic_vector(3 downto 0)
);
end entity ram_16x4;
-- Dados iniciais em arquivo MIF (para sintese com Intel Quartus Prime)
architecture ram_mif of ram_16x4 is
type arranjo_memoria is array(0 to 15) of std_logic_vector(3 downto 0);
signal memoria : arranjo_memoria;
-- Configuracao do Arquivo MIF
attribute ram_init_file: string;
attribute ram_init_file of memoria: signal is "ram_conteudo_inicial.mif";
begin
process(clk)
begin
if (clk = '1' and clk'event) then
if ce = '0' then -- dado armazenado na subida de "we" com "ce=0"
-- Detecta ativacao de we (ativo baixo)
if (we = '0')
then memoria(to_integer(unsigned(endereco))) <= dado_entrada;
end if;
end if;
end if;
end process;
-- saida da memoria
dado_saida <= memoria(to_integer(unsigned(endereco)));
end architecture ram_mif;
-- Dados iniciais (para simulacao com Modelsim)
architecture ram_modelsim of ram_16x4 is
type arranjo_memoria is array(0 to 15) of std_logic_vector(3 downto 0);
signal memoria : arranjo_memoria := (
"0001",
"0010",
"0100",
"1000",
"0100",
"0010",
"0001",
"0001",
"0010",
"0010",
"0100",
"0100",
"1000",
"1000",
"0001",
"0100" );
begin
process(clk)
begin
if (clk = '1' and clk'event) then
if ce = '0' then -- dado armazenado na subida de "we" com "ce=0"
-- Detecta ativacao de we (ativo baixo)
if (we = '0')
then memoria(to_integer(unsigned(endereco))) <= dado_entrada;
end if;
end if;
end if;
end process;
-- saida da memoria
dado_saida <= memoria(to_integer(unsigned(endereco)));
end architecture ram_modelsim;