2 use ieee.std_logic_1164.all;
\r
3 use ieee.std_logic_unsigned.conv_integer;
\r
6 -- MOTO NES FPGA On GHDL Simulation Environment Virtual Cuicuit Board
\r
7 -- All of the components are assembled and instanciated on this board.
\r
10 entity qt_proj_test5 is
\r
13 signal dbg_cpu_clk : out std_logic;
\r
14 signal dbg_ppu_clk : out std_logic;
\r
15 signal dbg_addr : out std_logic_vector( 16 - 1 downto 0);
\r
16 signal dbg_d_io : out std_logic_vector( 8 - 1 downto 0);
\r
18 signal dbg_status : out std_logic_vector(7 downto 0);
\r
19 signal dbg_dec_oe_n : out std_logic;
\r
20 signal dbg_dec_val : out std_logic_vector (7 downto 0);
\r
21 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
\r
22 signal dbg_status_val : out std_logic_vector (7 downto 0);
\r
23 signal dbg_stat_we_n : out std_logic;
\r
25 ---monitor inside cpu
\r
26 signal dbg_d1, dbg_d2, dbg_d_out: out std_logic_vector (7 downto 0);
\r
27 signal dbg_ea_carry, dbg_carry_clr_n : out std_logic;
\r
28 signal dbg_gate_n : out std_logic;
\r
31 base_clk : in std_logic;
\r
32 base_clk_27mhz : in std_logic;
\r
33 rst_n : in std_logic;
\r
34 h_sync_n : out std_logic;
\r
35 v_sync_n : out std_logic;
\r
36 r : out std_logic_vector(3 downto 0);
\r
37 g : out std_logic_vector(3 downto 0);
\r
38 b : out std_logic_vector(3 downto 0)
\r
42 architecture rtl of qt_proj_test5 is
\r
44 component clock_divider
\r
45 port ( base_clk : in std_logic;
\r
46 reset_n : in std_logic;
\r
47 cpu_clk : out std_logic;
\r
48 ppu_clk : out std_logic;
\r
49 vga_clk : out std_logic
\r
54 port ( ppu_clk : in std_logic;
\r
55 rst_n : in std_logic;
\r
56 pos_x : out std_logic_vector (8 downto 0);
\r
57 pos_y : out std_logic_vector (8 downto 0);
\r
58 nes_r : out std_logic_vector (3 downto 0);
\r
59 nes_g : out std_logic_vector (3 downto 0);
\r
60 nes_b : out std_logic_vector (3 downto 0)
\r
64 component vga_clk_gen
\r
67 inclk0 : IN STD_LOGIC := '0';
\r
72 signal pos_x : std_logic_vector (8 downto 0);
\r
73 signal pos_y : std_logic_vector (8 downto 0);
\r
74 signal nes_r : std_logic_vector (3 downto 0);
\r
75 signal nes_g : std_logic_vector (3 downto 0);
\r
76 signal nes_b : std_logic_vector (3 downto 0);
\r
79 port ( ppu_clk : in std_logic;
\r
80 vga_clk : in std_logic;
\r
81 rst_n : in std_logic;
\r
82 pos_x : in std_logic_vector (8 downto 0);
\r
83 pos_y : in std_logic_vector (8 downto 0);
\r
84 nes_r : in std_logic_vector (3 downto 0);
\r
85 nes_g : in std_logic_vector (3 downto 0);
\r
86 nes_b : in std_logic_vector (3 downto 0);
\r
87 h_sync_n : out std_logic;
\r
88 v_sync_n : out std_logic;
\r
89 r : out std_logic_vector(3 downto 0);
\r
90 g : out std_logic_vector(3 downto 0);
\r
91 b : out std_logic_vector(3 downto 0)
\r
96 constant data_size : integer := 8;
\r
97 constant addr_size : integer := 16;
\r
98 constant size14 : integer := 14;
\r
100 signal cpu_clk : std_logic;
\r
101 signal ppu_clk : std_logic;
\r
102 signal vga_clk : std_logic;
\r
103 signal vga_clk_pll : std_logic;
\r
106 signal addr : std_logic_vector( addr_size - 1 downto 0);
\r
107 signal d_io : std_logic_vector( data_size - 1 downto 0);
\r
109 component counter_register
\r
111 dsize : integer := 8;
\r
114 port ( clk : in std_logic;
\r
115 rst_n : in std_logic;
\r
116 ce_n : in std_logic;
\r
117 we_n : in std_logic;
\r
118 d : in std_logic_vector(dsize - 1 downto 0);
\r
119 q : out std_logic_vector(dsize - 1 downto 0)
\r
124 generic (abus_size : integer := 15; dbus_size : integer := 8);
\r
125 port ( clk : in std_logic;
\r
126 ce_n : in std_logic; --select pin active low.
\r
127 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
128 data : inout std_logic_vector (dbus_size - 1 downto 0)
\r
132 component processor_status
\r
134 dsize : integer := 8
\r
137 signal dbg_dec_oe_n : out std_logic;
\r
138 signal dbg_dec_val : out std_logic_vector (dsize - 1 downto 0);
\r
139 signal dbg_int_dbus : out std_logic_vector (dsize - 1 downto 0);
\r
140 signal dbg_status_val : out std_logic_vector (7 downto 0);
\r
141 signal dbg_stat_we_n : out std_logic;
\r
143 clk : in std_logic;
\r
144 res_n : in std_logic;
\r
145 dec_oe_n : in std_logic;
\r
146 bus_oe_n : in std_logic;
\r
147 set_flg_n : in std_logic;
\r
148 flg_val : in std_logic;
\r
149 load_bus_all_n : in std_logic;
\r
150 load_bus_nz_n : in std_logic;
\r
151 set_from_alu_n : in std_logic;
\r
152 alu_n : in std_logic;
\r
153 alu_v : in std_logic;
\r
154 alu_z : in std_logic;
\r
155 alu_c : in std_logic;
\r
156 stat_c : out std_logic;
\r
157 dec_val : inout std_logic_vector (dsize - 1 downto 0);
\r
158 int_dbus : inout std_logic_vector (dsize - 1 downto 0)
\r
163 signal status_reg, int_d_bus : std_logic_vector (7 downto 0);
\r
164 signal stat_dec_oe_n : std_logic;
\r
165 signal stat_bus_oe_n : std_logic;
\r
166 signal stat_set_flg_n : std_logic;
\r
167 signal stat_flg : std_logic;
\r
168 signal stat_bus_all_n : std_logic;
\r
169 signal stat_bus_nz_n : std_logic;
\r
170 signal stat_alu_we_n : std_logic;
\r
171 signal alu_n : std_logic;
\r
172 signal alu_z : std_logic;
\r
173 signal alu_c : std_logic;
\r
174 signal alu_v : std_logic;
\r
175 signal stat_c : std_logic;
\r
176 signal trig_clk : std_logic;
\r
182 d1 : in std_logic_vector(7 downto 0);
\r
183 d2 : in std_logic_vector(7 downto 0);
\r
184 d_out : out std_logic_vector(7 downto 0);
\r
185 carry_clr_n : in std_logic;
\r
186 ea_carry : out std_logic
\r
190 signal d1, d2, d_out : std_logic_vector (7 downto 0);
\r
191 signal ea_carry, gate_n : std_logic;
\r
192 signal carry_clr_n : std_logic;
\r
197 --ppu/cpu clock generator
\r
198 clock_inst : clock_divider port map
\r
199 (base_clk, rst_n, cpu_clk, ppu_clk, vga_clk);
\r
201 ppu_inst: dummy_ppu
\r
202 port map ( ppu_clk ,
\r
211 vga_clk_gen_inst : vga_clk_gen
\r
214 base_clk_27mhz, vga_clk_pll
\r
218 vga_ctl_inst : vga_ctl
\r
219 port map ( ppu_clk ,
\r
237 -- trig_clk <= not cpu_clk;
\r
239 -- pcl_inst : counter_register generic map (16) port map
\r
240 -- (cpu_clk, rst_n, '0', '1', (others => '0'), addr(15 downto 0));
\r
242 -- rom_inst : prg_rom generic map (12, 8) port map
\r
243 -- (base_clk, '0', addr(11 downto 0), d_io);
\r
245 -- dbg_addr <= addr;
\r
246 -- dbg_d_io <= d_io;
\r
248 -- dbg_cpu_clk <= cpu_clk;
\r
249 -- dbg_ppu_clk <= ppu_clk;
\r
253 -- dbg_d_out <= d_out;
\r
254 -- dbg_ea_carry <= ea_carry;
\r
255 -- dbg_carry_clr_n <= carry_clr_n;
\r
256 -- dbg_gate_n <= gate_n;
\r
258 -- dummy_alu : alu_test
\r
260 -- d1, d2, d_out, carry_clr_n , ea_carry
\r
263 -- gate_n <= not ea_carry;
\r
264 -- dec_test_p : process (rst_n, ea_carry, trig_clk)
\r
266 -- if (rst_n = '0') then
\r
267 -- d1 <= "00000000";
\r
268 -- d2 <= "00000000";
\r
269 -- carry_clr_n <= '0';
\r
270 -- --gate_n <= '1';
\r
271 ---- elsif (ea_carry = '1') then
\r
272 ---- gate_n <= '0';
\r
273 ---- carry_clr_n <= '0';
\r
274 -- elsif (rising_edge(trig_clk)) then
\r
275 -- if (addr(5 downto 0) = "000001") then
\r
277 -- carry_clr_n <= '1';
\r
278 -- d1 <= "00010011";
\r
279 -- d2 <= "01000111";
\r
280 -- --gate_n <= '1';
\r
281 -- elsif (addr(5 downto 0) = "000010") then
\r
283 -- carry_clr_n <= '1';
\r
284 -- d1 <= "00110011";
\r
285 -- d2 <= "11001111";
\r
286 -- --gate_n <= '1';
\r
287 -- elsif (addr(5 downto 0) = "000011") then
\r
289 -- carry_clr_n <= '1';
\r
290 -- d1 <= "00001010";
\r
291 -- d2 <= "01011001";
\r
292 -- --gate_n <= '1';
\r
293 -- elsif (addr(5 downto 0) = "000100") then
\r
295 -- carry_clr_n <= '1';
\r
296 -- d1 <= "10001010";
\r
297 -- d2 <= "10011001";
\r
298 -- --gate_n <= '1';
\r
300 -- carry_clr_n <= '1';
\r
301 -- d1 <= "00000000";
\r
302 -- d2 <= "00000000";
\r
303 -- --gate_n <= '1';
\r
309 -- --status register
\r
310 -- status_register : processor_status generic map (8)
\r
317 -- trig_clk , rst_n,
\r
318 -- stat_dec_oe_n, stat_bus_oe_n,
\r
319 -- stat_set_flg_n, stat_flg, stat_bus_all_n, stat_bus_nz_n,
\r
320 -- stat_alu_we_n, alu_n, alu_v, alu_z, alu_c, stat_c,
\r
321 -- status_reg, int_d_bus);
\r
323 -- dbg_status <= status_reg;
\r
324 -- status_test_p : process (addr)
\r
326 -- if (addr(5 downto 0) = "000010") then
\r
328 -- --set status(7) = '1'
\r
329 -- stat_dec_oe_n <= '1';
\r
330 -- stat_bus_oe_n <= '1';
\r
331 -- stat_set_flg_n <= '0';
\r
332 -- stat_flg <= '1';
\r
333 -- stat_bus_all_n <= '1';
\r
334 -- stat_bus_nz_n <= '1';
\r
335 -- stat_alu_we_n <= '1';
\r
336 -- status_reg <= "01000000";
\r
337 -- int_d_bus <= "00000000";
\r
339 -- elsif (addr(5 downto 0) = "000100") then
\r
341 -- --set status(2) = '0'
\r
342 -- stat_dec_oe_n <= '1';
\r
343 -- stat_bus_oe_n <= '1';
\r
344 -- stat_set_flg_n <= '0';
\r
345 -- stat_flg <= '0';
\r
346 -- stat_bus_all_n <= '1';
\r
347 -- stat_bus_nz_n <= '1';
\r
348 -- stat_alu_we_n <= '1';
\r
349 -- status_reg <= "00000100";
\r
350 -- int_d_bus <= "00000000";
\r
352 -- elsif (addr(5 downto 0) = "000110") then
\r
354 -- --set nz from bus, n=1
\r
355 -- stat_dec_oe_n <= '1';
\r
356 -- stat_bus_oe_n <= '1';
\r
357 -- stat_set_flg_n <= '1';
\r
358 -- stat_flg <= '0';
\r
359 -- stat_bus_all_n <= '1';
\r
360 -- stat_bus_nz_n <= '0';
\r
361 -- stat_alu_we_n <= '1';
\r
362 -- status_reg <= (others => 'Z');
\r
363 -- int_d_bus <= "10000000";
\r
365 -- elsif (addr(5 downto 0) = "001000") then
\r
367 -- --set nz from bus, z=1
\r
368 -- stat_dec_oe_n <= '1';
\r
369 -- stat_bus_oe_n <= '1';
\r
370 -- stat_set_flg_n <= '1';
\r
371 -- stat_flg <= '0';
\r
372 -- stat_bus_all_n <= '1';
\r
373 -- stat_bus_nz_n <= '0';
\r
374 -- stat_alu_we_n <= '1';
\r
375 -- status_reg <= (others => 'Z');
\r
376 -- int_d_bus <= "00000000";
\r
379 -- stat_dec_oe_n <= '0';
\r
380 -- stat_bus_oe_n <= '1';
\r
381 -- stat_set_flg_n <= '1';
\r
382 -- stat_flg <= '1';
\r
383 -- stat_bus_all_n <= '1';
\r
384 -- stat_bus_nz_n <= '1';
\r
385 -- stat_alu_we_n <= '1';
\r
386 -- status_reg <= (others => 'Z');
\r
387 -- int_d_bus <= (others => 'Z');
\r