Subversion Repositories ngs

Rev

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