OSDN Git Service

ppu rework...
authorastoria-d <astoria-d@mail.goo.ne.jp>
Mon, 8 Aug 2016 09:39:32 +0000 (18:39 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Mon, 8 Aug 2016 09:39:32 +0000 (18:39 +0900)
de1_nes/ppu/vga_ppu.vhd

index 7dd9256..5a4e22a 100644 (file)
@@ -205,7 +205,6 @@ signal vga_y        : std_logic_vector (9 downto 0);
 signal x_res_n      : std_logic;\r
 signal y_res_n      : std_logic;\r
 signal y_en_n       : std_logic;\r
-signal vga_clk_n    : std_logic;\r
 \r
 signal emu_ppu_clk_n    : std_logic;\r
 signal nes_x        : std_logic_vector (8 downto 0);\r
@@ -395,10 +394,27 @@ constant nes_color_palette : nes_color_array := (
 begin\r
     dbg_vga_x <= vga_x;\r
     dbg_vga_y <= vga_y;\r
+    dbg_nes_x <= nes_x;\r
+    dbg_nes_y <= nes_y;\r
+    dbg_disp_nt <= disp_nt;\r
+    dbg_disp_attr <= disp_attr;\r
+    dbg_disp_ptn_h <= disp_ptn_h;\r
+    dbg_disp_ptn_l <= disp_ptn_l;\r
+    dbg_plt_addr <= plt_addr;\r
+    dbg_plt_data <= plt_data;\r
+    dbg_plt_ce_rn_wn               <= plt_ram_ce_n & plt_r_n & plt_w_n;\r
+    dbg_p_oam_ce_rn_wn               <= p_oam_ram_ce_n & p_oam_r_n & p_oam_w_n;\r
+    dbg_p_oam_addr                   <= p_oam_addr;\r
+    dbg_p_oam_data                   <= p_oam_data;\r
+    dbg_s_oam_ce_rn_wn               <= s_oam_ram_ce_n & s_oam_r_n & s_oam_w_n;\r
+    dbg_s_oam_addr                   <= s_oam_addr;\r
+    dbg_s_oam_data                   <= s_oam_data;\r
+\r
 \r
-    vga_clk_n <= not vga_clk;\r
     \r
+    -----------------------------------------\r
     --vga position counter\r
+    -----------------------------------------\r
     vga_x_inst : counter_register generic map (10, 1)\r
             port map (vga_clk, x_res_n, '0', '1', (others => '0'), vga_x);\r
     vga_y_inst : counter_register generic map (10, 1)\r
@@ -445,37 +461,16 @@ begin
         end if;\r
     end process;\r
 \r
+\r
+    -----------------------------------------\r
+    ---emurated ppu clock and nes positions...\r
+    -----------------------------------------\r
     emu_ppu_clk_n <= not emu_ppu_clk;\r
     nes_x <= vga_x(9 downto 1);\r
     --debug purpose, accelarate the clock...\r
     nes_y <= vga_y(9 downto 1);\r
     --nes_y <= vga_y(8 downto 0);\r
 \r
-------------------------------------------------------------------------\r
-------------------------------------------------------------------------\r
-------------------------------------------------------------------------\r
-------------------------------------------------------------------------\r
------------------------- ppu render instance... ------------------------\r
-------------------------------------------------------------------------\r
-------------------------------------------------------------------------\r
-------------------------------------------------------------------------\r
-------------------------------------------------------------------------\r
-\r
-    dbg_nes_x <= nes_x;\r
-    dbg_nes_y <= nes_y;\r
-    dbg_disp_nt <= disp_nt;\r
-    dbg_disp_attr <= disp_attr;\r
-    dbg_disp_ptn_h <= disp_ptn_h;\r
-    dbg_disp_ptn_l <= disp_ptn_l;\r
-    dbg_plt_addr <= plt_addr;\r
-    dbg_plt_data <= plt_data;\r
-    dbg_plt_ce_rn_wn               <= plt_ram_ce_n & plt_r_n & plt_w_n;\r
-    dbg_p_oam_ce_rn_wn               <= p_oam_ram_ce_n & p_oam_r_n & p_oam_w_n;\r
-    dbg_p_oam_addr                   <= p_oam_addr;\r
-    dbg_p_oam_data                   <= p_oam_data;\r
-    dbg_s_oam_ce_rn_wn               <= s_oam_ram_ce_n & s_oam_r_n & s_oam_w_n;\r
-    dbg_s_oam_addr                   <= s_oam_addr;\r
-    dbg_s_oam_data                   <= s_oam_data;\r
 \r
     -----------------------------------------\r
     ---vram access signals\r
@@ -528,6 +523,7 @@ begin
             '1';\r
     v_bus_busy_n <= ah_oe_n;\r
 \r
+\r
     -----------------------------------------\r
     --vram i/o\r
     -----------------------------------------\r
@@ -537,6 +533,97 @@ begin
     vram_a_buf : tri_state_buffer generic map (6)\r
             port map (ah_oe_n, vram_addr(asize - 1 downto dsize), vram_a);\r
 \r
+\r
+    -----------------------------------------\r
+    ---palette ram\r
+    -----------------------------------------\r
+    r_n <= not r_nw;\r
+\r
+    plt_ram_ce_n_in <= '0' when plt_bus_ce_n = '0' and r_nw = '0' else \r
+                    '0' when plt_bus_ce_n = '0' and r_nw = '1' else\r
+                    '0' when ppu_mask(PPUSBG) = '1' and \r
+                            (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and \r
+                            (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) else\r
+                    '1';\r
+\r
+    plt_addr <= oam_plt_addr(4 downto 0) when plt_bus_ce_n = '0' else\r
+                "1" & spr_attr(0)(1 downto 0) & spr_ptn_h(0)(0) & spr_ptn_l(0)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(0) = "00000000" and \r
+                        (spr_ptn_h(0)(0) or spr_ptn_l(0)(0)) = '1' else\r
+                "1" & spr_attr(1)(1 downto 0) & spr_ptn_h(1)(0) & spr_ptn_l(1)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(1) = "00000000" and \r
+                        (spr_ptn_h(1)(0) or spr_ptn_l(1)(0)) = '1' else\r
+                "1" & spr_attr(2)(1 downto 0) & spr_ptn_h(2)(0) & spr_ptn_l(2)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and \r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(2) = "00000000" and\r
+                        (spr_ptn_h(2)(0) or spr_ptn_l(2)(0)) = '1' else\r
+                "1" & spr_attr(3)(1 downto 0) & spr_ptn_h(3)(0) & spr_ptn_l(3)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(3) = "00000000" and\r
+                        (spr_ptn_h(3)(0) or spr_ptn_l(3)(0)) = '1' else\r
+                "1" & spr_attr(4)(1 downto 0) & spr_ptn_h(4)(0) & spr_ptn_l(4)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(4) = "00000000" and\r
+                        (spr_ptn_h(4)(0) or spr_ptn_l(4)(0)) = '1' else\r
+                "1" & spr_attr(5)(1 downto 0) & spr_ptn_h(5)(0) & spr_ptn_l(5)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(5) = "00000000" and\r
+                        (spr_ptn_h(5)(0) or spr_ptn_l(5)(0)) = '1' else\r
+                "1" & spr_attr(6)(1 downto 0) & spr_ptn_h(6)(0) & spr_ptn_l(6)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(6) = "00000000" and\r
+                        (spr_ptn_h(6)(0) or spr_ptn_l(6)(0)) = '1' else\r
+                "1" & spr_attr(7)(1 downto 0) & spr_ptn_h(7)(0) & spr_ptn_l(7)(0)\r
+                    when ppu_mask(PPUSSP) = '1' and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
+                        spr_x_cnt(7) = "00000000" and\r
+                        (spr_ptn_h(7)(0) or spr_ptn_l(7)(0)) = '1' else\r
+                "0" & disp_attr(1 downto 0) & disp_ptn_h(0) & disp_ptn_l(0) \r
+                    when ppu_mask(PPUSBG) = '1' and nes_y(4) = '0' and\r
+                        ((disp_ptn_h(0) or disp_ptn_l(0)) = '1') and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) else\r
+                "0" & disp_attr(5 downto 4) & disp_ptn_h(0) & disp_ptn_l(0)\r
+                    when ppu_mask(PPUSBG) = '1' and nes_y(4) = '1' and\r
+                        ((disp_ptn_h(0) or disp_ptn_l(0)) = '1') and\r
+                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) else\r
+                ---else: no output color >> universal bg color output.\r
+                --0x3f00 is the universal bg palette.\r
+                (others => '0');    \r
+\r
+    plt_r_n <= not r_nw when plt_bus_ce_n = '0' else\r
+                '0' when ppu_mask(PPUSBG) = '1' else\r
+                '1';\r
+    plt_w_n <= r_nw when plt_bus_ce_n = '0' else\r
+                '1';\r
+    plt_d_buf_w : tri_state_buffer generic map (dsize)\r
+            port map (plt_w_n, oam_plt_data, plt_data);\r
+    plt_d_buf_r : tri_state_buffer generic map (dsize)\r
+            port map (plt_r_n, plt_data, oam_plt_data);\r
+    plt_ram_ctl : ram_ctrl generic map (1)\r
+            port map (mem_clk, plt_ram_ce_n_in, plt_r_n, plt_w_n, plt_ram_ce_n);\r
+    palette_inst : palette_ram generic map (5, dsize)\r
+            port map (mem_clk, plt_ram_ce_n, plt_r_n, plt_w_n, plt_addr, plt_data);\r
+\r
+\r
     -----------------------------------------\r
     ---primary oam implementation...\r
     -----------------------------------------\r
@@ -635,94 +722,6 @@ begin
                 port map (emu_ppu_clk_n, rst_n, spr_ptn_ce_n(i), spr_ptn_h_we_n(i), spr_ptn_in, spr_ptn_h(i));\r
     end generate;\r
 \r
-    -----------------------------------------\r
-    ---palette ram\r
-    -----------------------------------------\r
-    r_n <= not r_nw;\r
-\r
-    plt_ram_ce_n_in <= '0' when plt_bus_ce_n = '0' and r_nw = '0' else \r
-                    '0' when plt_bus_ce_n = '0' and r_nw = '1' else\r
-                    '0' when ppu_mask(PPUSBG) = '1' and \r
-                            (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and \r
-                            (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) else\r
-                    '1';\r
-\r
-    plt_addr <= oam_plt_addr(4 downto 0) when plt_bus_ce_n = '0' else\r
-                "1" & spr_attr(0)(1 downto 0) & spr_ptn_h(0)(0) & spr_ptn_l(0)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(0) = "00000000" and \r
-                        (spr_ptn_h(0)(0) or spr_ptn_l(0)(0)) = '1' else\r
-                "1" & spr_attr(1)(1 downto 0) & spr_ptn_h(1)(0) & spr_ptn_l(1)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(1) = "00000000" and \r
-                        (spr_ptn_h(1)(0) or spr_ptn_l(1)(0)) = '1' else\r
-                "1" & spr_attr(2)(1 downto 0) & spr_ptn_h(2)(0) & spr_ptn_l(2)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and \r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(2) = "00000000" and\r
-                        (spr_ptn_h(2)(0) or spr_ptn_l(2)(0)) = '1' else\r
-                "1" & spr_attr(3)(1 downto 0) & spr_ptn_h(3)(0) & spr_ptn_l(3)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(3) = "00000000" and\r
-                        (spr_ptn_h(3)(0) or spr_ptn_l(3)(0)) = '1' else\r
-                "1" & spr_attr(4)(1 downto 0) & spr_ptn_h(4)(0) & spr_ptn_l(4)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(4) = "00000000" and\r
-                        (spr_ptn_h(4)(0) or spr_ptn_l(4)(0)) = '1' else\r
-                "1" & spr_attr(5)(1 downto 0) & spr_ptn_h(5)(0) & spr_ptn_l(5)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(5) = "00000000" and\r
-                        (spr_ptn_h(5)(0) or spr_ptn_l(5)(0)) = '1' else\r
-                "1" & spr_attr(6)(1 downto 0) & spr_ptn_h(6)(0) & spr_ptn_l(6)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(6) = "00000000" and\r
-                        (spr_ptn_h(6)(0) or spr_ptn_l(6)(0)) = '1' else\r
-                "1" & spr_attr(7)(1 downto 0) & spr_ptn_h(7)(0) & spr_ptn_l(7)(0)\r
-                    when ppu_mask(PPUSSP) = '1' and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) and\r
-                        spr_x_cnt(7) = "00000000" and\r
-                        (spr_ptn_h(7)(0) or spr_ptn_l(7)(0)) = '1' else\r
-                "0" & disp_attr(1 downto 0) & disp_ptn_h(0) & disp_ptn_l(0) \r
-                    when ppu_mask(PPUSBG) = '1' and nes_y(4) = '0' and\r
-                        ((disp_ptn_h(0) or disp_ptn_l(0)) = '1') and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) else\r
-                "0" & disp_attr(5 downto 4) & disp_ptn_h(0) & disp_ptn_l(0)\r
-                    when ppu_mask(PPUSBG) = '1' and nes_y(4) = '1' and\r
-                        ((disp_ptn_h(0) or disp_ptn_l(0)) = '1') and\r
-                        (nes_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                        (nes_y < conv_std_logic_vector(VSCAN, X_SIZE)) else\r
-                ---else: no output color >> universal bg color output.\r
-                --0x3f00 is the universal bg palette.\r
-                (others => '0');    \r
-\r
-    plt_r_n <= not r_nw when plt_bus_ce_n = '0' else\r
-                '0' when ppu_mask(PPUSBG) = '1' else\r
-                '1';\r
-    plt_w_n <= r_nw when plt_bus_ce_n = '0' else\r
-                '1';\r
-    plt_d_buf_w : tri_state_buffer generic map (dsize)\r
-            port map (plt_w_n, oam_plt_data, plt_data);\r
-    plt_d_buf_r : tri_state_buffer generic map (dsize)\r
-            port map (plt_r_n, plt_data, oam_plt_data);\r
-    plt_ram_ctl : ram_ctrl generic map (1)\r
-            port map (mem_clk, plt_ram_ce_n_in, plt_r_n, plt_w_n, plt_ram_ce_n);\r
-    palette_inst : palette_ram generic map (5, dsize)\r
-            port map (mem_clk, plt_ram_ce_n, plt_r_n, plt_w_n, plt_addr, plt_data);\r
 \r
     -----------------------------------------\r
     ---sprite main process\r