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

Subversion Repositories System09

[/] [System09/] [trunk/] [rtl/] [System09_Digilent_ZyboZ20/] [system09.vhd] - Blame information for rev 199

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

Line No. Rev Author Line
1 165 davidgb
--===========================================================================----
2
--
3
--  S Y N T H E Z I A B L E    System09 - SOC.
4
--
5
--  www.OpenCores.Org - February 2007
6
--  This core adheres to the GNU public license  
7
--
8 187 davidgb
-- File name      : system09.vhd
9 165 davidgb
--
10
-- Purpose        : Top level file for 6809 compatible system on a chip
11 187 davidgb
--                  Designed with Digilent Zybo Z20.
12
-- ==========================================================================
13
-- Setup/Buttons
14
--    RS232 - connect a RS-232 Pmod to JE (upper row)
15
--    Configure terminal for 57600 baud 8-N-1, hardware handshake
16
--
17
-- Slide Switches - selects the nibble to display on the 4 LEDs
18
--    0000 - CPU Address 3 to 0
19
--    0001 - CPU Address 7 to 4
20
--    0010 - CPU Address 11 to 8
21
--    0011 - CPU Address 15 to 12
22
--    0100 - CPU Data 3 to 0
23
--    0101 - CPU Data 7 to 4
24
--
25
-- Push buttons
26
--     BTN3     BTN2     BTN1     BTN0
27
--    (unused)  Single   NMI      RESET
28
--              Step
29
--
30
-- Single-Step functionality is controlled by the CLOCK_MODE constant below
31
--
32
-- Memory Map     :
33 165 davidgb
--
34 187 davidgb
-- $0000 - User program RAM (32K Bytes)
35
-- $8000 - User program RAM (16K Bytes)
36
-- $C000 - Flex Operating System memory (8K Bytes)
37
-- $E000 - ACIA (SWTPc)
38
-- $E050 - Timer
39
-- $E060 - Bus trap
40
-- $F000 - Sys09Bug monitor Program (4K Bytes)
41
-- ==========================================================================
42
--
43 165 davidgb
-- Dependencies   : ieee.Std_Logic_1164
44
--                  ieee.std_logic_unsigned
45
--                  ieee.std_logic_arith
46
--                  ieee.numeric_std
47
--                  unisim.vcomponents
48
--
49 187 davidgb
-- Uses           : mon_rom    (sys09swt.vhd)         SWTPc S-Bug 1.7 Monitor ROM 
50
--                  cpu09      (cpu09.vhd)            CPU core
51
--                  ACIA_6850  (acia6850.vhd)         ACIA / UART
52
--                  ACIA_Clock (ACIA_Clock.vhd)       ACIA clock.
53 165 davidgb
--                  timer      (timer.vhd)            Interrupt timer
54
--                  trap       (trap.vhd)             Bus condition trap logic
55 187 davidgb
--                  flex_ram   (flex9ram.vhd)         Flex operating system
56
--                  ram_16K    (ram16k_b16.vhd)       32 KBytes of Block RAM
57 165 davidgb
--                  ram_32K    (ram32k_b16.vhd)       32 KBytes of Block RAM
58
--                  
59
--===========================================================================----
60
--
61
-- Revision History:
62
--===========================================================================--
63 187 davidgb
-- Version 0.1 - Jan 20, 2021
64
--    Copied from the System09_Xess-XSA3S1000 vhdl
65 165 davidgb
--===========================================================================--
66
library ieee;
67
   use ieee.std_logic_1164.all;
68
   use IEEE.STD_LOGIC_ARITH.ALL;
69
   use IEEE.STD_LOGIC_UNSIGNED.ALL;
70
   use ieee.numeric_std.all;
71
library work;
72
   use work.common.all;
73
library unisim;
74
   use unisim.vcomponents.all;
75
 
76
entity system09 is
77
  port(
78 187 davidgb
    CLKA         : in  Std_Logic;  -- 125 MHz Clock input
79 165 davidgb
 
80 193 davidgb
    -- RS232 Port - via Pmod RS232
81 199 davidgb
    RS232_CTS    : in  Std_Logic;
82
    RS232_RTS    : out Std_Logic;
83 187 davidgb
    RS232_RXD    : in  Std_Logic;
84
    RS232_TXD    : out Std_Logic;
85 165 davidgb
 
86 187 davidgb
    -- slide switches
87
         sw           : in std_logic_vector(3 downto 0);
88
         -- push buttons [Unused, Single-Step, NMI, RESET]
89
         btn          : in std_logic_vector(3 downto 0);
90
    -- Status 4 LEDs
91
    led          : out std_logic_vector(3 downto 0)
92 165 davidgb
  );
93
end system09;
94
 
95
-------------------------------------------------------------------------------
96
-- Architecture for System09
97
-------------------------------------------------------------------------------
98
architecture rtl of system09 is
99
 
100
  -----------------------------------------------------------------------------
101
  -- constants
102
  -----------------------------------------------------------------------------
103 187 davidgb
  constant CLOCK_MODE           : natural := 0; -- 0 means normal, 1 means single-step
104
 
105
  constant SYS_CLK_FREQ         : natural := 125_000_000;  -- FPGA System Clock (in Hz)
106 165 davidgb
  constant CPU_CLK_FREQ         : natural := 25_000_000;  -- CPU Clock (Hz)
107
  constant CPU_CLK_DIV          : natural := (SYS_CLK_FREQ/CPU_CLK_FREQ);
108
  constant BAUD_RATE            : integer := 57600;     -- Baud Rate
109
  constant ACIA_CLK_FREQ        : integer := BAUD_RATE * 16;
110
 
111
  -----------------------------------------------------------------------------
112
  -- Signals
113 177 davidgb
  -----------------------------------------------------------------------------
114 187 davidgb
  signal pbtn           : std_logic_vector(3 downto 0);
115 193 davidgb
  signal NMI            : std_logic;
116
  signal RESET          : std_logic;
117 187 davidgb
  signal SINGLE_STEP    : std_logic;
118
 
119 165 davidgb
  -- BOOT ROM
120
  signal rom_cs         : Std_logic;
121
  signal rom_data_out   : Std_Logic_Vector(7 downto 0);
122
 
123
  -- Flex Memory & Monitor Stack
124
  signal flex_cs        : Std_logic;
125
  signal flex_data_out  : Std_Logic_Vector(7 downto 0);
126
 
127
  -- ACIA/UART Interface signals
128
  signal acia_data_out  : Std_Logic_Vector(7 downto 0);
129
  signal acia_cs        : Std_Logic;
130
  signal acia_irq       : Std_Logic;
131
  signal acia_clk       : Std_Logic;
132 193 davidgb
  signal RXD            : Std_Logic;
133
  signal TXD            : Std_Logic;
134 165 davidgb
  signal DCD_n          : Std_Logic;
135
  signal RTS_n          : Std_Logic;
136
  signal CTS_n          : Std_Logic;
137
 
138
  -- RAM
139 177 davidgb
  signal ram1_cs         : std_logic;
140
  signal ram1_data_out   : std_logic_vector(7 downto 0);
141
  signal ram2_cs         : std_logic;
142
  signal ram2_data_out   : std_logic_vector(7 downto 0);
143
  signal ram3_cs         : std_logic;
144 165 davidgb
 
145
  -- CPU Interface signals
146
  signal cpu_reset      : Std_Logic;
147
  signal cpu_clk        : Std_Logic;
148
  signal cpu_rw         : std_logic;
149
  signal cpu_vma        : std_logic;
150
  signal cpu_halt       : std_logic;
151
  signal cpu_hold       : std_logic;
152
  signal cpu_firq       : std_logic;
153
  signal cpu_irq        : std_logic;
154
  signal cpu_nmi        : std_logic;
155
  signal cpu_addr       : std_logic_vector(15 downto 0);
156
  signal cpu_data_in    : std_logic_vector(7 downto 0);
157
  signal cpu_data_out   : std_logic_vector(7 downto 0);
158
 
159
  -- Dynamic Address Translation
160
  signal dat_cs       : std_logic;
161
  signal dat_addr     : std_logic_vector(7 downto 0);
162
 
163
  -- timer
164
  signal timer_data_out : std_logic_vector(7 downto 0);
165
  signal timer_cs       : std_logic;
166
  signal timer_irq      : std_logic;
167
 
168
  -- trap
169
  signal trap_cs        : std_logic;
170
  signal trap_data_out  : std_logic_vector(7 downto 0);
171
  signal trap_irq       : std_logic;
172
 
173
  signal rst_i         : std_logic;     -- internal reset signal
174 187 davidgb
  signal clk_i         : std_logic;     -- internal master clock signal
175 165 davidgb
 
176 196 davidgb
  signal CountL        : std_logic_vector(25 downto 0);
177 165 davidgb
  signal clk_count     : natural range 0 to CPU_CLK_DIV;
178
  signal Clk25         : std_logic;
179 187 davidgb
 
180
 
181
component btn_debounce
182
    Port ( BTN_I : in  STD_LOGIC_VECTOR (3 downto 0);
183
           CLK : in  STD_LOGIC;
184
           BTN_O : out  STD_LOGIC_VECTOR (3 downto 0));
185
end component;
186
 
187 165 davidgb
 
188
-----------------------------------------------------------------
189
--
190
-- CPU09 CPU core
191
--
192
-----------------------------------------------------------------
193
 
194
component cpu09
195
  port (
196
    clk:      in  std_logic;
197
    rst:      in  std_logic;
198
    vma:      out std_logic;
199
    addr:     out std_logic_vector(15 downto 0);
200
    rw:       out std_logic;     -- Asynchronous memory interface
201
    data_out: out std_logic_vector(7 downto 0);
202
    data_in:  in  std_logic_vector(7 downto 0);
203
    irq:      in  std_logic;
204
    firq:     in  std_logic;
205
    nmi:      in  std_logic;
206
    halt:     in  std_logic;
207
    hold:     in  std_logic
208
  );
209
end component;
210
 
211
----------------------------------------
212
--
213
-- 4K Block RAM Monitor ROM
214
-- $F000 - $FFFF
215
--
216
----------------------------------------
217
 
218
component mon_rom
219
  Port (
220
    clk   : in  std_logic;
221
    rst   : in  std_logic;
222
    cs    : in  std_logic;
223
    rw    : in  std_logic;
224
    addr  : in  std_logic_vector (11 downto 0);
225
    data_out : out std_logic_vector (7 downto 0);
226
    data_in : in  std_logic_vector (7 downto 0)
227
  );
228
end component;
229
 
230
----------------------------------------
231
--
232
-- 8KBytes Block RAM for FLEX9
233
-- $C000 - $DFFF
234
--
235
----------------------------------------
236
 
237
component flex_ram
238
  Port (
239
    clk      : in  std_logic;
240
    rst      : in  std_logic;
241
    cs       : in  std_logic;
242
    rw       : in  std_logic;
243
    addr     : in  std_logic_vector (12 downto 0);
244
    data_out    : out std_logic_vector (7 downto 0);
245
    data_in    : in  std_logic_vector (7 downto 0)
246
  );
247
end component;
248 177 davidgb
 
249
----------------------------------------
250
--
251
-- 32KBytes Block RAM 0000
252
-- $0000 - $7FFF
253
--
254
----------------------------------------
255 165 davidgb
 
256 177 davidgb
component ram_32k
257
  Port (
258
    clk      : in  std_logic;
259
    rst      : in  std_logic;
260
    cs       : in  std_logic;
261
    rw       : in  std_logic;
262
    addr     : in  std_logic_vector (14 downto 0);
263
    data_out    : out std_logic_vector (7 downto 0);
264
    data_in    : in  std_logic_vector (7 downto 0)
265
  );
266
end component;
267
 
268
 
269
----------------------------------------
270
--
271
-- 16KBytes Block RAM 8000
272
-- $8000 - $BFFF
273
--
274
----------------------------------------
275
 
276
component ram_16k
277
  Port (
278
    clk      : in  std_logic;
279
    rst      : in  std_logic;
280
    cs       : in  std_logic;
281
    rw       : in  std_logic;
282
    addr     : in  std_logic_vector (13 downto 0);
283
    data_out    : out std_logic_vector (7 downto 0);
284
    data_in    : in  std_logic_vector (7 downto 0)
285
  );
286
end component;
287
 
288 165 davidgb
-----------------------------------------------------------------
289
--
290
-- 6850 Compatible ACIA / UART
291
--
292
-----------------------------------------------------------------
293
 
294
component acia6850
295
  port (
296
    clk      : in  Std_Logic;  -- System Clock
297
    rst      : in  Std_Logic;  -- Reset input (active high)
298
    cs       : in  Std_Logic;  -- miniUART Chip Select
299
    rw       : in  Std_Logic;  -- Read / Not Write
300
    addr     : in  Std_Logic;  -- Register Select
301
    data_in  : in  Std_Logic_Vector(7 downto 0); -- Data Bus In 
302
    data_out : out Std_Logic_Vector(7 downto 0); -- Data Bus Out
303
    irq      : out Std_Logic;  -- Interrupt
304
    RxC      : in  Std_Logic;  -- Receive Baud Clock
305
    TxC      : in  Std_Logic;  -- Transmit Baud Clock
306
    RxD      : in  Std_Logic;  -- Receive Data
307
    TxD      : out Std_Logic;  -- Transmit Data
308
    DCD_n    : in  Std_Logic;  -- Data Carrier Detect
309
    CTS_n    : in  Std_Logic;  -- Clear To Send
310
    RTS_n    : out Std_Logic   -- Request To send
311
  );
312
end component;
313
 
314
-----------------------------------------------------------------
315
--
316
-- ACIA Clock divider
317
--
318
-----------------------------------------------------------------
319
 
320
component ACIA_Clock
321
  generic (
322
    SYS_CLK_FREQ  : integer :=  SYS_CLK_FREQ;
323
    ACIA_CLK_FREQ : integer := ACIA_CLK_FREQ
324
  );
325
  port (
326
    clk      : in  Std_Logic;  -- System Clock Input
327
    ACIA_clk : out Std_logic   -- ACIA Clock output
328
  );
329
end component;
330
 
331
----------------------------------------
332
--
333
-- Timer module
334
--
335
----------------------------------------
336
 
337
component timer
338
  port (
339
    clk       : in std_logic;
340
    rst       : in std_logic;
341
    cs        : in std_logic;
342
    rw        : in std_logic;
343
    addr      : in std_logic;
344
    data_in   : in std_logic_vector(7 downto 0);
345
    data_out  : out std_logic_vector(7 downto 0);
346
    irq       : out std_logic
347
  );
348
end component;
349
 
350
------------------------------------------------------------
351
--
352
-- Bus Trap logic
353
--
354
------------------------------------------------------------
355
 
356
component trap
357
  port (
358
    clk        : in  std_logic;
359
    rst        : in  std_logic;
360
    cs         : in  std_logic;
361
    rw         : in  std_logic;
362
    vma        : in  std_logic;
363
    addr       : in  std_logic_vector(15 downto 0);
364
    data_in    : in  std_logic_vector(7 downto 0);
365
    data_out   : out std_logic_vector(7 downto 0);
366
    irq        : out std_logic
367
  );
368
end component;
369
 
370
----------------------------------------
371
--
372
-- Dynamic Address Translation Registers
373
--
374
----------------------------------------
375
 
376
component dat_ram
377
  port (
378
    clk      : in  std_logic;
379
    rst      : in  std_logic;
380
    cs       : in  std_logic;
381
    rw       : in  std_logic;
382
    addr_lo  : in  std_logic_vector(3 downto 0);
383
    addr_hi  : in  std_logic_vector(3 downto 0);
384
    data_in  : in  std_logic_vector(7 downto 0);
385
    data_out : out std_logic_vector(7 downto 0)
386
  );
387
end component;
388 187 davidgb
 
389 165 davidgb
--
390
-- Clock buffer
391
--
392
 
393
component BUFG
394
   Port (
395
     i: in std_logic;
396
     o: out std_logic
397
  );
398
end component;
399
 
400 187 davidgb
begin
401 177 davidgb
 
402 187 davidgb
  --
403
  -- pushbutton debounce
404
  --
405
  my_singlestep: btn_debounce
406
    port map ( BTN_I => btn, CLK => CLKA, BTN_O => pbtn);
407
 
408 193 davidgb
  RESET      <= pbtn(0); -- Right PB
409
  NMI        <= pbtn(1); -- Center PB
410 187 davidgb
 
411
  --
412
  -- Generate CPU & Pixel Clock from Memory Clock
413
  --
414 196 davidgb
 
415
  my_prescaler : process( clk_i, clk_count )
416
  begin
417
    if rising_edge( clk_i ) then
418
      if clk_count = 0 then
419
        clk_count <= CPU_CLK_DIV-1;
420
      else
421
        clk_count <= clk_count - 1;
422 187 davidgb
      end if;
423 196 davidgb
      if clk_count = 0 then
424
         clk25 <= '0';
425
      elsif clk_count = (CPU_CLK_DIV/2) then
426
         clk25 <= '1';
427
      end if;
428
    end if;
429
  end process;
430 187 davidgb
 
431
  --
432
  -- Reset button and reset timer
433
  --
434 193 davidgb
  my_switch_assignments : process( rst_i, RESET)
435 187 davidgb
  begin
436 193 davidgb
    rst_i <= RESET;
437 187 davidgb
    cpu_reset <= rst_i;
438
  end process;
439
 
440
  clk_i <= CLKA;
441
 
442 165 davidgb
  -----------------------------------------------------------------------------
443
  -- Instantiation of internal components
444
  -----------------------------------------------------------------------------
445
 
446
  my_cpu : cpu09
447
    port map (
448
      clk       => cpu_clk,
449
      rst       => cpu_reset,
450
      vma       => cpu_vma,
451
      addr      => cpu_addr(15 downto 0),
452
      rw        => cpu_rw,
453
      data_out  => cpu_data_out,
454
      data_in   => cpu_data_in,
455
      irq       => cpu_irq,
456
      firq      => cpu_firq,
457
      nmi       => cpu_nmi,
458
      halt      => cpu_halt,
459
      hold      => cpu_hold
460
    );
461
 
462
  my_rom : mon_rom
463
    port map (
464
      clk   => cpu_clk,
465
      rst   => cpu_reset,
466
      cs    => rom_cs,
467
      rw    => '1',
468
      addr  => cpu_addr(11 downto 0),
469
      data_in => cpu_data_out,
470
      data_out => rom_data_out
471
    );
472
 
473
  my_flex : flex_ram
474
    port map (
475
      clk       => cpu_clk,
476
      rst       => cpu_reset,
477
      cs        => flex_cs,
478
      rw        => cpu_rw,
479
      addr      => cpu_addr(12 downto 0),
480
      data_out     => flex_data_out,
481
      data_in     => cpu_data_out
482 177 davidgb
    );
483
 
484
  my_32k : ram_32k
485
    port map (
486
      clk       => cpu_clk,
487
      rst       => cpu_reset,
488
      cs        => ram1_cs,
489
      rw        => cpu_rw,
490
      addr      => cpu_addr(14 downto 0),
491
      data_out     => ram1_data_out,
492
      data_in     => cpu_data_out
493
    );
494
 
495
  my_16k : ram_16k
496
    port map (
497
      clk       => cpu_clk,
498
      rst       => cpu_reset,
499
      cs        => ram2_cs,
500
      rw        => cpu_rw,
501
      addr      => cpu_addr(13 downto 0),
502
      data_out     => ram2_data_out,
503
      data_in     => cpu_data_out
504
    );
505
 
506 165 davidgb
  my_acia  : acia6850
507
    port map (
508
      clk       => cpu_clk,
509
      rst       => cpu_reset,
510
      cs        => acia_cs,
511
      rw        => cpu_rw,
512
      addr      => cpu_addr(0),
513
      data_in   => cpu_data_out,
514
      data_out  => acia_data_out,
515
      irq       => acia_irq,
516
      RxC       => acia_clk,
517
      TxC       => acia_clk,
518 193 davidgb
      RxD       => RXD,
519
      TxD       => TXD,
520
      DCD_n     => DCD_n,
521
      CTS_n     => CTS_n,
522
      RTS_n     => RTS_n
523
    );
524
 
525
  --
526
  -- RS232 signals:
527
  --
528 199 davidgb
  my_acia_assignments : process( RS232_RXD, RS232_CTS,
529 196 davidgb
                                 TXD, RTS_n )
530 193 davidgb
  begin
531
    RXD       <= RS232_RXD;
532 199 davidgb
    CTS_n     <= RS232_CTS;
533 193 davidgb
    DCD_n     <= '0';
534
    RS232_TXD <= TXD;
535 199 davidgb
    RS232_RTS <= RTS_n;
536 193 davidgb
  end process;
537 187 davidgb
 
538 165 davidgb
  my_ACIA_Clock : ACIA_Clock
539
    generic map(
540 187 davidgb
      SYS_CLK_FREQ  =>  SYS_CLK_FREQ,
541 165 davidgb
      ACIA_CLK_FREQ => ACIA_CLK_FREQ
542
    )
543
    port map(
544 193 davidgb
      clk        => clk_i,
545 165 davidgb
      acia_clk   => acia_clk
546
    );
547
 
548
  ----------------------------------------
549
  --
550
  -- Timer Module
551
  --
552
  ----------------------------------------
553
  my_timer  : timer
554
    port map (
555
      clk       => cpu_clk,
556
      rst       => cpu_reset,
557
      cs        => timer_cs,
558
      rw        => cpu_rw,
559
      addr      => cpu_addr(0),
560
      data_in   => cpu_data_out,
561
      data_out  => timer_data_out,
562
      irq       => timer_irq
563
    );
564
 
565
  ----------------------------------------
566
  --
567
  -- Bus Trap Interrupt logic
568
  --
569
  ----------------------------------------
570
  my_trap : trap
571
    port map (
572
      clk        => cpu_clk,
573
      rst        => cpu_reset,
574
      cs         => trap_cs,
575
      rw         => cpu_rw,
576
      vma        => cpu_vma,
577
      addr       => cpu_addr,
578
      data_in    => cpu_data_out,
579
      data_out   => trap_data_out,
580
      irq        => trap_irq
581
    );
582
 
583
  my_dat : dat_ram
584
    port map (
585
      clk       => cpu_clk,
586
      rst       => cpu_reset,
587
      cs        => dat_cs,
588
      rw        => cpu_rw,
589
      addr_hi   => cpu_addr(15 downto 12),
590
      addr_lo   => cpu_addr(3 downto 0),
591
      data_in   => cpu_data_out,
592
      data_out  => dat_addr(7 downto 0)
593
    );
594
 
595
  cpu_clk_buffer : BUFG
596
    port map(
597
      i => Clk25,
598
      o => cpu_clk
599
    );
600
 
601
  ----------------------------------------------------------------------
602
  --
603
  -- Process to decode memory map
604
  --
605
  ----------------------------------------------------------------------
606
 
607
  mem_decode: process( cpu_addr, cpu_rw, cpu_vma,
608
                     dat_addr,
609
                     rom_data_out,
610
                     flex_data_out,
611
                     acia_data_out,
612
                     timer_data_out,
613
                     trap_data_out,
614 177 davidgb
                     ram1_data_out, ram2_data_out
615 165 davidgb
                     )
616
  begin
617
    cpu_data_in <= (others=>'0');
618
    dat_cs      <= '0';
619
    rom_cs      <= '0';
620
    flex_cs     <= '0';
621
    acia_cs     <= '0';
622
    timer_cs    <= '0';
623
    trap_cs     <= '0';
624 177 davidgb
    ram1_cs      <= '0';
625
    ram2_cs      <= '0';
626
 
627 165 davidgb
    if cpu_addr( 15 downto 8 ) = "11111111" then  -- $FFxx
628
      cpu_data_in <= rom_data_out;
629
      dat_cs      <= cpu_vma;              -- write DAT
630
      rom_cs      <= cpu_vma;              -- read  ROM
631
 
632
    --
633
    -- Sys09Bug Monitor ROM $F000 - $FFFF
634
    --
635
    elsif dat_addr(3 downto 0) = "1111" then -- $XF000 - $XFFFF
636
      cpu_data_in <= rom_data_out;
637
      rom_cs      <= cpu_vma;
638
 
639
    --
640
    -- IO Devices $E000 - $E7FF
641
    --
642
    elsif dat_addr(3 downto 0) = "1110" then -- $XE000 - $XEFFF
643
      case cpu_addr(11 downto 8) is
644
        --
645
        -- SWTPC peripherals from $E000 to $E0FF
646
        --
647
        when "0000" =>
648
          case cpu_addr(7 downto 4) is
649
          --
650
          -- Console Port ACIA $E000 - $E00F
651
          --
652
            when "0000" => -- $E000
653
              cpu_data_in <= acia_data_out;
654
              acia_cs     <= cpu_vma;
655
 
656
            --
657
            -- Reserved
658
            -- Floppy Disk Controller port $E010 - $E01F
659
            --
660
 
661
            --
662
            -- Reserved SWTPc MP-T Timer $E040 - $E04F
663
            --
664
            when "0100" => -- $E040
665
              cpu_data_in <= (others=> '0');
666
 
667
            --
668
            -- Timer $E050 - $E05F
669
            --
670
            when "0101" => -- $E050
671
              cpu_data_in <= timer_data_out;
672
              timer_cs    <= cpu_vma;
673
 
674
            --
675
            -- Bus Trap Logic $E060 - $E06F
676
            --
677
            when "0110" => -- $E060
678
              cpu_data_in <= trap_data_out;
679
              trap_cs     <= cpu_vma;
680
 
681
            --
682
            -- Reserved SWTPc MP-ID PIA Timer/Printer Port $E080 - $E08F
683
            --
684
 
685
            --
686
            -- Reserved SWTPc MP-ID PTM 6840 Timer Port $E090 - $E09F
687
            --
688
 
689
            --
690
            -- Remaining 6 slots reserved for non SWTPc Peripherals
691
            --
692
            when others => -- $E0A0 to $E0FF
693
              null;
694
          end case;
695
 
696
        --
697
        -- $E200 to $EFFF reserved for future use
698
        --
699
        when others =>
700
           null;
701
      end case;
702 177 davidgb
 
703
    --
704 193 davidgb
    -- Block RAM (32k) $00000 - $07FFF
705 177 davidgb
    --
706 193 davidgb
    elsif dat_addr(7 downto 3) = "00000"   then -- $00000 - $07FFF
707 177 davidgb
      cpu_data_in <= ram1_data_out;
708
      ram1_cs     <= cpu_vma;
709
 
710
    --
711 193 davidgb
    -- Block RAM (16k) $08000 - $0BFFF
712 177 davidgb
    --
713 193 davidgb
    elsif dat_addr(7 downto 2) = "000010"  then -- $08000 - $0BFFF
714 177 davidgb
      cpu_data_in <= ram2_data_out;
715
      ram2_cs     <= cpu_vma;
716 165 davidgb
 
717
    --
718 193 davidgb
    -- Flex RAM (8k) $0C000 - $0DFFF
719
    --
720
    elsif dat_addr(7 downto 1) = "0000110" then -- $0C000 - $0DFFF
721
      cpu_data_in <= flex_data_out;
722
      flex_cs     <= cpu_vma;
723
 
724
    --
725 165 davidgb
    -- Everything else is RAM
726
    --
727
    else
728 177 davidgb
      cpu_data_in <= (others => '0');
729
      ram3_cs      <= cpu_vma;
730 165 davidgb
    end if;
731
 
732
  end process;
733
 
734
  --
735
  -- Interrupts and other bus control signals
736
  --
737 193 davidgb
  interrupts : process( NMI,
738 165 davidgb
                      acia_irq,
739
                      trap_irq,
740
                      timer_irq
741
                      )
742
  begin
743
    cpu_irq    <= acia_irq;
744 193 davidgb
    cpu_nmi    <= trap_irq or NMI;
745 165 davidgb
    cpu_firq   <= timer_irq;
746
    cpu_halt   <= '0';
747 177 davidgb
    cpu_hold   <= '0'; -- pb_hold or ram_hold;
748 165 davidgb
  end process;
749
 
750
  --
751 187 davidgb
  -- Flash 7 segment LEDS
752 165 davidgb
  --
753 187 davidgb
  my_led_flasher: process( clk_i, rst_i, CountL )
754 165 davidgb
  begin
755 187 davidgb
    if rst_i = '1' then
756 196 davidgb
         CountL <= "00000000000000000000000000";
757 187 davidgb
    elsif rising_edge(clk_i) then
758
         CountL <= CountL + 1;
759 165 davidgb
    end if;
760 187 davidgb
    --S(7 downto 0) <= CountL(23 downto 16);
761 165 davidgb
  end process;
762
 
763 193 davidgb
  status_leds : process( rst_i, cpu_reset, cpu_addr, cpu_data_in, sw)
764 187 davidgb
  begin
765
    case sw is
766 196 davidgb
         when "1000" =>
767 187 davidgb
           led(3 downto 0) <= cpu_addr(3 downto 0);
768 196 davidgb
    when "1001" =>
769 187 davidgb
           led(3 downto 0) <= cpu_addr(7 downto 4);
770 196 davidgb
         when "1010" =>
771 187 davidgb
           led(3 downto 0) <= cpu_addr(11 downto 8);
772 196 davidgb
    when "1011" =>
773 187 davidgb
           led(3 downto 0) <= cpu_addr(15 downto 12);
774 196 davidgb
    when "1100" =>
775 187 davidgb
           led(3 downto 0) <= cpu_data_in(3 downto 0);
776 196 davidgb
    when "1101" =>
777
           led(3 downto 0) <= cpu_data_in(7 downto 4);
778
    when "0000" =>
779
           led(3) <= '0';
780
      led(2) <= CountL(24);
781
                led(1) <= cpu_reset;
782
                led(0) <= NMI;
783 187 davidgb
    when others => led(3 downto 0) <= (others => '0');
784
         end case;
785 165 davidgb
  end process;
786
 
787
--  debug_proc : process( cpu_reset, cpu_clk, cpu_rw, cpu_vma,
788
--                      cpu_halt, cpu_hold,
789
--                      cpu_firq, cpu_irq, cpu_nmi,
790
--                      cpu_addr, cpu_data_out, cpu_data_in )
791
--  begin
792
--    cpu_reset_o    <= cpu_reset;
793
--    cpu_clk_o      <= cpu_clk;
794
--    cpu_rw_o       <= cpu_rw;
795
--    cpu_vma_o      <= cpu_vma;
796
--    cpu_halt_o     <= cpu_halt;
797
--    cpu_hold_o     <= cpu_hold;
798
--    cpu_firq_o     <= cpu_firq;
799
--    cpu_irq_o      <= cpu_irq;
800
--    cpu_nmi_o      <= cpu_nmi;
801
--    cpu_addr_o     <= cpu_addr;
802
--    cpu_data_out_o <= cpu_data_out;
803
--    cpu_data_in_o  <= cpu_data_in;
804
--  end process;
805
 
806
end rtl; --===================== End of architecture =======================--
807
 

powered by: WebSVN 2.1.0

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