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 rst_n : in std_logic;
\r
33 vga_clk : out std_logic
\r
37 architecture rtl of qt_proj_test5 is
\r
39 component clock_divider
\r
40 port ( base_clk : in std_logic;
\r
41 reset_n : in std_logic;
\r
42 cpu_clk : out std_logic;
\r
43 ppu_clk : out std_logic;
\r
44 vga_clk : out std_logic
\r
48 constant data_size : integer := 8;
\r
49 constant addr_size : integer := 16;
\r
50 constant size14 : integer := 14;
\r
52 signal cpu_clk : std_logic;
\r
53 signal ppu_clk : std_logic;
\r
54 signal vga_out_clk : std_logic;
\r
56 signal addr : std_logic_vector( addr_size - 1 downto 0);
\r
57 signal d_io : std_logic_vector( data_size - 1 downto 0);
\r
59 component counter_register
\r
61 dsize : integer := 8;
\r
64 port ( clk : in std_logic;
\r
65 rst_n : in std_logic;
\r
66 ce_n : in std_logic;
\r
67 we_n : in std_logic;
\r
68 d : in std_logic_vector(dsize - 1 downto 0);
\r
69 q : out std_logic_vector(dsize - 1 downto 0)
\r
74 generic (abus_size : integer := 15; dbus_size : integer := 8);
\r
75 port ( clk : in std_logic;
\r
76 ce_n : in std_logic; --select pin active low.
\r
77 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
78 data : inout std_logic_vector (dbus_size - 1 downto 0)
\r
82 component processor_status
\r
84 dsize : integer := 8
\r
87 signal dbg_dec_oe_n : out std_logic;
\r
88 signal dbg_dec_val : out std_logic_vector (dsize - 1 downto 0);
\r
89 signal dbg_int_dbus : out std_logic_vector (dsize - 1 downto 0);
\r
90 signal dbg_status_val : out std_logic_vector (7 downto 0);
\r
91 signal dbg_stat_we_n : out std_logic;
\r
94 res_n : in std_logic;
\r
95 dec_oe_n : in std_logic;
\r
96 bus_oe_n : in std_logic;
\r
97 set_flg_n : in std_logic;
\r
98 flg_val : in std_logic;
\r
99 load_bus_all_n : in std_logic;
\r
100 load_bus_nz_n : in std_logic;
\r
101 set_from_alu_n : in std_logic;
\r
102 alu_n : in std_logic;
\r
103 alu_v : in std_logic;
\r
104 alu_z : in std_logic;
\r
105 alu_c : in std_logic;
\r
106 stat_c : out std_logic;
\r
107 dec_val : inout std_logic_vector (dsize - 1 downto 0);
\r
108 int_dbus : inout std_logic_vector (dsize - 1 downto 0)
\r
113 signal status_reg, int_d_bus : std_logic_vector (7 downto 0);
\r
114 signal stat_dec_oe_n : std_logic;
\r
115 signal stat_bus_oe_n : std_logic;
\r
116 signal stat_set_flg_n : std_logic;
\r
117 signal stat_flg : std_logic;
\r
118 signal stat_bus_all_n : std_logic;
\r
119 signal stat_bus_nz_n : std_logic;
\r
120 signal stat_alu_we_n : std_logic;
\r
121 signal alu_n : std_logic;
\r
122 signal alu_z : std_logic;
\r
123 signal alu_c : std_logic;
\r
124 signal alu_v : std_logic;
\r
125 signal stat_c : std_logic;
\r
126 signal trig_clk : std_logic;
\r
132 d1 : in std_logic_vector(7 downto 0);
\r
133 d2 : in std_logic_vector(7 downto 0);
\r
134 d_out : out std_logic_vector(7 downto 0);
\r
135 carry_clr_n : in std_logic;
\r
136 ea_carry : out std_logic
\r
140 signal d1, d2, d_out : std_logic_vector (7 downto 0);
\r
141 signal ea_carry, gate_n : std_logic;
\r
142 signal carry_clr_n : std_logic;
\r
148 vga_clk <= vga_out_clk;
\r
149 trig_clk <= not cpu_clk;
\r
151 pcl_inst : counter_register generic map (16) port map
\r
152 (cpu_clk, rst_n, '0', '1', (others => '0'), addr(15 downto 0));
\r
154 rom_inst : prg_rom generic map (12, 8) port map
\r
155 (base_clk, '0', addr(11 downto 0), d_io);
\r
160 --ppu/cpu clock generator
\r
161 clock_inst : clock_divider port map
\r
162 (base_clk, rst_n, cpu_clk, ppu_clk, vga_out_clk);
\r
164 dbg_cpu_clk <= cpu_clk;
\r
165 dbg_ppu_clk <= ppu_clk;
\r
169 dbg_d_out <= d_out;
\r
170 dbg_ea_carry <= ea_carry;
\r
171 dbg_carry_clr_n <= carry_clr_n;
\r
172 dbg_gate_n <= gate_n;
\r
174 dummy_alu : alu_test
\r
176 d1, d2, d_out, carry_clr_n , ea_carry
\r
179 gate_n <= not ea_carry;
\r
180 dec_test_p : process (rst_n, ea_carry, trig_clk)
\r
182 if (rst_n = '0') then
\r
185 carry_clr_n <= '0';
\r
187 -- elsif (ea_carry = '1') then
\r
189 -- carry_clr_n <= '0';
\r
190 elsif (rising_edge(trig_clk)) then
\r
191 if (addr(5 downto 0) = "000001") then
\r
193 carry_clr_n <= '1';
\r
197 elsif (addr(5 downto 0) = "000010") then
\r
199 carry_clr_n <= '1';
\r
203 elsif (addr(5 downto 0) = "000011") then
\r
205 carry_clr_n <= '1';
\r
209 elsif (addr(5 downto 0) = "000100") then
\r
211 carry_clr_n <= '1';
\r
216 carry_clr_n <= '1';
\r
226 status_register : processor_status generic map (8)
\r
234 stat_dec_oe_n, stat_bus_oe_n,
\r
235 stat_set_flg_n, stat_flg, stat_bus_all_n, stat_bus_nz_n,
\r
236 stat_alu_we_n, alu_n, alu_v, alu_z, alu_c, stat_c,
\r
237 status_reg, int_d_bus);
\r
239 dbg_status <= status_reg;
\r
240 status_test_p : process (addr)
\r
242 if (addr(5 downto 0) = "000010") then
\r
244 --set status(7) = '1'
\r
245 stat_dec_oe_n <= '1';
\r
246 stat_bus_oe_n <= '1';
\r
247 stat_set_flg_n <= '0';
\r
249 stat_bus_all_n <= '1';
\r
250 stat_bus_nz_n <= '1';
\r
251 stat_alu_we_n <= '1';
\r
252 status_reg <= "01000000";
\r
253 int_d_bus <= "00000000";
\r
255 elsif (addr(5 downto 0) = "000100") then
\r
257 --set status(2) = '0'
\r
258 stat_dec_oe_n <= '1';
\r
259 stat_bus_oe_n <= '1';
\r
260 stat_set_flg_n <= '0';
\r
262 stat_bus_all_n <= '1';
\r
263 stat_bus_nz_n <= '1';
\r
264 stat_alu_we_n <= '1';
\r
265 status_reg <= "00000100";
\r
266 int_d_bus <= "00000000";
\r
268 elsif (addr(5 downto 0) = "000110") then
\r
270 --set nz from bus, n=1
\r
271 stat_dec_oe_n <= '1';
\r
272 stat_bus_oe_n <= '1';
\r
273 stat_set_flg_n <= '1';
\r
275 stat_bus_all_n <= '1';
\r
276 stat_bus_nz_n <= '0';
\r
277 stat_alu_we_n <= '1';
\r
278 status_reg <= (others => 'Z');
\r
279 int_d_bus <= "10000000";
\r
281 elsif (addr(5 downto 0) = "001000") then
\r
283 --set nz from bus, z=1
\r
284 stat_dec_oe_n <= '1';
\r
285 stat_bus_oe_n <= '1';
\r
286 stat_set_flg_n <= '1';
\r
288 stat_bus_all_n <= '1';
\r
289 stat_bus_nz_n <= '0';
\r
290 stat_alu_we_n <= '1';
\r
291 status_reg <= (others => 'Z');
\r
292 int_d_bus <= "00000000";
\r
295 stat_dec_oe_n <= '0';
\r
296 stat_bus_oe_n <= '1';
\r
297 stat_set_flg_n <= '1';
\r
299 stat_bus_all_n <= '1';
\r
300 stat_bus_nz_n <= '1';
\r
301 stat_alu_we_n <= '1';
\r
302 status_reg <= (others => 'Z');
\r
303 int_d_bus <= (others => 'Z');
\r