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
110
111
112
113
114
115
116
117
118
|
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package interface is
constant maxAddrBitBRAMLimit : integer := 32;
constant minAddrBit : integer := 2;
constant wordSize : integer := 32;
type ToROM is record
memAWriteEnable : std_logic;
memAAddr : std_logic_vector(maxAddrBitBRAMLimit downto minAddrBit);
memAWrite : std_logic_vector(wordSize-1 downto 0);
memBWriteEnable : std_logic;
memBAddr : std_logic_vector(maxAddrBitBRAMLimit downto minAddrBit);
memBWrite : std_logic_vector(wordSize-1 downto 0);
end record;
type FromROM is record
memARead : std_logic_vector(wordSize-1 downto 0);
memBRead : std_logic_vector(wordSize-1 downto 0);
end record;
end package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.interface.all;
entity BootROM is
generic
(
maxAddrBitBRAM : integer := 7
);
port (
clk : in std_logic;
areset : in std_logic := '0';
from_sys : in ToROM;
to_sys : out FromROM
);
end entity;
architecture arch of BootROM is
type ram_type is array(natural range 0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0);
shared variable ram : ram_type :=
(
0 => x"84808080",
1 => x"8c0b8480",
2 => x"8081e004",
3 => x"00848080",
4 => x"808c04ff",
5 => x"0d800404",
6 => x"40000017",
7 => x"00000000",
8 => x"0b83ffe0",
9 => x"80080b83",
10 => x"ffe08408",
11 => x"0b83ffe0",
12 => x"88088480",
13 => x"80809808",
14 => x"2d0b83ff",
15 => x"e0880c0b",
16 => x"83ffe084",
17 => x"0c0b83ff",
18 => x"e0800c04",
19 => x"00000000",
20 => x"00000000",
21 => x"00000000",
22 => x"00000000",
23 => x"00000000",
24 => x"71fd0608",
25 => x"72830609",
26 => x"81058205",
27 => x"832b2a83",
28 => x"ffff0652",
29 => x"0471fc06",
30 => x"08728306",
31 => x"09810583",
others => x"00000000"
);
attribute no_rw_check: boolean;
attribute no_rw_check of ram : variable is true;
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (from_sys.memAWriteEnable = '1') and (from_sys.memBWriteEnable = '1') and (from_sys.memAAddr=from_sys.memBAddr) and (from_sys.memAWrite/=from_sys.memBWrite) then
report "write collision" severity failure;
end if;
if (from_sys.memAWriteEnable = '1') then
ram(to_integer(unsigned(from_sys.memAAddr(maxAddrBitBRAM downto 2)))) := from_sys.memAWrite;
to_sys.memARead <= from_sys.memAWrite;
else
to_sys.memARead <= ram(to_integer(unsigned(from_sys.memAAddr(maxAddrBitBRAM downto 2))));
end if;
end if;
end process;
process (clk)
begin
if (clk'event and clk = '1') then
if (from_sys.memBWriteEnable = '1') then
ram(to_integer(unsigned(from_sys.memBAddr(maxAddrBitBRAM downto 2)))) := from_sys.memBWrite;
to_sys.memBRead <= from_sys.memBWrite;
else
to_sys.memBRead <= ram(to_integer(unsigned(from_sys.memBAddr(maxAddrBitBRAM downto 2))));
end if;
end if;
end process;
end arch;
|