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

Subversion Repositories mlite

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

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
--   0x20000030  GPIO0 Out
21
--   0x20000050  GPIOA In
22
--   0x20000060  Counter
23
--   IRQ bits:
24
--      7   GPIO31
25
--      6   GPIO30
26
--      5  ^GPIO31
27
--      4  ^GPIO30
28
--      3   Counter(18)
29
--      2  ^Counter(18)
30
--      1  ^UartWriteBusy
31
--      0   UartDataAvailable
32 48 rhoads
---------------------------------------------------------------------
33
library ieee;
34
use ieee.std_logic_1164.all;
35
use work.mlite_pack.all;
36
 
37
entity plasma is
38 186 rhoads
   generic(memory_type : string := "XILINX_16X"; --"DUAL_PORT_" "ALTERA_LPM";
39 48 rhoads
           log_file    : string := "UNUSED");
40 139 rhoads
   port(clk               : in std_logic;
41
        reset             : in std_logic;
42 48 rhoads
 
43 139 rhoads
        uart_write        : out std_logic;
44
        uart_read         : in std_logic;
45 48 rhoads
 
46 139 rhoads
        address           : out std_logic_vector(31 downto 2);
47 264 rhoads
        byte_we           : out std_logic_vector(3 downto 0);
48 139 rhoads
        data_write        : out std_logic_vector(31 downto 0);
49
        data_read         : in std_logic_vector(31 downto 0);
50
        mem_pause_in      : in std_logic;
51
 
52
        gpio0_out         : out std_logic_vector(31 downto 0);
53
        gpioA_in          : in std_logic_vector(31 downto 0));
54 48 rhoads
end; --entity plasma
55
 
56
architecture logic of plasma is
57 264 rhoads
   signal address_next    : std_logic_vector(31 downto 2);
58
   signal byte_we_next    : std_logic_vector(3 downto 0);
59
   signal mem_address     : std_logic_vector(31 downto 2);
60
   signal mem_byte_we     : std_logic_vector(3 downto 0);
61
   signal data_r          : std_logic_vector(31 downto 0);
62
   signal data_w          : std_logic_vector(31 downto 0);
63
   signal data_read_ram   : std_logic_vector(31 downto 0);
64
   signal data_read_uart  : std_logic_vector(7 downto 0);
65
   signal write_enable    : std_logic;
66
   signal mem_pause       : std_logic;
67 139 rhoads
 
68
   signal enable_internal_ram : std_logic;
69
   signal enable_misc         : std_logic;
70
   signal enable_uart         : std_logic;
71
   signal enable_uart_read    : std_logic;
72
   signal enable_uart_write   : std_logic;
73
 
74
   signal gpio0_reg           : std_logic_vector(31 downto 0);
75
 
76
   signal uart_write_busy     : std_logic;
77
   signal uart_data_avail     : std_logic;
78
   signal irq_mask_reg        : std_logic_vector(7 downto 0);
79
   signal irq_status          : std_logic_vector(7 downto 0);
80
   signal irq                 : std_logic;
81
   signal counter_reg         : std_logic_vector(31 downto 0);
82
 
83 48 rhoads
begin  --architecture
84 264 rhoads
   address <= mem_address;
85
   byte_we <= mem_byte_we;
86
   data_write <= data_w;
87
   write_enable <= '1' when mem_byte_we /= "0000" else '0';
88 139 rhoads
   mem_pause <= mem_pause_in or (uart_write_busy and enable_uart and write_enable);
89
   irq_status <= gpioA_in(31 downto 30) & (gpioA_in(31 downto 30) xor "11") &
90
                 counter_reg(18) & not counter_reg(18) &
91
                 not uart_write_busy & uart_data_avail;
92
   irq <= '1' when (irq_status and irq_mask_reg) /= ZERO(7 downto 0) else '0';
93
   gpio0_out <= gpio0_reg;
94
 
95 264 rhoads
   enable_internal_ram <= '1' when address_next(30 downto 28) = "000" else '0';
96
   enable_misc <= '1' when mem_address(30 downto 28) = "010" else '0';
97
   enable_uart <= '1' when enable_misc = '1' and mem_address(7 downto 4) = "0000" else '0';
98 139 rhoads
   enable_uart_read <= enable_uart and not write_enable;
99
   enable_uart_write <= enable_uart and write_enable;
100
 
101 48 rhoads
   u1_cpu: mlite_cpu
102
      generic map (memory_type => memory_type)
103
      PORT MAP (
104 139 rhoads
         clk          => clk,
105
         reset_in     => reset,
106
         intr_in      => irq,
107 48 rhoads
 
108 264 rhoads
         address_next => address_next,
109
         byte_we_next => byte_we_next,
110
 
111
         address      => mem_address,
112
         byte_we      => mem_byte_we,
113
         data_w       => data_w,
114
         data_r       => data_r,
115 48 rhoads
         mem_pause    => mem_pause);
116
 
117 264 rhoads
   misc_proc: process(clk, reset, address_next, mem_address, enable_misc,
118 139 rhoads
      data_read_ram, data_read, data_read_uart, mem_pause,
119
      irq_mask_reg, irq_status, gpio0_reg, write_enable,
120 264 rhoads
      gpioA_in, counter_reg, data_w)
121 139 rhoads
   begin
122 264 rhoads
      case mem_address(30 downto 28) is
123 139 rhoads
      when "000" =>      --internal RAM
124 264 rhoads
         data_r <= data_read_ram;
125 139 rhoads
      when "001" =>      --external RAM
126 264 rhoads
         data_r <= data_read;
127 139 rhoads
      when "010" =>      --misc
128 264 rhoads
         case mem_address(6 downto 4) is
129 139 rhoads
         when "000" =>      --uart
130 264 rhoads
            data_r <= ZERO(31 downto 8) & data_read_uart;
131 139 rhoads
         when "001" =>      --irq_mask
132 264 rhoads
            data_r <= ZERO(31 downto 8) & irq_mask_reg;
133 139 rhoads
         when "010" =>      --irq_status
134 264 rhoads
            data_r <= ZERO(31 downto 8) & irq_status;
135 139 rhoads
         when "011" =>      --gpio0
136 264 rhoads
            data_r <= gpio0_reg;
137 139 rhoads
         when "101" =>      --gpioA
138 264 rhoads
            data_r <= gpioA_in;
139 139 rhoads
         when "110" =>      --counter
140 264 rhoads
            data_r <= counter_reg;
141 139 rhoads
         when others =>
142 264 rhoads
            data_r <= gpioA_in;
143 139 rhoads
         end case;
144
      when others =>
145 264 rhoads
         data_r <= ZERO;
146 139 rhoads
      end case;
147
 
148
      if reset = '1' then
149
         irq_mask_reg <= ZERO(7 downto 0);
150
         gpio0_reg <= ZERO;
151
         counter_reg <= ZERO;
152
      elsif rising_edge(clk) then
153
         if mem_pause = '0' then
154
            if enable_misc = '1' and write_enable = '1' then
155 264 rhoads
               if mem_address(6 downto 4) = "001" then
156
                  irq_mask_reg <= data_w(7 downto 0);
157
               elsif mem_address(6 downto 4) = "011" then
158
                  gpio0_reg <= data_w;
159 139 rhoads
               end if;
160
            end if;
161
         end if;
162
         counter_reg <= bv_inc(counter_reg);
163
      end if;
164
   end process;
165
 
166 48 rhoads
   u2_ram: ram
167
      generic map (memory_type => memory_type)
168 139 rhoads
      port map (
169
         clk               => clk,
170
         enable            => enable_internal_ram,
171 264 rhoads
         write_byte_enable => byte_we_next,
172
         address           => address_next,
173
         data_write        => data_w,
174 139 rhoads
         data_read         => data_read_ram);
175 48 rhoads
 
176
   u3_uart: uart
177
      generic map (log_file => log_file)
178
      port map(
179 139 rhoads
         clk          => clk,
180
         reset        => reset,
181
         enable_read  => enable_uart_read,
182
         enable_write => enable_uart_write,
183 264 rhoads
         data_in      => data_w(7 downto 0),
184 139 rhoads
         data_out     => data_read_uart,
185
         uart_read    => uart_read,
186
         uart_write   => uart_write,
187
         busy_write   => uart_write_busy,
188
         data_avail   => uart_data_avail);
189 48 rhoads
 
190
end; --architecture logic

powered by: WebSVN 2.1.0

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