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

Subversion Repositories usb_fpga_2_14

[/] [usb_fpga_2_14/] [trunk/] [examples/] [memfifo/] [fpga-2.14/] [memfifo.srcs/] [sources_1/] [ip/] [mig_7series_0/] [mig_7series_0/] [user_design/] [rtl/] [phy/] [mig_7series_v2_3_ddr_phy_ocd_cntlr.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
//*****************************************************************************
2
// (c) Copyright 2009 - 2013 Xilinx, Inc. All rights reserved.
3
//
4
// This file contains confidential and proprietary information
5
// of Xilinx, Inc. and is protected under U.S. and
6
// international copyright and other intellectual property
7
// laws.
8
//
9
// DISCLAIMER
10
// This disclaimer is not a license and does not grant any
11
// rights to the materials distributed herewith. Except as
12
// otherwise provided in a valid license issued to you by
13
// Xilinx, and to the maximum extent permitted by applicable
14
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19
// (2) Xilinx shall not be liable (whether in contract or tort,
20
// including negligence, or under any other theory of
21
// liability) for any loss or damage of any kind or nature
22
// related to, arising under or in connection with these
23
// materials, including for any direct, or any indirect,
24
// special, incidental, or consequential loss or damage
25
// (including loss of data, profits, goodwill, or any type of
26
// loss or damage suffered as a result of any action brought
27
// by a third party) even if such damage or loss was
28
// reasonably foreseeable or Xilinx had been advised of the
29
// possibility of the same.
30
//
31
// CRITICAL APPLICATIONS
32
// Xilinx products are not designed or intended to be fail-
33
// safe, or for use in any application requiring fail-safe
34
// performance, such as life-support or safety devices or
35
// systems, Class III medical devices, nuclear facilities,
36
// applications related to the deployment of airbags, or any
37
// other applications that could lead to death, personal
38
// injury, or severe property or environmental damage
39
// (individually and collectively, "Critical
40
// Applications"). Customer assumes the sole risk and
41
// liability of any use of Xilinx products in Critical
42
// Applications, subject only to applicable laws and
43
// regulations governing limitations on product liability.
44
//
45
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46
// PART OF THIS FILE AT ALL TIMES.
47
//
48
//*****************************************************************************
49
//   ____  ____
50
//  /   /\/   /
51
// /___/  \  /    Vendor: Xilinx
52
// \   \   \/     Version: %version
53
//  \   \         Application: MIG
54
//  /   /         Filename: ddr_phy_v2_3_phy_ocd_cntlr.v
55
// /___/   /\     Date Last Modified: $Date: 2011/02/25 02:07:40 $
56
// \   \  /  \    Date Created: Aug 03 2009 
57
//  \___\/\___\
58
//
59
//Device: 7 Series
60
//Design Name: DDR3 SDRAM
61
//Purpose: Steps through the major sections of the output clock
62
// delay algorithm.  Enabling various subblocks at the right time.
63
//
64
// Steps through each byte of the interface.
65
//
66
// Implements both the simple and complex data pattern.
67
//
68
// for each byte in interface
69
//   begin
70
//     Limit
71
//     Scan - which includes DQS centering
72
//     Precharge
73
//   end
74
// set _wrlvl and _done equal to one
75
// 
76
//Reference:
77
//Revision History:
78
//*****************************************************************************
79
 
80
`timescale 1ps/1ps
81
 
82
module mig_7series_v2_3_ddr_phy_ocd_cntlr #
83
  (parameter TCQ             = 100,
84
   parameter DQS_CNT_WIDTH   = 3,
85
   parameter DQS_WIDTH       = 8)
86
  (/*AUTOARG*/
87
  // Outputs
88
  wrlvl_final, complex_wrlvl_final, oclk_init_delay_done,
89
  ocd_prech_req, lim_start, complex_oclkdelay_calib_done,
90
  oclkdelay_calib_done, phy_rddata_en_1, phy_rddata_en_2,
91
  phy_rddata_en_3, ocd_cntlr2stg2_dec, oclkdelay_calib_cnt,
92
  reset_scan,
93
  // Inputs
94
  clk, rst, prech_done, oclkdelay_calib_start,
95
  complex_oclkdelay_calib_start, lim_done, phy_rddata_en,
96
  po_counter_read_val, po_rdy, scan_done
97
  );
98
 
99
  localparam ONE = 1;
100
 
101
  input clk;
102
  input rst;
103
 
104
  output wrlvl_final, complex_wrlvl_final;
105
  reg wrlvl_final_ns, wrlvl_final_r, complex_wrlvl_final_ns, complex_wrlvl_final_r;
106
  always @(posedge clk) wrlvl_final_r <= #TCQ wrlvl_final_ns;
107
  always @(posedge clk) complex_wrlvl_final_r <= #TCQ complex_wrlvl_final_ns;
108
  assign wrlvl_final = wrlvl_final_r;
109
  assign complex_wrlvl_final = complex_wrlvl_final_r;
110
 
111
   // Completed initial delay increment
112
  output oclk_init_delay_done;  // may not need this... maybe for fast cal mode.
113
  assign oclk_init_delay_done = 1'b1;
114
 
115
  // Precharge done status from ddr_phy_init
116
  input prech_done;
117
  reg ocd_prech_req_ns, ocd_prech_req_r;
118
  always @(posedge clk) ocd_prech_req_r <= #TCQ ocd_prech_req_ns;
119
  output ocd_prech_req;
120
  assign ocd_prech_req = ocd_prech_req_r;
121
 
122
  input oclkdelay_calib_start, complex_oclkdelay_calib_start;
123
  input lim_done;
124
 
125
  reg lim_start_ns, lim_start_r;
126
  always @(posedge clk) lim_start_r <= #TCQ lim_start_ns;
127
  output lim_start;
128
  assign lim_start = lim_start_r;
129
 
130
  reg complex_oclkdelay_calib_done_ns, complex_oclkdelay_calib_done_r;
131
  always @(posedge clk) complex_oclkdelay_calib_done_r <= #TCQ complex_oclkdelay_calib_done_ns;
132
  output complex_oclkdelay_calib_done;
133
  assign complex_oclkdelay_calib_done = complex_oclkdelay_calib_done_r;
134
 
135
  reg oclkdelay_calib_done_ns, oclkdelay_calib_done_r;
136
  always @(posedge clk) oclkdelay_calib_done_r <= #TCQ oclkdelay_calib_done_ns;
137
  output oclkdelay_calib_done;
138
  assign oclkdelay_calib_done = oclkdelay_calib_done_r;
139
 
140
  input phy_rddata_en;
141
  reg prde_r1, prde_r2;
142
  always @(posedge clk) prde_r1 <= #TCQ phy_rddata_en;
143
  always @(posedge clk) prde_r2 <= #TCQ prde_r1;
144
  wire prde = complex_oclkdelay_calib_start ? prde_r2 : phy_rddata_en;
145
 
146
  reg phy_rddata_en_r1, phy_rddata_en_r2, phy_rddata_en_r3;
147
  always @(posedge clk) phy_rddata_en_r1 <= #TCQ prde;
148
  always @(posedge clk) phy_rddata_en_r2 <= #TCQ phy_rddata_en_r1;
149
  always @(posedge clk) phy_rddata_en_r3 <= #TCQ phy_rddata_en_r2;
150
  output phy_rddata_en_1, phy_rddata_en_2, phy_rddata_en_3;
151
  assign phy_rddata_en_1 = phy_rddata_en_r1;
152
  assign phy_rddata_en_2 = phy_rddata_en_r2;
153
  assign phy_rddata_en_3 = phy_rddata_en_r3;
154
 
155
  input [8:0] po_counter_read_val;
156
  reg ocd_cntlr2stg2_dec_r;
157
  output ocd_cntlr2stg2_dec;
158
  assign ocd_cntlr2stg2_dec = ocd_cntlr2stg2_dec_r;
159
  input po_rdy;
160
 
161
  reg [3:0] po_rd_wait_ns, po_rd_wait_r;
162
  always @(posedge clk) po_rd_wait_r <= #TCQ po_rd_wait_ns;
163
 
164
  reg [DQS_CNT_WIDTH-1:0] byte_ns, byte_r;
165
  always @(posedge clk) byte_r <= #TCQ byte_ns;
166
  output [DQS_CNT_WIDTH:0] oclkdelay_calib_cnt;
167
  assign oclkdelay_calib_cnt = {1'b0, byte_r};
168
 
169
  reg reset_scan_ns, reset_scan_r;
170
  always @(posedge clk) reset_scan_r <= #TCQ reset_scan_ns;
171
  output reset_scan;
172
  assign reset_scan = reset_scan_r;
173
  input scan_done;
174
 
175
  reg [2:0] sm_ns, sm_r;
176
  always @(posedge clk) sm_r <= #TCQ sm_ns;
177
 
178
  // Primary state machine.
179
 
180
  always @(*) begin
181
 
182
  // Default next state assignments.
183
 
184
    byte_ns = byte_r;
185
    complex_wrlvl_final_ns = complex_wrlvl_final_r;
186
    lim_start_ns = lim_start_r;
187
    oclkdelay_calib_done_ns = oclkdelay_calib_done_r;
188
    complex_oclkdelay_calib_done_ns = complex_oclkdelay_calib_done_r;
189
    ocd_cntlr2stg2_dec_r = 1'b0;
190
    po_rd_wait_ns = po_rd_wait_r;
191
    if (|po_rd_wait_r) po_rd_wait_ns = po_rd_wait_r - 4'b1;
192
    reset_scan_ns = reset_scan_r;
193
    wrlvl_final_ns = wrlvl_final_r;
194
    sm_ns = sm_r;
195
    ocd_prech_req_ns= 1'b0;
196
 
197
    if (rst == 1'b1) begin
198
 
199
  // RESET next states
200
      complex_oclkdelay_calib_done_ns = 1'b0;
201
      complex_wrlvl_final_ns = 1'b0;
202
      sm_ns = /*AK("READY")*/3'd0;
203
      lim_start_ns = 1'b0;
204
      oclkdelay_calib_done_ns = 1'b0;
205
      reset_scan_ns = 1'b1;
206
      wrlvl_final_ns = 1'b0;
207
    end else
208
 
209
  // State based actions and next states. 
210
      case (sm_r)
211
        /*AL("READY")*/3'd0: begin
212
          byte_ns = {DQS_CNT_WIDTH{1'b0}};
213
          if (oclkdelay_calib_start && ~oclkdelay_calib_done_r ||
214
              complex_oclkdelay_calib_start && ~complex_oclkdelay_calib_done_r)
215
          begin
216
            sm_ns = /*AK("LIMIT_START")*/3'd1;
217
            lim_start_ns = 1'b1;
218
          end
219
        end
220
 
221
        /*AL("LIMIT_START")*/3'd1:
222
            sm_ns = /*AK("LIMIT_WAIT")*/3'd2;
223
 
224
       /*AL("LIMIT_WAIT")*/3'd2:begin
225
          if (lim_done) begin
226
            lim_start_ns = 1'b0;
227
            sm_ns = /*AK("SCAN")*/3'd3;
228
            reset_scan_ns = 1'b0;
229
          end
230
        end
231
 
232
        /*AL("SCAN")*/3'd3:begin
233
          if (scan_done) begin
234
            reset_scan_ns = 1'b1;
235
            sm_ns = /*AK("COMPUTE")*/3'd4;
236
          end
237
        end
238
 
239
       /*AL("COMPUTE")*/3'd4:begin
240
          sm_ns = /*AK("PRECHARGE")*/3'd5;
241
          ocd_prech_req_ns = 1'b1;
242
       end
243
 
244
       /*AL("PRECHARGE")*/3'd5:begin
245
         if (prech_done) sm_ns = /*AK("DONE")*/3'd6;
246
       end
247
 
248
        /*AL("DONE")*/3'd6:begin
249
          byte_ns = byte_r + ONE[DQS_CNT_WIDTH-1:0];
250
          if ({1'b0, byte_r} == DQS_WIDTH[DQS_CNT_WIDTH:0] - ONE[DQS_WIDTH:0]) begin
251
            byte_ns = {DQS_CNT_WIDTH{1'b0}};
252
            po_rd_wait_ns = 4'd8;
253
            sm_ns = /*AK("STG2_2_ZERO")*/3'd7;
254
          end else begin
255
            sm_ns = /*AK("LIMIT_START")*/3'd1;
256
            lim_start_ns = 1'b1;
257
          end
258
        end
259
 
260
        /*AL("STG2_2_ZERO")*/3'd7:
261
          if (~|po_rd_wait_r && po_rdy)
262
            if (|po_counter_read_val[5:0]) ocd_cntlr2stg2_dec_r = 1'b1;
263
            else begin
264
              if ({1'b0, byte_r} == DQS_WIDTH[DQS_CNT_WIDTH:0] - ONE[DQS_WIDTH:0]) begin
265
                sm_ns = /*AK("READY")*/3'd0;
266
                oclkdelay_calib_done_ns= 1'b1;
267
                wrlvl_final_ns = 1'b1;
268
                if (complex_oclkdelay_calib_start) begin
269
                  complex_oclkdelay_calib_done_ns = 1'b1;
270
                  complex_wrlvl_final_ns = 1'b1;
271
                end
272
              end else begin
273
                byte_ns = byte_r + ONE[DQS_CNT_WIDTH-1:0];
274
                po_rd_wait_ns = 4'd8;
275
              end
276
            end // else: !if(|po_counter_read_val[5:0])
277
 
278
      endcase // case (sm_r)
279
  end // always @ begin
280
 
281
endmodule // mig_7series_v2_3_ddr_phy_ocd_cntlr
282
 
283
// Local Variables:
284
// verilog-autolabel-prefix: "3'd"
285
// End:

powered by: WebSVN 2.1.0

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