OSDN Git Service

merge updates
authorastoria-d <astoria-d@mail.goo.ne.jp>
Thu, 26 Sep 2013 05:46:53 +0000 (14:46 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Thu, 26 Sep 2013 05:46:53 +0000 (14:46 +0900)
de1_nes/address_decoder.vhd
de1_nes/cpu/cpu_registers.vhd
de1_nes/de1_nes.vhd
de1_nes/mem/chr_rom.vhd
de1_nes/mem/prg_rom.vhd
de1_nes/mem/ram.vhd
de1_nes/motonesfpga_common.vhd
de1_nes/ppu/ppu.vhd
de1_nes/ppu/ppu_registers.vhd
de1_nes/ppu/render.vhd

index e3ca360..9bb3864 100644 (file)
@@ -27,6 +27,18 @@ end address_decoder;
 -- * */
 
 architecture rtl of address_decoder is
+
+component ram_ctrl
+    port (  
+            clk              : in std_logic;
+            ce_n, oe_n, we_n : in std_logic;
+            sync_ce_n        : out std_logic
+        );
+end component;
+
+signal ram_ce_n_in    : std_logic;
+signal r_n            : std_logic;
+
 begin
 
     rom_ce_n <= '0' when (addr(15) = '1' and R_nW = '1') else
@@ -40,6 +52,10 @@ begin
             when (addr(15) = '0' and addr(14) = '1' and addr(13) = '0')  else
                 '1';
 
+    r_n <= not r_nw;
+    ram_ctl_inst : ram_ctrl
+            port map (mem_clk, ram_ce_n_in, r_n, r_nw, ram_ce_n);
+
     --ram io timing.
     main_p : process (phi2, addr, d_io, R_nW)
     begin
@@ -50,15 +66,15 @@ begin
             if (R_nW = '0') then
                 --write
                 --write timing slided by half clock.
-                ram_ce_n <= not phi2;
+                ram_ce_n_in <= not phi2;
             elsif (R_nW = '1') then 
                 --read
-                ram_ce_n <= '0';
+                ram_ce_n_in <= '0';
             else
-                ram_ce_n <= '1';
+                ram_ce_n_in <= '1';
             end if;
         else
-            ram_ce_n <= '1';
+            ram_ce_n_in <= '1';
         end if;
     end process;
 
index e69a658..df5eb26 100644 (file)
@@ -1,130 +1,3 @@
-
-----------------------------------------
---- d-flipflop with set/reset
-----------------------------------------
-
-library ieee;
-use ieee.std_logic_1164.all;
-
-entity d_flip_flop is 
-    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 d_flip_flop;
-
-architecture rtl of d_flip_flop is
-begin
-
-    process (clk, res_n, set_n, d)
-    begin
-        if (res_n = '0') then
-            q <= (others => '0');
-        elsif (set_n = '0') then
-            q <= d;
-        elsif (clk'event and clk = '1') then
-            if (we_n = '0') then
-                q <= d;
-            end if;
-        end if;
-    end process;
-end rtl;
-
-
---------- 1 bit d-flipflop.
-library ieee;
-use ieee.std_logic_1164.all;
-
-entity d_flip_flop_bit is 
-    port (  
-            clk     : in std_logic;
-            res_n   : in std_logic;
-            set_n   : in std_logic;
-            we_n    : in std_logic;
-            d       : in std_logic;
-            q       : out std_logic
-        );
-end d_flip_flop_bit;
-
-architecture rtl of d_flip_flop_bit is
-begin
-
-    process (clk, res_n, set_n, d)
-    begin
-        if (res_n = '0') then
-            q <= '0';
-        elsif (set_n = '0') then
-            q <= d;
-        elsif (clk'event and clk = '1') then
-            if (we_n = '0') then
-                q <= d;
-            end if;
-        end if;
-    end process;
-end rtl;
-
-----------------------------------------
---- data latch declaration
-----------------------------------------
-
-library ieee;
-use ieee.std_logic_1164.all;
-
-entity data_latch is 
-    generic (
-            dsize : integer := 8
-            );
-    port (  
-            clk     : in std_logic;
-            d       : in std_logic_vector (dsize - 1 downto 0);
-            q       : out std_logic_vector (dsize - 1 downto 0)
-        );
-end data_latch;
-
-architecture rtl of data_latch is
-begin
-
-    process (clk, d)
-    begin
-        if ( clk = '1') then
-            --latch only when clock is high
-            q <= d;
-        end if;
-    end process;
-end rtl;
-
-----------------------------------------
---- tri-state buffer
-----------------------------------------
-
-library ieee;
-use ieee.std_logic_1164.all;
-
-entity tri_state_buffer is 
-    generic (
-            dsize : integer := 8
-            );
-    port (  
-            oe_n    : in std_logic;
-            d       : in std_logic_vector (dsize - 1 downto 0);
-            q       : out std_logic_vector (dsize - 1 downto 0)
-        );
-end tri_state_buffer;
-
-architecture rtl of tri_state_buffer is
-begin
-    q <= d when oe_n = '0' else
-        (others => 'Z');
-end rtl;
-
-
 ----------------------------------------
 --- dual port d flip flop w/ tri-state buffer
 ----------------------------------------
index 22c4115..8c1791f 100644 (file)
@@ -8,31 +8,31 @@ use ieee.std_logic_unsigned.conv_integer;
 --  
 
 entity de1_nes is 
-    port (\r
---debug signal\r
-    signal dbg_cpu_clk  : out std_logic;\r
-    signal dbg_ppu_clk  : out std_logic;\r
-    signal dbg_mem_clk  : out std_logic;\r
-    signal dbg_r_nw     : out std_logic;\r
-    signal dbg_addr     : out std_logic_vector( 16 - 1 downto 0);\r
-    signal dbg_d_io     : out std_logic_vector( 8 - 1 downto 0);\r
-    signal dbg_vram_ad  : out std_logic_vector (7 downto 0);\r
-    signal dbg_vram_a   : out std_logic_vector (13 downto 8);\r
----monitor inside cpu\r
-    signal dbg_instruction  : out std_logic_vector(7 downto 0);\r
-    signal dbg_int_d_bus    : out std_logic_vector(7 downto 0);\r
-    signal dbg_exec_cycle   : out std_logic_vector (5 downto 0);\r
---    signal dbg_index_bus    : out std_logic_vector(7 downto 0);\r
---    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);\r
-    signal dbg_status       : out std_logic_vector(7 downto 0);\r
-    signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);\r
-    signal dbg_dec_oe_n    : out std_logic;\r
-    signal dbg_dec_val     : out std_logic_vector (7 downto 0);\r
-    signal dbg_int_dbus    : out std_logic_vector (7 downto 0);\r
---    signal dbg_status_val    : out std_logic_vector (7 downto 0);\r
-    signal dbg_stat_we_n    : out std_logic;\r
-\r
---NES instance\r
+    port (
+--debug signal
+    signal dbg_cpu_clk  : out std_logic;
+    signal dbg_ppu_clk  : out std_logic;
+    signal dbg_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_vram_ad  : out std_logic_vector (7 downto 0);
+    signal dbg_vram_a   : out std_logic_vector (13 downto 8);
+---monitor inside cpu
+    signal dbg_instruction  : out std_logic_vector(7 downto 0);
+    signal dbg_int_d_bus    : out std_logic_vector(7 downto 0);
+    signal dbg_exec_cycle   : out std_logic_vector (5 downto 0);
+--    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
+--    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
+    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_int_dbus    : out std_logic_vector (7 downto 0);
+--    signal dbg_status_val    : out std_logic_vector (7 downto 0);
+    signal dbg_stat_we_n    : out std_logic;
+
+--NES instance
         base_clk       : in std_logic;
         rst_n          : in std_logic;
         joypad1     : in std_logic_vector(7 downto 0);
@@ -51,20 +51,20 @@ architecture rtl of de1_nes is
         generic (   dsize : integer := 8;
                     asize : integer :=16
                 );
-        port (  \r
-    signal dbg_instruction  : out std_logic_vector(7 downto 0);\r
-    signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);\r
-    signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);\r
---    signal dbg_index_bus    : out std_logic_vector(7 downto 0);\r
---    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);\r
-    signal dbg_status       : out std_logic_vector(7 downto 0);\r
-    signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);\r
-    signal dbg_dec_oe_n    : out std_logic;\r
-    signal dbg_dec_val     : out std_logic_vector (7 downto 0);\r
-    signal dbg_int_dbus    : out std_logic_vector (7 downto 0);\r
---    signal dbg_status_val    : out std_logic_vector (7 downto 0);\r
-    signal dbg_stat_we_n    : out std_logic;\r
-\r
+        port (  
+    signal dbg_instruction  : out std_logic_vector(7 downto 0);
+    signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);
+    signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);
+--    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
+--    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
+    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_int_dbus    : out std_logic_vector (7 downto 0);
+--    signal dbg_status_val    : out std_logic_vector (7 downto 0);
+    signal dbg_stat_we_n    : out std_logic;
+
                 input_clk   : in std_logic; --phi0 input pin.
                 rdy         : in std_logic;
                 rst_n       : in std_logic;
@@ -84,45 +84,48 @@ architecture rtl of de1_nes is
                 reset_n     : in std_logic;
                 cpu_clk     : out std_logic;
                 ppu_clk     : out std_logic;
-                mem_clk     : out std_logic;\r
+                mem_clk     : out std_logic;
                 vga_clk     : out std_logic
             );
     end component;
 
     component address_decoder
     generic (abus_size : integer := 16; dbus_size : integer := 8);
-        port (  phi2        : in std_logic;\r
-                mem_clk     : in std_logic;\r
-                R_nW        : in std_logic; \r
-                addr        : in std_logic_vector (abus_size - 1 downto 0);\r
-                d_io        : in std_logic_vector (dbus_size - 1 downto 0);\r
-                rom_ce_n    : out std_logic;\r
-                ram_ce_n    : out std_logic;\r
-                ppu_ce_n    : out std_logic;\r
-                apu_ce_n    : out std_logic\r
+        port (  phi2        : in std_logic;
+                mem_clk     : in std_logic;
+                R_nW        : in std_logic; 
+                addr        : in std_logic_vector (abus_size - 1 downto 0);
+                d_io        : in std_logic_vector (dbus_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 ram\r
-        generic (abus_size : integer := 16; dbus_size : integer := 8);\r
-        port (  ce_n, oe_n, we_n  : in std_logic;   --select pin active low.\r
-                addr              : in std_logic_vector (abus_size - 1 downto 0);\r
-                d_io              : inout std_logic_vector (dbus_size - 1 downto 0)\r
-        );\r
-    end component;\r
-\r
-    component prg_rom\r
-        generic (abus_size : integer := 15; dbus_size : integer := 8);\r
-        port (\r
-                clk             : in std_logic;\r
-                ce_n            : in std_logic;     --active low.\r
-                addr            : in std_logic_vector (abus_size - 1 downto 0);\r
-                data            : out std_logic_vector (dbus_size - 1 downto 0)\r
-        );\r
-    end component;\r
-\r
+    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)
+        );
+    end component;
+
     component ppu
     port (  clk         : in std_logic;
+            mem_clk     : in std_logic;
             ce_n        : in std_logic;
             rst_n       : in std_logic;
             r_nw        : in std_logic;
@@ -160,7 +163,9 @@ architecture rtl of de1_nes is
 
     component chr_rom
         generic (abus_size : integer := 13; dbus_size : integer := 8);
-        port (  ce_n            : in std_logic;     --active low.
+        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);
                 nt_v_mirror     : out std_logic
@@ -177,7 +182,7 @@ architecture rtl of de1_nes is
                 q         : out std_logic_vector(dsize - 1 downto 0)
         );
     end component;
-\r
+
     component apu
         port (  clk         : in std_logic;
                 ce_n        : in std_logic;
@@ -193,15 +198,15 @@ architecture rtl of de1_nes is
     constant addr_size : integer := 16;
     constant vram_size14    : integer := 14;
 
-    constant ram_2k : integer := 11;      --2k = 11 bit width.\r
-    constant rom_32k : integer := 15;     --32k = 15 bit width.\r
-    constant rom_4k : integer := 12;     --4k = 12 bit width. (for test use)\r
+    constant ram_2k : integer := 11;      --2k = 11 bit width.
+    constant rom_32k : integer := 15;     --32k = 15 bit width.
+    constant rom_4k : integer := 12;     --4k = 12 bit width. (for test use)
     constant vram_1k : integer := 10;      --1k = 10 bit width.
     constant chr_rom_8k : integer := 13;     --32k = 15 bit width.
-\r
+
     signal cpu_clk  : std_logic;
     signal ppu_clk  : std_logic;
-    signal mem_clk  : std_logic;\r
+    signal mem_clk  : std_logic;
     signal vga_out_clk   : std_logic;
 
     signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
@@ -209,9 +214,9 @@ architecture rtl of de1_nes is
     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;\r
-    signal ram_ce_n : std_logic;\r
-    signal ram_oe_n : std_logic;\r
+    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;
 
@@ -226,7 +231,7 @@ architecture rtl of de1_nes is
     signal nt0_ce_n : std_logic;
     signal nt1_ce_n : std_logic;
 
-\r
+
 begin
 
     irq_n <= '0';
@@ -238,76 +243,76 @@ begin
 
     --mos 6502 cpu instance
     cpu_inst : mos6502 generic map (data_size, addr_size) 
-        port map (\r
-    dbg_instruction,\r
-    dbg_int_d_bus,\r
-    dbg_exec_cycle,\r
- --   dbg_index_bus,\r
- --   dbg_acc_bus,\r
-    dbg_status,\r
-    dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,\r
-    dbg_dec_oe_n,\r
-    dbg_dec_val,\r
-    dbg_int_dbus,\r
---    dbg_status_val    ,\r
-    dbg_stat_we_n    ,\r
-\r
-                cpu_clk, '1', --rdy, -----for testing...\r
+        port map (
+    dbg_instruction,
+    dbg_int_d_bus,
+    dbg_exec_cycle,
+ --   dbg_index_bus,
+ --   dbg_acc_bus,
+    dbg_status,
+    dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
+    dbg_dec_oe_n,
+    dbg_dec_val,
+    dbg_int_dbus,
+--    dbg_status_val    ,
+    dbg_stat_we_n    ,
+
+                cpu_clk, '1', --rdy, -----for testing...
                 rst_n, irq_n, nmi_n, dbe, r_nw, 
                 phi1, phi2, addr, d_io);
 
     addr_dec_inst : address_decoder generic map (addr_size, data_size) 
         port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
-\r
-    --main ROM/RAM instance\r
---    prg_rom_inst : prg_rom generic map (rom_32k, data_size)\r
---            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);\r
-    prg_rom_inst : prg_rom generic map (rom_4k, data_size)\r
-            port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);\r
-\r
-    ram_oe_n <= not R_nW;\r
---    prg_ram_inst : ram generic map (ram_2k, data_size)\r
---            port map (ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);\r
---\r
---    --nes ppu instance\r
---    ppu_inst : ppu \r
---        port map (ppu_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io, \r
---                nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,\r
---                vga_out_clk, h_sync_n, v_sync_n, r, g, b);\r
---\r
---    ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size) \r
---        port map (ppu_clk, rd_n, wr_n, ale, v_addr, vram_ad, \r
---                nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);\r
---\r
---    ---VRAM/CHR ROM instances\r
---    v_addr (13 downto 8) <= vram_a;\r
---\r
---    --transparent d-latch\r
---    vram_latch : ls373 generic map (data_size)\r
---                port map(ale, '0', vram_ad, v_addr(7 downto 0));\r
---\r
---    vchr_rom : chr_rom generic map (chr_rom_8k, data_size)\r
---            port map (pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);\r
---\r
---    --name table/attr table\r
---    vram_nt0 : ram generic map (vram_1k, data_size)\r
---            port map (nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);\r
---\r
---    vram_nt1 : ram generic map (vram_1k, data_size)\r
---            port map (nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);\r
---\r
---    --APU/DMA instance\r
---    apu_inst : apu\r
---        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);\r
-\r
-    dbg_cpu_clk <= cpu_clk;\r
-    dbg_ppu_clk <= ppu_clk;\r
-    dbg_mem_clk <= mem_clk;\r
-    dbg_r_nw <= r_nw;\r
-    dbg_addr <= addr;\r
-    dbg_d_io <= d_io;\r
---    dbg_vram_ad  <= vram_ad ;\r
---    dbg_vram_a   <= vram_a  ;\r
+
+    --main ROM/RAM instance
+--    prg_rom_inst : prg_rom generic map (rom_32k, data_size)
+--            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
+    prg_rom_inst : prg_rom generic map (rom_4k, data_size)
+            port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
+
+    ram_oe_n <= not R_nW;
+--    prg_ram_inst : ram generic map (ram_2k, data_size)
+--            port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
+--
+--    --nes ppu instance
+--    ppu_inst : ppu 
+--        port map (ppu_clk, mem_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io, 
+--                nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
+--                vga_out_clk, h_sync_n, v_sync_n, r, g, b);
+--
+--    ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size) 
+--        port map (ppu_clk, rd_n, wr_n, ale, v_addr, vram_ad, 
+--                nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
+--
+--    ---VRAM/CHR ROM instances
+--    v_addr (13 downto 8) <= vram_a;
+--
+--    --transparent d-latch
+--    vram_latch : ls373 generic map (data_size)
+--                port map(ale, '0', vram_ad, v_addr(7 downto 0));
+--
+--    vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
+--            port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
+--
+--    --name table/attr table
+--    vram_nt0 : ram generic map (vram_1k, data_size)
+--            port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
+--
+--    vram_nt1 : ram generic map (vram_1k, data_size)
+--            port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
+--
+--    --APU/DMA instance
+--    apu_inst : apu
+--        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
+
+    dbg_cpu_clk <= cpu_clk;
+    dbg_ppu_clk <= ppu_clk;
+    dbg_mem_clk <= mem_clk;
+    dbg_r_nw <= r_nw;
+    dbg_addr <= addr;
+    dbg_d_io <= d_io;
+--    dbg_vram_ad  <= vram_ad ;
+--    dbg_vram_a   <= vram_a  ;
 
 
 end rtl;
index d4ed6fd..ec9a6a6 100644 (file)
@@ -8,7 +8,9 @@ use work.motonesfpga_common.all;
 --asyncronous rom
 entity chr_rom is 
     generic (abus_size : integer := 13; dbus_size : integer := 8);
-    port (  ce_n            : in std_logic;     --active low.
+    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);
             nt_v_mirror     : out std_logic
@@ -73,12 +75,14 @@ begin
     
     nt_v_mirror <= vmirror;
 
-    p : process (ce_n, addr)
+    p : process (clk)
     begin
-    if (ce_n = '0') then
-        data <= p_rom(conv_integer(addr));
-    else
-        data <= (others => 'Z');
+    if (rising_edge(clk)) then
+        if (ce_n = '0') then
+            data <= p_rom(conv_integer(addr));
+        else
+            data <= (others => 'Z');
+        end if;
     end if;
     end process;
 end rtl;
index 5694f8f..cbf40cb 100644 (file)
@@ -77,7 +77,7 @@ begin
 
     p : process (clk)
     begin
-    if(rising_edge(clk)) then
+    if (rising_edge(clk)) then
         if (ce_n = '0') then
             data <= p_rom(conv_integer(addr));
         else
index 08cab96..86c4ec4 100644 (file)
@@ -6,7 +6,9 @@ use ieee.std_logic_unsigned.conv_integer;
 ----SRAM asyncronous memory.
 entity ram is 
     generic (abus_size : integer := 16; dbus_size : integer := 8);
-    port (  ce_n, oe_n, we_n : in std_logic;   --select pin active low.
+    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)
         );
@@ -25,19 +27,23 @@ constant RAM_TAOE : time := 25 ns;      --OE access time
 constant RAM_TOH : time := 10 ns;       --write data hold time
 
 begin
-    p_write : process (ce_n, we_n)
+    p_write : process (clk)
     begin
-    if (ce_n = '0' and we_n = '0') then
-        work_ram(conv_integer(addr)) <= d_io;
+    if (rising_edge(clk)) then
+        if (ce_n = '0' and we_n = '0') then
+            work_ram(conv_integer(addr)) <= d_io;
+        end if;
     end if;
     end process;
 
-    p_read : process (ce_n, oe_n, addr)
+    p_read : process (clk)
     begin
-    if (ce_n= '0' and we_n = '1' and oe_n = '0') then
-        d_io <= work_ram(conv_integer(addr));
-    else
-        d_io <= (others => 'Z');
+    if (rising_edge(clk)) then
+        if (ce_n= '0' and we_n = '1' and oe_n = '0') then
+            d_io <= work_ram(conv_integer(addr));
+        else
+            d_io <= (others => 'Z');
+        end if;
     end if;
     end process;
 end rtl;
@@ -53,7 +59,9 @@ use ieee.std_logic_1164.all;
 
 entity palette_ram is 
     generic (abus_size : integer := 16; dbus_size : integer := 8);
-    port (  ce_n, oe_n, we_n : in std_logic;   --select pin active low.
+    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)
         );
@@ -62,7 +70,9 @@ end palette_ram;
 architecture rtl of palette_ram is
 component ram
     generic (abus_size : integer := 5; dbus_size : integer := 8);
-    port (  ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
+    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)
     );
@@ -75,7 +85,55 @@ begin
     plt_addr <= "0" & addr(3 downto 0) when addr (4) = '1' and addr (1) = '0' and addr (0) = '0' else
                 addr;
     palette_ram_inst : ram generic map (abus_size, dbus_size)
-            port map (ce_n, oe_n, we_n, plt_addr, d_io);
+            port map (clk, ce_n, oe_n, we_n, plt_addr, d_io);
+
+end rtl;
+
+-----------------------------------------------------
+-----------------------------------------------------
+--------------- ram timing adjuster -----------------
+-----------------------------------------------------
+-----------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity ram_ctrl is 
+    port (  
+            clk              : in std_logic;
+            ce_n, oe_n, we_n : in std_logic;
+            sync_ce_n        : out std_logic
+        );
+end ram_ctrl;
+
+architecture rtl of ram_ctrl is
+component counter_register
+    generic (
+        dsize       : integer := 8;
+        inc         : integer := 1
+    );
+    port (  clk         : in std_logic;
+            rst_n       : in std_logic;
+            ce_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;
+
+signal cnt_rst_n    : std_logic;
+signal clk_cnt      : std_logic_vector(5 downto 0);
+
+begin
+
+    cnt_rst_n <= not ce_n;
+
+    counter_inst : counter_register generic map (6, 1)
+            port map (clk, cnt_rst_n, '0', '1', (others => '0'), clk_cnt);
+
+    sync_ce_n <= '0' when ce_n = '0' and oe_n = '0' and we_n = '1' else
+                 '0' when ce_n = '0' and oe_n = '1' and we_n = '0' and clk_cnt = "000001" else
+                 '1';
 
 end rtl;
 
index acf7b94..22b3a99 100644 (file)
@@ -76,3 +76,195 @@ end;
 
 end motonesfpga_common;
 
+-------------------------------------------------------------
+-------------------------------------------------------------
+-------------------------------------------------------------
+------------------ other common modules ---------------------
+-------------------------------------------------------------
+-------------------------------------------------------------
+-------------------------------------------------------------
+
+----------------------------------------
+--- d-flipflop with set/reset
+----------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity d_flip_flop is 
+    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 d_flip_flop;
+
+architecture rtl of d_flip_flop is
+begin
+
+    process (clk, res_n, set_n, d)
+    begin
+        if (res_n = '0') then
+            q <= (others => '0');
+        elsif (set_n = '0') then
+            q <= d;
+        elsif (clk'event and clk = '1') then
+            if (we_n = '0') then
+                q <= d;
+            end if;
+        end if;
+    end process;
+end rtl;
+
+
+--------- 1 bit d-flipflop.
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity d_flip_flop_bit is 
+    port (  
+            clk     : in std_logic;
+            res_n   : in std_logic;
+            set_n   : in std_logic;
+            we_n    : in std_logic;
+            d       : in std_logic;
+            q       : out std_logic
+        );
+end d_flip_flop_bit;
+
+architecture rtl of d_flip_flop_bit is
+begin
+
+    process (clk, res_n, set_n, d)
+    begin
+        if (res_n = '0') then
+            q <= '0';
+        elsif (set_n = '0') then
+            q <= d;
+        elsif (clk'event and clk = '1') then
+            if (we_n = '0') then
+                q <= d;
+            end if;
+        end if;
+    end process;
+end rtl;
+
+----------------------------------------
+--- data latch declaration
+----------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity data_latch is 
+    generic (
+            dsize : integer := 8
+            );
+    port (  
+            clk     : in std_logic;
+            d       : in std_logic_vector (dsize - 1 downto 0);
+            q       : out std_logic_vector (dsize - 1 downto 0)
+        );
+end data_latch;
+
+architecture rtl of data_latch is
+begin
+
+    process (clk, d)
+    begin
+        if ( clk = '1') then
+            --latch only when clock is high
+            q <= d;
+        end if;
+    end process;
+end rtl;
+
+----------------------------------------
+--- tri-state buffer
+----------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity tri_state_buffer is 
+    generic (
+            dsize : integer := 8
+            );
+    port (  
+            oe_n    : in std_logic;
+            d       : in std_logic_vector (dsize - 1 downto 0);
+            q       : out std_logic_vector (dsize - 1 downto 0)
+        );
+end tri_state_buffer;
+
+architecture rtl of tri_state_buffer is
+begin
+    q <= d when oe_n = '0' else
+        (others => 'Z');
+end rtl;
+
+-------------------------------
+------ count up registers -----
+-------------------------------
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity counter_register is 
+    generic (
+        dsize       : integer := 8;
+        inc         : integer := 1
+    );
+    port (  clk         : in std_logic;
+            rst_n       : in std_logic;
+            ce_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 counter_register;
+
+architecture rtl of counter_register is
+
+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;
+
+use ieee.std_logic_unsigned.all;
+
+signal dff_we_n : std_logic;
+signal d_in : std_logic_vector(dsize - 1 downto 0);
+signal q_out : std_logic_vector(dsize - 1 downto 0);
+
+begin
+    q <= q_out;
+    dff_we_n <= ce_n and we_n;
+    counter_reg_inst : d_flip_flop generic map (dsize)
+            port map (clk, rst_n, '1', dff_we_n, d_in, q_out);
+        
+    clk_p : process (clk, we_n, ce_n, d)
+    begin
+        if (we_n = '0') then
+            d_in <= d;
+        elsif (ce_n = '0') then
+            d_in <= q_out + inc;
+        end if;
+    end process;
+
+end rtl;
+
index 387852a..e05bc2d 100644 (file)
@@ -4,6 +4,7 @@ use work.motonesfpga_common.all;
 
 entity ppu is 
     port (  clk         : in std_logic;
+            mem_clk     : in std_logic;
             ce_n        : in std_logic;
             rst_n       : in std_logic;
             r_nw        : in std_logic;
@@ -28,6 +29,7 @@ architecture rtl of ppu is
 
 component ppu_render
     port (  clk         : in std_logic;
+            mem_clk     : in std_logic;
             rst_n       : in std_logic;
             rd_n        : out std_logic;
             wr_n        : out std_logic;
@@ -168,7 +170,7 @@ signal plt_data_out     : std_logic_vector (dsize - 1 downto 0);
 
 begin
 
-    render_inst : ppu_render port map (clk, rst_n,
+    render_inst : ppu_render port map (clk, mem_clk, rst_n,
             rd_n, wr_n, ale, vram_ad, vram_a,
             pos_x, pos_y, nes_r, nes_g, nes_b,
             ppu_ctrl, ppu_mask, read_status, ppu_status, ppu_scroll_x, ppu_scroll_y,
index 2c1e74c..adae470 100644 (file)
@@ -59,68 +59,6 @@ begin
 end rtl;
 
 -------------------------------
------- count up registers -----
--------------------------------
-library ieee;
-use ieee.std_logic_1164.all;
-
-entity counter_register is 
-    
-    generic (
-        dsize       : integer := 8;
-        inc         : integer := 1
-    );
-    port (  clk         : in std_logic;
-            rst_n       : in std_logic;
-            ce_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 counter_register;
-
-architecture rtl of counter_register is
-
-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;
-
-use ieee.std_logic_unsigned.all;
-
-signal dff_we_n : std_logic;
-signal d_in : std_logic_vector(dsize - 1 downto 0);
-signal q_out : std_logic_vector(dsize - 1 downto 0);
-
-begin
-    q <= q_out;
-    dff_we_n <= ce_n and we_n;
-    counter_reg_inst : d_flip_flop generic map (dsize)
-            port map (clk, rst_n, '1', dff_we_n, d_in, q_out);
-        
-    clk_p : process (clk, we_n, ce_n, d)
-    begin
-        if (we_n = '0') then
-            d_in <= d;
-        elsif (ce_n = '0') then
-            d_in <= q_out + inc;\r
-        else\r
-            d_in <= (others => 'Z');
-        end if;
-    end process;
-
-end rtl;
-
--------------------------------
 -- LS373 transparent D-latch---
 -------------------------------
 library ieee;
index f2ba44e..3cac701 100644 (file)
@@ -6,6 +6,7 @@ use work.motonesfpga_common.all;
 
 entity ppu_render is 
     port (  clk         : in std_logic;
+            mem_clk     : in std_logic;
             rst_n       : in std_logic;
             rd_n        : out std_logic;
             wr_n        : out std_logic;
@@ -89,7 +90,9 @@ end component;
 
 component ram
     generic (abus_size : integer := 16; dbus_size : integer := 8);
-    port (  ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
+    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)
     );
@@ -97,7 +100,9 @@ end component;
 
 component palette_ram
     generic (abus_size : integer := 16; dbus_size : integer := 8);
-    port (  ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
+    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)
     );
@@ -509,7 +514,7 @@ begin
     plt_d_buf_r : tri_state_buffer generic map (dsize)
             port map (r_n, plt_data, oam_plt_data);
     palette_inst : palette_ram generic map (5, dsize)
-            port map (plt_ram_ce_n, plt_r_n, plt_w_n, plt_addr, plt_data);
+            port map (mem_clk, plt_ram_ce_n, plt_r_n, plt_w_n, plt_addr, plt_data);
 
     ---primary oam
     oam_ram_ce_n <= clk when oam_bus_ce_n = '0' and r_nw = '0' else
@@ -540,7 +545,7 @@ begin
     oam_d_buf_r : tri_state_buffer generic map (dsize)
             port map (r_n, oam_data, oam_plt_data);
     primary_oam_inst : ram generic map (dsize, dsize)
-            port map (oam_ram_ce_n, oam_r_n, oam_w_n, oam_addr, oam_data);
+            port map (mem_clk, oam_ram_ce_n, oam_r_n, oam_w_n, oam_addr, oam_data);
 
     ---secondary oam
     p_oam_cnt_inst : counter_register generic map (dsize, 4)
@@ -562,10 +567,10 @@ begin
                                 cur_x > conv_std_logic_vector(256, X_SIZE) and
                                 cur_x <= conv_std_logic_vector(320, X_SIZE) and
                                 s_oam_addr_cpy_n = '0' else
-                    '1';
+                      '1';
 
     secondary_oam_inst : ram generic map (5, dsize)
-            port map (s_oam_ram_ce_n, s_oam_r_n, s_oam_w_n, s_oam_addr, s_oam_data);
+            port map (mem_clk, s_oam_ram_ce_n, s_oam_r_n, s_oam_w_n, s_oam_addr, s_oam_data);
 
     spr_y_inst : d_flip_flop generic map(dsize)
             port map (clk_n, p_oam_cnt_res_n, '1', spr_y_we_n, s_oam_data, spr_y_tmp);