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
41 dram_addr : out std_logic_vector (11 downto 0); --Address (12 bit)
\r
42 dram_bank : out std_logic_vector (1 downto 0); --Bank
\r
43 dram_cas_n : out std_logic; --Column Address is being transmitted
\r
44 dram_cke : out std_logic; --Clock Enable
\r
45 dram_clk : out std_logic; --Clock
\r
46 dram_cs_n : out std_logic; --Chip Select (Here - Mask commands)
\r
47 dram_dq : inout std_logic_vector (15 downto 0); --Data in / Data out
\r
48 dram_ldqm : out std_logic; --Byte masking
\r
49 dram_udqm : out std_logic; --Byte masking
\r
50 dram_ras_n : out std_logic; --Row Address is being transmitted
\r
51 dram_we_n : out std_logic --Write Enable
\r
56 architecture rtl of qt_proj_test5 is
\r
58 component clock_divider
\r
59 port ( base_clk : in std_logic;
\r
60 reset_n : in std_logic;
\r
61 cpu_clk : out std_logic;
\r
62 ppu_clk : out std_logic;
\r
63 mem_clk : out std_logic;
\r
64 vga_clk : out std_logic
\r
69 port ( ppu_clk : in std_logic;
\r
70 rst_n : in std_logic;
\r
71 pos_x : out std_logic_vector (8 downto 0);
\r
72 pos_y : out std_logic_vector (8 downto 0);
\r
73 nes_r : out std_logic_vector (3 downto 0);
\r
74 nes_g : out std_logic_vector (3 downto 0);
\r
75 nes_b : out std_logic_vector (3 downto 0)
\r
79 component vga_clk_gen
\r
82 inclk0 : IN STD_LOGIC := '0';
\r
83 c0 : OUT STD_LOGIC ;
\r
88 signal pos_x : std_logic_vector (8 downto 0);
\r
89 signal pos_y : std_logic_vector (8 downto 0);
\r
90 signal nes_r : std_logic_vector (3 downto 0);
\r
91 signal nes_g : std_logic_vector (3 downto 0);
\r
92 signal nes_b : std_logic_vector (3 downto 0);
\r
95 port ( ppu_clk : in std_logic;
\r
96 mem_clk : in std_logic;
\r
97 vga_clk : in std_logic;
\r
98 rst_n : in std_logic;
\r
99 pos_x : in std_logic_vector (8 downto 0);
\r
100 pos_y : in std_logic_vector (8 downto 0);
\r
101 nes_r : in std_logic_vector (3 downto 0);
\r
102 nes_g : in std_logic_vector (3 downto 0);
\r
103 nes_b : in std_logic_vector (3 downto 0);
\r
104 h_sync_n : out std_logic;
\r
105 v_sync_n : out std_logic;
\r
106 r : out std_logic_vector(3 downto 0);
\r
107 g : out std_logic_vector(3 downto 0);
\r
108 b : out std_logic_vector(3 downto 0);
\r
111 wbs_adr_i : out std_logic_vector (21 downto 0); --Address (Bank, Row, Col)
\r
112 wbs_dat_i : out std_logic_vector (15 downto 0); --Data In (16 bits)
\r
113 wbs_we_i : out std_logic; --Write Enable
\r
114 wbs_tga_i : out std_logic_vector (7 downto 0); --Address Tag : Read/write burst length-1 (0 represents 1 word, FF represents 256 words)
\r
115 wbs_cyc_i : out std_logic; --Cycle Command from interface
\r
116 wbs_stb_i : out std_logic; --Strobe Command from interface
\r
117 wbs_dat_o : in std_logic_vector (15 downto 0); --Data Out (16 bits)
\r
118 wbs_stall_o : in std_logic; --Slave is not ready to receive new data
\r
119 wbs_err_o : in std_logic; --Error flag: OOR Burst. Burst length is greater that 256-column address
\r
120 wbs_ack_o : in std_logic --When Read Burst: DATA bus must be valid in this cycle
\r
124 component sdram_controller
\r
127 reset_polarity_g : std_logic := '0' --When rst = reset_polarity_g, system is in RESET mode
\r
130 --Clocks and Reset
\r
131 clk_i : in std_logic; --Wishbone input clock
\r
132 rst : in std_logic; --Reset
\r
133 pll_locked : in std_logic; --PLL Locked indication, for CKE (Clock Enable) signal to SDRAM
\r
136 dram_addr : out std_logic_vector (11 downto 0); --Address (12 bit)
\r
137 dram_bank : out std_logic_vector (1 downto 0); --Bank
\r
138 dram_cas_n : out std_logic; --Column Address is being transmitted
\r
139 dram_cke : out std_logic; --Clock Enable
\r
140 dram_cs_n : out std_logic; --Chip Select (Here - Mask commands)
\r
141 dram_dq : inout std_logic_vector (15 downto 0); --Data in / Data out
\r
142 dram_ldqm : out std_logic; --Byte masking
\r
143 dram_udqm : out std_logic; --Byte masking
\r
144 dram_ras_n : out std_logic; --Row Address is being transmitted
\r
145 dram_we_n : out std_logic; --Write Enable
\r
147 -- Wishbone Slave signals to Read/Write interface
\r
148 wbs_adr_i : in std_logic_vector (21 downto 0); --Address (Bank, Row, Col)
\r
149 wbs_dat_i : in std_logic_vector (15 downto 0); --Data In (16 bits)
\r
150 wbs_we_i : in std_logic; --Write Enable
\r
151 wbs_tga_i : in std_logic_vector (7 downto 0); --Address Tag : Read/write burst length-1 (0 represents 1 word, FF represents 256 words)
\r
152 wbs_cyc_i : in std_logic; --Cycle Command from interface
\r
153 wbs_stb_i : in std_logic; --Strobe Command from interface
\r
154 wbs_dat_o : out std_logic_vector (15 downto 0); --Data Out (16 bits)
\r
155 wbs_stall_o : out std_logic; --Slave is not ready to receive new data
\r
156 wbs_err_o : out std_logic; --Error flag: OOR Burst. Burst length is greater that 256-column address
\r
157 wbs_ack_o : out std_logic; --When Read Burst: DATA bus must be valid in this cycle
\r
158 --When Write Burst: Data has been read from SDRAM and is valid
\r
161 cmd_ack : out std_logic; --Command has been acknowledged
\r
162 cmd_done : out std_logic; --Command has finished (read/write)
\r
163 init_st_o : out std_logic_vector (3 downto 0); --Current init state
\r
164 main_st_o : out std_logic_vector (3 downto 0) --Current main state
\r
168 constant data_size : integer := 8;
\r
169 constant addr_size : integer := 16;
\r
170 constant size14 : integer := 14;
\r
172 signal cpu_clk : std_logic;
\r
173 signal ppu_clk : std_logic;
\r
174 signal mem_clk : std_logic;
\r
175 signal vga_clk : std_logic;
\r
176 signal vga_clk_pll, mem_clk_pll : std_logic;
\r
178 -- Wishbone Slave signals to Read/Write interface
\r
179 signal wbs_adr_i : std_logic_vector (21 downto 0); --Address (Bank, Row, Col)
\r
180 signal wbs_dat_i : std_logic_vector (15 downto 0); --Data In (16 bits)
\r
181 signal wbs_we_i : std_logic; --Write Enable
\r
182 signal wbs_tga_i : std_logic_vector (7 downto 0); --Address Tag : Read/write burst length-1 (0 represents 1 word, FF represents 256 words)
\r
183 signal wbs_cyc_i : std_logic; --Cycle Command from interface
\r
184 signal wbs_stb_i : std_logic; --Strobe Command from interface
\r
185 signal wbs_dat_o : std_logic_vector (15 downto 0); --Data Out (16 bits)
\r
186 signal wbs_stall_o : std_logic; --Slave is not ready to receive new data
\r
187 signal wbs_err_o : std_logic; --Error flag: OOR Burst. Burst length is greater that 256-column address
\r
188 signal wbs_ack_o : std_logic; --When Read Burst: DATA bus must be valid in this cycle
\r
189 --When Write Burst: Data has been read from SDRAM and is valid
\r
192 signal cmd_ack : std_logic; --Command has been acknowledged
\r
193 signal cmd_done : std_logic; --Command has finished (read/write)
\r
194 signal init_st_o : std_logic_vector (3 downto 0); --Current init state
\r
195 signal main_st_o : std_logic_vector (3 downto 0); --Current main state
\r
198 --ppu/cpu clock generator
\r
199 clock_inst : clock_divider port map
\r
200 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
\r
202 ppu_inst: dummy_ppu
\r
203 port map ( ppu_clk ,
\r
212 vga_clk_gen_inst : vga_clk_gen
\r
215 --mem_clk_pll = 135 MHz.
\r
216 base_clk_27mhz, vga_clk_pll, mem_clk_pll
\r
218 -- --- testbench pll clock..
\r
219 -- dummy_clock_p: process
\r
221 -- mem_clk_pll <= '1';
\r
222 -- wait for 7407 ps / 2;
\r
223 -- mem_clk_pll <= '0';
\r
224 -- wait for 7407 ps / 2;
\r
228 vga_ctl_inst : vga_ctl
\r
229 port map ( ppu_clk ,
\r
259 dram_clk <= base_clk;
\r
260 sdram_ctl_inst : sdram_controller
\r
262 --Clocks and Reset
\r
265 '1', --pll_locked : in std_logic; --PLL Locked indication, for CKE (Clock Enable) signal to SDRAM
\r
279 -- Wishbone Slave signals to Read/Write interface
\r
299 -- signal addr : std_logic_vector( addr_size - 1 downto 0);
\r
300 -- signal d_io : std_logic_vector( data_size - 1 downto 0);
\r
302 --component counter_register
\r
304 -- dsize : integer := 8;
\r
305 -- inc : integer := 1
\r
307 -- port ( clk : in std_logic;
\r
308 -- rst_n : in std_logic;
\r
309 -- ce_n : in std_logic;
\r
310 -- we_n : in std_logic;
\r
311 -- d : in std_logic_vector(dsize - 1 downto 0);
\r
312 -- q : out std_logic_vector(dsize - 1 downto 0)
\r
316 --component prg_rom
\r
317 -- generic (abus_size : integer := 15; dbus_size : integer := 8);
\r
318 -- port ( clk : in std_logic;
\r
319 -- ce_n : in std_logic; --select pin active low.
\r
320 -- addr : in std_logic_vector (abus_size - 1 downto 0);
\r
321 -- data : inout std_logic_vector (dbus_size - 1 downto 0)
\r
325 --component processor_status
\r
327 -- dsize : integer := 8
\r
330 -- signal dbg_dec_oe_n : out std_logic;
\r
331 -- signal dbg_dec_val : out std_logic_vector (dsize - 1 downto 0);
\r
332 -- signal dbg_int_dbus : out std_logic_vector (dsize - 1 downto 0);
\r
333 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
\r
334 -- signal dbg_stat_we_n : out std_logic;
\r
336 -- clk : in std_logic;
\r
337 -- res_n : in std_logic;
\r
338 -- dec_oe_n : in std_logic;
\r
339 -- bus_oe_n : in std_logic;
\r
340 -- set_flg_n : in std_logic;
\r
341 -- flg_val : in std_logic;
\r
342 -- load_bus_all_n : in std_logic;
\r
343 -- load_bus_nz_n : in std_logic;
\r
344 -- set_from_alu_n : in std_logic;
\r
345 -- alu_n : in std_logic;
\r
346 -- alu_v : in std_logic;
\r
347 -- alu_z : in std_logic;
\r
348 -- alu_c : in std_logic;
\r
349 -- stat_c : out std_logic;
\r
350 -- dec_val : inout std_logic_vector (dsize - 1 downto 0);
\r
351 -- int_dbus : inout std_logic_vector (dsize - 1 downto 0)
\r
355 -- ---status register
\r
356 -- signal status_reg, int_d_bus : std_logic_vector (7 downto 0);
\r
357 -- signal stat_dec_oe_n : std_logic;
\r
358 -- signal stat_bus_oe_n : std_logic;
\r
359 -- signal stat_set_flg_n : std_logic;
\r
360 -- signal stat_flg : std_logic;
\r
361 -- signal stat_bus_all_n : std_logic;
\r
362 -- signal stat_bus_nz_n : std_logic;
\r
363 -- signal stat_alu_we_n : std_logic;
\r
364 -- signal alu_n : std_logic;
\r
365 -- signal alu_z : std_logic;
\r
366 -- signal alu_c : std_logic;
\r
367 -- signal alu_v : std_logic;
\r
368 -- signal stat_c : std_logic;
\r
369 -- signal trig_clk : std_logic;
\r
373 -- component alu_test
\r
375 -- d1 : in std_logic_vector(7 downto 0);
\r
376 -- d2 : in std_logic_vector(7 downto 0);
\r
377 -- d_out : out std_logic_vector(7 downto 0);
\r
378 -- carry_clr_n : in std_logic;
\r
379 -- ea_carry : out std_logic
\r
383 -- signal d1, d2, d_out : std_logic_vector (7 downto 0);
\r
384 -- signal ea_carry, gate_n : std_logic;
\r
385 -- signal carry_clr_n : std_logic;
\r
390 -- trig_clk <= not cpu_clk;
\r
392 -- pcl_inst : counter_register generic map (16) port map
\r
393 -- (cpu_clk, rst_n, '0', '1', (others => '0'), addr(15 downto 0));
\r
395 -- rom_inst : prg_rom generic map (12, 8) port map
\r
396 -- (base_clk, '0', addr(11 downto 0), d_io);
\r
398 -- dbg_addr <= addr;
\r
399 -- dbg_d_io <= d_io;
\r
401 -- dbg_cpu_clk <= cpu_clk;
\r
402 -- dbg_ppu_clk <= ppu_clk;
\r
406 -- dbg_d_out <= d_out;
\r
407 -- dbg_ea_carry <= ea_carry;
\r
408 -- dbg_carry_clr_n <= carry_clr_n;
\r
409 -- dbg_gate_n <= gate_n;
\r
411 -- dummy_alu : alu_test
\r
413 -- d1, d2, d_out, carry_clr_n , ea_carry
\r
416 -- gate_n <= not ea_carry;
\r
417 -- dec_test_p : process (rst_n, ea_carry, trig_clk)
\r
419 -- if (rst_n = '0') then
\r
420 -- d1 <= "00000000";
\r
421 -- d2 <= "00000000";
\r
422 -- carry_clr_n <= '0';
\r
423 -- --gate_n <= '1';
\r
424 ---- elsif (ea_carry = '1') then
\r
425 ---- gate_n <= '0';
\r
426 ---- carry_clr_n <= '0';
\r
427 -- elsif (rising_edge(trig_clk)) then
\r
428 -- if (addr(5 downto 0) = "000001") then
\r
430 -- carry_clr_n <= '1';
\r
431 -- d1 <= "00010011";
\r
432 -- d2 <= "01000111";
\r
433 -- --gate_n <= '1';
\r
434 -- elsif (addr(5 downto 0) = "000010") then
\r
436 -- carry_clr_n <= '1';
\r
437 -- d1 <= "00110011";
\r
438 -- d2 <= "11001111";
\r
439 -- --gate_n <= '1';
\r
440 -- elsif (addr(5 downto 0) = "000011") then
\r
442 -- carry_clr_n <= '1';
\r
443 -- d1 <= "00001010";
\r
444 -- d2 <= "01011001";
\r
445 -- --gate_n <= '1';
\r
446 -- elsif (addr(5 downto 0) = "000100") then
\r
448 -- carry_clr_n <= '1';
\r
449 -- d1 <= "10001010";
\r
450 -- d2 <= "10011001";
\r
451 -- --gate_n <= '1';
\r
453 -- carry_clr_n <= '1';
\r
454 -- d1 <= "00000000";
\r
455 -- d2 <= "00000000";
\r
456 -- --gate_n <= '1';
\r
462 -- --status register
\r
463 -- status_register : processor_status generic map (8)
\r
470 -- trig_clk , rst_n,
\r
471 -- stat_dec_oe_n, stat_bus_oe_n,
\r
472 -- stat_set_flg_n, stat_flg, stat_bus_all_n, stat_bus_nz_n,
\r
473 -- stat_alu_we_n, alu_n, alu_v, alu_z, alu_c, stat_c,
\r
474 -- status_reg, int_d_bus);
\r
476 -- dbg_status <= status_reg;
\r
477 -- status_test_p : process (addr)
\r
479 -- if (addr(5 downto 0) = "000010") then
\r
481 -- --set status(7) = '1'
\r
482 -- stat_dec_oe_n <= '1';
\r
483 -- stat_bus_oe_n <= '1';
\r
484 -- stat_set_flg_n <= '0';
\r
485 -- stat_flg <= '1';
\r
486 -- stat_bus_all_n <= '1';
\r
487 -- stat_bus_nz_n <= '1';
\r
488 -- stat_alu_we_n <= '1';
\r
489 -- status_reg <= "01000000";
\r
490 -- int_d_bus <= "00000000";
\r
492 -- elsif (addr(5 downto 0) = "000100") then
\r
494 -- --set status(2) = '0'
\r
495 -- stat_dec_oe_n <= '1';
\r
496 -- stat_bus_oe_n <= '1';
\r
497 -- stat_set_flg_n <= '0';
\r
498 -- stat_flg <= '0';
\r
499 -- stat_bus_all_n <= '1';
\r
500 -- stat_bus_nz_n <= '1';
\r
501 -- stat_alu_we_n <= '1';
\r
502 -- status_reg <= "00000100";
\r
503 -- int_d_bus <= "00000000";
\r
505 -- elsif (addr(5 downto 0) = "000110") then
\r
507 -- --set nz from bus, n=1
\r
508 -- stat_dec_oe_n <= '1';
\r
509 -- stat_bus_oe_n <= '1';
\r
510 -- stat_set_flg_n <= '1';
\r
511 -- stat_flg <= '0';
\r
512 -- stat_bus_all_n <= '1';
\r
513 -- stat_bus_nz_n <= '0';
\r
514 -- stat_alu_we_n <= '1';
\r
515 -- status_reg <= (others => 'Z');
\r
516 -- int_d_bus <= "10000000";
\r
518 -- elsif (addr(5 downto 0) = "001000") then
\r
520 -- --set nz from bus, z=1
\r
521 -- stat_dec_oe_n <= '1';
\r
522 -- stat_bus_oe_n <= '1';
\r
523 -- stat_set_flg_n <= '1';
\r
524 -- stat_flg <= '0';
\r
525 -- stat_bus_all_n <= '1';
\r
526 -- stat_bus_nz_n <= '0';
\r
527 -- stat_alu_we_n <= '1';
\r
528 -- status_reg <= (others => 'Z');
\r
529 -- int_d_bus <= "00000000";
\r
532 -- stat_dec_oe_n <= '0';
\r
533 -- stat_bus_oe_n <= '1';
\r
534 -- stat_set_flg_n <= '1';
\r
535 -- stat_flg <= '1';
\r
536 -- stat_bus_all_n <= '1';
\r
537 -- stat_bus_nz_n <= '1';
\r
538 -- stat_alu_we_n <= '1';
\r
539 -- status_reg <= (others => 'Z');
\r
540 -- int_d_bus <= (others => 'Z');
\r