OSDN Git Service

async param test
[motonesfpga/motonesfpga.git] / tools / qt_proj_test5 / qt_proj_test5.vhd
1 library ieee;\r
2 use ieee.std_logic_1164.all;\r
3 use ieee.std_logic_unsigned.conv_integer;\r
4 \r
5 --  \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
8 --  \r
9 \r
10 entity qt_proj_test5 is \r
11     port (\r
12 \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
17 \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
24     \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
29 \r
30 \r
31         base_clk        : in std_logic;\r
32         rst_n           : in std_logic;\r
33         vga_clk     : out std_logic\r
34          );\r
35 end qt_proj_test5;\r
36 \r
37 architecture rtl of qt_proj_test5 is\r
38 \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
45             );\r
46     end component;\r
47 \r
48     constant data_size : integer := 8;\r
49     constant addr_size : integer := 16;\r
50     constant size14    : integer := 14;\r
51 \r
52     signal cpu_clk  : std_logic;\r
53     signal ppu_clk  : std_logic;\r
54     signal vga_out_clk   : std_logic;\r
55 \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
58 \r
59 component counter_register\r
60     generic (\r
61         dsize       : integer := 8;\r
62         inc         : integer := 1\r
63     );\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
70     );\r
71 end component;\r
72 \r
73 component prg_rom\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
79         );\r
80 end component;\r
81 \r
82 component processor_status \r
83     generic (\r
84             dsize : integer := 8\r
85             );\r
86     port (  \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
92     \r
93             clk         : in 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
109         );\r
110 end component;\r
111 \r
112     ---status register\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
127     \r
128     \r
129     \r
130     component alu_test\r
131     port (  \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
137         );\r
138 end component;\r
139 \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
143 \r
144 \r
145 \r
146 begin\r
147 \r
148     vga_clk <= vga_out_clk;\r
149     trig_clk <= not cpu_clk;\r
150 \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
153 \r
154     rom_inst : prg_rom generic map (12, 8) port map\r
155         (base_clk, '0', addr(11 downto 0), d_io);\r
156 \r
157     dbg_addr <= addr;\r
158     dbg_d_io <= d_io;\r
159 \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
163 \r
164     dbg_cpu_clk <= cpu_clk;\r
165     dbg_ppu_clk <= ppu_clk;\r
166 \r
167     dbg_d1 <= d1;\r
168     dbg_d2 <= d2;\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
173     \r
174     dummy_alu : alu_test\r
175     port map (  \r
176         d1, d2, d_out, carry_clr_n , ea_carry\r
177         );\r
178 \r
179         gate_n <= not ea_carry;\r
180     dec_test_p : process (rst_n, ea_carry, trig_clk)\r
181     begin\r
182         if (rst_n = '0') then\r
183             d1 <= "00000000";\r
184             d2 <= "00000000";\r
185             carry_clr_n <= '0';\r
186             --gate_n <= '1';\r
187 --        elsif (ea_carry = '1') then\r
188 --            gate_n <= '0';\r
189 --            carry_clr_n <= '0';\r
190         elsif (rising_edge(trig_clk)) then\r
191             if (addr(5 downto 0) = "000001") then\r
192             --addr=01\r
193                 carry_clr_n <= '1';\r
194                 d1 <= "00010011";\r
195                 d2 <= "01000111";\r
196                 --gate_n <= '1';\r
197             elsif (addr(5 downto 0) = "000010") then\r
198             --addr=02\r
199                 carry_clr_n <= '1';\r
200                 d1 <= "00110011";\r
201                 d2 <= "11001111";\r
202                 --gate_n <= '1';\r
203             elsif (addr(5 downto 0) = "000011") then\r
204             --addr=03\r
205                 carry_clr_n <= '1';\r
206                 d1 <= "00001010";\r
207                 d2 <= "01011001";\r
208                 --gate_n <= '1';\r
209             elsif (addr(5 downto 0) = "000100") then\r
210             --addr=04\r
211                 carry_clr_n <= '1';\r
212                 d1 <= "10001010";\r
213                 d2 <= "10011001";\r
214                 --gate_n <= '1';\r
215             else\r
216                 carry_clr_n <= '1';\r
217                 d1 <= "00000000";\r
218                 d2 <= "00000000";\r
219                 --gate_n <= '1';\r
220             end if;\r
221         end if;\r
222     end process;\r
223 \r
224 \r
225     --status register\r
226     status_register : processor_status generic map (8) \r
227             port map (\r
228     dbg_dec_oe_n,\r
229     dbg_dec_val,\r
230     dbg_int_dbus,\r
231     dbg_status_val,\r
232     dbg_stat_we_n    ,\r
233                     trig_clk , rst_n, \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
238 \r
239     dbg_status <= status_reg;\r
240     status_test_p : process (addr)\r
241     begin\r
242         if (addr(5 downto 0) = "000010") then\r
243         --addr=02\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
248             stat_flg <= '1';\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
254 \r
255         elsif (addr(5 downto 0) = "000100") then\r
256         --addr=04\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
261             stat_flg <= '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
267 \r
268         elsif (addr(5 downto 0) = "000110") then\r
269         --addr=06\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
274             stat_flg <= '0';\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
280 \r
281         elsif (addr(5 downto 0) = "001000") then\r
282         --addr=08\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
287             stat_flg <= '0';\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
293 \r
294         else\r
295             stat_dec_oe_n <= '0';\r
296             stat_bus_oe_n <= '1';\r
297             stat_set_flg_n <= '1';\r
298             stat_flg <= '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
304         end if;\r
305     end process;\r
306 \r
307 end rtl;\r
308 \r