3 -- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
7 -- Redistribution and use in source and binary forms, with or without
8 -- modification, are permitted provided that the following conditions
11 -- 1. Redistributions of source code must retain the above copyright
12 -- notice, this list of conditions and the following disclaimer.
13 -- 2. Redistributions in binary form must reproduce the above
14 -- copyright notice, this list of conditions and the following
15 -- disclaimer in the documentation and/or other materials
16 -- provided with the distribution.
18 -- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
19 -- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20 -- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21 -- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 -- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 -- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 -- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 -- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 -- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 -- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 -- The views and conclusions contained in the software and documentation
32 -- are those of the authors and should not be interpreted as representing
33 -- official policies, either expressed or implied, of the ZPU Project.
36 use ieee.std_logic_1164.
all;
37 use ieee.numeric_std.
all;
40 use work.zpu_config.
all;
48 architecture behave
of fpga_top
is
51 signal clk
: std_logic;
53 signal areset
: std_logic := '1';
58 log_file
: string := "log.txt"
62 areset
: in std_logic;
64 writeEnable
: in std_logic;
65 readEnable
: in std_logic;
66 write
: in std_logic_vector(wordSize
-1 downto 0);
67 read
: out std_logic_vector(wordSize
-1 downto 0);
68 addr
: in std_logic_vector(maxAddrBit
downto minAddrBit
)
73 signal mem_busy
: std_logic;
74 signal mem_read
: std_logic_vector(wordSize
-1 downto 0);
75 signal mem_write
: std_logic_vector(wordSize
-1 downto 0);
76 signal mem_addr
: std_logic_vector(maxAddrBitIncIO
downto 0);
77 signal mem_writeEnable
: std_logic;
78 signal mem_readEnable
: std_logic;
79 signal mem_writeMask
: std_logic_vector(wordBytes
-1 downto 0);
81 signal enable
: std_logic;
83 signal dram_mem_busy
: std_logic;
84 signal dram_mem_read
: std_logic_vector(wordSize
-1 downto 0);
85 signal dram_mem_write
: std_logic_vector(wordSize
-1 downto 0);
86 signal dram_mem_writeEnable
: std_logic;
87 signal dram_mem_readEnable
: std_logic;
88 signal dram_mem_writeMask
: std_logic_vector(wordBytes
-1 downto 0);
90 signal io_busy
: std_logic;
92 signal io_mem_read
: std_logic_vector(wordSize
-1 downto 0);
93 signal io_mem_writeEnable
: std_logic;
94 signal io_mem_readEnable
: std_logic;
96 signal dram_ready
: std_logic;
97 signal io_ready
: std_logic;
98 signal io_reading
: std_logic;
100 signal break
: std_logic;
110 in_mem_busy
=> mem_busy
,
111 mem_read
=> mem_read
,
112 mem_write
=> mem_write
,
113 out_mem_addr
=> mem_addr
,
114 out_mem_writeEnable
=> mem_writeEnable
,
115 out_mem_readEnable
=> mem_readEnable
,
116 mem_writeMask
=> mem_writeMask
,
127 writeEnable
=> io_mem_writeEnable
,
128 readEnable
=> io_mem_readEnable
,
131 addr
=> mem_addr
(maxAddrBit
downto minAddrBit
)
134 dram_mem_writeEnable
<= mem_writeEnable
and not mem_addr
(ioBit
);
135 dram_mem_readEnable
<= mem_readEnable
and not mem_addr
(ioBit
);
136 io_mem_writeEnable
<= mem_writeEnable
and mem_addr
(ioBit
);
137 io_mem_readEnable
<= mem_readEnable
and mem_addr
(ioBit
);
141 -- Memory reads either come from IO or DRAM. We need to pick the right one.
142 memorycontrol
: process(dram_mem_read
, dram_ready
, io_ready
, io_mem_read
)
144 mem_read
<= (others => 'U');
145 if dram_ready
='1' then
146 mem_read
<= dram_mem_read
;
150 mem_read
<= (others => '0');
151 mem_read
<= io_mem_read
;
157 io_ready
<= (io_reading
or io_mem_readEnable
) and not io_busy
;
159 memoryControlSync
: process(clk
, areset
)
166 elsif rising_edge
(clk
) then
168 io_reading
<= io_busy
or io_mem_readEnable
;
169 dram_ready
<= dram_mem_readEnable
;
173 -- wiggle the clock @ 100MHz
184 end architecture behave
;