OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [experiments/] [memctrl/] [fpga/] [memctrl-2/] [src/] [clk_rst/] [clk_rst.v] - Blame information for rev 319

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 319 hellwig
//
2
// clk_rst.v -- clock and reset generator
3
//
4
 
5
 
6
`timescale 1ns/10ps
7
`default_nettype none
8
 
9
 
10
module clk_rst(clk_in, rst_inout_n,
11
               sdram_clk, sdram_fb,
12
               clk_ok, clk2, clk, rst);
13
    input clk_in;
14
    inout rst_inout_n;
15
    output sdram_clk;
16
    input sdram_fb;
17
    output clk_ok;
18
    output clk2;
19
    output clk;
20
    output rst;
21
 
22
  wire clk_in_buf;
23
  wire int_clk2;
24
  wire int_clk;
25
  wire int_locked;
26
  wire ext_rst_n;
27
  wire ext_fb;
28
  wire ext_clk2;
29
  wire ext_locked;
30
 
31
  wire rst_counting;
32
  reg [23:0] rst_counter;
33
  reg rst_p_n;
34
  reg rst_s_n;
35
 
36
  //
37
  // internal DCM, 100 MHz and 50 MHz
38
  //
39
 
40
  IBUF clk_in_buffer(
41
    .I(clk_in),
42
    .O(clk_in_buf)
43
  );
44
 
45
  DCM int_dcm(
46
    .CLKIN(clk_in_buf),
47
    .CLKFB(clk2),
48
    .RST(1'b0),
49
    .CLK0(int_clk2),
50
    .CLKDV(int_clk),
51
    .LOCKED(int_locked)
52
  );
53
 
54
  defparam int_dcm.CLKDV_DIVIDE = 2;
55
 
56
  BUFG int_clk2_buffer(
57
    .I(int_clk2),
58
    .O(clk2)
59
  );
60
 
61
  BUFG int_clk_buffer(
62
    .I(int_clk),
63
    .O(clk)
64
  );
65
 
66
  //
67
  // reset circuit for external DCM
68
  //
69
 
70
  SRL16 ext_dll_rst_gen(
71
    .CLK(clk_in_buf),
72
    .D(int_locked),
73
    .Q(ext_rst_n),
74
    .A0(1'b1),
75
    .A1(1'b1),
76
    .A2(1'b1),
77
    .A3(1'b1)
78
  );
79
 
80
  defparam ext_dll_rst_gen.INIT = 16'h0000;
81
 
82
  //
83
  // external DCM, 100 MHz
84
  //
85
 
86
  IBUF ext_fb_buffer(
87
    .I(sdram_fb),
88
    .O(ext_fb)
89
  );
90
 
91
  DCM ext_dcm(
92
    .CLKIN(clk_in_buf),
93
    .CLKFB(ext_fb),
94
    .RST(~ext_rst_n),
95
    .CLK0(ext_clk2),
96
    .LOCKED(ext_locked),
97
    .PSEN(1'b0),
98
    .PSCLK(1'b0),
99
    .PSINCDEC(1'b0)
100
  );
101
 
102
  defparam ext_dcm.CLKOUT_PHASE_SHIFT = "FIXED";
103
  defparam ext_dcm.PHASE_SHIFT = 0;
104
 
105
  OBUF ext_clk2_buffer(
106
    .I(ext_clk2),
107
    .O(sdram_clk)
108
  );
109
 
110
  assign clk_ok = int_locked & ext_locked;
111
 
112
  //
113
  // reset generator
114
  //
115
 
116
  assign rst_counting = (rst_counter == 24'hFFFFFF) ? 0 : 1;
117
  assign rst_inout_n = (rst_counter[23] == 0) ? 1'b0 : 1'bz;
118
 
119
  always @(posedge clk2) begin
120
    rst_p_n <= rst_inout_n;
121
    rst_s_n <= rst_p_n;
122
    if (rst_counting) begin
123
      rst_counter <= rst_counter + 1;
124
    end else begin
125
      if (~rst_s_n | ~clk_ok) begin
126
        rst_counter <= 24'h000000;
127
      end
128
    end
129
  end
130
 
131
  assign rst = rst_counting;
132
 
133
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.