OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [trunk/] [vhdl/] [plasma.vhd] - Blame information for rev 407

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 rhoads
---------------------------------------------------------------------
2
-- TITLE: Plasma (CPU core with memory)
3
-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
-- DATE CREATED: 6/4/02
5
-- FILENAME: plasma.vhd
6
-- PROJECT: Plasma CPU core
7
-- COPYRIGHT: Software placed into the public domain by the author.
8
--    Software 'as is' without warranty.  Author liable for nothing.
9
-- DESCRIPTION:
10
--    This entity combines the CPU core with memory and a UART.
11 139 rhoads
--
12
-- Memory Map:
13 184 rhoads
--   0x00000000 - 0x0000ffff   Internal RAM (8KB)
14
--   0x10000000 - 0x100fffff   External RAM (1MB)
15 139 rhoads
--   Access all Misc registers with 32-bit accesses
16
--   0x20000000  Uart Write (will pause CPU if busy)
17
--   0x20000000  Uart Read
18
--   0x20000010  IRQ Mask
19
--   0x20000020  IRQ Status
20 286 rhoads
--   0x20000030  GPIO0 Out Set bits
21
--   0x20000040  GPIO0 Out Clear bits
22 139 rhoads
--   0x20000050  GPIOA In
23
--   0x20000060  Counter
24 286 rhoads
--   0x20000070  Ethernet transmit count
25 139 rhoads
--   IRQ bits:
26
--      7   GPIO31
27 329 rhoads
--      6  ^GPIO31
28 286 rhoads
--      5   EthernetSendDone
29
--      4   EthernetReceive
30 139 rhoads
--      3   Counter(18)
31
--      2  ^Counter(18)
32
--      1  ^UartWriteBusy
33
--      0   UartDataAvailable
34 48 rhoads
---------------------------------------------------------------------
35
library ieee;
36
use ieee.std_logic_1164.all;
37
use work.mlite_pack.all;
38
 
39
entity plasma is
40 186 rhoads
   generic(memory_type : string := "XILINX_16X"; --"DUAL_PORT_" "ALTERA_LPM";
41 286 rhoads
           log_file    : string := "UNUSED";
42 346 rhoads
           ethernet    : std_logic := '0';
43
           use_cache   : std_logic := '0');
44 286 rhoads
   port(clk          : in std_logic;
45
        reset        : in std_logic;
46 48 rhoads
 
47 286 rhoads
        uart_write   : out std_logic;
48
        uart_read    : in std_logic;
49 48 rhoads
 
50 286 rhoads
        address      : out std_logic_vector(31 downto 2);
51
        byte_we      : out std_logic_vector(3 downto 0);
52
        data_write   : out std_logic_vector(31 downto 0);
53
        data_read    : in std_logic_vector(31 downto 0);
54 383 rhoads
        mem_pause_in : in std_logic;
55
        no_ddr_start : out std_logic;
56 346 rhoads
        no_ddr_stop  : out std_logic;
57 139 rhoads
 
58 286 rhoads
        gpio0_out    : out std_logic_vector(31 downto 0);
59
        gpioA_in     : in std_logic_vector(31 downto 0));
60 48 rhoads
end; --entity plasma
61
 
62
architecture logic of plasma is
63 346 rhoads
   signal address_next      : std_logic_vector(31 downto 2);
64
   signal byte_we_next      : std_logic_vector(3 downto 0);
65
   signal cpu_address       : std_logic_vector(31 downto 0);
66
   signal cpu_byte_we       : std_logic_vector(3 downto 0);
67
   signal cpu_data_w        : std_logic_vector(31 downto 0);
68
   signal cpu_data_r        : std_logic_vector(31 downto 0);
69
   signal cpu_pause         : std_logic;
70 139 rhoads
 
71 346 rhoads
   signal data_read_uart    : std_logic_vector(7 downto 0);
72 383 rhoads
   signal write_enable      : std_logic;
73 346 rhoads
   signal eth_pause_in      : std_logic;
74
   signal eth_pause         : std_logic;
75
   signal mem_busy          : std_logic;
76 139 rhoads
 
77 346 rhoads
   signal enable_misc       : std_logic;
78
   signal enable_uart       : std_logic;
79
   signal enable_uart_read  : std_logic;
80
   signal enable_uart_write : std_logic;
81
   signal enable_eth        : std_logic;
82 139 rhoads
 
83 346 rhoads
   signal gpio0_reg         : std_logic_vector(31 downto 0);
84
   signal uart_write_busy   : std_logic;
85
   signal uart_data_avail   : std_logic;
86
   signal irq_mask_reg      : std_logic_vector(7 downto 0);
87
   signal irq_status        : std_logic_vector(7 downto 0);
88
   signal irq               : std_logic;
89
   signal irq_eth_rec       : std_logic;
90
   signal irq_eth_send      : std_logic;
91
   signal counter_reg       : std_logic_vector(31 downto 0);
92 139 rhoads
 
93 346 rhoads
   signal ram_enable        : std_logic;
94
   signal ram_byte_we       : std_logic_vector(3 downto 0);
95
   signal ram_address       : std_logic_vector(31 downto 2);
96
   signal ram_data_w        : std_logic_vector(31 downto 0);
97
   signal ram_data_r        : std_logic_vector(31 downto 0);
98
 
99 383 rhoads
   signal cache_access      : std_logic;
100 346 rhoads
   signal cache_checking    : std_logic;
101 383 rhoads
   signal cache_miss        : std_logic;
102 346 rhoads
   signal cache_hit         : std_logic;
103
 
104 48 rhoads
begin  --architecture
105 346 rhoads
   write_enable <= '1' when cpu_byte_we /= "0000" else '0';
106 383 rhoads
   mem_busy <= eth_pause or mem_pause_in;
107 346 rhoads
   cache_hit <= cache_checking and not cache_miss;
108
   cpu_pause <= (uart_write_busy and enable_uart and write_enable) or  --UART busy
109
      cache_miss or                                                    --Cache wait
110 383 rhoads
      (cpu_address(28) and not cache_hit and mem_busy);                --DDR or flash
111 286 rhoads
   irq_status <= gpioA_in(31) & not gpioA_in(31) &
112
                 irq_eth_send & irq_eth_rec &
113 139 rhoads
                 counter_reg(18) & not counter_reg(18) &
114
                 not uart_write_busy & uart_data_avail;
115
   irq <= '1' when (irq_status and irq_mask_reg) /= ZERO(7 downto 0) else '0';
116 286 rhoads
   gpio0_out(31 downto 29) <= gpio0_reg(31 downto 29);
117
   gpio0_out(23 downto 0) <= gpio0_reg(23 downto 0);
118 139 rhoads
 
119 346 rhoads
   enable_misc <= '1' when cpu_address(30 downto 28) = "010" else '0';
120
   enable_uart <= '1' when enable_misc = '1' and cpu_address(7 downto 4) = "0000" else '0';
121 139 rhoads
   enable_uart_read <= enable_uart and not write_enable;
122
   enable_uart_write <= enable_uart and write_enable;
123 346 rhoads
   enable_eth <= '1' when enable_misc = '1' and cpu_address(7 downto 4) = "0111" else '0';
124
   cpu_address(1 downto 0) <= "00";
125 139 rhoads
 
126 48 rhoads
   u1_cpu: mlite_cpu
127
      generic map (memory_type => memory_type)
128
      PORT MAP (
129 139 rhoads
         clk          => clk,
130
         reset_in     => reset,
131
         intr_in      => irq,
132 48 rhoads
 
133 346 rhoads
         address_next => address_next,             --before rising_edge(clk)
134 264 rhoads
         byte_we_next => byte_we_next,
135
 
136 346 rhoads
         address      => cpu_address(31 downto 2), --after rising_edge(clk)
137
         byte_we      => cpu_byte_we,
138
         data_w       => cpu_data_w,
139
         data_r       => cpu_data_r,
140
         mem_pause    => cpu_pause);
141 48 rhoads
 
142 356 rhoads
   opt_cache: if use_cache = '0' generate
143 383 rhoads
      cache_access <= '0';
144 346 rhoads
      cache_checking <= '0';
145
      cache_miss <= '0';
146
   end generate;
147
 
148
   opt_cache2: if use_cache = '1' generate
149
   --Control 4KB unified cache that uses the upper 4KB of the 8KB
150
   --internal RAM.  Only lowest 2MB of DDR is cached.
151
   u_cache: cache
152
      generic map (memory_type => memory_type)
153
      PORT MAP (
154
         clk            => clk,
155
         reset          => reset,
156
         address_next   => address_next,
157
         byte_we_next   => byte_we_next,
158
         cpu_address    => cpu_address(31 downto 2),
159
         mem_busy       => mem_busy,
160
 
161 383 rhoads
         cache_access   => cache_access,    --access 4KB cache
162
         cache_checking => cache_checking,  --checking if cache hit
163
         cache_miss     => cache_miss);     --cache miss
164
   end generate; --opt_cache2
165
 
166
   no_ddr_start <= not eth_pause and cache_checking;
167
   no_ddr_stop <= not eth_pause and cache_miss;
168 346 rhoads
   eth_pause_in <= mem_pause_in or (not eth_pause and cache_miss and not cache_checking);
169
 
170
   misc_proc: process(clk, reset, cpu_address, enable_misc,
171
      ram_data_r, data_read, data_read_uart, cpu_pause,
172 139 rhoads
      irq_mask_reg, irq_status, gpio0_reg, write_enable,
173 346 rhoads
      cache_checking,
174
      gpioA_in, counter_reg, cpu_data_w)
175 139 rhoads
   begin
176 346 rhoads
      case cpu_address(30 downto 28) is
177
      when "000" =>         --internal RAM
178
         cpu_data_r <= ram_data_r;
179
      when "001" =>         --external RAM
180
         if cache_checking = '1' then
181
            cpu_data_r <= ram_data_r; --cache
182
         else
183
            cpu_data_r <= data_read; --DDR
184
         end if;
185
      when "010" =>         --misc
186
         case cpu_address(6 downto 4) is
187 139 rhoads
         when "000" =>      --uart
188 346 rhoads
            cpu_data_r <= ZERO(31 downto 8) & data_read_uart;
189 139 rhoads
         when "001" =>      --irq_mask
190 346 rhoads
            cpu_data_r <= ZERO(31 downto 8) & irq_mask_reg;
191 139 rhoads
         when "010" =>      --irq_status
192 346 rhoads
            cpu_data_r <= ZERO(31 downto 8) & irq_status;
193 139 rhoads
         when "011" =>      --gpio0
194 346 rhoads
            cpu_data_r <= gpio0_reg;
195 139 rhoads
         when "101" =>      --gpioA
196 346 rhoads
            cpu_data_r <= gpioA_in;
197 139 rhoads
         when "110" =>      --counter
198 346 rhoads
            cpu_data_r <= counter_reg;
199 139 rhoads
         when others =>
200 346 rhoads
            cpu_data_r <= gpioA_in;
201 139 rhoads
         end case;
202 346 rhoads
      when "011" =>         --flash
203
         cpu_data_r <= data_read;
204 139 rhoads
      when others =>
205 346 rhoads
         cpu_data_r <= ZERO;
206 139 rhoads
      end case;
207
 
208
      if reset = '1' then
209
         irq_mask_reg <= ZERO(7 downto 0);
210
         gpio0_reg <= ZERO;
211
         counter_reg <= ZERO;
212
      elsif rising_edge(clk) then
213 346 rhoads
         if cpu_pause = '0' then
214 139 rhoads
            if enable_misc = '1' and write_enable = '1' then
215 346 rhoads
               if cpu_address(6 downto 4) = "001" then
216
                  irq_mask_reg <= cpu_data_w(7 downto 0);
217
               elsif cpu_address(6 downto 4) = "011" then
218
                  gpio0_reg <= gpio0_reg or cpu_data_w;
219
               elsif cpu_address(6 downto 4) = "100" then
220
                  gpio0_reg <= gpio0_reg and not cpu_data_w;
221 139 rhoads
               end if;
222
            end if;
223
         end if;
224
         counter_reg <= bv_inc(counter_reg);
225
      end if;
226
   end process;
227
 
228 383 rhoads
   ram_proc: process(cache_access, cache_miss,
229
                     address_next, cpu_address,
230
                     byte_we_next, cpu_data_w, data_read)
231
   begin
232
      if cache_access = '1' then    --Check if cache hit or write through
233
         ram_enable <= '1';
234
         ram_byte_we <= byte_we_next;
235
         ram_address(31 downto 2) <= ZERO(31 downto 16) &
236
            "0001" & address_next(11 downto 2);
237
         ram_data_w <= cpu_data_w;
238
      elsif cache_miss = '1' then  --Update cache after cache miss
239
         ram_enable <= '1';
240
         ram_byte_we <= "1111";
241
         ram_address(31 downto 2) <= ZERO(31 downto 16) &
242
            "0001" & cpu_address(11 downto 2);
243
         ram_data_w <= data_read;
244
      else                         --Normal non-cache access
245
         if address_next(30 downto 28) = "000" then
246
            ram_enable <= '1';
247
         else
248
            ram_enable <= '0';
249
         end if;
250
         ram_byte_we <= byte_we_next;
251
         ram_address(31 downto 2) <= address_next(31 downto 2);
252
         ram_data_w <= cpu_data_w;
253
      end if;
254
   end process;
255 346 rhoads
 
256 48 rhoads
   u2_ram: ram
257
      generic map (memory_type => memory_type)
258 139 rhoads
      port map (
259
         clk               => clk,
260 346 rhoads
         enable            => ram_enable,
261
         write_byte_enable => ram_byte_we,
262
         address           => ram_address,
263
         data_write        => ram_data_w,
264
         data_read         => ram_data_r);
265 48 rhoads
 
266
   u3_uart: uart
267
      generic map (log_file => log_file)
268
      port map(
269 139 rhoads
         clk          => clk,
270
         reset        => reset,
271
         enable_read  => enable_uart_read,
272
         enable_write => enable_uart_write,
273 346 rhoads
         data_in      => cpu_data_w(7 downto 0),
274 139 rhoads
         data_out     => data_read_uart,
275
         uart_read    => uart_read,
276
         uart_write   => uart_write,
277
         busy_write   => uart_write_busy,
278
         data_avail   => uart_data_avail);
279 48 rhoads
 
280 286 rhoads
   dma_gen: if ethernet = '0' generate
281 346 rhoads
      address <= cpu_address(31 downto 2);
282
      byte_we <= cpu_byte_we;
283
      data_write <= cpu_data_w;
284 286 rhoads
      eth_pause <= '0';
285
      gpio0_out(28 downto 24) <= ZERO(28 downto 24);
286
      irq_eth_rec <= '0';
287
      irq_eth_send <= '0';
288
   end generate;
289
 
290
   dma_gen2: if ethernet = '1' generate
291
   u4_eth: eth_dma
292
      port map(
293
         clk         => clk,
294
         reset       => reset,
295
         enable_eth  => gpio0_reg(24),
296
         select_eth  => enable_eth,
297
         rec_isr     => irq_eth_rec,
298
         send_isr    => irq_eth_send,
299
 
300
         address     => address,      --to DDR
301
         byte_we     => byte_we,
302
         data_write  => data_write,
303
         data_read   => data_read,
304 346 rhoads
         pause_in    => eth_pause_in,
305 286 rhoads
 
306 346 rhoads
         mem_address => cpu_address(31 downto 2), --from CPU
307
         mem_byte_we => cpu_byte_we,
308
         data_w      => cpu_data_w,
309 286 rhoads
         pause_out   => eth_pause,
310
 
311
         E_RX_CLK    => gpioA_in(20),
312
         E_RX_DV     => gpioA_in(19),
313
         E_RXD       => gpioA_in(18 downto 15),
314
         E_TX_CLK    => gpioA_in(14),
315
         E_TX_EN     => gpio0_out(28),
316
         E_TXD       => gpio0_out(27 downto 24));
317
   end generate;
318
 
319 48 rhoads
end; --architecture logic
320 346 rhoads
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.