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.13/] [memfifo.srcs/] [sources_1/] [ip/] [mig_7series_0/] [mig_7series_0/] [user_design/] [rtl/] [phy/] [mig_7series_v2_3_ddr_phy_tempmon.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
//*****************************************************************************
2
// (c) Copyright 2008 - 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              : mig_7series_v2_3_ddr_phy_tempmon.v
55
// /___/   /\     Date Last Modified    : $date$
56
// \   \  /  \    Date Created          : Dec 20 2013
57
//  \___\/\___\
58
//
59
//Device            : 7 Series
60
//Design Name       : DDR3 SDRAM
61
//Purpose           : Monitors chip temperature via the XADC and adjusts the
62
//                    stage 2 tap values as appropriate.
63
//Reference         :
64
//Revision History  :
65
//*****************************************************************************
66
 
67
`timescale 1 ps / 1 ps
68
 
69
module mig_7series_v2_3_ddr_phy_tempmon #
70
(
71
  parameter TCQ             = 100,      // Register delay (simulation only)
72
  // Temperature bands must be in order. To disable bands, set to extreme.
73
  parameter TEMP_INCDEC     = 1465,   // Degrees C * 100 (14.65 * 100) 
74
  parameter TEMP_HYST       = 1,
75
  parameter TEMP_MIN_LIMIT  = 12'h8ac,
76
  parameter TEMP_MAX_LIMIT  = 12'hca4
77
)
78
(
79
  input           clk,                  // Fabric clock
80
  input           rst,                  // System reset
81
  input           calib_complete,       // Calibration complete
82
  input           tempmon_sample_en,    // Signal to enable sampling
83
  input   [11:0]  device_temp,          // Current device temperature
84
  output          tempmon_pi_f_inc,     // Increment PHASER_IN taps
85
  output          tempmon_pi_f_dec,     // Decrement PHASER_IN taps
86
  output          tempmon_sel_pi_incdec // Assume control of PHASER_IN taps
87
);
88
 
89
  // translate hysteresis into XADC units
90
  localparam HYST_OFFSET = (TEMP_HYST * 4096) / 504;
91
 
92
  localparam TEMP_INCDEC_OFFSET = ((TEMP_INCDEC * 4096) / 50400) ;
93
 
94
  // Temperature sampler FSM encoding
95
  localparam IDLE      = 11'b000_0000_0001;
96
  localparam INIT      = 11'b000_0000_0010;
97
  localparam FOUR_INC  = 11'b000_0000_0100;
98
  localparam THREE_INC = 11'b000_0000_1000;
99
  localparam TWO_INC   = 11'b000_0001_0000;
100
  localparam ONE_INC   = 11'b000_0010_0000;
101
  localparam NEUTRAL   = 11'b000_0100_0000;
102
  localparam ONE_DEC   = 11'b000_1000_0000;
103
  localparam TWO_DEC   = 11'b001_0000_0000;
104
  localparam THREE_DEC = 11'b010_0000_0000;
105
  localparam FOUR_DEC  = 11'b100_0000_0000;
106
 
107
 
108
  //===========================================================================
109
  // Reg declarations
110
  //===========================================================================
111
 
112
  // Output port flops.  Inc and dec are mutex.
113
  reg         pi_f_dec;     // Flop output
114
  reg         pi_f_inc;     // Flop output
115
  reg         pi_f_dec_nxt; // FSM output
116
  reg         pi_f_inc_nxt; // FSM output
117
 
118
  // FSM state
119
  reg  [10:0] tempmon_state;
120
  reg  [10:0] tempmon_state_nxt;
121
 
122
  // FSM output used to capture the initial device termperature
123
  reg         tempmon_state_init;
124
 
125
  // Flag to indicate the initial device temperature is captured and normal operation can begin
126
  reg         tempmon_init_complete;
127
 
128
  // Temperature band/state boundaries
129
  reg  [11:0] four_inc_max_limit;
130
  reg  [11:0] three_inc_max_limit;
131
  reg  [11:0] two_inc_max_limit;
132
  reg  [11:0] one_inc_max_limit;
133
  reg  [11:0] neutral_max_limit;
134
  reg  [11:0] one_dec_max_limit;
135
  reg  [11:0] two_dec_max_limit;
136
  reg  [11:0] three_dec_max_limit;
137
  reg  [11:0] three_inc_min_limit;
138
  reg  [11:0] two_inc_min_limit;
139
  reg  [11:0] one_inc_min_limit;
140
  reg  [11:0] neutral_min_limit;
141
  reg  [11:0] one_dec_min_limit;
142
  reg  [11:0] two_dec_min_limit;
143
  reg  [11:0] three_dec_min_limit;
144
  reg  [11:0] four_dec_min_limit;
145
  reg  [11:0] device_temp_init;
146
 
147
  // Flops for capturing and storing the current device temperature
148
  reg         tempmon_sample_en_101;
149
  reg         tempmon_sample_en_102;
150
  reg  [11:0] device_temp_101;
151
  reg  [11:0] device_temp_capture_102;
152
  reg         update_temp_102;
153
 
154
  // Flops for comparing temperature to max limits
155
  reg         temp_cmp_four_inc_max_102;
156
  reg         temp_cmp_three_inc_max_102;
157
  reg         temp_cmp_two_inc_max_102;
158
  reg         temp_cmp_one_inc_max_102;
159
  reg         temp_cmp_neutral_max_102;
160
  reg         temp_cmp_one_dec_max_102;
161
  reg         temp_cmp_two_dec_max_102;
162
  reg         temp_cmp_three_dec_max_102;
163
 
164
  // Flops for comparing temperature to min limits
165
  reg         temp_cmp_three_inc_min_102;
166
  reg         temp_cmp_two_inc_min_102;
167
  reg         temp_cmp_one_inc_min_102;
168
  reg         temp_cmp_neutral_min_102;
169
  reg         temp_cmp_one_dec_min_102;
170
  reg         temp_cmp_two_dec_min_102;
171
  reg         temp_cmp_three_dec_min_102;
172
  reg         temp_cmp_four_dec_min_102;
173
  //===========================================================================
174
  // Overview and temperature band limits
175
  //===========================================================================
176
 
177
  // The main feature of the tempmon block is an FSM that tracks the temerature provided by the ADC and decides if the phaser needs to be adjusted.  The FSM 
178
  // has nine temperature bands or states, centered around an initial device temperature.  The name of each state is the net number of phaser increments or
179
  // decrements that have been issued in getting to the state.  There are two temperature boundaries or limits between adjacent states.  These two boundaries are
180
  // offset by a small amount to provide hysteresis.  The max limits are the boundaries that are used to determine when to move to the next higher temperature state
181
  // and decrement the phaser.  The min limits determine when to move to the next lower temperature state and increment the phaser.  The limits are calculated when
182
  // the initial device temperature is taken, and will always be at fixed offsets from the initial device temperature.  States with limits below 0C or above
183
  // 125C will never be entered.
184
 
185
  // Temperature  lowest                                                                                                                                     highest
186
  //              <------------------------------------------------------------------------------------------------------------------------------------------------>
187
  //
188
  // Temp          four          three            two               one              neutral            one               two                three            four
189
  // band/state    inc           inc              inc               inc                                 dec               dec                dec              dec 
190
  // 
191
  // Max limits           |<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|
192
  // Min limits        |<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|<-2*TEMP_INCDEC->|  |
193
  //                   |  |                                |  |                        |                                                             |  |
194
  //                   |  |                                |  |                        |                                                             |  |
195
  // three_inc_min_limit  |                 HYST_OFFSET--->|  |<--                     |                                            four_dec_min_limit  |
196
  //                      |                                                     device_temp_init                                                        |
197
  //     four_inc_max_limit                                                                                                           three_dec_max_limit
198
 
199
 
200
 
201
  // Boundaries for moving from lower temp bands to higher temp bands.
202
  // Note that only three_dec_max_limit can roll over, assuming device_temp_init is between 0C and 125C and TEMP_INCDEC_OFFSET is 14.65C,
203
  // and none of the min or max limits can roll under.  So three_dec_max_limit has a check for being out of the 0x0 to 0xFFF range.
204
  wire [11:0] four_inc_max_limit_nxt  = device_temp_init - 7*TEMP_INCDEC_OFFSET; // upper boundary of lowest temp band
205
  wire [11:0] three_inc_max_limit_nxt = device_temp_init - 5*TEMP_INCDEC_OFFSET;
206
  wire [11:0] two_inc_max_limit_nxt   = device_temp_init - 3*TEMP_INCDEC_OFFSET;
207
  wire [11:0] one_inc_max_limit_nxt   = device_temp_init -   TEMP_INCDEC_OFFSET;
208
  wire [11:0] neutral_max_limit_nxt   = device_temp_init +   TEMP_INCDEC_OFFSET; // upper boundary of init temp band
209
  wire [11:0] one_dec_max_limit_nxt   = device_temp_init + 3*TEMP_INCDEC_OFFSET;
210
  wire [11:0] two_dec_max_limit_nxt   = device_temp_init + 5*TEMP_INCDEC_OFFSET;
211
  wire [12:0] three_dec_max_limit_tmp = device_temp_init + 7*TEMP_INCDEC_OFFSET; // upper boundary of 2nd highest temp band
212
  wire [11:0] three_dec_max_limit_nxt = three_dec_max_limit_tmp[12] ? 12'hFFF : three_dec_max_limit_tmp[11:0];
213
 
214
 
215
  // Boundaries for moving from higher temp bands to lower temp bands
216
  wire [11:0] three_inc_min_limit_nxt = four_inc_max_limit  - HYST_OFFSET; // lower boundary of 2nd lowest temp band
217
  wire [11:0] two_inc_min_limit_nxt   = three_inc_max_limit - HYST_OFFSET;
218
  wire [11:0] one_inc_min_limit_nxt   = two_inc_max_limit   - HYST_OFFSET;
219
  wire [11:0] neutral_min_limit_nxt   = one_inc_max_limit   - HYST_OFFSET; // lower boundary of init temp band
220
  wire [11:0] one_dec_min_limit_nxt   = neutral_max_limit   - HYST_OFFSET;
221
  wire [11:0] two_dec_min_limit_nxt   = one_dec_max_limit   - HYST_OFFSET;
222
  wire [11:0] three_dec_min_limit_nxt = two_dec_max_limit   - HYST_OFFSET;
223
  wire [11:0] four_dec_min_limit_nxt  = three_dec_max_limit - HYST_OFFSET; // lower boundary of highest temp band
224
 
225
 
226
 
227
  //===========================================================================
228
  // Capture device temperature
229
  //===========================================================================
230
 
231
  // There is a three stage pipeline used to capture temperature, calculate the next state
232
  // of the FSM, and update the tempmon outputs.
233
  //
234
  // Stage 100  Inputs device_temp and tempmon_sample_en become valid and are flopped.
235
  //            Input device_temp is compared to ADC codes for 0C and 125C and limited
236
  //            at the flop input if needed.
237
  //
238
  // Stage 101  The flopped version of device_temp is compared to the FSM temperature band boundaries
239
  //            to determine if a state change is needed.  State changes are only enabled on the
240
  //            rising edge of the flopped tempmon_sample_en signal.  If there is a state change a phaser
241
  //            increment or decrement signal is generated and flopped.
242
  //
243
  // Stage 102  The flopped versions of the phaser inc/dec signals drive the module outputs.
244
 
245
  // Limit device_temp to 0C to 125C and assign it to flop input device_temp_100
246
  // temp C = ( ( ADC CODE * 503.975 ) / 4096 ) - 273.15
247
  wire        device_temp_high = device_temp > TEMP_MAX_LIMIT;
248
  wire        device_temp_low  = device_temp < TEMP_MIN_LIMIT;
249
  wire [11:0] device_temp_100  =     ( { 12 {  device_temp_high                     } } & TEMP_MAX_LIMIT )
250
                                   | ( { 12 {                      device_temp_low  } } & TEMP_MIN_LIMIT )
251
                                   | ( { 12 { ~device_temp_high & ~device_temp_low  } } & device_temp );
252
 
253
  // Capture/hold the initial temperature used in setting temperature bands and set init complete flag
254
  // to enable normal sample operation.
255
  wire [11:0] device_temp_init_nxt      = tempmon_state_init  ? device_temp_101 : device_temp_init;
256
  wire        tempmon_init_complete_nxt = tempmon_state_init  ? 1'b1            : tempmon_init_complete;
257
 
258
  // Capture/hold the current temperature on the sample enable signal rising edge after init is complete.
259
  // The captured current temp is not used functionaly.  It is just useful for debug and waveform review.
260
  wire        update_temp_101           =  tempmon_init_complete & ~tempmon_sample_en_102 & tempmon_sample_en_101;
261
  wire [11:0] device_temp_capture_101   =  update_temp_101 ? device_temp_101 : device_temp_capture_102;
262
 
263
 
264
  //===========================================================================
265
  // Generate FSM arc signals
266
  //===========================================================================
267
 
268
  // Temperature comparisons for increasing temperature.
269
  wire        temp_cmp_four_inc_max_101  = device_temp_101 >= four_inc_max_limit  ;
270
  wire        temp_cmp_three_inc_max_101 = device_temp_101 >= three_inc_max_limit ;
271
  wire        temp_cmp_two_inc_max_101   = device_temp_101 >= two_inc_max_limit   ;
272
  wire        temp_cmp_one_inc_max_101   = device_temp_101 >= one_inc_max_limit   ;
273
  wire        temp_cmp_neutral_max_101   = device_temp_101 >= neutral_max_limit   ;
274
  wire        temp_cmp_one_dec_max_101   = device_temp_101 >= one_dec_max_limit   ;
275
  wire        temp_cmp_two_dec_max_101   = device_temp_101 >= two_dec_max_limit   ;
276
  wire        temp_cmp_three_dec_max_101 = device_temp_101 >= three_dec_max_limit ;
277
 
278
  // Temperature comparisons for decreasing temperature.
279
  wire        temp_cmp_three_inc_min_101 = device_temp_101 < three_inc_min_limit ;
280
  wire        temp_cmp_two_inc_min_101   = device_temp_101 < two_inc_min_limit   ;
281
  wire        temp_cmp_one_inc_min_101   = device_temp_101 < one_inc_min_limit   ;
282
  wire        temp_cmp_neutral_min_101   = device_temp_101 < neutral_min_limit   ;
283
  wire        temp_cmp_one_dec_min_101   = device_temp_101 < one_dec_min_limit   ;
284
  wire        temp_cmp_two_dec_min_101   = device_temp_101 < two_dec_min_limit   ;
285
  wire        temp_cmp_three_dec_min_101 = device_temp_101 < three_dec_min_limit ;
286
  wire        temp_cmp_four_dec_min_101  = device_temp_101 < four_dec_min_limit  ;
287
 
288
  // FSM arcs for increasing temperature.
289
  wire        temp_gte_four_inc_max  = update_temp_102 & temp_cmp_four_inc_max_102;
290
  wire        temp_gte_three_inc_max = update_temp_102 & temp_cmp_three_inc_max_102;
291
  wire        temp_gte_two_inc_max   = update_temp_102 & temp_cmp_two_inc_max_102;
292
  wire        temp_gte_one_inc_max   = update_temp_102 & temp_cmp_one_inc_max_102;
293
  wire        temp_gte_neutral_max   = update_temp_102 & temp_cmp_neutral_max_102;
294
  wire        temp_gte_one_dec_max   = update_temp_102 & temp_cmp_one_dec_max_102;
295
  wire        temp_gte_two_dec_max   = update_temp_102 & temp_cmp_two_dec_max_102;
296
  wire        temp_gte_three_dec_max = update_temp_102 & temp_cmp_three_dec_max_102;
297
 
298
  // FSM arcs for decreasing temperature.
299
  wire        temp_lte_three_inc_min = update_temp_102 & temp_cmp_three_inc_min_102;
300
  wire        temp_lte_two_inc_min   = update_temp_102 & temp_cmp_two_inc_min_102;
301
  wire        temp_lte_one_inc_min   = update_temp_102 & temp_cmp_one_inc_min_102;
302
  wire        temp_lte_neutral_min   = update_temp_102 & temp_cmp_neutral_min_102;
303
  wire        temp_lte_one_dec_min   = update_temp_102 & temp_cmp_one_dec_min_102;
304
  wire        temp_lte_two_dec_min   = update_temp_102 & temp_cmp_two_dec_min_102;
305
  wire        temp_lte_three_dec_min = update_temp_102 & temp_cmp_three_dec_min_102;
306
  wire        temp_lte_four_dec_min  = update_temp_102 & temp_cmp_four_dec_min_102;
307
 
308
 
309
  //===========================================================================
310
  // Implement FSM
311
  //===========================================================================
312
 
313
  // In addition to the nine temperature states, there are also IDLE and INIT states.
314
  // The INIT state triggers the calculation of the temperature boundaries between the
315
  // other states.  After INIT, the FSM will always go to the NEUTRAL state.  There is
316
  // no timing restriction required between calib_complete and tempmon_sample_en.
317
 
318
  always @(*) begin
319
 
320
    tempmon_state_nxt = tempmon_state;
321
    tempmon_state_init = 1'b0;
322
    pi_f_inc_nxt = 1'b0;
323
    pi_f_dec_nxt = 1'b0;
324
 
325
    casez (tempmon_state)
326
      IDLE: begin
327
        if (calib_complete) tempmon_state_nxt = INIT;
328
      end
329
      INIT: begin
330
        tempmon_state_nxt = NEUTRAL;
331
        tempmon_state_init = 1'b1;
332
      end
333
      FOUR_INC: begin
334
        if (temp_gte_four_inc_max) begin
335
          tempmon_state_nxt = THREE_INC;
336
          pi_f_dec_nxt = 1'b1;
337
        end
338
      end
339
      THREE_INC: begin
340
        if (temp_gte_three_inc_max) begin
341
          tempmon_state_nxt = TWO_INC;
342
          pi_f_dec_nxt = 1'b1;
343
        end
344
        else if (temp_lte_three_inc_min) begin
345
          tempmon_state_nxt = FOUR_INC;
346
          pi_f_inc_nxt = 1'b1;
347
        end
348
      end
349
      TWO_INC: begin
350
        if (temp_gte_two_inc_max) begin
351
          tempmon_state_nxt = ONE_INC;
352
          pi_f_dec_nxt = 1'b1;
353
        end
354
        else if (temp_lte_two_inc_min) begin
355
          tempmon_state_nxt = THREE_INC;
356
          pi_f_inc_nxt = 1'b1;
357
        end
358
      end
359
      ONE_INC: begin
360
        if (temp_gte_one_inc_max) begin
361
          tempmon_state_nxt = NEUTRAL;
362
          pi_f_dec_nxt = 1'b1;
363
        end
364
        else if (temp_lte_one_inc_min) begin
365
          tempmon_state_nxt = TWO_INC;
366
          pi_f_inc_nxt = 1'b1;
367
        end
368
      end
369
      NEUTRAL: begin
370
        if (temp_gte_neutral_max) begin
371
          tempmon_state_nxt = ONE_DEC;
372
          pi_f_dec_nxt = 1'b1;
373
        end
374
        else if (temp_lte_neutral_min) begin
375
          tempmon_state_nxt = ONE_INC;
376
          pi_f_inc_nxt = 1'b1;
377
        end
378
      end
379
      ONE_DEC: begin
380
        if (temp_gte_one_dec_max) begin
381
          tempmon_state_nxt = TWO_DEC;
382
          pi_f_dec_nxt = 1'b1;
383
        end
384
        else if (temp_lte_one_dec_min) begin
385
          tempmon_state_nxt = NEUTRAL;
386
          pi_f_inc_nxt = 1'b1;
387
        end
388
      end
389
      TWO_DEC: begin
390
        if (temp_gte_two_dec_max) begin
391
          tempmon_state_nxt = THREE_DEC;
392
          pi_f_dec_nxt = 1'b1;
393
        end
394
        else if (temp_lte_two_dec_min) begin
395
          tempmon_state_nxt = ONE_DEC;
396
          pi_f_inc_nxt = 1'b1;
397
        end
398
      end
399
      THREE_DEC: begin
400
        if (temp_gte_three_dec_max) begin
401
          tempmon_state_nxt = FOUR_DEC;
402
          pi_f_dec_nxt = 1'b1;
403
        end
404
        else if (temp_lte_three_dec_min) begin
405
          tempmon_state_nxt = TWO_DEC;
406
          pi_f_inc_nxt = 1'b1;
407
        end
408
      end
409
      FOUR_DEC: begin
410
        if (temp_lte_four_dec_min) begin
411
          tempmon_state_nxt = THREE_DEC;
412
          pi_f_inc_nxt = 1'b1;
413
        end
414
      end
415
      default: begin
416
          tempmon_state_nxt = IDLE;
417
      end
418
    endcase
419
 
420
  end //always
421
 
422
//synopsys translate_off
423
reg [71:0] tempmon_state_name;
424
always @(*) casez (tempmon_state)
425
   IDLE      : tempmon_state_name = "IDLE";
426
   INIT      : tempmon_state_name = "INIT";
427
   FOUR_INC  : tempmon_state_name = "FOUR_INC";
428
   THREE_INC : tempmon_state_name = "THREE_INC";
429
   TWO_INC   : tempmon_state_name = "TWO_INC";
430
   ONE_INC   : tempmon_state_name = "ONE_INC";
431
   NEUTRAL   : tempmon_state_name = "NEUTRAL";
432
   ONE_DEC   : tempmon_state_name = "ONE_DEC";
433
   TWO_DEC   : tempmon_state_name = "TWO_DEC";
434
   THREE_DEC : tempmon_state_name = "THREE_DEC";
435
   FOUR_DEC  : tempmon_state_name = "FOUR_DEC";
436
   default   : tempmon_state_name = "BAD_STATE";
437
endcase
438
//synopsys translate_on
439
 
440
  //===========================================================================
441
  // Generate final output and implement flops
442
  //===========================================================================
443
 
444
  // Generate output
445
  assign tempmon_pi_f_inc = pi_f_inc;
446
  assign tempmon_pi_f_dec = pi_f_dec;
447
  assign tempmon_sel_pi_incdec = pi_f_inc | pi_f_dec;
448
 
449
 
450
  // Implement reset flops
451
  always @(posedge clk) begin
452
    if(rst) begin
453
      tempmon_state           <= #TCQ 11'b000_0000_0001;
454
      pi_f_inc                <= #TCQ 1'b0;
455
      pi_f_dec                <= #TCQ 1'b0;
456
      four_inc_max_limit      <= #TCQ 12'b0;
457
      three_inc_max_limit     <= #TCQ 12'b0;
458
      two_inc_max_limit       <= #TCQ 12'b0;
459
      one_inc_max_limit       <= #TCQ 12'b0;
460
      neutral_max_limit       <= #TCQ 12'b0;
461
      one_dec_max_limit       <= #TCQ 12'b0;
462
      two_dec_max_limit       <= #TCQ 12'b0;
463
      three_dec_max_limit     <= #TCQ 12'b0;
464
      three_inc_min_limit     <= #TCQ 12'b0;
465
      two_inc_min_limit       <= #TCQ 12'b0;
466
      one_inc_min_limit       <= #TCQ 12'b0;
467
      neutral_min_limit       <= #TCQ 12'b0;
468
      one_dec_min_limit       <= #TCQ 12'b0;
469
      two_dec_min_limit       <= #TCQ 12'b0;
470
      three_dec_min_limit     <= #TCQ 12'b0;
471
      four_dec_min_limit      <= #TCQ 12'b0;
472
      device_temp_init        <= #TCQ 12'b0;
473
      tempmon_init_complete   <= #TCQ 1'b0;
474
      tempmon_sample_en_101   <= #TCQ 1'b0;
475
      tempmon_sample_en_102   <= #TCQ 1'b0;
476
      device_temp_101         <= #TCQ 12'b0;
477
      device_temp_capture_102 <= #TCQ 12'b0;
478
    end
479
    else begin
480
      tempmon_state           <= #TCQ tempmon_state_nxt;
481
      pi_f_inc                <= #TCQ pi_f_inc_nxt;
482
      pi_f_dec                <= #TCQ pi_f_dec_nxt;
483
      four_inc_max_limit      <= #TCQ four_inc_max_limit_nxt;
484
      three_inc_max_limit     <= #TCQ three_inc_max_limit_nxt;
485
      two_inc_max_limit       <= #TCQ two_inc_max_limit_nxt;
486
      one_inc_max_limit       <= #TCQ one_inc_max_limit_nxt;
487
      neutral_max_limit       <= #TCQ neutral_max_limit_nxt;
488
      one_dec_max_limit       <= #TCQ one_dec_max_limit_nxt;
489
      two_dec_max_limit       <= #TCQ two_dec_max_limit_nxt;
490
      three_dec_max_limit     <= #TCQ three_dec_max_limit_nxt;
491
      three_inc_min_limit     <= #TCQ three_inc_min_limit_nxt;
492
      two_inc_min_limit       <= #TCQ two_inc_min_limit_nxt;
493
      one_inc_min_limit       <= #TCQ one_inc_min_limit_nxt;
494
      neutral_min_limit       <= #TCQ neutral_min_limit_nxt;
495
      one_dec_min_limit       <= #TCQ one_dec_min_limit_nxt;
496
      two_dec_min_limit       <= #TCQ two_dec_min_limit_nxt;
497
      three_dec_min_limit     <= #TCQ three_dec_min_limit_nxt;
498
      four_dec_min_limit      <= #TCQ four_dec_min_limit_nxt;
499
      device_temp_init        <= #TCQ device_temp_init_nxt;
500
      tempmon_init_complete   <= #TCQ tempmon_init_complete_nxt;
501
      tempmon_sample_en_101   <= #TCQ tempmon_sample_en;
502
      tempmon_sample_en_102   <= #TCQ tempmon_sample_en_101;
503
      device_temp_101         <= #TCQ device_temp_100;
504
      device_temp_capture_102 <= #TCQ device_temp_capture_101;
505
    end
506
  end
507
 
508
  // Implement non-reset flops
509
  always @(posedge clk) begin
510
      temp_cmp_four_inc_max_102  <= #TCQ temp_cmp_four_inc_max_101;
511
      temp_cmp_three_inc_max_102 <= #TCQ temp_cmp_three_inc_max_101;
512
      temp_cmp_two_inc_max_102   <= #TCQ temp_cmp_two_inc_max_101;
513
      temp_cmp_one_inc_max_102   <= #TCQ temp_cmp_one_inc_max_101;
514
      temp_cmp_neutral_max_102   <= #TCQ temp_cmp_neutral_max_101;
515
      temp_cmp_one_dec_max_102   <= #TCQ temp_cmp_one_dec_max_101;
516
      temp_cmp_two_dec_max_102   <= #TCQ temp_cmp_two_dec_max_101;
517
      temp_cmp_three_dec_max_102 <= #TCQ temp_cmp_three_dec_max_101;
518
      temp_cmp_three_inc_min_102 <= #TCQ temp_cmp_three_inc_min_101;
519
      temp_cmp_two_inc_min_102   <= #TCQ temp_cmp_two_inc_min_101;
520
      temp_cmp_one_inc_min_102   <= #TCQ temp_cmp_one_inc_min_101;
521
      temp_cmp_neutral_min_102   <= #TCQ temp_cmp_neutral_min_101;
522
      temp_cmp_one_dec_min_102   <= #TCQ temp_cmp_one_dec_min_101;
523
      temp_cmp_two_dec_min_102   <= #TCQ temp_cmp_two_dec_min_101;
524
      temp_cmp_three_dec_min_102 <= #TCQ temp_cmp_three_dec_min_101;
525
      temp_cmp_four_dec_min_102  <= #TCQ temp_cmp_four_dec_min_101;
526
      update_temp_102            <= #TCQ update_temp_101;
527
  end
528
 
529
 
530
endmodule

powered by: WebSVN 2.1.0

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