1 //*****************************************************************************
2 // (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
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
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.
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.
45 // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46 // PART OF THIS FILE AT ALL TIMES.
48 //*****************************************************************************
51 // /___/ \ / Vendor : Xilinx
52 // \ \ \/ Version : %version
53 // \ \ Application : MIG
54 // / / Filename : mig_7series_v1_9_tempmon.v
55 // /___/ /\ Date Last Modified : $date$
56 // \ \ / \ Date Created : Jul 25 2012
60 //Design Name : DDR3 SDRAM
61 //Purpose : Monitors chip temperature via the XADC and adjusts the
62 // stage 2 tap values as appropriate.
65 //*****************************************************************************
67 `timescale 1 ps /
1 ps
71 parameter TCQ =
100,
// Register delay (sim only)
72 parameter TEMP_MON_CONTROL =
"INTERNAL",
// XADC or user temperature source
73 parameter XADC_CLK_PERIOD =
5000,
// pS (default to 200 MHz refclk)
74 parameter tTEMPSAMPLE =
10000000 // ps (10 us)
77 input clk,
// Fabric clock
79 input rst,
// System reset
80 input [
11:
0]
device_temp_i,
// User device temperature
81 output [
11:
0]
device_temp // Sampled temperature
84 //***************************************************************************
87 // This function performs ceiling division (divide and round-up)
89 // num: integer to be divided
92 // cdiv: result of ceiling division (num/div, rounded up)
93 //***************************************************************************
95 function integer cdiv (
input integer num,
input integer div);
97 // perform division, then add 1 if and only if remainder is non-zero
98 cdiv = (
num/
div) + (((
num%
div)>
0) ?
1 :
0);
102 //***************************************************************************
105 // This function performs binary logarithm and rounds up
107 // size: integer to perform binary log upon
109 // clogb2: result of binary logarithm, rounded up
110 //***************************************************************************
112 function integer clogb2 (
input integer size);
117 // increment clogb2 from 1 for each bit in size
118 for (
clogb2 =
1;
size >
1;
clogb2 =
clogb2 +
1)
123 endfunction // clogb2
125 // Synchronization registers
126 (*
ASYNC_REG =
"TRUE" *)
reg [
11:
0]
device_temp_sync_r1;
127 (*
ASYNC_REG =
"TRUE" *)
reg [
11:
0]
device_temp_sync_r2;
128 (*
ASYNC_REG =
"TRUE" *)
reg [
11:
0]
device_temp_sync_r3 /* synthesis syn_srlstyle="registers" **/;
129 (*
ASYNC_REG =
"TRUE" *)
reg [
11:
0]
device_temp_sync_r4;
130 (*
ASYNC_REG =
"TRUE" *)
reg [
11:
0]
device_temp_sync_r5;
133 (*
ASYNC_REG =
"TRUE" *)
reg [
11:
0]
device_temp_r;
135 wire [
11:
0]
device_temp_lcl;
136 reg [
3:
0]
sync_cntr =
4'b0000;
137 reg device_temp_sync_r4_neq_r3;
139 // (* ASYNC_REG = "TRUE" *) reg rst_r1;
140 // (* ASYNC_REG = "TRUE" *) reg rst_r2;
142 // // Synchronization rst to XADC clock domain
143 // always @(posedge xadc_clk) begin
148 // Synchronization counter
149 always @(
posedge clk)
begin
151 device_temp_sync_r1 <= #TCQ
device_temp_lcl;
152 device_temp_sync_r2 <= #TCQ
device_temp_sync_r1;
153 device_temp_sync_r3 <= #TCQ
device_temp_sync_r2;
154 device_temp_sync_r4 <= #TCQ
device_temp_sync_r3;
155 device_temp_sync_r5 <= #TCQ
device_temp_sync_r4;
157 device_temp_sync_r4_neq_r3 <= #TCQ (
device_temp_sync_r4 !=
device_temp_sync_r3) ?
1'b1 :
1'b0;
161 always @(
posedge clk)
162 if(
rst || (
device_temp_sync_r4_neq_r3))
163 sync_cntr <= #TCQ
4'b0000;
165 sync_cntr <= #TCQ
sync_cntr +
4'b0001;
167 always @(
posedge clk)
169 device_temp_r <= #TCQ
device_temp_sync_r5;
171 assign device_temp =
device_temp_r;
175 if(
TEMP_MON_CONTROL ==
"EXTERNAL")
begin :
user_supplied_temperature
177 assign device_temp_lcl =
device_temp_i;
179 end else begin :
xadc_supplied_temperature
181 // calculate polling timer width and limit
182 localparam nTEMPSAMP = cdiv(tTEMPSAMPLE, XADC_CLK_PERIOD);
183 localparam nTEMPSAMP_CLKS = nTEMPSAMP;
184 localparam nTEMPSAMP_CLKS_M6 = nTEMPSAMP -
6;
185 localparam nTEMPSAMP_CNTR_WIDTH = clogb2(nTEMPSAMP_CLKS);
187 // Temperature sampler FSM encoding
188 localparam INIT_IDLE =
2'b00;
189 localparam REQUEST_READ_TEMP =
2'b01;
190 localparam WAIT_FOR_READ =
2'b10;
191 localparam READ =
2'b11;
193 // polling timer and tick
194 reg [nTEMPSAMP_CNTR_WIDTH-
1:
0] sample_timer = {nTEMPSAMP_CNTR_WIDTH{
1'b0}};
195 reg sample_timer_en =
1'b0;
196 reg sample_timer_clr =
1'b0;
197 reg sample_en =
1'b0;
199 // Temperature sampler state
200 reg [
2:
0] tempmon_state = INIT_IDLE;
201 reg [
2:
0] tempmon_next_state = INIT_IDLE;
207 reg xadc_drdy_r =
1'b0;
208 reg [
15:
0] xadc_do_r =
1'b0;
210 // Temperature storage
211 reg [
11:
0] temperature =
12'b0;
214 (* ASYNC_REG =
"TRUE" *)
reg rst_r1;
215 (* ASYNC_REG =
"TRUE" *)
reg rst_r2;
217 // Synchronization rst to XADC clock domain
218 always @(
posedge xadc_clk)
begin
223 // XADC polling interval timer
224 always @ (
posedge xadc_clk)
225 if(
rst_r2 ||
sample_timer_clr)
226 sample_timer <= #TCQ {
nTEMPSAMP_CNTR_WIDTH{
1'b0}};
227 else if(
sample_timer_en)
228 sample_timer <= #TCQ
sample_timer +
1'b1;
230 // XADC sampler state transition
231 always @(
posedge xadc_clk)
233 tempmon_state <= #TCQ
INIT_IDLE;
235 tempmon_state <= #TCQ
tempmon_next_state;
238 always @(
posedge xadc_clk)
239 sample_en <= #TCQ (
sample_timer ==
nTEMPSAMP_CLKS_M6) ?
1'b1 :
1'b0;
241 // XADC sampler next state transition
242 always @(
tempmon_state or sample_en or xadc_drdy_r)
begin
244 tempmon_next_state =
tempmon_state;
250 tempmon_next_state =
REQUEST_READ_TEMP;
253 tempmon_next_state =
WAIT_FOR_READ;
257 tempmon_next_state =
READ;
260 tempmon_next_state =
INIT_IDLE;
263 tempmon_next_state =
INIT_IDLE;
269 // Sample timer clear
270 always @(
posedge xadc_clk)
271 if(
rst_r2 || (
tempmon_state ==
WAIT_FOR_READ))
272 sample_timer_clr <= #TCQ
1'b0;
273 else if(
tempmon_state ==
REQUEST_READ_TEMP)
274 sample_timer_clr <= #TCQ
1'b1;
276 // Sample timer enable
277 always @(
posedge xadc_clk)
278 if(
rst_r2 || (
tempmon_state ==
REQUEST_READ_TEMP))
279 sample_timer_en <= #TCQ
1'b0;
280 else if((
tempmon_state ==
INIT_IDLE) || (
tempmon_state ==
READ))
281 sample_timer_en <= #TCQ
1'b1;
284 always @(
posedge xadc_clk)
285 if(
rst_r2 || (
tempmon_state ==
WAIT_FOR_READ))
286 xadc_den <= #TCQ
1'b0;
287 else if(
tempmon_state ==
REQUEST_READ_TEMP)
288 xadc_den <= #TCQ
1'b1;
290 // Register XADC outputs
291 always @(
posedge xadc_clk)
293 xadc_drdy_r <= #TCQ
1'b0;
294 xadc_do_r <= #TCQ
16'b0;
297 xadc_drdy_r <= #TCQ
xadc_drdy;
298 xadc_do_r <= #TCQ
xadc_do;
301 // Store current read value
302 always @(
posedge xadc_clk)
304 temperature <= #TCQ
12'b0;
305 else if(
tempmon_state ==
READ)
306 temperature <= #TCQ
xadc_do_r[
15:
4];
308 assign device_temp_lcl =
temperature;
310 // XADC: Dual 12-Bit 1MSPS Analog-to-Digital Converter
312 // Xilinx HDL Libraries Guide, version 14.1
314 // INIT_40 - INIT_42: XADC configuration registers
315 .
INIT_40(
16'h8000),
// config reg 0
316 .
INIT_41(
16'h3f0f),
// config reg 1
317 .
INIT_42(
16'h0400),
// config reg 2
318 // INIT_48 - INIT_4F: Sequence Registers
319 .
INIT_48(
16'h0100),
// Sequencer channel selection
320 .
INIT_49(
16'h0000),
// Sequencer channel selection
321 .
INIT_4A(
16'h0000),
// Sequencer Average selection
322 .
INIT_4B(
16'h0000),
// Sequencer Average selection
323 .
INIT_4C(
16'h0000),
// Sequencer Bipolar selection
324 .
INIT_4D(
16'h0000),
// Sequencer Bipolar selection
325 .
INIT_4E(
16'h0000),
// Sequencer Acq time selection
326 .
INIT_4F(
16'h0000),
// Sequencer Acq time selection
327 // INIT_50 - INIT_58, INIT5C: Alarm Limit Registers
328 .
INIT_50(
16'hb5ed),
// Temp alarm trigger
329 .
INIT_51(
16'h57e4),
// Vccint upper alarm limit
330 .
INIT_52(
16'ha147),
// Vccaux upper alarm limit
331 .
INIT_53(
16'hca33),
// Temp alarm OT upper
332 .
INIT_54(
16'ha93a),
// Temp alarm reset
333 .
INIT_55(
16'h52c6),
// Vccint lower alarm limit
334 .
INIT_56(
16'h9555),
// Vccaux lower alarm limit
335 .
INIT_57(
16'hae4e),
// Temp alarm OT reset
336 .
INIT_58(
16'h5999),
// VBRAM upper alarm limit
337 .
INIT_5C(
16'h5111),
// VBRAM lower alarm limit
338 // Simulation attributes: Set for proepr simulation behavior
339 .
SIM_DEVICE(
"7SERIES")
// Select target device (values)
342 // ALARMS: 8-bit (each) output: ALM, OT
343 .
ALM(),
// 8-bit output: Output alarm for temp, Vccint, Vccaux and Vccbram
344 .
OT(),
// 1-bit output: Over-Temperature alarm
345 // Dynamic Reconfiguration Port (DRP): 16-bit (each) output: Dynamic Reconfiguration Ports
346 .
DO(
xadc_do),
// 16-bit output: DRP output data bus
347 .
DRDY(
xadc_drdy),
// 1-bit output: DRP data ready
348 // STATUS: 1-bit (each) output: XADC status ports
349 .
BUSY(),
// 1-bit output: ADC busy output
350 .
CHANNEL(),
// 5-bit output: Channel selection outputs
351 .
EOC(),
// 1-bit output: End of Conversion
352 .
EOS(),
// 1-bit output: End of Sequence
353 .
JTAGBUSY(),
// 1-bit output: JTAG DRP transaction in progress output
354 .
JTAGLOCKED(),
// 1-bit output: JTAG requested DRP port lock
355 .
JTAGMODIFIED(),
// 1-bit output: JTAG Write to the DRP has occurred
356 .
MUXADDR(),
// 5-bit output: External MUX channel decode
357 // Auxiliary Analog-Input Pairs: 16-bit (each) input: VAUXP[15:0], VAUXN[15:0]
358 .
VAUXN(
16'b0),
// 16-bit input: N-side auxiliary analog input
359 .
VAUXP(
16'b0),
// 16-bit input: P-side auxiliary analog input
360 // CONTROL and CLOCK: 1-bit (each) input: Reset, conversion start and clock inputs
361 .
CONVST(
1'b0),
// 1-bit input: Convert start input
362 .
CONVSTCLK(
1'b0),
// 1-bit input: Convert start input
363 .
RESET(
1'b0),
// 1-bit input: Active-high reset
364 // Dedicated Analog Input Pair: 1-bit (each) input: VP/VN
365 .
VN(
1'b0),
// 1-bit input: N-side analog input
366 .
VP(
1'b0),
// 1-bit input: P-side analog input
367 // Dynamic Reconfiguration Port (DRP): 7-bit (each) input: Dynamic Reconfiguration Ports
368 .
DADDR(
7'b0),
// 7-bit input: DRP address bus
369 .
DCLK(
xadc_clk),
// 1-bit input: DRP clock
370 .
DEN(
xadc_den),
// 1-bit input: DRP enable signal
371 .
DI(
16'b0),
// 16-bit input: DRP input data bus
372 .
DWE(
1'b0)
// 1-bit input: DRP write enable
375 // End of XADC_inst instantiation