OSDN Git Service

integration with the cpu bus ok.
authorastoria-d <astoria-d@mail.goo.ne.jp>
Tue, 9 Jul 2013 07:23:15 +0000 (16:23 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Tue, 9 Jul 2013 07:23:15 +0000 (16:23 +0900)
simulation/ppu/ppu.vhd
simulation/ppu/testbench_ppu.vhd

index 47f2c5e..ffa6616 100644 (file)
@@ -156,11 +156,6 @@ begin
             r_nw, oam_bus_ce_n, oam_addr, oam_data,
             plt_bus_ce_n, plt_addr, plt_data);
 
---    render_ad_buf : tri_state_buffer generic map (dsize)
---            port map ('0', render_vram_ad, vram_ad);
---    render_d_buf : tri_state_buffer generic map (6)
---            port map ('0', render_vram_a, vram_a);
-
     vga_inst : vga_ctl port map (clk, vga_clk, rst_n, 
             pos_x, pos_y, nes_r, nes_g, nes_b,
             h_sync_n, v_sync_n, r, g, b);
@@ -251,25 +246,41 @@ begin
                     ppu_addr_cnt_ce_n <= '0';
                     ppu_addr_we_n <= '0';
                     if (ppu_addr_cnt(0) = '0') then
+                        --if address is 3fxx, set palette table.
                         ppu_addr_in <= cpu_d(5 downto 0) & ppu_addr(7 downto 0);
-                        ale <= '1';
                     else
                         ppu_addr_in <= ppu_addr(13 downto 8) & cpu_d;
-                        vram_ad <= ppu_addr(7 downto 0);
-                        vram_a <= ppu_addr(13 downto 8);
-                        ale <= '0';
+                        if (ppu_addr(13 downto 8) = "111111") then
+                            plt_addr <= cpu_d(4 downto 0);
+                            ale <= '0';
+                        else
+                            vram_ad <= cpu_d;
+                            vram_a <= ppu_addr(13 downto 8);
+                            ale <= '1';
+                        end if;
                     end if;
                 else
                     ppu_addr_cnt_ce_n <= '1';
                     ppu_addr_we_n <= '1';
-                    ale <= '1';
+                    ale <= '0';
                 end if;
 
                 if(cpu_addr = PPUDATA) then
                     ppu_data_we_n <= '0';
                     rd_n <= not r_nw;
                     wr_n <= r_nw;
+                    if (ppu_addr(13 downto 8) = "111111") then
+                        --case palette tbl.
+                        plt_bus_ce_n <= '0';
+                        plt_data <= cpu_d(5 downto 0);
+                    else
+                        plt_bus_ce_n <= '1';
+                        if (r_nw = '0') then
+                            vram_ad <= cpu_d;
+                        end if;
+                    end if;
                 else
+                    plt_bus_ce_n <= '1';
                     ppu_data_we_n <= '1';
                     rd_n <= '1';
                     wr_n <= '1';
@@ -289,44 +300,18 @@ begin
                 ppu_addr_cnt_ce_n    <= '1';
                 ppu_data_we_n    <= '1';
 
+                plt_bus_ce_n <= '1';
+
                 ale <= 'Z';
                 rd_n <= 'Z';
                 wr_n <= 'Z';
                 vram_ad <= (others => 'Z');
                 vram_a <= (others => 'Z');
             end if; --if (ce_n = '0') then
-        else
 
         end if;--if (clk'event and clk = '1') then
 
     end process;
 
-----test init value set.
---    p_palette_init : process
---    variable i : integer := 0;
---use ieee.std_logic_arith.all;
---constant ppu_clk_time : time := 186 ns;
---    begin
---        wait for 7 us;
---
---        --fill palette teble.
---        plt_bus_ce_n <= '0';
---        plt_r_nw <= '0';
---        for i in 0 to 32 loop
---            plt_addr <= conv_std_logic_vector(i, 5);
---            plt_data <= conv_std_logic_vector((i - 1) * 4 + 17, 6);
---            wait for ppu_clk_time;
---        end loop;
---        plt_bus_ce_n <= '1';
---
---        ---TODO: for the time being...
---        plt_bus_ce_n <= 'Z';
---        plt_r_nw <= 'Z';
---        plt_addr <= (others => 'Z');
---        plt_data <= (others => 'Z');
---
---        wait;
---    end process;
-
 end rtl;
 
index baf2be3..ebba264 100644 (file)
@@ -40,18 +40,6 @@ architecture stimulus of testbench_ppu is
             );
     end component;
 
-    component test_module_init_data
-        port (  clk             : in std_logic;
-                v_rd_n          : out std_logic;
-                v_wr_n          : out std_logic;
-                v_ale           : out std_logic;
-                v_ad            : out std_logic_vector (7 downto 0);
-                v_a             : out std_logic_vector (13 downto 8);
-                cpu_addr        : out std_logic_vector (2 downto 0);
-                cpu_d           : out std_logic_vector (7 downto 0)
-        );
-    end component;
-
     component vga_device
     port (  vga_clk     : in std_logic;
             rst_n       : in std_logic;
@@ -100,11 +88,6 @@ begin
                 vblank_n, rd_n, wr_n, ale, vram_ad, vram_a,
                 vga_clk, h_sync_n, v_sync_n, r, g, b);
 
---    -----fill test data during the reset.....
---    init_data : test_module_init_data 
---        port map (clk, rd_n, wr_n, ale, vram_ad, vram_a,
---                cpu_addr, cpu_d);
-
     ppu_addr_decoder : v_address_decoder generic map (size14, size8) 
         port map (clk, rd_n, wr_n, ale, vram_ad, vram_a);
 
@@ -137,9 +120,10 @@ begin
         wait for vga_clk_time / 2;
     end process;
 
+    --test data set.
     test_init_p : process
     variable i : integer := 0;
-    constant loopcnt : integer := 15;
+    constant loopcnt : integer := 40;
     begin
         wait for test_init_time + test_reset_time + ppu_clk_time / 2;
         ce_n <= '0';
@@ -164,14 +148,24 @@ begin
             wait for ppu_clk_time;
 
             --attr tbl set.
---            cpu_addr <= "110";
---            cpu_d <= conv_std_logic_vector(16#23c0# + i, 16)(15 downto 8);
---            wait for ppu_clk_time;
---            cpu_d <= conv_std_logic_vector(16#23c0# + i, 16)(7 downto 0);
---            wait for ppu_clk_time;
---            cpu_addr <= "111";
---            cpu_d <= conv_std_logic_vector(16#5a# + 3 * i, 8);
---            wait for ppu_clk_time;
+            cpu_addr <= "110";
+            cpu_d <= conv_std_logic_vector(16#23c0# + i, 16)(15 downto 8);
+            wait for ppu_clk_time;
+            cpu_d <= conv_std_logic_vector(16#23c0# + i, 16)(7 downto 0);
+            wait for ppu_clk_time;
+            cpu_addr <= "111";
+            cpu_d <= conv_std_logic_vector(16#5a# + 3 * i, 8);
+            wait for ppu_clk_time;
+
+            --palette tbl set.
+            cpu_addr <= "110";
+            cpu_d <= conv_std_logic_vector(16#3f00# + i, 16)(15 downto 8);
+            wait for ppu_clk_time;
+            cpu_d <= conv_std_logic_vector(16#3f00# + i, 16)(7 downto 0);
+            wait for ppu_clk_time;
+            cpu_addr <= "111";
+            cpu_d <= conv_std_logic_vector((i - 1 ) * 4 + 17, 8);
+            wait for ppu_clk_time;
         end loop;
 
         --enable show bg.
@@ -188,115 +182,3 @@ begin
 
 end stimulus ;
 
-
-
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
---       initialize with dummy data
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
-library IEEE;
-use IEEE.std_logic_1164.all;
-use ieee.std_logic_arith.all;
-
-entity test_module_init_data is
-    port (  clk             : in std_logic;
-            v_rd_n          : out std_logic;
-            v_wr_n          : out std_logic;
-            v_ale           : out std_logic;
-            v_ad            : out std_logic_vector (7 downto 0);
-            v_a             : out std_logic_vector (13 downto 8);
-            cpu_addr        : out std_logic_vector (2 downto 0);
-            cpu_d           : out std_logic_vector (7 downto 0)
-    );
-end test_module_init_data;
-
-architecture stimulus of test_module_init_data is
-
-    constant ppu_clk : time := 186 ns;
-    constant size8 : integer := 8;
-    constant size16 : integer := 16;
-    constant size14 : integer := 14;
-
-constant test_init_time : time := 7 us;
-constant test_reset_time : time := 20 us;
-
-    signal v_addr       : std_logic_vector (size14 - 1 downto 0);
-
-begin
-
-    v_ad <= v_addr(size8 - 1 downto 0);
-    v_a <= v_addr(size14 - 1 downto size8);
-
-    -----test for vram/chr-rom
-    p_vram_init : process
-    variable i : integer := 0;
-    variable tmp : std_logic_vector (size8 - 1 downto 0);
-    constant loopcnt : integer := 15;
-    begin
-
-        ---dummy power up wait (same amount of time as testbench)
-        wait for test_init_time;
-
-        --copy from chr rom to name tbl.
-        for i in 0 to loopcnt loop
-            --write name tbl #0
-            v_ale <= '1';
-            v_rd_n <= '1';
-            v_wr_n <= '1';
-            v_addr <= conv_std_logic_vector(16#2000# + i, size14);
-            wait for ppu_clk;
-            v_addr(7 downto 0) <= (others => 'Z');
-            v_ale <= '0';
-            v_rd_n <= '1';
-            v_wr_n <= '0';
-            ---bg start from 0.
-            v_addr(7 downto 0) <= conv_std_logic_vector(i + 32, size8);
-            wait for ppu_clk;
-
-            --write attr tbl #0
-            v_ale <= '1';
-            v_rd_n <= '1';
-            v_wr_n <= '1';
-            v_addr <= conv_std_logic_vector(16#23c0# + i, size14);
-            wait for ppu_clk;
-            v_addr(7 downto 0) <= (others => 'Z');
-            v_ale <= '0';
-            v_rd_n <= '1';
-            v_wr_n <= '0';
-            v_addr(7 downto 0) <= conv_std_logic_vector(16#a0# + i, size8);
-            wait for ppu_clk;
-        end loop;
-
-        v_ale <= 'Z';
-        v_rd_n <= 'Z';
-        v_wr_n <= 'Z';
-        v_addr <= (others => 'Z');
-
-        wait;
-    end process;
-
---    p_palette_init : process
---    variable i : integer := 0;
---    begin
---        wait for 7 us;
---
---        --fill palette teble.
---        plt_bus_ce_n <= '0';
---        plt_r_nw <= '0';
---        for i in 0 to 32 loop
---            plt_addr <= conv_std_logic_vector(i, 5);
---            plt_data <= conv_std_logic_vector((i - 1) * 4 + 17, 6);
---            wait for ppu_clk;
---        end loop;
---        plt_bus_ce_n <= '1';
---        plt_data <= (others => 'Z');
---
---        wait;
---    end process;
-
-end stimulus ;