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

Subversion Repositories System09

[/] [System09/] [tags/] [LinuxPort/] [rtl/] [System09_BurchED_B5-X300/] [System09_BurchED_B5-X300.vhd] - Blame information for rev 19

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

Line No. Rev Author Line
1 19 dilbert57
--===========================================================================----
2
--
3
--  S Y N T H E Z I A B L E    System09 - SOC.
4
--
5
--  www.OpenCores.Org - September 2003
6
--  This core adheres to the GNU public license  
7
--
8
-- File name      : System09.vhd
9
--
10
-- Purpose        : Top level file for 6809 compatible system on a chip
11
--                  Designed with Xilinx XC2S300e Spartan 2+ FPGA.
12
--                  Implemented With BurchED B5-X300 FPGA board,
13
--                  B5-SRAM module, B5-CF module and B5-FPGA-CPU-IO module
14
--
15
-- Dependencies   : ieee.Std_Logic_1164
16
--                  ieee.std_logic_unsigned
17
--                  ieee.std_logic_arith
18
--                  ieee.numeric_std
19
--
20
-- Uses           : 
21
--                  cpu09      (cpu09.vhd)      CPU core
22
--                  mon_rom    (sys09bug_rom2k_b4.vhd) Monitor ROM
23
--                  dat_ram    (datram.vhd)     Dynamic Address Translation
24
--                  acia_6850  (ACIA_6850.vhd) ACIA / MiniUART
25
--                             (ACIA_RX.vhd)
26
--                             (ACIA_TX.vhd)
27
--                  ACIA_Clock (ACIA_Clock.vhd) ACIA Baud Clock Divider
28
--                  keyboard   (keyboard.vhd)   PS/2 Keyboard Interface
29
--                  vdu8       (vdu8.vhd)       80 x 25 Video Display
30
--                  timer      (timer.vhd)      Timer module
31
--                  trap            (trap.vhd)       Bus Trap interrupt
32
--                  ioport     (ioport.vhd)     Parallel I/O port.
33
-- 
34
-- Author         : John E. Kent      
35
--                  dilbert57@opencores.org      
36
--      Memory Map     :
37
-- $E000 - ACIA (SWTPc)
38
-- $E010 - Reserved for FD1771 FDC (SWTPc)
39
-- $E020 - Keyboard
40
-- $E030 - VDU
41
-- $E040 - Compact Flash
42
-- $E050 - Timer
43
-- $E060 - Bus trap
44
-- $E070 - Parallel I/O
45
-- $E080 - Reserved for 6821 PIA (?) (SWTPc)
46
-- $E090 - Reserved for 6840 PTM (?) (SWTPc)
47
--
48
--===========================================================================----
49
--
50
-- Revision History:
51
--===========================================================================--
52
-- Version 0.1 - 20 March 2003
53
-- Version 0.2 - 30 March 2003
54
-- Version 0.3 - 29 April 2003
55
-- Version 0.4 - 29 June 2003
56
--
57
-- Version 0.5 - 19 July 2003
58
-- prints out "Hello World"
59
--
60
-- Version 0.6 - 5 September 2003
61
-- Runs SBUG
62
--
63
-- Version 1.0- 6 Sep 2003 - John Kent
64
-- Inverted SysClk
65
-- Initial release to Open Cores
66
--
67
-- Version 1.1 - 17 Jan 2004 - John Kent
68
-- Updated miniUart.
69
--
70
-- Version 1.2 - 25 Jan 2004 - John Kent
71
-- removed signals "test_alu" and "test_cc" 
72
-- Trap hardware re-instated.
73
--
74
-- Version 1.3 - 11 Feb 2004 - John Kent
75
-- Designed forked off to produce System09_VDU
76
-- Added VDU component
77
--      VDU runs at 25MHz and divides the clock by 2 for the CPU
78
-- UART Runs at 57.6 Kbps
79
--
80
-- Version 1.4 - 21 Nov 2004 - John Kent
81
-- Changes to make compatible with Spartan3 starter kit version
82
-- Designed to run with a 50MHz clock input.
83
-- the VDU divides 50 MHz to generate a 
84
-- 25 MHz VDU Pixel Clock and a 12.5 MHz CPU clock
85
-- Changed Monitor ROM signals to make it look like
86
-- a standard 2K memory block
87
-- Re-assigned I/O port assignments so it is possible to run KBUG9
88
-- $E000 - ACIA
89
-- $E010 - Keyboard
90
-- $E020 - VDU
91
-- $E030 - Compact Flash
92
-- $E040 - Timer
93
-- $E050 - Bus trap
94
-- $E060 - Parallel I/O
95
--
96
-- Version 1.5 - 3rd February 2007 - John Kent
97
-- Changed VDU8 to use external clock divider
98
-- renamed miniUART to ACIA_6850
99
-- Memory decoding of ROM & IO now uses DAT
100
--
101
-- Version 1.6 - 7th Februaury 2007 - John Kent
102
-- Made ACIA Clock generator an external component
103
-- Added Generics to VDU and Keyboard
104
-- Changed decoding
105
--
106
-- Version 1.7 - 20th May 2007 - John Kent
107
-- Added 4 wait states to CF access
108
-- Removed DAT memory map control of ROM & IO
109
-- to allow for full use of RAM as a RAM disk.
110
-- Mapped in all 16 bits of the CF data bus.
111
-- 
112
--===========================================================================
113
--
114
library ieee;
115
   use ieee.std_logic_1164.all;
116
   use IEEE.STD_LOGIC_ARITH.ALL;
117
   use IEEE.STD_LOGIC_UNSIGNED.ALL;
118
   use ieee.numeric_std.all;
119
library unisim;
120
        use unisim.vcomponents.all;
121
 
122
entity System09 is
123
  port(
124
    SysClk      : in  Std_Logic;  -- System Clock input
125
         Reset_n     : in  Std_logic;  -- Master Reset input (active low)
126
    LED         : out std_logic;  -- Diagnostic LED Flasher
127
 
128
    -- Memory Interface signals
129
    ram_csn     : out Std_Logic;
130
    ram_wrln    : out Std_Logic;
131
    ram_wrun    : out Std_Logic;
132
    ram_addr    : out Std_Logic_Vector(16 downto 0);
133
    ram_data    : inout Std_Logic_Vector(15 downto 0);
134
 
135
         -- Stuff on the peripheral board
136
 
137
         -- PS/2 Keyboard
138
         kb_clock    : inout Std_logic;
139
         kb_data     : inout Std_Logic;
140
 
141
         -- PS/2 Mouse interface
142
--       mouse_clock : in  Std_Logic;
143
--       mouse_data  : in  Std_Logic;
144
 
145
         -- Uart Interface
146
    rxbit       : in  Std_Logic;
147
         txbit       : out Std_Logic;
148
    rts_n       : out Std_Logic;
149
    cts_n       : in  Std_Logic;
150
 
151
         -- CRTC output signals
152
         v_drive     : out Std_Logic;
153
    h_drive     : out Std_Logic;
154
    blue_lo     : out std_logic;
155
    blue_hi     : out std_logic;
156
    green_lo    : out std_logic;
157
    green_hi    : out std_logic;
158
    red_lo      : out std_logic;
159
    red_hi      : out std_logic;
160
--         buzzer      : out std_logic;
161
 
162
-- Compact Flash
163
    cf_rst_n     : out std_logic;
164
         cf_cs0_n     : out std_logic;
165
         cf_cs1_n     : out std_logic;
166
    cf_rd_n      : out std_logic;
167
    cf_wr_n      : out std_logic;
168
         cf_cs16_n    : out std_logic;
169
    cf_a         : out std_logic_vector(2 downto 0);
170
    cf_d         : inout std_logic_vector(15 downto 0);
171
--    cf_d         : inout std_logic_vector(7 downto 0);
172
 
173
-- Parallel I/O port
174
    porta        : inout std_logic_vector(7 downto 0);
175
    portb        : inout std_logic_vector(7 downto 0);
176
 
177
-- CPU bus
178
         bus_clk      : out std_logic;
179
         bus_reset    : out std_logic;
180
         bus_rw       : out std_logic;
181
         bus_cs       : out std_logic;
182
    bus_addr     : out std_logic_vector(15 downto 0);
183
         bus_data     : inout std_logic_vector(7 downto 0);
184
 
185
-- timer
186
    timer_out    : out std_logic
187
         );
188
end System09;
189
 
190
-------------------------------------------------------------------------------
191
-- Architecture for System09
192
-------------------------------------------------------------------------------
193
architecture rtl of System09 is
194
  -----------------------------------------------------------------------------
195
  -- constants
196
  -----------------------------------------------------------------------------
197
  constant SYS_Clock_Frequency  : integer := 50000000;  -- FPGA System Clock
198
  constant PIX_Clock_Frequency  : integer := 25000000;  -- VGA Pixel Clock
199
  constant CPU_Clock_Frequency  : integer := 12500000;  -- CPU Clock
200
  constant BAUD_Rate            : integer := 57600;       -- Baud Rate
201
  constant ACIA_Clock_Frequency : integer := BAUD_Rate * 16;
202
 
203
  type hold_state_type is ( hold_release_state, hold_request_state );
204
 
205
  -----------------------------------------------------------------------------
206
  -- Signals
207
  -----------------------------------------------------------------------------
208
  -- Monitor ROM
209
  signal rom_data_out  : Std_Logic_Vector(7 downto 0);
210
  signal rom_cs        : std_logic;
211
 
212
  -- UART Interface signals
213
  signal uart_data_out : Std_Logic_Vector(7 downto 0);
214
  signal uart_cs       : Std_Logic;
215
  signal uart_irq      : Std_Logic;
216
  signal uart_clk       : Std_Logic;
217
  signal DCD_n         : Std_Logic;
218
 
219
  -- timer
220
  signal timer_data_out : std_logic_vector(7 downto 0);
221
  signal timer_cs    : std_logic;
222
  signal timer_irq   : std_logic;
223
 
224
  -- trap
225
  signal trap_cs         : std_logic;
226
  signal trap_data_out   : std_logic_vector(7 downto 0);
227
  signal trap_irq        : std_logic;
228
 
229
  -- Parallel I/O port
230
  signal ioport_data_out : std_logic_vector(7 downto 0);
231
  signal ioport_cs    : std_logic;
232
 
233
  -- compact flash port
234
  signal cf_data_out : std_logic_vector(7 downto 0);
235
  signal cf_cs       : std_logic;
236
  signal cf_rd       : std_logic;
237
  signal cf_wr       : std_logic;
238
  signal cf_hold     : std_logic;
239
  signal cf_release  : std_logic;
240
  signal cf_count    : std_logic_vector(3 downto 0);
241
  signal cf_hold_state : hold_state_type;
242
 
243
  -- keyboard port
244
  signal keyboard_data_out : std_logic_vector(7 downto 0);
245
  signal keyboard_cs       : std_logic;
246
  signal keyboard_irq      : std_logic;
247
 
248
  -- RAM
249
  signal ram_cs      : std_logic; -- memory chip select
250
  signal ram_wrl     : std_logic; -- memory write lower
251
  signal ram_wru     : std_logic; -- memory write upper
252
  signal ram_data_out    : std_logic_vector(7 downto 0);
253
 
254
  -- CPU Interface signals
255
  signal cpu_reset    : Std_Logic;
256
  signal cpu_clk      : Std_Logic;
257
  signal cpu_rw       : std_logic;
258
  signal cpu_vma      : std_logic;
259
  signal cpu_halt     : std_logic;
260
  signal cpu_hold     : std_logic;
261
  signal cpu_firq     : std_logic;
262
  signal cpu_irq      : std_logic;
263
  signal cpu_nmi      : std_logic;
264
  signal cpu_addr     : std_logic_vector(15 downto 0);
265
  signal cpu_data_in  : std_logic_vector(7 downto 0);
266
  signal cpu_data_out : std_logic_vector(7 downto 0);
267
 
268
  -- Dynamic address translation
269
  signal dat_cs       : std_logic;
270
  signal dat_addr     : std_logic_vector(7 downto 0);
271
 
272
  -- Video Display Unit
273
  signal pix_clk      : std_logic;
274
  signal vdu_cs       : std_logic;
275
  signal vdu_data_out : std_logic_vector(7 downto 0);
276
  signal vga_red      : std_logic;
277
  signal vga_green    : std_logic;
278
  signal vga_blue     : std_logic;
279
 
280
  -- Flashing Led test signals
281
  signal countL      : std_logic_vector(23 downto 0);
282
  signal clock_div   : std_logic_vector(1 downto 0);
283
 
284
-----------------------------------------------------------------
285
--
286
-- CPU09 CPU core
287
--
288
-----------------------------------------------------------------
289
 
290
component cpu09
291
  port (
292
         clk:        in std_logic;
293
    rst:      in        std_logic;
294
    rw:      out        std_logic;              -- Asynchronous memory interface
295
    vma:             out        std_logic;
296
    address:  out       std_logic_vector(15 downto 0);
297
    data_in:  in        std_logic_vector(7 downto 0);
298
         data_out: out std_logic_vector(7 downto 0);
299
         halt:     in  std_logic;
300
         hold:     in  std_logic;
301
         irq:      in  std_logic;
302
         nmi:      in  std_logic;
303
         firq:     in  std_logic
304
  );
305
end component;
306
 
307
 
308
----------------------------------------
309
--
310
-- SBUG Block RAM Monitor ROM
311
--
312
----------------------------------------
313
component mon_rom
314
    port (
315
       clk   : in  std_logic;
316
       rst   : in  std_logic;
317
       cs    : in  std_logic;
318
       rw    : in  std_logic;
319
       addr  : in  std_logic_vector (10 downto 0);
320
       wdata : in  std_logic_vector (7 downto 0);
321
       rdata : out std_logic_vector (7 downto 0)
322
    );
323
end component;
324
 
325
 
326
----------------------------------------
327
--
328
-- Dynamic Address Translation Registers
329
--
330
----------------------------------------
331
component dat_ram
332
  port (
333
    clk:      in  std_logic;
334
         rst:      in  std_logic;
335
         cs:       in  std_logic;
336
         rw:       in  std_logic;
337
         addr_lo:  in  std_logic_vector(3 downto 0);
338
         addr_hi:  in  std_logic_vector(3 downto 0);
339
    data_in:  in  std_logic_vector(7 downto 0);
340
         data_out: out std_logic_vector(7 downto 0)
341
         );
342
end component;
343
 
344
-----------------------------------------------------------------
345
--
346
-- 6850 ACIA/UART
347
--
348
-----------------------------------------------------------------
349
 
350
component ACIA_6850
351
  port (
352
     clk      : in  Std_Logic;  -- System Clock
353
     rst      : in  Std_Logic;  -- Reset input (active high)
354
     cs       : in  Std_Logic;  -- miniUART Chip Select
355
     rw       : in  Std_Logic;  -- Read / Not Write
356
     irq      : out Std_Logic;  -- Interrupt
357
     Addr     : in  Std_Logic;  -- Register Select
358
     DataIn   : in  Std_Logic_Vector(7 downto 0); -- Data Bus In 
359
     DataOut  : out Std_Logic_Vector(7 downto 0); -- Data Bus Out
360
     RxC      : in  Std_Logic;  -- Receive Baud Clock
361
     TxC      : in  Std_Logic;  -- Transmit Baud Clock
362
     RxD      : in  Std_Logic;  -- Receive Data
363
     TxD      : out Std_Logic;  -- Transmit Data
364
          DCD_n    : in  Std_Logic;  -- Data Carrier Detect
365
     CTS_n    : in  Std_Logic;  -- Clear To Send
366
     RTS_n    : out Std_Logic );  -- Request To send
367
end component;
368
 
369
-----------------------------------------------------------------
370
--
371
-- ACIA Clock divider
372
--
373
-----------------------------------------------------------------
374
 
375
component ACIA_Clock
376
  generic (
377
     SYS_Clock_Frequency  : integer :=  SYS_Clock_Frequency;
378
          ACIA_Clock_Frequency : integer := ACIA_Clock_Frequency
379
  );
380
  port (
381
     clk      : in  Std_Logic;  -- System Clock Input
382
          ACIA_clk : out Std_logic   -- ACIA Clock output
383
  );
384
end component;
385
 
386
----------------------------------------
387
--
388
-- Timer module
389
--
390
----------------------------------------
391
 
392
component timer
393
  port (
394
     clk       : in std_logic;
395
     rst       : in std_logic;
396
     cs        : in std_logic;
397
     rw        : in std_logic;
398
     addr      : in std_logic;
399
     data_in   : in std_logic_vector(7 downto 0);
400
          data_out  : out std_logic_vector(7 downto 0);
401
          irq       : out std_logic;
402
     timer_in  : in std_logic;
403
          timer_out : out std_logic
404
          );
405
end component;
406
 
407
------------------------------------------------------------
408
--
409
-- Bus Trap logic
410
--
411
------------------------------------------------------------
412
 
413
component trap
414
        port (
415
         clk        : in  std_logic;
416
    rst        : in  std_logic;
417
    cs         : in  std_logic;
418
    rw         : in  std_logic;
419
    vma        : in  std_logic;
420
    addr       : in  std_logic_vector(15 downto 0);
421
    data_in    : in  std_logic_vector(7 downto 0);
422
         data_out   : out std_logic_vector(7 downto 0);
423
         irq        : out std_logic
424
  );
425
end component;
426
 
427
----------------------------------------
428
--
429
-- Dual 8 bit Parallel I/O module
430
--
431
----------------------------------------
432
component ioport
433
        port (
434
         clk       : in  std_logic;
435
    rst       : in  std_logic;
436
    cs        : in  std_logic;
437
    rw        : in  std_logic;
438
    addr      : in  std_logic_vector(1 downto 0);
439
    data_in   : in  std_logic_vector(7 downto 0);
440
         data_out  : out std_logic_vector(7 downto 0);
441
         porta_io  : inout std_logic_vector(7 downto 0);
442
         portb_io  : inout std_logic_vector(7 downto 0)
443
         );
444
end component;
445
 
446
----------------------------------------
447
--
448
-- PS/2 Keyboard
449
--
450
----------------------------------------
451
 
452
component keyboard
453
  generic(
454
  KBD_Clock_Frequency : integer := CPU_Clock_Frequency
455
  );
456
  port(
457
  clk             : in    std_logic;
458
  rst             : in    std_logic;
459
  cs              : in    std_logic;
460
  rw              : in    std_logic;
461
  addr            : in    std_logic;
462
  data_in         : in    std_logic_vector(7 downto 0);
463
  data_out        : out   std_logic_vector(7 downto 0);
464
  irq             : out   std_logic;
465
  kbd_clk         : inout std_logic;
466
  kbd_data        : inout std_logic
467
  );
468
end component;
469
 
470
----------------------------------------
471
--
472
-- Video Display Unit.
473
--
474
----------------------------------------
475
component vdu8
476
      generic(
477
        VDU_CLOCK_FREQUENCY    : integer := CPU_Clock_Frequency; -- HZ
478
        VGA_CLOCK_FREQUENCY    : integer := PIX_Clock_Frequency; -- HZ
479
             VGA_HOR_CHARS          : integer := 80; -- CHARACTERS
480
             VGA_VER_CHARS          : integer := 25; -- CHARACTERS
481
             VGA_PIXELS_PER_CHAR    : integer := 8;  -- PIXELS
482
             VGA_LINES_PER_CHAR     : integer := 16; -- LINES
483
             VGA_HOR_BACK_PORCH     : integer := 40; -- PIXELS
484
             VGA_HOR_SYNC           : integer := 96; -- PIXELS
485
             VGA_HOR_FRONT_PORCH    : integer := 24; -- PIXELS
486
             VGA_VER_BACK_PORCH     : integer := 13; -- LINES
487
             VGA_VER_SYNC           : integer := 1;  -- LINES
488
             VGA_VER_FRONT_PORCH    : integer := 36  -- LINES
489
      );
490
      port(
491
                -- control register interface
492
      vdu_clk      : in  std_logic;      -- CPU Clock - 12.5MHz
493
      vdu_rst      : in  std_logic;
494
                vdu_cs       : in  std_logic;
495
                vdu_rw       : in  std_logic;
496
                vdu_addr     : in  std_logic_vector(2 downto 0);
497
      vdu_data_in  : in  std_logic_vector(7 downto 0);
498
      vdu_data_out : out std_logic_vector(7 downto 0);
499
 
500
      -- vga port connections
501
                vga_clk      : in  std_logic;   -- VGA Pixel Clock - 25 MHz
502
      vga_red_o    : out std_logic;
503
      vga_green_o  : out std_logic;
504
      vga_blue_o   : out std_logic;
505
      vga_hsync_o  : out std_logic;
506
      vga_vsync_o  : out std_logic
507
   );
508
end component;
509
 
510
 
511
component BUFG
512
  port (
513
                i: in  std_logic;
514
                o: out std_logic
515
  );
516
end component;
517
 
518
begin
519
  -----------------------------------------------------------------------------
520
  -- Instantiation of internal components
521
  -----------------------------------------------------------------------------
522
 
523
----------------------------------------
524
--
525
-- CPU09 CPU Core
526
--
527
----------------------------------------
528
my_cpu : cpu09  port map (
529
         clk         => cpu_clk,
530
    rst       => cpu_reset,
531
    rw       => cpu_rw,
532
    vma       => cpu_vma,
533
    address   => cpu_addr(15 downto 0),
534
    data_in   => cpu_data_in,
535
         data_out  => cpu_data_out,
536
         halt      => cpu_halt,
537
         hold      => cpu_hold,
538
         irq       => cpu_irq,
539
         nmi       => cpu_nmi,
540
         firq      => cpu_firq
541
  );
542
 
543
----------------------------------------
544
--
545
-- SBUG / KBUG / SYS09BUG Monitor ROM
546
--
547
----------------------------------------
548
my_rom : mon_rom port map (
549
       clk   => cpu_clk,
550
                 rst   => cpu_reset,
551
                 cs    => rom_cs,
552
                 rw    => '1',
553
       addr  => cpu_addr(10 downto 0),
554
                 wdata => cpu_data_out,
555
       rdata => rom_data_out
556
    );
557
 
558
----------------------------------------
559
--
560
-- Dynamic Address Translation Registers
561
--
562
----------------------------------------
563
my_dat : dat_ram port map (
564
    clk        => cpu_clk,
565
         rst        => cpu_reset,
566
         cs         => dat_cs,
567
         rw         => cpu_rw,
568
         addr_hi    => cpu_addr(15 downto 12),
569
         addr_lo    => cpu_addr(3 downto 0),
570
    data_in    => cpu_data_out,
571
         data_out   => dat_addr(7 downto 0)
572
         );
573
 
574
----------------------------------------
575
--
576
-- ACIA/UART Serial interface
577
--
578
----------------------------------------
579
my_ACIA  : ACIA_6850 port map (
580
         clk         => cpu_clk,
581
         rst       => cpu_reset,
582
    cs        => uart_cs,
583
         rw        => cpu_rw,
584
    irq       => uart_irq,
585
    Addr      => cpu_addr(0),
586
         Datain    => cpu_data_out,
587
         DataOut   => uart_data_out,
588
         RxC       => uart_clk,
589
         TxC       => uart_clk,
590
         RxD       => rxbit,
591
         TxD       => txbit,
592
         DCD_n     => dcd_n,
593
         CTS_n     => cts_n,
594
         RTS_n     => rts_n
595
         );
596
 
597
----------------------------------------
598
--
599
-- ACIA Clock
600
--
601
----------------------------------------
602
my_ACIA_Clock : ACIA_Clock
603
  generic map(
604
    SYS_Clock_Frequency  => SYS_Clock_Frequency,
605
         ACIA_Clock_Frequency => ACIA_Clock_Frequency
606
  )
607
  port map(
608
    clk        => SysClk,
609
    acia_clk   => uart_clk
610
  );
611
 
612
----------------------------------------
613
--
614
-- PS/2 Keyboard Interface
615
--
616
----------------------------------------
617
my_keyboard : keyboard
618
   generic map (
619
        KBD_Clock_Frequency => CPU_Clock_frequency
620
        )
621
   port map(
622
        clk          => cpu_clk,
623
        rst          => cpu_reset,
624
        cs           => keyboard_cs,
625
        rw           => cpu_rw,
626
        addr         => cpu_addr(0),
627
        data_in      => cpu_data_out(7 downto 0),
628
        data_out     => keyboard_data_out(7 downto 0),
629
        irq          => keyboard_irq,
630
        kbd_clk      => kb_clock,
631
        kbd_data     => kb_data
632
        );
633
 
634
----------------------------------------
635
--
636
-- Video Display Unit instantiation
637
--
638
----------------------------------------
639
my_vdu : vdu8
640
  generic map(
641
      VDU_CLOCK_FREQUENCY    => CPU_Clock_Frequency, -- HZ
642
      VGA_CLOCK_FREQUENCY    => PIX_Clock_Frequency, -- HZ
643
           VGA_HOR_CHARS          => 80, -- CHARACTERS
644
           VGA_VER_CHARS          => 25, -- CHARACTERS
645
           VGA_PIXELS_PER_CHAR    => 8,  -- PIXELS
646
           VGA_LINES_PER_CHAR     => 16, -- LINES
647
           VGA_HOR_BACK_PORCH     => 40, -- PIXELS
648
           VGA_HOR_SYNC           => 96, -- PIXELS
649
           VGA_HOR_FRONT_PORCH    => 24, -- PIXELS
650
           VGA_VER_BACK_PORCH     => 13, -- LINES
651
           VGA_VER_SYNC           => 1,  -- LINES
652
           VGA_VER_FRONT_PORCH    => 36  -- LINES
653
  )
654
  port map(
655
 
656
                -- Control Registers
657
                vdu_clk       => cpu_clk,                                        -- 12.5 MHz System Clock in
658
      vdu_rst       => cpu_reset,
659
                vdu_cs        => vdu_cs,
660
                vdu_rw        => cpu_rw,
661
                vdu_addr      => cpu_addr(2 downto 0),
662
                vdu_data_in   => cpu_data_out,
663
                vdu_data_out  => vdu_data_out,
664
 
665
      -- vga port connections
666
      vga_clk       => pix_clk,                                  -- 25 MHz VDU pixel clock
667
      vga_red_o     => vga_red,
668
      vga_green_o   => vga_green,
669
      vga_blue_o    => vga_blue,
670
      vga_hsync_o   => h_drive,
671
      vga_vsync_o   => v_drive
672
   );
673
 
674
----------------------------------------
675
--
676
-- Timer Module
677
--
678
----------------------------------------
679
my_timer  : timer port map (
680
    clk       => cpu_clk,
681
         rst       => cpu_reset,
682
    cs        => timer_cs,
683
         rw        => cpu_rw,
684
    addr      => cpu_addr(0),
685
         data_in   => cpu_data_out,
686
         data_out  => timer_data_out,
687
    irq       => timer_irq,
688
         timer_in  => CountL(5),
689
         timer_out => timer_out
690
    );
691
 
692
----------------------------------------
693
--
694
-- Bus Trap Interrupt logic
695
--
696
----------------------------------------
697
my_trap : trap port map (
698
         clk        => cpu_clk,
699
    rst        => cpu_reset,
700
    cs         => trap_cs,
701
    rw         => cpu_rw,
702
         vma        => cpu_vma,
703
    addr       => cpu_addr,
704
    data_in    => cpu_data_out,
705
         data_out   => trap_data_out,
706
         irq        => trap_irq
707
    );
708
 
709
----------------------------------------
710
--
711
-- Parallel I/O Port
712
--
713
----------------------------------------
714
my_ioport  : ioport port map (
715
         clk       => cpu_clk,
716
    rst       => cpu_reset,
717
    cs        => ioport_cs,
718
    rw        => cpu_rw,
719
    addr      => cpu_addr(1 downto 0),
720
    data_in   => cpu_data_out,
721
         data_out  => ioport_data_out,
722
         porta_io  => porta,
723
         portb_io  => portb
724
         );
725
 
726
--
727
-- 12.5 MHz CPU clock
728
--
729
cpu_clk_buffer : BUFG port map(
730
    i => clock_div(1),
731
         o => cpu_clk
732
    );
733
 
734
--
735
-- 25 MHz VGA Pixel clock
736
--
737
vga_clk_buffer : BUFG port map(
738
    i => clock_div(0),
739
         o => pix_clk
740
    );
741
 
742
----------------------------------------------------------------------
743
--
744
-- Process to decode memory map
745
--
746
----------------------------------------------------------------------
747
 
748
mem_decode: process( cpu_clk, Reset_n, dat_addr,
749
                     cpu_addr, cpu_rw, cpu_vma,
750
                                              rom_data_out,
751
                                                        ram_data_out,
752
                                              cf_data_out,
753
                                                   timer_data_out,
754
                                                        trap_data_out,
755
                                                        ioport_data_out,
756
                                                   uart_data_out,
757
                                                        keyboard_data_out,
758
                                                        vdu_data_out,
759
                                                        bus_data )
760
variable decode_addr : std_logic_vector(4 downto 0);
761
begin
762
    decode_addr := dat_addr(3 downto 0) & cpu_addr(11);
763
--    decode_addr := cpu_addr(15 downto 11);
764
 
765
    if cpu_addr( 15 downto 8 ) = "11111111" then
766
                        cpu_data_in <= rom_data_out;
767
                        rom_cs      <= cpu_vma;              -- read ROM
768
                        dat_cs      <= cpu_vma;              -- write DAT
769
                        ram_cs      <= '0';
770
                        uart_cs     <= '0';
771
                        cf_cs       <= '0';
772
                        timer_cs    <= '0';
773
                        trap_cs     <= '0';
774
                        ioport_cs   <= '0';
775
                        keyboard_cs <= '0';
776
                        vdu_cs      <= '0';
777
                        bus_cs      <= '0';
778
         else
779
      case decode_addr is
780
           --
781
                -- SBUG/KBUG/SYS09BUG Monitor ROM $F800 - $FFFF
782
                --
783
                when "11111" => -- $F800 - $FFFF
784
                   cpu_data_in <= rom_data_out;
785
                        rom_cs      <= cpu_vma;              -- read ROM
786
                        dat_cs      <= '0';
787
                        ram_cs      <= '0';
788
                        uart_cs     <= '0';
789
                        cf_cs       <= '0';
790
                        timer_cs    <= '0';
791
                        trap_cs     <= '0';
792
                        ioport_cs   <= '0';
793
                        keyboard_cs <= '0';
794
                        vdu_cs      <= '0';
795
                        bus_cs      <= '0';
796
 
797
      --
798
                -- IO Devices $E000 - $E7FF
799
                --
800
                when "11100" => -- $E000 - $E7FF
801
                        rom_cs    <= '0';
802
                   dat_cs    <= '0';
803
                        ram_cs    <= '0';
804
                   case cpu_addr(7 downto 4) is
805
                        --
806
                        -- UART / ACIA $E000
807
                        --
808
                        when "0000" => -- $E000
809
                     cpu_data_in <= uart_data_out;
810
                          uart_cs     <= cpu_vma;
811
                          cf_cs       <= '0';
812
                          timer_cs    <= '0';
813
                          trap_cs     <= '0';
814
                          ioport_cs   <= '0';
815
                          keyboard_cs <= '0';
816
                          vdu_cs      <= '0';
817
                          bus_cs      <= '0';
818
 
819
                        --
820
                        -- WD1771 FDC sites at $E010-$E01F
821
                        --
822
 
823
         --
824
         -- Keyboard port $E020 - $E02F
825
                        --
826
                        when "0010" => -- $E020
827
           cpu_data_in <= keyboard_data_out;
828
                          uart_cs     <= '0';
829
                          cf_cs       <= '0';
830
           timer_cs    <= '0';
831
                          trap_cs     <= '0';
832
                          ioport_cs   <= '0';
833
                          keyboard_cs <= cpu_vma;
834
                          vdu_cs      <= '0';
835
                          bus_cs      <= '0';
836
 
837
         --
838
         -- VDU port $E030 - $E03F
839
                        --
840
                        when "0011" => -- $E030
841
           cpu_data_in <= vdu_data_out;
842
                          uart_cs     <= '0';
843
                          cf_cs       <= '0';
844
           timer_cs    <= '0';
845
                          trap_cs     <= '0';
846
                          ioport_cs   <= '0';
847
                          keyboard_cs <= '0';
848
                          vdu_cs      <= cpu_vma;
849
                          bus_cs      <= '0';
850
 
851
         --
852
                        -- Compact Flash $E040 - $E04F
853
                        --
854
                        when "0100" => -- $E040
855
           cpu_data_in <= cf_data_out;
856
                          uart_cs     <= '0';
857
           cf_cs       <= cpu_vma;
858
                          timer_cs    <= '0';
859
                          trap_cs     <= '0';
860
                          ioport_cs   <= '0';
861
                          keyboard_cs <= '0';
862
                          vdu_cs      <= '0';
863
                          bus_cs      <= '0';
864
 
865
         --
866
         -- Timer $E050 - $E05F
867
                        --
868
                        when "0101" => -- $E050
869
           cpu_data_in <= timer_data_out;
870
                          uart_cs     <= '0';
871
                          cf_cs       <= '0';
872
           timer_cs    <= cpu_vma;
873
                          trap_cs     <= '0';
874
                          ioport_cs   <= '0';
875
                          keyboard_cs <= '0';
876
                          vdu_cs      <= '0';
877
                          bus_cs      <= '0';
878
 
879
         --
880
         -- Bus Trap Logic $E060 - $E06F
881
                        --
882
                        when "0110" => -- $E060
883
           cpu_data_in <= trap_data_out;
884
                          uart_cs     <= '0';
885
                          cf_cs       <= '0';
886
           timer_cs    <= '0';
887
                          trap_cs     <= cpu_vma;
888
                          ioport_cs   <= '0';
889
                          keyboard_cs <= '0';
890
                          vdu_cs      <= '0';
891
                          bus_cs      <= '0';
892
 
893
         --
894
         -- I/O port $E070 - $E07F
895
                        --
896
                        when "0111" => -- $E070
897
           cpu_data_in <= ioport_data_out;
898
                          uart_cs     <= '0';
899
                          cf_cs       <= '0';
900
           timer_cs    <= '0';
901
                          trap_cs     <= '0';
902
                          ioport_cs   <= cpu_vma;
903
                          keyboard_cs <= '0';
904
                          vdu_cs      <= '0';
905
                          bus_cs      <= '0';
906
 
907
                        when others => -- $E080 to $E7FF
908
           cpu_data_in <= bus_data;
909
                          uart_cs     <= '0';
910
                          cf_cs       <= '0';
911
                          timer_cs    <= '0';
912
                          trap_cs     <= '0';
913
                          ioport_cs   <= '0';
914
                          keyboard_cs <= '0';
915
                          vdu_cs      <= '0';
916
                          bus_cs      <= cpu_vma;
917
                   end case;
918
                --
919
                -- Everything else is RAM
920
                --
921
                when others =>
922
                  cpu_data_in <= ram_data_out;
923
                  rom_cs      <= '0';
924
                  dat_cs      <= '0';
925
                  ram_cs      <= cpu_vma;
926
                  uart_cs     <= '0';
927
                  cf_cs       <= '0';
928
                  timer_cs    <= '0';
929
                  trap_cs     <= '0';
930
                  ioport_cs   <= '0';
931
                  keyboard_cs <= '0';
932
                  vdu_cs      <= '0';
933
                  bus_cs      <= '0';
934
                end case;
935
        end if;
936
end process;
937
 
938
 
939
--
940
-- B5-SRAM Control
941
-- Processes to read and write memory based on bus signals
942
--
943
ram_process: process( cpu_clk, Reset_n,
944
                      cpu_addr, cpu_rw, cpu_vma, cpu_data_out,
945
                                               dat_addr,
946
                      ram_cs, ram_wrl, ram_wru, ram_data_out )
947
begin
948
    ram_csn <= not( ram_cs and Reset_n );
949
         ram_wrl  <= (not cpu_addr(0)) and (not cpu_rw) and cpu_clk;
950
         ram_wrln <= not (ram_wrl);
951
    ram_wru  <= cpu_addr(0) and (not cpu_rw) and cpu_clk;
952
         ram_wrun <= not (ram_wru);
953
         ram_addr(16 downto 11) <= dat_addr(5 downto 0);
954
         ram_addr(10 downto 0) <= cpu_addr(11 downto 1);
955
 
956
    if ram_wrl = '1' then
957
                ram_data(7 downto 0) <= cpu_data_out;
958
         else
959
      ram_data(7 downto 0)  <= "ZZZZZZZZ";
960
         end if;
961
 
962
         if ram_wru = '1' then
963
                ram_data(15 downto 8) <= cpu_data_out;
964
         else
965
      ram_data(15 downto 8)  <= "ZZZZZZZZ";
966
    end if;
967
 
968
         if cpu_addr(0) = '1' then
969
      ram_data_out <= ram_data(15 downto 8);
970
         else
971
      ram_data_out <= ram_data(7 downto 0);
972
    end if;
973
end process;
974
 
975
--
976
-- Compact Flash Control
977
--
978
compact_flash: process( Reset_n,
979
                 cpu_addr, cpu_rw, cpu_vma, cpu_data_out,
980
                                          cf_cs, cf_rd, cf_wr, cf_d )
981
begin
982
         cf_rst_n  <= Reset_n;
983
         cf_cs0_n  <= not( cf_cs ) or cpu_addr(3);
984
         cf_cs1_n  <= not( cf_cs and cpu_addr(3));
985
         cf_cs16_n <= '1';
986
         cf_wr     <= cf_cs and (not cpu_rw);
987
         cf_rd     <= cf_cs and cpu_rw;
988
         cf_wr_n   <= not cf_wr;
989
         cf_rd_n   <= not cf_rd;
990
         cf_a      <= cpu_addr(2 downto 0);
991
         if cf_wr = '1' then
992
           cf_d(7 downto 0) <= cpu_data_out;
993
         else
994
           cf_d(7 downto 0) <= "ZZZZZZZZ";
995
         end if;
996
         cf_data_out <= cf_d(7 downto 0);
997
         cf_d(15 downto 8) <= "ZZZZZZZZ";
998
end process;
999
 
1000
--
1001
-- Hold CF access       for a few cycles
1002
--
1003
cf_hold_proc: process( cpu_clk, Reset_n )
1004
begin
1005
    if Reset_n = '0' then
1006
                 cf_release    <= '0';
1007
                 cf_count      <= "0000";
1008
            cf_hold_state <= hold_release_state;
1009
         elsif cpu_clk'event and cpu_clk='0' then
1010
            case cf_hold_state is
1011
                 when hold_release_state =>
1012
          cf_release <= '0';
1013
                    if cf_cs = '1' then
1014
                            cf_count      <= "0011";
1015
                                 cf_hold_state <= hold_request_state;
1016
                         end if;
1017
 
1018
                 when hold_request_state =>
1019
                    cf_count <= cf_count - "0001";
1020
                         if cf_count = "0000" then
1021
             cf_release    <= '1';
1022
                                 cf_hold_state <= hold_release_state;
1023
                         end if;
1024
       when others =>
1025
                    null;
1026
       end case;
1027
         end if;
1028
end process;
1029
 
1030
--
1031
-- Interrupts and other bus control signals
1032
--
1033
interrupts : process( Reset_n,
1034
                                                         cf_cs, cf_hold, cf_release,
1035
                      uart_irq, trap_irq, timer_irq, keyboard_irq
1036
                                                         )
1037
begin
1038
    cf_hold   <= cf_cs and (not cf_release);
1039
         cpu_reset <= not Reset_n; -- CPU reset is active high
1040
    cpu_irq   <= uart_irq or keyboard_irq;
1041
         cpu_nmi   <= trap_irq;
1042
         cpu_firq  <= timer_irq;
1043
         cpu_halt  <= '0';
1044
         cpu_hold  <= cf_hold;
1045
end process;
1046
 
1047
--
1048
-- CPU bus signals
1049
--
1050
my_bus : process( cpu_clk, cpu_reset, cpu_rw, cpu_addr, cpu_data_out )
1051
begin
1052
        bus_clk   <= cpu_clk;
1053
   bus_reset <= cpu_reset;
1054
        bus_rw    <= cpu_rw;
1055
   bus_addr  <= cpu_addr;
1056
        if( cpu_rw = '1' ) then
1057
           bus_data <= "ZZZZZZZZ";
1058
   else
1059
           bus_data <= cpu_data_out;
1060
   end if;
1061
end process;
1062
 
1063
  --
1064
  -- flash led to indicate code is working
1065
  --
1066
my_LED_Flasher: process (cpu_clk, CountL )
1067
begin
1068
    if(cpu_clk'event and cpu_clk = '0') then
1069
      countL <= countL + 1;
1070
    end if;
1071
         LED <= countL(23);
1072
         dcd_n <= '0';
1073
end process;
1074
 
1075
--
1076
-- Clock divider
1077
--
1078
my_clock_divider: process( SysClk )
1079
begin
1080
        if SysClk'event and SysClk='0' then
1081
                clock_div <= clock_div + "01";
1082
        end if;
1083
end process;
1084
--
1085
-- Assign VDU VGA colour output
1086
-- only 8 colours are handled.
1087
--
1088
my_vga_out: process( vga_red, vga_green, vga_blue )
1089
begin
1090
           red_lo   <= vga_red;
1091
      red_hi   <= vga_red;
1092
      green_lo <= vga_green;
1093
      green_hi <= vga_green;
1094
      blue_lo  <= vga_blue;
1095
      blue_hi  <= vga_blue;
1096
end process;
1097
 
1098
end rtl; --===================== End of architecture =======================--
1099
 

powered by: WebSVN 2.1.0

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