Rev 61 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 61 | Rev 118 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | // part of NeoGS project (c) 2007-2008 NedoPC |
1 | // part of NeoGS flash programmer project (c) 2014 lvd^NedoPC |
2 | // |
2 | // |
- | 3 | // reset controller |
|
3 | 4 | ||
- | 5 | module reset |
|
- | 6 | ( |
|
- | 7 | input wire clk_fpga, |
|
- | 8 | input wire clk_24mhz, |
|
4 | 9 | ||
5 | module resetter( |
10 | input wire init, |
- | 11 | output reg init_in_progress, |
|
6 | 12 | ||
- | 13 | output wire zxbus_rst_n, |
|
- | 14 | output reg rom_rst_n, |
|
7 | clk, |
15 | output reg z80_rst_n, |
8 | 16 | ||
9 | rst_in1_n, |
17 | output reg z80_busrq_n, |
10 | rst_in2_n, |
18 | input wire z80_busak_n |
- | 19 | ); |
|
11 | 20 | ||
12 | rst_out_n ); |
21 | parameter RST_CNT_SIZE = 8; |
13 | 22 | ||
- | 23 | reg [RST_CNT_SIZE:0] poweron_rst_cnt; |
|
14 | parameter RST_CNT_SIZE = 3; |
24 | reg [RST_CNT_SIZE:0] rz_rst_cnt; |
15 | 25 | ||
- | 26 | wire poweron_rst_n = poweron_rst_cnt[RST_CNT_SIZE]; |
|
16 | 27 | ||
17 | input clk; |
28 | wire rz_rst_n = rz_rst_cnt[RST_CNT_SIZE]; |
18 | 29 | ||
19 | input rst_in1_n; // input of external asynchronous reset 1 |
- | |
20 | input rst_in2_n; // input of external asynchronous reset 2 |
30 | reg z80_rst2; |
21 | 31 | ||
22 | output reg rst_out_n; // output of end-synchronized reset (beginning is asynchronous to clock) |
32 | reg [1:0] z80_halted; |
23 | 33 | ||
24 | 34 | ||
- | 35 | // make overall reset from poweron |
|
- | 36 | // |
|
- | 37 | initial |
|
- | 38 | poweron_rst_cnt <= 'd0; |
|
- | 39 | // |
|
- | 40 | always @(posedge clk_24mhz) |
|
- | 41 | if( !poweron_rst_n ) |
|
- | 42 | poweron_rst_cnt <= poweron_rst_cnt + 'd1; |
|
25 | 43 | ||
26 | reg [RST_CNT_SIZE:0] rst_cnt; // one bit more for counter stopping |
- | |
27 | - | ||
28 | reg rst1_n,rst2_n; |
- | |
29 | - | ||
30 | wire resets_n; |
- | |
31 | 44 | ||
- | 45 | // make zxbus reset |
|
- | 46 | assign zxbus_rst_n = poweron_rst_n; |
|
32 | 47 | ||
33 | assign resets_n = rst_in1_n & rst_in2_n; |
- | |
34 | 48 | ||
- | 49 | // make rom/z80 reset |
|
- | 50 | // |
|
35 | always @(posedge clk, negedge resets_n) |
51 | always @(posedge clk_24mhz, negedge poweron_rst_n) |
- | 52 | if( !poweron_rst_cnt ) |
|
- | 53 | rz_rst_cnt <= 'd0; |
|
- | 54 | else if( init ) |
|
- | 55 | rz_rst_cnt <= 'd0; |
|
- | 56 | else if( !rz_rst_n ) |
|
36 | if( !resets_n ) // external asynchronous reset |
57 | rz_rst_cnt <= rz_rst_cnt + 'd1; |
- | 58 | ||
- | 59 | // z80 reset |
|
- | 60 | always @(posedge clk_fpga, negedge rz_rst_n) |
|
- | 61 | if( !rz_rst_n ) |
|
37 | begin |
62 | begin |
38 | rst_cnt <= 0; |
63 | z80_rst_n <= 1'b0; |
39 | - | ||
40 | rst1_n <= 1'b0; |
64 | z80_rst2 <= 1'b0; |
41 | rst2_n <= 1'b0; // sync in reset end |
- | |
42 | - | ||
43 | rst_out_n <= 1'b0; // this zeroing also happens after FPGA configuration, so also power-up reset happens |
- | |
44 | end |
65 | end |
45 | else // clocking |
66 | else |
46 | begin |
67 | begin |
- | 68 | z80_rst_n <= z80_rst2; |
|
47 | rst1_n <= 1'b1; |
69 | z80_rst2 <= 1'b1; |
- | 70 | end |
|
- | 71 | ||
- | 72 | // z80 busrq/busak |
|
- | 73 | always @(posedge clk_fpga, negedge z80_rst_n) |
|
- | 74 | if( !z80_rst_n ) |
|
48 | rst2_n <= rst1_n; |
75 | z80_busrq_n <= 1'b1; |
- | 76 | else |
|
- | 77 | z80_busrq_n <= 1'b0; |
|
- | 78 | // |
|
- | 79 | always @(posedge clk_24mhz, negedge rz_rst_n) |
|
- | 80 | if( !rz_rst_n ) |
|
- | 81 | z80_halted <= 2'b00; |
|
- | 82 | else |
|
- | 83 | z80_halted[1:0] <= {z80_halted[0], ~z80_busak_n}; |
|
49 | 84 | ||
- | 85 | ||
50 | if( rst2_n && !rst_cnt[RST_CNT_SIZE] ) |
86 | // rom reset, init_in_progress |
- | 87 | always @(posedge clk_24mhz, negedge rz_rst_n) |
|
- | 88 | if( !rz_rst_n ) |
|
51 | begin |
89 | begin |
- | 90 | rom_rst_n <= 1'b0; |
|
52 | rst_cnt <= rst_cnt + 1; |
91 | init_in_progress <= 1'b1; |
53 | end |
92 | end |
- | 93 | else if( z80_halted[1] ) |
|
54 | 94 | begin |
|
55 | rst_out_n <= rst_cnt[RST_CNT_SIZE]; |
95 | rom_rst_n <= 1'b1; |
- | 96 | init_in_progress <= 1'b0; |
|
56 | end |
97 | end |
57 | 98 | ||
58 | 99 | ||
59 | endmodule |
100 | endmodule |
60 | 101 |