OSDN Git Service

a2 inst all addressing supported.
[motonesfpga/motonesfpga.git] / de0_cv_nes / de0_cv_nes.vhd
index 37062c4..f9653a7 100644 (file)
@@ -3,495 +3,470 @@ use ieee.std_logic_1164.all;
 use ieee.std_logic_unsigned.conv_integer;
 
 --  
---   MOTO NES FPGA On GHDL Simulation Environment Virtual Cuicuit Board
+--   MOTO NES FPGA On DE0-CV Environment Virtual Cuicuit Board
 --   All of the components are assembled and instanciated on this board.
 --  
 
 entity de0_cv_nes is 
-    port (
---debug signal
-    signal dbg_cpu_clk  : out std_logic;
-    signal dbg_ppu_clk  : out std_logic;
-    signal dbg_emu_ppu_clk  : out std_logic;
-    signal dbg_cpu_mem_clk  : out std_logic;
-    signal dbg_r_nw     : out std_logic;
-    signal dbg_addr     : out std_logic_vector( 16 - 1 downto 0);
-    signal dbg_d_io     : out std_logic_vector( 8 - 1 downto 0);
-    signal dbg_v_addr   : out std_logic_vector (13 downto 0);
-    signal dbg_v_data   : out std_logic_vector (7 downto 0);
-
----monitor inside cpu
-    signal dbg_instruction  : out std_logic_vector(7 downto 0);
-    signal dbg_exec_cycle   : out std_logic_vector (5 downto 0);
-    signal dbg_ea_carry     : out std_logic;
-    signal dbg_status       : out std_logic_vector(7 downto 0);
-
---ppu debug pins
-    signal dbg_ppu_ce_n    : out std_logic;
-    signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
-    signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
-    signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
-    signal dbg_nmi  : out std_logic;
-\r
+    port (\r
 --logic analyzer reference clock
     signal dbg_base_clk: out std_logic;\r
     
 --NES instance
-        base_clk       : in std_logic;
-        rst_n          : in std_logic;
-        joypad1     : in std_logic_vector(7 downto 0);
-        joypad2     : in std_logic_vector(7 downto 0);
-        h_sync_n    : out std_logic;
-        v_sync_n    : out std_logic;
-        r           : out std_logic_vector(3 downto 0);
-        g           : out std_logic_vector(3 downto 0);
-        b           : out std_logic_vector(3 downto 0);
-        nt_v_mirror : in std_logic\r
+        pi_base_clk    : in std_logic;
+        pi_rst_n       : in std_logic;
+        pi_joypad1     : in std_logic_vector(7 downto 0);
+        pi_joypad2     : in std_logic_vector(7 downto 0);
+        po_h_sync_n    : out std_logic;
+        po_v_sync_n    : out std_logic;
+        po_r           : out std_logic_vector(3 downto 0);
+        po_g           : out std_logic_vector(3 downto 0);
+        po_b           : out std_logic_vector(3 downto 0);
+        pi_nt_v_mirror : in std_logic;\r
+        \r
+        --for debugging..\r
+        po_dbg_cnt     : out std_logic_vector (63 downto 0)\r
          );
 end de0_cv_nes;
 
 architecture rtl of de0_cv_nes is
     component mos6502
-        generic (   dsize : integer := 8;
-                    asize : integer :=16
-                );
-        port (  
-    signal dbg_instruction  : out std_logic_vector(7 downto 0);
-    signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);\r
-    signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);
-    signal dbg_ea_carry     : out std_logic;
-    signal dbg_status       : out std_logic_vector(7 downto 0);
-    signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
-    signal dbg_dec_oe_n    : out std_logic;
-    signal dbg_dec_val     : out std_logic_vector (7 downto 0);
-    signal dbg_stat_we_n    : out std_logic;
-    signal dbg_idl_h, dbg_idl_l     : out std_logic_vector (7 downto 0);
-
-                cpu_clk     : in std_logic; --phi0 input pin.
-                dl_cpu_clk  : in std_logic; --phi1 delayed clock.
-                rdy         : in std_logic;
-                rst_n       : in std_logic;
-                irq_n       : in std_logic;
-                nmi_n       : in std_logic;
-                r_nw        : out std_logic;
-                addr        : out std_logic_vector ( asize - 1 downto 0);
-                d_io        : inout std_logic_vector ( dsize - 1 downto 0)
-        );
-    end component;
-
-    component clock_divider
-        port (  base_clk    : in std_logic;
-                reset_n     : in std_logic;
-                cpu_clk     : out std_logic;
-                ppu_clk     : out std_logic;
-                emu_ppu_clk : out std_logic;
-                vga_clk     : out std_logic;
-                cpu_mem_clk     : out std_logic;
-                cpu_recv_clk     : out std_logic;
-                emu_ppu_mem_clk : out std_logic
-            );
-    end component;
-
-    component address_decoder
-    generic (abus_size : integer := 16; dbus_size : integer := 8);
-        port (
-                addr        : in std_logic_vector (abus_size - 1 downto 0);
-                rom_ce_n    : out std_logic;
-                ram_ce_n    : out std_logic;
-                ppu_ce_n    : out std_logic;
-                apu_ce_n    : out std_logic
-    );
-    end component;
-
-    component tss_ram
-        generic (abus_size : integer := 16; dbus_size : integer := 8);
-        port (  
-                clk               : in std_logic;
-                ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
-                addr              : in std_logic_vector (abus_size - 1 downto 0);
-                d_io              : inout std_logic_vector (dbus_size - 1 downto 0)
-        );
-    end component;
-
-    component ram
-        generic (abus_size : integer := 16; dbus_size : integer := 8);
-        port (  
-                clk               : in std_logic;
-                ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
-                addr              : in std_logic_vector (abus_size - 1 downto 0);
-                d_io              : inout std_logic_vector (dbus_size - 1 downto 0)
-        );
-    end component;
-
-    component prg_rom
-        generic (abus_size : integer := 15; dbus_size : integer := 8);
         port (
-                clk             : in std_logic;
-                ce_n            : in std_logic;     --active low.
-                addr            : in std_logic_vector (abus_size - 1 downto 0);
-                data            : out std_logic_vector (dbus_size - 1 downto 0)
+                pi_rst_n       : in std_logic;\r
+                pi_base_clk    : in std_logic;\r
+                pi_cpu_en      : in std_logic_vector (7 downto 0);\r
+                pi_rdy         : in std_logic;\r
+                pi_irq_n       : in std_logic;\r
+                pi_nmi_n       : in std_logic;\r
+                po_r_nw        : out std_logic;\r
+                po_addr        : out std_logic_vector ( 15 downto 0);\r
+                pio_d_io       : inout std_logic_vector ( 7 downto 0)\r
         );
     end component;
 
+    component clock_selector\r
+        port (\r
+                pi_rst_n        : in std_logic;\r
+                pi_base_clk     : in std_logic;\r
+                po_cpu_en       : out std_logic_vector (7 downto 0);\r
+                po_rnd_en       : out std_logic_vector (3 downto 0)\r
+            );\r
+    end component;\r
+\r
+    component chip_selector\r
+        port (\r
+                pi_rst_n        : in std_logic;\r
+                pi_base_clk     : in std_logic;\r
+                pi_addr         : in std_logic_vector (15 downto 0);\r
+                po_rom_ce_n     : out std_logic;\r
+                po_ram_ce_n     : out std_logic;\r
+                po_ppu_ce_n     : out std_logic;\r
+                po_apu_ce_n     : out std_logic\r
+            );\r
+    end component;\r
+\r
+    component prg_rom port (\r
+                pi_base_clk    : in std_logic;\r
+                pi_ce_n         : in std_logic;\r
+                pi_addr         : in std_logic_vector (14 downto 0);\r
+                po_data         : out std_logic_vector (7 downto 0)\r
+            );\r
+    end component;\r
+\r
     component ppu port (
-        signal dbg_ppu_ce_n    : out std_logic;
-        signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
-        signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
-        signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
-
-        signal dbg_nes_x                        : out std_logic_vector (8 downto 0);
-        signal dbg_vga_x                        : out std_logic_vector (9 downto 0);
-        signal dbg_nes_y                        : out std_logic_vector (8 downto 0);
-        signal dbg_vga_y                        : out std_logic_vector (9 downto 0);
-        signal dbg_disp_nt, dbg_disp_attr       : out std_logic_vector (7 downto 0);
-        signal dbg_disp_ptn_h, dbg_disp_ptn_l   : out std_logic_vector (15 downto 0);
-        signal dbg_plt_ce_rn_wn                 : out std_logic_vector (2 downto 0);
-        signal dbg_plt_addr                     : out std_logic_vector (4 downto 0);
-        signal dbg_plt_data                     : out std_logic_vector (7 downto 0);
-        signal dbg_p_oam_ce_rn_wn               : out std_logic_vector (2 downto 0);
-        signal dbg_p_oam_addr                   : out std_logic_vector (7 downto 0);
-        signal dbg_p_oam_data                   : out std_logic_vector (7 downto 0);
-        signal dbg_s_oam_ce_rn_wn               : out std_logic_vector (2 downto 0);
-        signal dbg_s_oam_addr                   : out std_logic_vector (4 downto 0);
-        signal dbg_s_oam_data                   : out std_logic_vector (7 downto 0);
-        signal dbg_s_oam_addr_cpy               : out std_logic_vector (4 downto 0);
-
-                cpu_clk     : in std_logic;
-                dl_cpu_clk  : in std_logic;
-                ppu_clk     : in std_logic;
-                vga_clk     : in std_logic;
-                emu_ppu_clk : in std_logic;
-                emu_ppu_clk_dl : in std_logic;
-                ce_n        : in std_logic;
-                rst_n       : in std_logic;
-                r_nw        : in std_logic;
-                cpu_addr    : in std_logic_vector (2 downto 0);
-                cpu_d       : inout std_logic_vector (7 downto 0);
-
-                vblank_n    : out std_logic;
-                rd_n        : out std_logic;
-                wr_n        : out std_logic;
-                ale_n       : out std_logic;
-                vram_addr   : out std_logic_vector (13 downto 0);
-                vram_data   : inout std_logic_vector (7 downto 0);
-
-                h_sync_n    : out std_logic;
-                v_sync_n    : out std_logic;
-                r           : out std_logic_vector(3 downto 0);
-                g           : out std_logic_vector(3 downto 0);
-                b           : out std_logic_vector(3 downto 0)
+                pi_rst_n       : in std_logic;\r
+                pi_base_clk    : in std_logic;
+                pi_cpu_en      : in std_logic_vector (7 downto 0);\r
+                pi_ce_n        : in std_logic;
+                pi_r_nw        : in std_logic;
+                pi_cpu_addr    : in std_logic_vector (2 downto 0);
+                pio_cpu_d      : inout std_logic_vector (7 downto 0);
+
+                po_v_ce_n       : out std_logic;\r
+                po_v_rd_n       : out std_logic;\r
+                po_v_wr_n       : out std_logic;\r
+                po_v_addr       : out std_logic_vector (13 downto 0);\r
+                pio_v_data      : inout std_logic_vector (7 downto 0);\r
+\r
+                po_plt_ce_n     : out std_logic;\r
+                po_plt_rd_n     : out std_logic;\r
+                po_plt_wr_n     : out std_logic;\r
+                po_plt_addr     : out std_logic_vector (4 downto 0);\r
+                pio_plt_data    : inout std_logic_vector (7 downto 0);\r
+\r
+                po_spr_ce_n     : out std_logic;\r
+                po_spr_rd_n     : out std_logic;\r
+                po_spr_wr_n     : out std_logic;\r
+                po_spr_addr     : out std_logic_vector (7 downto 0);\r
+                po_spr_data     : out std_logic_vector (7 downto 0);\r
+\r
+                po_ppu_ctrl        : out std_logic_vector (7 downto 0);\r
+                po_ppu_mask        : out std_logic_vector (7 downto 0);\r
+                pi_ppu_status      : in std_logic_vector (7 downto 0);\r
+                po_ppu_scroll_x    : out std_logic_vector (7 downto 0);\r
+                po_ppu_scroll_y    : out std_logic_vector (7 downto 0)\r
     );
     end component;
 
-    component v_address_decoder
-    generic (abus_size : integer := 14; dbus_size : integer := 8);
-        port (
-                v_addr      : in std_logic_vector (13 downto 0);
-                nt_v_mirror : in std_logic;
-                pt_ce_n     : out std_logic;
-                nt0_ce_n    : out std_logic;
-                nt1_ce_n    : out std_logic
-            );
-    end component;
-
-    component chr_rom
-        generic (abus_size : integer := 13; dbus_size : integer := 8);
-        port (  
-                clk             : in std_logic;
-                ce_n            : in std_logic;     --active low.
-                addr            : in std_logic_vector (abus_size - 1 downto 0);
-                data            : out std_logic_vector (dbus_size - 1 downto 0)\r
-        );
-    end component;
-
-    component d_flip_flop
-        generic (
-                dsize : integer := 8
-                );
-        port (  clk     : in std_logic;
-                res_n   : in std_logic;
-                set_n   : in std_logic;
-                we_n    : in std_logic;
-                d       : in std_logic_vector (dsize - 1 downto 0);
-                q       : out std_logic_vector (dsize - 1 downto 0)
-            );
-    end component;
-
-    component apu
-        port (  clk         : in std_logic;
-                ce_n        : in std_logic;
-                rst_n       : in std_logic;
-                r_nw        : inout std_logic;
-                cpu_addr    : inout std_logic_vector (15 downto 0);
-                cpu_d       : inout std_logic_vector (7 downto 0);
-                rdy         : out std_logic
-        );
-    end component;
+    component ram\r
+        generic (abus_size : integer := 16; dbus_size : integer := 8);\r
+        port (\r
+                pi_base_clk     : in std_logic;\r
+                pi_ce_n         : in std_logic;\r
+                pi_oe_n         : in std_logic;\r
+                pi_we_n         : in std_logic;\r
+                pi_addr         : in std_logic_vector (abus_size - 1 downto 0);\r
+                pio_d_io        : inout std_logic_vector (dbus_size - 1 downto 0)\r
+            );\r
+    end component;\r
 \r
-    constant data_size : integer := 8;
-    constant addr_size : integer := 16;
-    constant vram_size14    : integer := 14;
-
-    constant ram_2k : integer := 11;      --2k = 11 bit width.
-    constant rom_32k : integer := 15;     --32k = 15 bit width.
-    constant rom_8k : integer := 13;     --8k = 13 bit width. (for test use)
-    constant vram_1k : integer := 10;      --1k = 10 bit width.
-    constant chr_rom_8k : integer := 13;     --32k = 15 bit width.
-
-    signal cpu_clk  : std_logic;
-    signal ppu_clk  : std_logic;
-    signal vga_clk  : std_logic;
-    signal emu_ppu_clk  : std_logic;
-    signal cpu_mem_clk     : std_logic;
-    signal cpu_recv_clk    : std_logic;
-    signal emu_ppu_mem_clk : std_logic;
-
-    signal rdy, irq_n, nmi_n, r_nw : std_logic;
-    signal addr : std_logic_vector( addr_size - 1 downto 0);
-    signal d_io : std_logic_vector( data_size - 1 downto 0);
-
-    signal rom_ce_n : std_logic;
-    signal ram_ce_n : std_logic;
-    signal ram_oe_n : std_logic;
-    signal ppu_ce_n : std_logic;
-    signal apu_ce_n : std_logic;
-
-    signal rd_n     : std_logic;
-    signal wr_n     : std_logic;
-    signal ale_n    : std_logic;
-    signal v_addr   : std_logic_vector (13 downto 0);
-    signal v_addr_ppu   : std_logic_vector (13 downto 0);
-    signal v_data   : std_logic_vector (7 downto 0);
-    signal pt_ce_n  : std_logic;
-    signal nt0_ce_n : std_logic;
-    signal nt1_ce_n : std_logic;
-
-    signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
-    signal dbg_stat_we_n    : std_logic;
-    signal dbg_idl_h, dbg_idl_l     : std_logic_vector (7 downto 0);
-
-    signal dbg_vga_clk                      : std_logic;
-    signal dbg_ppu_addr_dummy               : std_logic_vector (13 downto 0);
-    signal dbg_nes_x                        : std_logic_vector (8 downto 0);
-    signal dbg_vga_x                        : std_logic_vector (9 downto 0);
-    signal dbg_nes_y                        : std_logic_vector (8 downto 0);
-    signal dbg_vga_y                        : std_logic_vector (9 downto 0);
-    signal dbg_plt_ce_rn_wn                 : std_logic_vector (2 downto 0);
-    signal dbg_plt_addr                     : std_logic_vector (4 downto 0);
-    signal dbg_plt_data                     : std_logic_vector (7 downto 0);
-    signal dbg_p_oam_ce_rn_wn               : std_logic_vector (2 downto 0);
-    signal dbg_p_oam_addr                   : std_logic_vector (7 downto 0);
-    signal dbg_p_oam_data                   : std_logic_vector (7 downto 0);
-    signal dbg_s_oam_ce_rn_wn               : std_logic_vector (2 downto 0);
-    signal dbg_s_oam_addr                   : std_logic_vector (4 downto 0);
-    signal dbg_s_oam_data                   : std_logic_vector (7 downto 0);
-    signal dbg_s_oam_addr_cpy               : std_logic_vector (4 downto 0);
-    signal dbg_ppu_ctrl_dummy               : std_logic_vector (7 downto 0);\r
-    signal dbg_ppu_mask_dummy               : std_logic_vector (7 downto 0);\r
-    signal dbg_ppu_data_dummy               : std_logic_vector (7 downto 0);\r
-    signal dbg_ppu_status_dummy             : std_logic_vector (7 downto 0);
-    signal dbg_ppu_scrl_x_dummy             : std_logic_vector (7 downto 0);
-    signal dbg_ppu_scrl_y_dummy             : std_logic_vector (7 downto 0);
-    signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy   : std_logic_vector (15 downto 0);
-
-    signal dbg_instruction_dummy  : std_logic_vector(7 downto 0);
-    signal dbg_int_d_bus_dummy    : std_logic_vector(7 downto 0);\r
-    signal dbg_exec_cycle_dummy   : std_logic_vector (5 downto 0);
-    signal dbg_ea_carry_dummy     : std_logic;
-    signal dbg_status_dummy       : std_logic_vector(7 downto 0);
-    signal dbg_sp_dummy, dbg_x_dummy, dbg_y_dummy, dbg_acc_dummy       : std_logic_vector(7 downto 0);\r
-    signal dbg_dec_oe_n    : std_logic;\r
-    signal dbg_dec_val     : std_logic_vector (7 downto 0);\r
-    signal dbg_int_d_bus    : std_logic_vector(7 downto 0);\r
-    signal dbg_sp, dbg_x, dbg_y, dbg_acc       : std_logic_vector(7 downto 0);\r
-    signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);\r
-    signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);\r
-
+    component palette_ram\r
+        port (\r
+                pi_base_clk     : in std_logic;\r
+                pi_ce_n         : in std_logic;\r
+                pi_oe_n         : in std_logic;\r
+                pi_we_n         : in std_logic;\r
+                pi_addr         : in std_logic_vector (4 downto 0);\r
+                pio_d_io        : inout std_logic_vector (7 downto 0)\r
+            );\r
+    end component;\r
+\r
+    component chr_rom\r
+        port (  \r
+                pi_base_clk     : in std_logic;\r
+                pi_ce_n         : in std_logic;\r
+                pi_addr         : in std_logic_vector (12 downto 0);\r
+                po_data         : out std_logic_vector (7 downto 0)\r
+            );\r
+    end component;\r
+\r
+    component v_chip_selector\r
+        port (\r
+                    pi_rst_n        : in std_logic;\r
+                    pi_base_clk     : in std_logic;\r
+                    pi_v_ce_n       : in std_logic;\r
+                    pi_v_addr       : in std_logic_vector (13 downto 0);\r
+                    pi_nt_v_mirror  : in std_logic;\r
+                    po_pt_ce_n      : out std_logic;\r
+                    po_nt0_ce_n     : out std_logic;\r
+                    po_nt1_ce_n     : out std_logic\r
+            );\r
+    end component;\r
+\r
+    component render\r
+        port (\r
+            pi_rst_n       : in std_logic;\r
+            pi_base_clk    : in std_logic;\r
+            pi_rnd_en      : in std_logic_vector (3 downto 0);\r
+\r
+            --ppu i/f\r
+            pi_ppu_ctrl        : in std_logic_vector (7 downto 0);\r
+            pi_ppu_mask        : in std_logic_vector (7 downto 0);\r
+            po_ppu_status      : out std_logic_vector (7 downto 0);\r
+            pi_ppu_scroll_x    : in std_logic_vector (7 downto 0);\r
+            pi_ppu_scroll_y    : in std_logic_vector (7 downto 0);\r
 \r
-    component counter_register \r
-        generic (\r
-            dsize       : integer := 8;\r
-            inc         : integer := 1\r
-        );\r
-        port (  clk         : in std_logic;\r
-                rst_n       : in std_logic;\r
-                ce_n        : in std_logic;\r
-                we_n        : in std_logic;\r
-                d           : in std_logic_vector(dsize - 1 downto 0);\r
-                q           : out std_logic_vector(dsize - 1 downto 0)\r
-        );\r
+            --vram i/f\r
+            po_v_ce_n       : out std_logic;\r
+            po_v_rd_n       : out std_logic;\r
+            po_v_wr_n       : out std_logic;\r
+            po_v_addr       : out std_logic_vector (13 downto 0);\r
+            pi_v_data       : in std_logic_vector (7 downto 0);\r
+\r
+            --plt i/f\r
+            po_plt_ce_n     : out std_logic;\r
+            po_plt_rd_n     : out std_logic;\r
+            po_plt_wr_n     : out std_logic;\r
+            po_plt_addr     : out std_logic_vector (4 downto 0);\r
+            pi_plt_data     : in std_logic_vector (7 downto 0);\r
+\r
+            --sprite i/f\r
+            po_spr_ce_n     : out std_logic;\r
+            po_spr_rd_n     : out std_logic;\r
+            po_spr_wr_n     : out std_logic;\r
+            po_spr_addr     : out std_logic_vector (7 downto 0);\r
+            pi_spr_data     : in std_logic_vector (7 downto 0);\r
+\r
+            --vga output\r
+            po_h_sync_n    : out std_logic;\r
+            po_v_sync_n    : out std_logic;\r
+            po_r           : out std_logic_vector(3 downto 0);\r
+            po_g           : out std_logic_vector(3 downto 0);\r
+            po_b           : out std_logic_vector(3 downto 0)\r
+            );\r
     end component;\r
-    signal loop24 : std_logic_vector (23 downto 0);\r
-    signal clock_counter : std_logic_vector (63 downto 0);\r
+\r
+constant ram_2k     : integer := 11;    --2k = 11   bit width.\r
+constant rom_32k    : integer := 15;    --32k = 15  bit width.\r
+constant vram_1k    : integer := 10;    --1k = 10   bit width.\r
+\r
+signal wr_cpu_en       : std_logic_vector (7 downto 0);\r
+signal wr_rnd_en       : std_logic_vector (3 downto 0);\r
+\r
+signal wr_rdy       : std_logic;\r
+signal wr_irq_n     : std_logic;\r
+signal wr_nmi_n     : std_logic;\r
+signal wr_r_nw      : std_logic;\r
+--r_n is negative logic of wr_r_nw.\r
+signal lg_r_n       : std_logic;\r
+\r
+signal wr_addr      : std_logic_vector ( 15 downto 0);\r
+signal wr_d_io      : std_logic_vector ( 7 downto 0);\r
+\r
+signal wr_rom_ce_n     : std_logic;\r
+signal wr_ram_ce_n     : std_logic;\r
+signal wr_ppu_ce_n     : std_logic;\r
+signal wr_apu_ce_n     : std_logic;\r
+\r
+signal wr_v_ce_n        : std_logic;\r
+signal wr_v_rd_n        : std_logic;\r
+signal wr_v_wr_n        : std_logic;\r
+signal wr_v_addr        : std_logic_vector (13 downto 0);\r
+signal wr_v_data        : std_logic_vector (7 downto 0);\r
+\r
+signal wr_plt_ce_n      : std_logic;\r
+signal wr_plt_rd_n      : std_logic;\r
+signal wr_plt_wr_n      : std_logic;\r
+signal wr_plt_addr      : std_logic_vector (4 downto 0);\r
+signal wr_plt_data      : std_logic_vector (7 downto 0);\r
+\r
+signal wr_spr_ce_n      : std_logic;\r
+signal wr_spr_rd_n      : std_logic;\r
+signal wr_spr_wr_n      : std_logic;\r
+signal wr_spr_addr      : std_logic_vector (7 downto 0);\r
+signal wr_spr_data      : std_logic_vector (7 downto 0);\r
+\r
+signal wr_pt_ce_n       : std_logic;\r
+signal wr_nt0_ce_n      : std_logic;\r
+signal wr_nt1_ce_n      : std_logic;\r
+\r
+signal wr_ppu_ctrl          : std_logic_vector (7 downto 0);\r
+signal wr_ppu_mask          : std_logic_vector (7 downto 0);\r
+signal wr_ppu_status        : std_logic_vector (7 downto 0);\r
+signal wr_ppu_scroll_x      : std_logic_vector (7 downto 0);\r
+signal wr_ppu_scroll_y      : std_logic_vector (7 downto 0);\r
+\r
+signal reg_dbg_cnt          : std_logic_vector (63 downto 0);\r
 \r
 begin
-
-    irq_n <= '0';
-
-    --ppu/cpu clock generator
-    clock_inst : clock_divider port map 
-        (base_clk, rst_n, cpu_clk, ppu_clk, emu_ppu_clk, vga_clk, cpu_mem_clk, cpu_recv_clk, emu_ppu_mem_clk);
-
-    addr_dec_inst : address_decoder generic map (addr_size, data_size) \r
-        port map (addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);\r
-\r
-    --mos 6502 cpu instance
-    cpu_inst : mos6502 generic map (data_size, addr_size) 
-        port map (
-    dbg_instruction,
-    dbg_int_d_bus,\r
-    dbg_exec_cycle,
-    dbg_ea_carry,
-    dbg_status,
-    dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,\r
-    dbg_dec_oe_n,\r
-    dbg_dec_val,\r
-    dbg_stat_we_n    ,
-    dbg_idl_h, dbg_idl_l,
-
-                cpu_clk, cpu_recv_clk, rdy,
-                rst_n, irq_n, nmi_n, r_nw, 
-                addr, d_io);
-
-    --main ROM/RAM instance
-    prg_rom_inst : prg_rom generic map (rom_32k, data_size)
-            port map (cpu_mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
-
-    ram_oe_n <= not R_nW;
-    prg_ram_inst : tss_ram generic map (ram_2k, data_size)
-            port map (cpu_mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
-\r
-    --nes ppu instance
-    ppu_inst: ppu port map (  
-        dbg_ppu_ce_n                                        ,
-        dbg_ppu_ctrl_dummy, dbg_ppu_mask_dummy, dbg_ppu_status          ,
-        dbg_ppu_addr                                        ,
-        dbg_ppu_data_dummy, dbg_ppu_scrl_x, dbg_ppu_scrl_y        ,
-
-        dbg_nes_x                        ,
-        dbg_vga_x                        ,
-        dbg_nes_y                        ,
-        dbg_vga_y                        ,
-        dbg_disp_nt, dbg_disp_attr                          ,
-        dbg_disp_ptn_h, dbg_disp_ptn_l     ,
-        dbg_plt_ce_rn_wn                 ,
-        dbg_plt_addr                     ,
-        dbg_plt_data                     ,
-        dbg_p_oam_ce_rn_wn              ,
-        dbg_p_oam_addr                  ,
-        dbg_p_oam_data                  ,
-        dbg_s_oam_ce_rn_wn              ,
-        dbg_s_oam_addr                  ,
-        dbg_s_oam_data                  ,
-        dbg_s_oam_addr_cpy              ,
-
-                cpu_clk     ,
-                cpu_mem_clk     ,
-                ppu_clk         ,
-                vga_clk     ,
-                emu_ppu_clk     ,
-                emu_ppu_mem_clk     ,
-                ppu_ce_n        ,
-                rst_n       ,
-                r_nw        ,
-                addr(2 downto 0)    ,
-                d_io       ,
-
-                nmi_n    ,
-                rd_n        ,
-                wr_n        ,
-                ale_n       ,
-                v_addr_ppu      ,
-                v_data      ,
-
-                h_sync_n    ,
-                v_sync_n    ,
-                r           ,
-                g           ,
-                b           
-
-        );
-
-    ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size) 
-        port map (v_addr, nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
-
-    --transparent d-latch
-    --ale_n=0 >> addr latch\r
-    --ale_n=1 >> addr output.\r
-       vram_latch : d_flip_flop generic map (vram_size14)
-                port map(emu_ppu_mem_clk, rst_n, '1', ale_n, v_addr_ppu, v_addr);
-
-    vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
-            port map (emu_ppu_mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), v_data);
-
-    --name table/attr table
-    vram_nt0 : ram generic map (vram_1k, data_size)
-            port map (emu_ppu_mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), v_data);
-
-    vram_nt1 : ram generic map (vram_1k, data_size)
-            port map (emu_ppu_mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), v_data);
-
-    --APU/DMA instance
-    apu_inst : apu
-        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
 \r
-
-
------------------------------------------------------------\r
------------------------------------------------------------\r
-------------------debug pin setting....--------------------    \r
------------------------------------------------------------\r
------------------------------------------------------------\r
-    --for debugging cpu timing, use ppu clock for jtag clock.\r
-    dbg_base_clk <= base_clk;\r
-\r
-    clock_counter_inst : counter_register generic map (64) port map \r
-        (cpu_clk, rst_n, '0', '1', (others=>'0'), clock_counter);\r
-\r
---    led_test : counter_register generic map (24) port map \r
---        (base_clk, rst_n, '0', '1', (others=>'0'), loop24);\r
---    dbg_cpu_clk <= loop24(23);\r
---    dbg_ppu_clk <= loop24(22);\r
---    dbg_mem_clk <= loop24(21);\r
-\r
-\r
-    ----general...\r
-    dbg_cpu_clk <= cpu_clk;\r
-    dbg_ppu_clk <= ppu_clk;\r
-    dbg_emu_ppu_clk <= emu_ppu_clk;\r
-    dbg_cpu_mem_clk <= cpu_mem_clk;\r
-    dbg_vga_clk <= vga_clk;
-    dbg_r_nw <= r_nw;\r
-    dbg_addr <= addr;\r
-    dbg_d_io <= d_io;\r
-    dbg_v_addr <= v_addr;\r
-    dbg_v_data <= v_data;\r
-    dbg_nmi <= nmi_n;\r
-\r
-    ----cpu...\r
-    dbg_ppu_ctrl <= dbg_pcl;\r
-    dbg_ppu_data <= dbg_idl_l;\r
-    dbg_ppu_mask <= dbg_idl_h;\r
-\r
-    --ppu debug....\r
---    dbg_exec_cycle(0) <= dbg_nes_x(8);\r
---    dbg_instruction <= dbg_nes_x(7 downto 0);\r
---    dbg_exec_cycle(4) <= dbg_nes_y(8);\r
---    dbg_status <= dbg_nes_y(7 downto 0);\r
---\r
---    dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;\r
---    dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;\r
---    dbg_int_d_bus(4 downto 0) <= dbg_s_oam_addr(4 downto 0);
---    --dbg_ppu_scrl_y <= dbg_s_oam_data;
---    dbg_ppu_scrl_y <= dbg_ppu_scrl_y_dummy;
---\r
---    dbg_ppu_scrl_x(0) <= ale_n;
---    dbg_ppu_scrl_x(1) <= rd_n;
---    dbg_ppu_scrl_x(2) <= wr_n;
---    dbg_ppu_scrl_x(3) <= nt0_ce_n;
-
-    --nmi_n <= dummy_nmi;
-    ---------------
+    dbg_base_clk <= pi_base_clk;\r
+\r
+    --synchronized clock generator instance\r
+    clock_selector_inst : clock_selector port map (\r
+            pi_rst_n,\r
+            pi_base_clk,\r
+            wr_cpu_en,\r
+            wr_rnd_en\r
+            );\r
+\r
+    --mos 6502 cpu instance\r
+    cpu_inst : mos6502 port map (\r
+            pi_rst_n, \r
+            pi_base_clk, \r
+            wr_cpu_en, \r
+            wr_rdy,\r
+            wr_irq_n, \r
+            wr_nmi_n, \r
+            wr_r_nw, \r
+            wr_addr, \r
+            wr_d_io\r
+            );\r
+\r
+    --chip select (address decode)\r
+    cs_inst : chip_selector port map (\r
+            pi_rst_n,\r
+            pi_base_clk, \r
+            wr_addr,\r
+            wr_rom_ce_n,\r
+            wr_ram_ce_n,\r
+            wr_ppu_ce_n,\r
+            wr_apu_ce_n\r
+            );\r
+\r
+    --program rom\r
+    prom_inst : prg_rom port map (\r
+            pi_base_clk, \r
+            wr_rom_ce_n,\r
+            wr_addr(14 downto 0), \r
+            wr_d_io\r
+            );\r
+\r
+    lg_r_n <= not wr_r_nw;\r
+    --cpu ram inst.\r
+    cpu_ram_inst : ram generic map\r
+        (ram_2k, 8) port map (\r
+            pi_base_clk,\r
+            wr_ram_ce_n,\r
+            lg_r_n, \r
+            wr_r_nw, \r
+            wr_addr(10 downto 0), \r
+            wr_d_io\r
+            );\r
+\r
+    --ppu\r
+    ppu_inst : ppu port map (\r
+            pi_rst_n, \r
+            pi_base_clk, \r
+            wr_cpu_en,\r
+            wr_ppu_ce_n,\r
+            wr_r_nw, \r
+            wr_addr(2 downto 0), \r
+            wr_d_io,\r
+\r
+            wr_v_ce_n,\r
+            wr_v_rd_n,\r
+            wr_v_wr_n,\r
+            wr_v_addr,\r
+            wr_v_data,\r
+\r
+            wr_plt_ce_n,\r
+            wr_plt_rd_n,\r
+            wr_plt_wr_n,\r
+            wr_plt_addr,\r
+            wr_plt_data,\r
+\r
+            wr_spr_ce_n,\r
+            wr_spr_rd_n,\r
+            wr_spr_wr_n,\r
+            wr_spr_addr,\r
+            wr_spr_data,\r
+\r
+            --render i/f\r
+            wr_ppu_ctrl,\r
+            wr_ppu_mask,\r
+            wr_ppu_status,\r
+            wr_ppu_scroll_x,\r
+            wr_ppu_scroll_y\r
+            );\r
 \r
+    --vram chip select (address decode)\r
+    vcs_inst : v_chip_selector port map (\r
+            pi_rst_n,\r
+            pi_base_clk,\r
+            wr_v_ce_n,\r
+            wr_v_addr,\r
+            pi_nt_v_mirror,\r
+            wr_pt_ce_n,\r
+            wr_nt0_ce_n,\r
+            wr_nt1_ce_n\r
+            );\r
+\r
+    --name table/attr table #0\r
+    vram_nt0_inst : ram generic map\r
+        (vram_1k, 8) port map (\r
+            pi_base_clk,\r
+            wr_nt0_ce_n,\r
+            wr_v_rd_n,\r
+            wr_v_wr_n,\r
+            wr_v_addr(vram_1k - 1 downto 0),\r
+            wr_v_data\r
+            );\r
+\r
+    --name table/attr table #1\r
+    vram_nt1_inst : ram generic map\r
+        (vram_1k, 8) port map (\r
+            pi_base_clk,\r
+            wr_nt1_ce_n,\r
+            wr_v_rd_n,\r
+            wr_v_wr_n,\r
+            wr_v_addr(vram_1k - 1 downto 0),\r
+            wr_v_data\r
+            );\r
+\r
+    --palette table\r
+    vram_plt_inst : palette_ram port map (\r
+            pi_base_clk,\r
+            wr_plt_ce_n,\r
+            wr_plt_rd_n,\r
+            wr_plt_wr_n,\r
+            wr_plt_addr,\r
+            wr_plt_data\r
+            );\r
+\r
+    --pattern table\r
+    chr_rom_inst : chr_rom port map (\r
+            pi_base_clk,\r
+            wr_pt_ce_n,\r
+            wr_v_addr(12 downto 0),\r
+            wr_v_data\r
+            );\r
+\r
+    --palette table\r
+    spr_ram_inst : ram generic map\r
+            (8, 8) port map (\r
+            pi_base_clk,\r
+            wr_spr_ce_n,\r
+            wr_spr_rd_n,\r
+            wr_spr_wr_n,\r
+            wr_spr_addr,\r
+            wr_spr_data\r
+            );\r
+\r
+    --vga render instance\r
+    render_inst : render port map (\r
+            pi_rst_n, \r
+            pi_base_clk,\r
+            wr_rnd_en,\r
+\r
+            --ppu i/f\r
+            wr_ppu_ctrl,\r
+            wr_ppu_mask,\r
+            wr_ppu_status,\r
+            wr_ppu_scroll_x,\r
+            wr_ppu_scroll_y,\r
+\r
+            --vram i/f\r
+            wr_v_ce_n,\r
+            wr_v_rd_n,\r
+            wr_v_wr_n,\r
+            wr_v_addr,\r
+            wr_v_data,\r
+\r
+            --plt i/f\r
+            wr_plt_ce_n,\r
+            wr_plt_rd_n,\r
+            wr_plt_wr_n,\r
+            wr_plt_addr,\r
+            wr_plt_data,\r
+\r
+            --sprite i/f\r
+            wr_spr_ce_n,\r
+            wr_spr_rd_n,\r
+            wr_spr_wr_n,\r
+            wr_spr_addr,\r
+            wr_spr_data,\r
+\r
+            --vga output\r
+            po_h_sync_n,\r
+            po_v_sync_n,\r
+            po_r,\r
+            po_g,\r
+            po_b\r
+            );\r
+\r
+    wr_rdy <= '1';\r
+    wr_irq_n <= '1';\r
+    wr_nmi_n <= '1';\r
+\r
+    po_dbg_cnt <= reg_dbg_cnt;\r
+    deb_cnt_p : process (pi_rst_n, pi_base_clk)\r
+use ieee.std_logic_unsigned.all;\r
+    variable cnt : integer;\r
+    begin\r
+        if (pi_rst_n = '0') then\r
+            reg_dbg_cnt <= (others => '0');\r
+            cnt := 0;\r
+        else\r
+            if (rising_edge(pi_base_clk)) then\r
+                if (cnt = 0) then\r
+                    --debug count is half cycle because too fast to capture in st ii.\r
+                    reg_dbg_cnt <= reg_dbg_cnt + 1;\r
+                    cnt := 1;\r
+                else\r
+                    cnt := 0;\r
+                end if;\r
+            end if;\r
+        end if;\r
+    end process;\r
 end rtl;
-