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

Subversion Repositories spacewiresystemc

[/] [spacewiresystemc/] [trunk/] [altera_work/] [spw_fifo_ulight/] [ulight_fifo/] [synthesis/] [submodules/] [altdq_dqs2_acv_connect_to_hard_phy_cyclonev.sv] - Blame information for rev 40

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 32 redbear
// (C) 2001-2017 Intel Corporation. All rights reserved.
2
// Your use of Intel Corporation's design tools, logic functions and other
3
// software and tools, and its AMPP partner logic functions, and any output
4 40 redbear
// files from any of the foregoing (including device programming or simulation
5 32 redbear
// files), and any associated documentation or information are expressly subject
6
// to the terms and conditions of the Intel Program License Subscription
7 40 redbear
// Agreement, Intel FPGA IP License Agreement, or other applicable
8 32 redbear
// license agreement, including, without limitation, that your use is for the
9
// sole purpose of programming logic devices manufactured by Intel and sold by
10
// Intel or its authorized distributors.  Please refer to the applicable
11
// agreement for further details.
12
 
13
 
14
// altera message_off 10034 10036 10030 10858
15
 
16
`timescale 1 ps / 1 ps
17
 
18
(* altera_attribute = "-name MESSAGE_DISABLE 12010; -name MESSAGE_DISABLE 12161" *)
19
module altdq_dqs2_acv_connect_to_hard_phy_cyclonev (
20
        dll_delayctrl_in,
21
        dll_offsetdelay_in,
22
        capture_strobe_in,
23
        capture_strobe_n_in,
24
        capture_strobe_ena,
25
        capture_strobe_out,
26
 
27
        output_strobe_ena,
28
        output_strobe_out,
29
        output_strobe_n_out,
30
        oct_ena_in,
31
        strobe_io,
32
        strobe_n_io,
33
 
34
        core_clock_in,
35
        fr_clock_in,
36
        hr_clock_in,
37
        dr_clock_in,
38
        strobe_ena_hr_clock_in,
39
        write_strobe_clock_in,
40
        write_strobe,
41
        reset_n_core_clock_in,
42
        parallelterminationcontrol_in,
43
        seriesterminationcontrol_in,
44
 
45
        read_data_in,
46
        write_data_out,
47
        read_write_data_io,
48
 
49
        write_oe_in,
50
        read_data_out,
51
        write_data_in,
52
        extra_write_data_in,
53
        extra_write_data_out,
54
        capture_strobe_tracking,
55
 
56
        lfifo_rdata_en,
57
        lfifo_rdata_en_full,
58
        lfifo_rd_latency,
59
        lfifo_reset_n,
60
        lfifo_rdata_valid,
61
        vfifo_qvld,
62
        vfifo_inc_wr_ptr,
63
        vfifo_reset_n,
64
        rfifo_reset_n,
65
 
66
        config_data_in,
67
        config_dqs_ena,
68
        config_io_ena,
69
        config_extra_io_ena,
70
        config_dqs_io_ena,
71
        config_update,
72
        config_clock_in
73
 
74
);
75
 
76
parameter PIN_WIDTH = 8;
77
parameter PIN_TYPE = "bidir";
78
 
79
parameter USE_INPUT_PHASE_ALIGNMENT = "false";
80
parameter USE_OUTPUT_PHASE_ALIGNMENT = "false";
81
parameter USE_HALF_RATE_INPUT = "false";
82
parameter USE_HALF_RATE_OUTPUT = "false";
83
 
84
parameter DIFFERENTIAL_CAPTURE_STROBE = "false";
85
parameter SEPARATE_CAPTURE_STROBE = "false";
86
 
87
parameter INPUT_FREQ = 0.0;
88
parameter INPUT_FREQ_PS = "0 ps";
89
parameter DELAY_CHAIN_BUFFER_MODE = "high";
90
parameter DQS_PHASE_SETTING = 3;
91
parameter DQS_PHASE_SHIFT = 9000;
92
localparam DQS_DELAYCHAIN_BYPASS = (DQS_PHASE_SHIFT == 0) ? "true" : "false";
93
parameter DQS_ENABLE_PHASE_SETTING = 2;
94
parameter USE_DYNAMIC_CONFIG = "true";
95
parameter INVERT_CAPTURE_STROBE = "false";
96
parameter SWAP_CAPTURE_STROBE_POLARITY = "false";
97
parameter USE_TERMINATION_CONTROL = "false";
98
parameter USE_OCT_ENA_IN_FOR_OCT = "false";
99
parameter USE_DQS_ENABLE = "false";
100
parameter USE_IO_CONFIG = "false";
101
parameter USE_DQS_CONFIG = "false";
102
 
103
parameter USE_OFFSET_CTRL = "false";
104
parameter HR_DDIO_OUT_HAS_THREE_REGS = "true";
105
 
106
parameter USE_OUTPUT_STROBE = "true";
107
parameter DIFFERENTIAL_OUTPUT_STROBE = "false";
108
parameter USE_OUTPUT_STROBE_RESET = "true";
109
parameter USE_BIDIR_STROBE = "false";
110
parameter REVERSE_READ_WORDS = "false";
111
parameter NATURAL_ALIGNMENT = "false";
112
 
113
parameter EXTRA_OUTPUT_WIDTH = 0;
114
parameter PREAMBLE_TYPE = "none";
115
parameter USE_DATA_OE_FOR_OCT = "false";
116
parameter DQS_ENABLE_WIDTH = 1;
117
parameter EMIF_UNALIGNED_PREAMBLE_SUPPORT = "false";
118
parameter EMIF_BYPASS_OCT_DDIO = "false";
119
 
120
parameter USE_2X_FF = "false";
121
parameter USE_DQS_TRACKING = "false";
122
 
123
parameter SEPERATE_LDC_FOR_WRITE_STROBE = "false";
124
 
125
localparam rate_mult_in = (USE_HALF_RATE_INPUT == "true") ? 4 : 2;
126
localparam rate_mult_out = (USE_HALF_RATE_OUTPUT == "true") ? 4 : 2;
127
localparam fpga_width_in = PIN_WIDTH * rate_mult_in;
128
localparam fpga_width_out = PIN_WIDTH * rate_mult_out;
129
localparam extra_fpga_width_out = EXTRA_OUTPUT_WIDTH * rate_mult_out;
130
localparam OS_ENA_WIDTH =  rate_mult_out / 2;
131
localparam WRITE_OE_WIDTH = PIN_WIDTH * rate_mult_out / 2;
132
parameter  DQS_ENABLE_PHASECTRL = "true";
133
 
134
parameter DYNAMIC_MODE = "dynamic";
135
 
136
parameter OCT_SERIES_TERM_CONTROL_WIDTH   = 16;
137
parameter OCT_PARALLEL_TERM_CONTROL_WIDTH = 16;
138
parameter DLL_WIDTH = 6;
139
parameter REGULAR_WRITE_BUS_ORDERING = "true";
140
 
141
parameter ALTERA_ALTDQ_DQS2_FAST_SIM_MODEL = 0;
142
 
143
parameter USE_HARD_FIFOS = "false";
144
parameter CALIBRATION_SUPPORT = "false";
145
parameter USE_DQSIN_FOR_VFIFO_READ = "false";
146
parameter HHP_HPS = "false";
147
 
148
localparam READ_FIFO_MODE = (USE_HALF_RATE_OUTPUT == "true") ? "hrate_mode" : "frate_mode";
149
 
150
localparam DATA_RATE = 1;
151
 
152
 
153
localparam DELAY_CHAIN_WIDTH = 5;
154
 
155
localparam OUTPUT_ALIGNMENT_DELAY = "two_cycle";
156
 
157
input [DLL_WIDTH-1:0] dll_delayctrl_in;
158
input [DLL_WIDTH-1:0] dll_offsetdelay_in;
159
 
160
input core_clock_in;
161
input fr_clock_in;
162
input hr_clock_in;
163
input strobe_ena_hr_clock_in;
164
input write_strobe_clock_in;
165
input [3:0] write_strobe;
166
 
167
input [PIN_WIDTH-1:0] read_data_in;
168
output [PIN_WIDTH-1:0] write_data_out;
169
inout [PIN_WIDTH-1:0] read_write_data_io;
170
 
171
input capture_strobe_in;
172
input capture_strobe_n_in;
173
input [DQS_ENABLE_WIDTH-1:0] capture_strobe_ena;
174
 
175
input reset_n_core_clock_in;
176
parameter USE_LDC_AS_LOW_SKEW_CLOCK = "false";
177
parameter DLL_USE_2X_CLK = "false";
178
 
179
parameter DQS_ENABLE_AFTER_T7 = "true";
180
 
181
input [OS_ENA_WIDTH-1:0] output_strobe_ena;
182
output output_strobe_out;
183
output output_strobe_n_out;
184
input [1:0] oct_ena_in;
185
inout strobe_io;
186
inout strobe_n_io;
187
 
188
output [fpga_width_out-1:0] read_data_out;
189
input [fpga_width_out-1:0] write_data_in;
190
 
191
input [WRITE_OE_WIDTH-1:0] write_oe_in;
192
output capture_strobe_out;
193
 
194
input [extra_fpga_width_out-1:0] extra_write_data_in;
195
output [EXTRA_OUTPUT_WIDTH-1:0] extra_write_data_out;
196
 
197
output capture_strobe_tracking;
198
 
199
parameter LFIFO_OCT_EN_MASK = 4294967295;
200
input [(rate_mult_out / 2)-1:0] lfifo_rdata_en;
201
input [(rate_mult_out / 2)-1:0] lfifo_rdata_en_full;
202
localparam LFIFO_RD_LATENCY_WIDTH = 5;
203
input [LFIFO_RD_LATENCY_WIDTH-1:0] lfifo_rd_latency;
204
input lfifo_reset_n;
205
output lfifo_rdata_valid;
206
input [(rate_mult_out / 2)-1:0] vfifo_qvld;
207
input [(rate_mult_out / 2)-1:0] vfifo_inc_wr_ptr;
208
input vfifo_reset_n;
209
input rfifo_reset_n;
210
 
211
input dr_clock_in;
212
 
213
input   [OCT_PARALLEL_TERM_CONTROL_WIDTH-1:0] parallelterminationcontrol_in;
214
input   [OCT_SERIES_TERM_CONTROL_WIDTH-1:0] seriesterminationcontrol_in;
215
 
216
input config_data_in;
217
input config_update;
218
input config_dqs_ena;
219
input [PIN_WIDTH-1:0] config_io_ena;
220
input [EXTRA_OUTPUT_WIDTH-1:0] config_extra_io_ena;
221
input config_dqs_io_ena;
222
input config_clock_in;
223
 
224
wire [DLL_WIDTH-1:0] dll_delay_value;
225
assign dll_delay_value = dll_delayctrl_in;
226
 
227
wire dqsbusout;
228
wire dqsnbusout;
229
 
230
wire capture_strobe;
231
 
232
 
233
wire [1:0] inputclkdelaysetting;
234
wire [1:0] inputclkndelaysetting;
235
wire [4:0] dqs_outputdelaysetting;
236
wire [4:0] dqs_outputenabledelaysetting;
237
 
238
wire [DELAY_CHAIN_WIDTH-1:0] dqs_outputdelaysetting_dlc;
239
wire [DELAY_CHAIN_WIDTH-1:0] dqs_outputenabledelaysetting_dlc;
240
 
241
 
242
 
243
`ifndef FAMILY_HAS_NO_DYNCONF
244
generate
245
if (USE_DYNAMIC_CONFIG =="true" && (USE_OUTPUT_STROBE == "true" || PIN_TYPE =="input" || PIN_TYPE == "bidir"))
246
begin
247
 
248
        cyclonev_io_config dqs_io_config_1 (
249
                        .outputhalfratebypass(),
250
      .readfiforeadclockselect(),
251
      .readfifomode(),
252
      .padtoinputregisterdelaysetting(),
253
                .datain(config_data_in),
254
                        .clk(config_clock_in),
255
                        .ena(config_dqs_io_ena),
256
                        .update(config_update),
257
                        .outputregdelaysetting(dqs_outputdelaysetting),
258
                        .outputenabledelaysetting(dqs_outputenabledelaysetting),
259
                        .dataout()
260
                );
261
 
262
        assign dqs_outputdelaysetting_dlc = dqs_outputdelaysetting;
263
        assign dqs_outputenabledelaysetting_dlc = dqs_outputenabledelaysetting;
264
 
265
        /*
266
        cyclonev_io_config dqsn_io_config_1 (
267
                    .datain(config_data_in),
268
                        .clk(config_clock_in),
269
                        .ena(config_dqs_io_ena),
270
                        .update(config_update),
271
                        .outputregdelaysetting(dqsn_outputdelaysetting),
272
                        .outputenabledelaysetting(dqsn_outputenabledelaysetting),
273
                        .padtoinputregisterdelaysetting(dqsn_inputdelaysetting),
274
 
275
                        .dataout()
276
                );
277
        */
278
end
279
endgenerate
280
`endif
281
 
282
wire [1:0] oct_ena;
283
wire fr_term;
284
 
285
wire [1:0] oct_source;
286
 
287
generate
288
        if (USE_DATA_OE_FOR_OCT == "true")
289
        begin
290
                assign oct_source = ~write_oe_in;
291
        end
292
        else
293
        begin
294
                assign oct_source = ~output_strobe_ena;
295
        end
296
endgenerate
297
 
298
generate
299
        if (USE_HARD_FIFOS == "true")
300
        begin
301
                if (USE_HALF_RATE_OUTPUT == "true")
302
                begin
303
                        if (USE_OCT_ENA_IN_FOR_OCT == "true")
304
                        begin
305
                                assign oct_ena = oct_ena_in;
306
                        end
307
                        else
308
                        begin
309
                                assign oct_ena = oct_source;
310
                        end
311
 
312
                end
313
                else
314
                begin
315
                        if (USE_OCT_ENA_IN_FOR_OCT == "true")
316
                        begin
317
                                assign fr_term = oct_ena_in[0];
318
                        end
319
                        else
320
                        begin
321
                                assign fr_term = oct_source[0];
322
                        end
323
                end
324
        end
325
        else
326
        begin
327
                if (USE_HALF_RATE_OUTPUT == "true")
328
                begin : oct_ena_hr_gen
329
                        if (USE_OCT_ENA_IN_FOR_OCT == "true")
330
                        begin
331
                                assign oct_ena = oct_ena_in;
332
                        end
333
                        else
334
                        begin
335
                                reg oct_ena_hr_reg;
336
                                always @(posedge hr_clock_in)
337
                                        oct_ena_hr_reg <= oct_source[1];
338
                                assign oct_ena[1] = ~oct_source[1];
339
                                assign oct_ena[0] = ~(oct_ena_hr_reg | oct_source[1]);
340
                        end
341
                end
342
                else
343
                begin : oct_ena_fr_gen
344
                        if (USE_OCT_ENA_IN_FOR_OCT == "true")
345
                        begin
346
                                assign fr_term = oct_ena_in[0];
347
                        end
348
                        else
349
                        begin
350
                                reg oct_ena_fr_reg;
351
                                initial
352
                                        oct_ena_fr_reg = 0;
353
                                always @(posedge hr_clock_in)
354
                                        oct_ena_fr_reg <= oct_source[0];
355
                                assign fr_term = ~(oct_source[0] | oct_ena_fr_reg);
356
                        end
357
                end
358
        end
359
endgenerate
360
 
361
 
362
 
363
localparam PINS_PER_DQS_CONFIG = 6;
364
localparam NUM_STROBES = (DIFFERENTIAL_CAPTURE_STROBE == "true" || SEPARATE_CAPTURE_STROBE == "true") ? 2 : 1;
365
localparam DQS_CONFIGS = (PIN_WIDTH + EXTRA_OUTPUT_WIDTH + NUM_STROBES) / PINS_PER_DQS_CONFIG;
366
 
367
wire dividerphasesetting [DQS_CONFIGS:0];
368
wire dqoutputphaseinvert [DQS_CONFIGS:0];
369
wire [1:0] dqoutputphasesetting [DQS_CONFIGS:0];
370
wire [4:0] dqsbusoutdelaysetting [DQS_CONFIGS:0];
371
wire [1:0] dqsoutputphasesetting [DQS_CONFIGS:0];
372
wire [1:0] resyncinputphasesetting [DQS_CONFIGS:0];
373
wire [4:0] dqsenabledelaysetting [DQS_CONFIGS:0];
374
wire [4:0] dqsdisabledelaysetting [DQS_CONFIGS:0];
375
wire dqshalfratebypass [DQS_CONFIGS:0];
376
wire [1:0] dqsinputphasesetting [DQS_CONFIGS:0];
377
wire [1:0] dqsenablectrlphasesetting [DQS_CONFIGS:0];
378
wire dqoutputpowerdown [DQS_CONFIGS:0];
379
wire dqsoutputpowerdown [DQS_CONFIGS:0];
380
wire resyncinputpowerdown [DQS_CONFIGS:0];
381
wire dqsenablectrlpowerdown [DQS_CONFIGS:0];
382
 
383
wire [1:0] dq2xoutputphasesetting [DQS_CONFIGS:0];
384
wire dq2xoutputphaseinvert [DQS_CONFIGS:0];
385
wire [1:0] dqs2xoutputphasesetting [DQS_CONFIGS:0];
386
wire dqs2xoutputphaseinvert [DQS_CONFIGS:0];
387
 
388
wire dqsbusoutfinedelaysetting [DQS_CONFIGS:0];
389
wire dqsenablectrlphaseinvert [DQS_CONFIGS:0];
390
wire dqsenablefinedelaysetting [DQS_CONFIGS:0];
391
wire dqsoutputphaseinvert [DQS_CONFIGS:0];
392
wire enadataoutbypass [DQS_CONFIGS:0];
393
wire enadqsenablephasetransferreg [DQS_CONFIGS:0];
394
 
395
wire enainputcycledelaysetting [DQS_CONFIGS:0];
396
wire enainputphasetransferreg [DQS_CONFIGS:0];
397
 
398
wire enaoctphasetransferreg [DQS_CONFIGS:0];
399
wire enaoutputphasetransferreg [DQS_CONFIGS:0];
400
wire enadqsphasetransferreg [DQS_CONFIGS:0];
401
wire [2:0] enadqscycledelaysetting [DQS_CONFIGS:0];
402
wire [2:0] enaoctcycledelaysetting [DQS_CONFIGS:0];
403
wire [2:0] enaoutputcycledelaysetting [DQS_CONFIGS:0];
404
wire [4:0] octdelaysetting1 [DQS_CONFIGS:0];
405
 
406
wire resyncinputphaseinvert [DQS_CONFIGS:0];
407
 
408
wire [DELAY_CHAIN_WIDTH-1:0] dqsbusoutdelaysetting_dlc[DQS_CONFIGS:0];
409
wire [DELAY_CHAIN_WIDTH-1:0] dqsenabledelaysetting_dlc[DQS_CONFIGS:0];
410
wire [DELAY_CHAIN_WIDTH-1:0] dqsdisabledelaysetting_dlc[DQS_CONFIGS:0];
411
wire [DELAY_CHAIN_WIDTH-1:0] octdelaysetting1_dlc[DQS_CONFIGS:0];
412
 
413
`ifndef FAMILY_HAS_NO_DYNCONF
414
generate
415
if (USE_DYNAMIC_CONFIG == "true")
416
begin
417
        genvar c_num;
418
        for (c_num = 0; c_num <= DQS_CONFIGS; c_num = c_num + 1)
419
        begin :dqs_config_gen
420
 
421
                cyclonev_dqs_config dqs_config_inst
422
                (
423
                .clk(config_clock_in),
424
                .datain(config_data_in),
425
                .dataout(),
426
                .ena(config_dqs_ena),
427
                .update(config_update),
428
 
429
                .postamblephasesetting(dqsenablectrlphasesetting[c_num]),
430
                .postamblephaseinvert(dqsenablectrlphaseinvert[c_num]),
431
 
432
                .dqsenablegatingdelaysetting(dqsenabledelaysetting[c_num]),
433
                .dqsenableungatingdelaysetting(dqsdisabledelaysetting[c_num]),
434
                .dqshalfratebypass(dqshalfratebypass[c_num]),
435
 
436
                .enadqsenablephasetransferreg(enadqsenablephasetransferreg[c_num]),
437
                .octdelaysetting(octdelaysetting1[c_num]),
438
                .dqsbusoutdelaysetting(dqsbusoutdelaysetting[c_num])
439
                );
440
                assign dqsbusoutdelaysetting_dlc[c_num] = dqsbusoutdelaysetting[c_num];
441
                assign dqsenabledelaysetting_dlc[c_num] = dqsenabledelaysetting[c_num];
442
                assign dqsdisabledelaysetting_dlc[c_num] = dqsdisabledelaysetting[c_num];
443
                assign octdelaysetting1_dlc[c_num] = octdelaysetting1[c_num];
444
        end
445
end
446
endgenerate
447
`endif
448
 
449
generate
450
if (USE_BIDIR_STROBE == "true")
451
begin
452
        assign output_strobe_out = 1'b0;
453
        assign output_strobe_n_out = 1'b1;
454
end
455
else
456
begin
457
        assign strobe_io = 1'b0;
458
        assign strobe_n_io = 1'b1;
459
end
460
endgenerate
461
 
462
wire dq_dr_clock;
463
wire dqs_dr_clock;
464
wire dq_shifted_clock;
465
wire dqs_shifted_clock;
466
wire write_strobe_clock;
467
wire hr_seq_clock;
468
 
469
wire ena_clock;
470
wire ena_zero_phase_clock;
471
 
472
 
473
wire phy_clk_dqs_2x;
474
wire phy_clk_dqs;
475
wire phy_clk_dq;
476
wire phy_clk_hr;
477
 
478
generate
479
if (HHP_HPS == "true") begin
480
        assign phy_clk_hr = hr_clock_in;
481
        assign phy_clk_dq = fr_clock_in;
482
        assign phy_clk_dqs = write_strobe_clock_in;
483
        assign phy_clk_dqs_2x = dr_clock_in;
484
end else begin
485
        cyclonev_phy_clkbuf phy_clkbuf (
486
                .inclk ({hr_clock_in, fr_clock_in, write_strobe_clock_in, dr_clock_in}),
487
                .outclk ({phy_clk_hr, phy_clk_dq, phy_clk_dqs, phy_clk_dqs_2x})
488
        );
489
end
490
endgenerate
491
 
492
wire [3:0] leveled_dqs_clocks;
493
wire [3:0] leveled_dq_clocks;
494
wire [3:0] leveled_hr_clocks;
495
 
496
cyclonev_leveling_delay_chain leveling_delay_chain_dqs (
497
        .clkin (phy_clk_dqs),
498
        .delayctrlin (dll_delay_value),
499
        .clkout(leveled_dqs_clocks)
500
);
501
defparam leveling_delay_chain_dqs.physical_clock_source = "DQS";
502
 
503
cyclonev_clk_phase_select clk_phase_select_dqs (
504
  .phasectrlin(),
505
  .phaseinvertctrl(),
506
  .dqsin(),
507
        .clkin (leveled_dqs_clocks[0]),
508
        .clkout (dqs_shifted_clock)
509
);
510
defparam clk_phase_select_dqs.physical_clock_source = "DQS";
511
defparam clk_phase_select_dqs.use_phasectrlin = "false";
512
defparam clk_phase_select_dqs.phase_setting = 0;
513
 
514
generate
515
        if (SEPERATE_LDC_FOR_WRITE_STROBE == "true") begin
516
 
517
                wire extra_phy_clk_dqs_2x;
518
                wire extra_phy_clk_dqs;
519
                wire extra_phy_clk_dq;
520
                wire extra_phy_clk_hr;
521
                cyclonev_phy_clkbuf phy_clkbuf (
522
                        .inclk ({hr_clock_in, fr_clock_in, write_strobe_clock_in, dr_clock_in}),
523
                        .outclk ({extra_phy_clk_hr, extra_phy_clk_dq, extra_phy_clk_dqs, extra_phy_clk_dqs_2x})
524
                );
525
                wire [3:0] extra_leveled_dqs_clocks;
526
                cyclonev_leveling_delay_chain leveling_delay_chain_dqs (
527
                        .clkin (extra_phy_clk_dqs),
528
                        .delayctrlin (dll_delay_value),
529
                        .clkout(extra_leveled_dqs_clocks)
530
                );
531
                defparam leveling_delay_chain_dqs.physical_clock_source = "DQS";
532
 
533
                cyclonev_clk_phase_select clk_phase_select_dqs (
534
      .phasectrlin(),
535
      .phaseinvertctrl(),
536
      .dqsin(),
537
                        .clkin (extra_leveled_dqs_clocks[0]),
538
                        .clkout (write_strobe_clock)
539
                );
540
                defparam clk_phase_select_dqs.physical_clock_source = "DQS";
541
                defparam clk_phase_select_dqs.use_phasectrlin = "false";
542
                defparam clk_phase_select_dqs.phase_setting = 0;
543
        end else begin
544
                assign write_strobe_clock = dqs_shifted_clock;
545
        end
546
endgenerate
547
 
548
cyclonev_clk_phase_select clk_phase_select_pst_0p (
549
    .phasectrlin(),
550
    .phaseinvertctrl(),
551
    .dqsin(dqsbusout),
552
    .clkin (leveled_dqs_clocks[0]),
553
    .clkout (ena_zero_phase_clock)
554
);
555
defparam clk_phase_select_pst_0p.physical_clock_source = "PST_0P";
556
defparam clk_phase_select_pst_0p.use_phasectrlin = "false";
557
defparam clk_phase_select_pst_0p.phase_setting = 0;
558
defparam clk_phase_select_pst_0p.use_dqs_input = USE_DQSIN_FOR_VFIFO_READ;
559
 
560
generate
561
        if (USE_DYNAMIC_CONFIG == "true")
562
        begin
563
                cyclonev_clk_phase_select clk_phase_select_pst (
564
                    .clkin (leveled_dqs_clocks),
565
                    .phasectrlin(dqsenablectrlphasesetting[0]),
566
                    .phaseinvertctrl(dqsenablectrlphaseinvert[0]),
567
                    .clkout (ena_clock),
568
                    .dqsin()
569
                );
570
                defparam clk_phase_select_pst.physical_clock_source = "PST";
571
                defparam clk_phase_select_pst.invert_phase = "dynamic";
572
        end
573
        else
574
        begin
575
                cyclonev_clk_phase_select clk_phase_select_pst (
576
                    .clkin (leveled_dqs_clocks),
577
                    .phasectrlin(),
578
                    .phaseinvertctrl(),
579
                    .clkout (ena_clock),
580
                    .dqsin()
581
                );
582
                defparam clk_phase_select_pst.physical_clock_source = "PST";
583
                defparam clk_phase_select_pst.use_phasectrlin = "false";
584
        end
585
endgenerate
586
 
587
cyclonev_leveling_delay_chain leveling_delay_chain_dq (
588
    .clkin (phy_clk_dq),
589
    .delayctrlin (),
590
    .clkout(leveled_dq_clocks)
591
);
592
defparam leveling_delay_chain_dq.physical_clock_source = "DQ";
593
 
594
cyclonev_clk_phase_select clk_phase_select_dq (
595
    .phasectrlin(),
596
    .phaseinvertctrl(),
597
    .dqsin(),
598
    .clkin (leveled_dq_clocks[0]),
599
    .clkout (dq_shifted_clock)
600
);
601
defparam clk_phase_select_dq.physical_clock_source = "DQ";
602
defparam clk_phase_select_dq.use_phasectrlin = "false";
603
defparam clk_phase_select_dq.phase_setting = 0;
604
 
605
cyclonev_leveling_delay_chain leveling_delay_chain_hr (
606
    .clkin (phy_clk_hr),
607
    .delayctrlin (),
608
    .clkout(leveled_hr_clocks)
609
);
610
defparam leveling_delay_chain_hr.physical_clock_source = "HR";
611
 
612
cyclonev_clk_phase_select clk_phase_select_hr (
613
    .phasectrlin(),
614
    .phaseinvertctrl(),
615
    .dqsin(),
616
    .clkin (leveled_hr_clocks[0]),
617
    .clkout (hr_seq_clock)
618
);
619
defparam clk_phase_select_hr.physical_clock_source = "HR";
620
defparam clk_phase_select_hr.use_phasectrlin = "false";
621
defparam clk_phase_select_hr.phase_setting = 0;
622
 
623
generate
624
if (USE_2X_FF == "true")
625
begin
626
        wire [3:0] leveled_dqs_2x_clocks;
627
 
628
        cyclonev_leveling_delay_chain leveling_delay_chain_dqs_2x (
629
                .clkin (phy_clk_dqs_2x),
630
                .delayctrlin (),
631
                .clkout(leveled_dqs_2x_clocks)
632
        );
633
        defparam leveling_delay_chain_dqs_2x.physical_clock_source = "DQS_2X";
634
 
635
        cyclonev_clk_phase_select clk_phase_select_dqs_2x (
636
    .phasectrlin(),
637
    .phaseinvertctrl(),
638
    .dqsin(),
639
                .clkin (leveled_dqs_2x_clocks[0]),
640
                .clkout (dqs_dr_clock)
641
        );
642
        defparam clk_phase_select_dqs_2x.physical_clock_source = "DQS_2X";
643
        defparam clk_phase_select_dqs_2x.use_phasectrlin = "false";
644
        defparam clk_phase_select_dqs_2x.phase_setting = 0;
645
 
646
        assign dq_dr_clock = dqs_dr_clock;
647
end
648
endgenerate
649
 
650
generate
651
wire vfifo_capture_strobe_ena;
652
wire lfifo_rden;
653
wire lfifo_oct;
654
if (USE_HARD_FIFOS == "true" && (PIN_TYPE == "input" || PIN_TYPE == "bidir"))
655
begin
656
        wire vfifo_qvld_fr;
657
        wire vfifo_inc_wr_ptr_fr;
658
        wire lfifo_rdata_en_fr;
659
        wire lfifo_rdata_en_full_fr;
660
        if (USE_HALF_RATE_OUTPUT == "true")
661
        begin
662
                cyclonev_ddio_out
663
                #(
664
                        .half_rate_mode("true"),
665
                        .use_new_clocking_model("true"),
666
                        .async_mode("none")
667
                ) hr_to_fr_vfifo_qvld (
668
                        .datainhi(vfifo_qvld[0]),
669
                        .datainlo(vfifo_qvld[1]),
670
                        .dataout(vfifo_qvld_fr),
671
                        .clkhi (hr_seq_clock),
672
                        .clklo (hr_seq_clock),
673
                        .hrbypass(dqshalfratebypass[0]),
674
                        .muxsel (hr_seq_clock),
675
      .clk(),
676
      .ena(1'b1),
677
      .areset(),
678
      .sreset(),
679
      .dfflo(),
680
      .dffhi(),
681
      .devpor(),
682
      .devclrn()
683
                );
684
 
685
                cyclonev_ddio_out
686
                #(
687
                        .half_rate_mode("true"),
688
                        .use_new_clocking_model("true"),
689
                        .async_mode("none")
690
                ) hr_to_fr_vfifo_inc_wr_ptr (
691
                        .datainhi(vfifo_inc_wr_ptr[0]),
692
                        .datainlo(vfifo_inc_wr_ptr[1]),
693
                        .dataout(vfifo_inc_wr_ptr_fr),
694
                        .clkhi (hr_seq_clock),
695
                        .clklo (hr_seq_clock),
696
                        .hrbypass(dqshalfratebypass[0]),
697
                        .muxsel (hr_seq_clock),
698
      .clk(),
699
      .ena(1'b1),
700
      .areset(),
701
      .sreset(),
702
      .dfflo(),
703
      .dffhi(),
704
      .devpor(),
705
      .devclrn()
706
                );
707
                cyclonev_ddio_out
708
                #(
709
                        .half_rate_mode("true"),
710
                        .use_new_clocking_model("true"),
711
                        .async_mode("none")
712
                ) hr_to_fr_lfifo_rdata_en (
713
                        .datainhi(lfifo_rdata_en[0]),
714
                        .datainlo(lfifo_rdata_en[1]),
715
                        .dataout(lfifo_rdata_en_fr),
716
                        .clkhi (hr_seq_clock),
717
                        .clklo (hr_seq_clock),
718
                        .hrbypass(dqshalfratebypass[0]),
719
                        .muxsel (hr_seq_clock),
720
      .clk(),
721
      .ena(1'b1),
722
      .areset(),
723
      .sreset(),
724
      .dfflo(),
725
      .dffhi(),
726
      .devpor(),
727
      .devclrn()
728
                );
729
 
730
                cyclonev_ddio_out
731
                #(
732
                        .half_rate_mode("true"),
733
                        .use_new_clocking_model("true"),
734
                        .async_mode("none")
735
                ) hr_to_fr_lfifo_rdata_en_full (
736
                        .datainhi(lfifo_rdata_en_full[0]),
737
                        .datainlo(lfifo_rdata_en_full[1]),
738
                        .dataout(lfifo_rdata_en_full_fr),
739
                        .clkhi (hr_seq_clock),
740
                        .clklo (hr_seq_clock),
741
                        .hrbypass(dqshalfratebypass[0]),
742
                        .muxsel (hr_seq_clock),
743
      .clk(),
744
      .ena(1'b1),
745
      .areset(),
746
      .sreset(),
747
      .dfflo(),
748
      .dffhi(),
749
      .devpor(),
750
      .devclrn()
751
                );
752
        end
753
        else
754
        begin
755
                assign vfifo_qvld_fr = vfifo_qvld[0];
756
                assign vfifo_inc_wr_ptr_fr = vfifo_inc_wr_ptr[0];
757
                assign lfifo_rdata_en_fr = lfifo_rdata_en[0];
758
                assign lfifo_rdata_en_full_fr = lfifo_rdata_en_full[0];
759
        end
760
 
761
        cyclonev_vfifo
762
        vfifo (
763
                .rstn (vfifo_reset_n),
764
                .qvldin (vfifo_qvld_fr),
765
                .qvldreg (vfifo_capture_strobe_ena),
766
                .incwrptr (vfifo_inc_wr_ptr_fr),
767
                .wrclk (dqs_shifted_clock),
768
                .rdclk (ena_zero_phase_clock)
769
        );
770
 
771
        wire [LFIFO_RD_LATENCY_WIDTH-1:0] lfifo_rd_latency_full_rate;
772
 
773
        assign lfifo_rd_latency_full_rate = lfifo_rd_latency << (DATA_RATE-1);
774
 
775
        cyclonev_lfifo
776
        #(
777
                .oct_lfifo_enable(LFIFO_OCT_EN_MASK)
778
        ) lfifo (
779
                .rdataen (lfifo_rdata_en_fr),
780
                .rdataenfull (lfifo_rdata_en_full_fr),
781
                .rdlatency (lfifo_rd_latency_full_rate),
782
                .rstn (lfifo_reset_n),
783
                .clk (dqs_shifted_clock),
784
                .rden (lfifo_rden),
785
                .rdatavalid(lfifo_rdata_valid),
786
                .octlfifo(lfifo_oct)
787
        );
788
end
789
else
790
begin
791
        assign vfifo_capture_strobe_ena = 1'b0;
792
        assign lfifo_rden = 1'b0;
793
        assign lfifo_rdata_valid = 1'b0;
794
        assign lfifo_oct = 1'b0;
795
end
796
endgenerate
797
 
798
wire delayed_oct;
799
generate
800
        wire fr_os_oct;
801
        wire aligned_os_oct;
802
 
803
        if (USE_HALF_RATE_OUTPUT == "true")
804
        begin
805
                if (EMIF_BYPASS_OCT_DDIO == "true")
806
                begin
807
                        assign fr_os_oct = oct_ena[0];
808
                end
809
                else
810
                begin
811
                        cyclonev_ddio_out
812
                        #(
813
                                .half_rate_mode("true"),
814
                                .use_new_clocking_model("true"),
815
                                .async_mode("none")
816
                        ) hr_to_fr_os_oct (
817
                                .datainhi(oct_ena[0]),
818
                                .datainlo(oct_ena[1]),
819
                                .dataout(fr_os_oct),
820
                                .clkhi (hr_seq_clock),
821
                                .clklo (hr_seq_clock),
822
                                .hrbypass(dqshalfratebypass[0]),
823
                                .muxsel (hr_seq_clock),
824
                        .clk(),
825
                        .ena(1'b1),
826
                        .areset(),
827
                        .sreset(),
828
                        .dfflo(),
829
                        .dffhi(),
830
                        .devpor(),
831
                        .devclrn()
832
                        );
833
                end
834
        end
835
        else
836
        begin
837
                assign fr_os_oct = fr_term;
838
        end
839
 
840
        if (USE_HARD_FIFOS == "true")
841
        begin
842
                if (EMIF_BYPASS_OCT_DDIO == "true")
843
                begin
844
                        assign aligned_os_oct = fr_os_oct;
845
                end
846
                else
847
                begin
848
                        cyclonev_ddio_oe # (
849
                        .disable_second_level_register("true")
850
                        ) os_oct_ddio_oe (
851
                                .clk (dqs_shifted_clock),
852
                                .oe (fr_os_oct),
853
                                .octreadcontrol (lfifo_oct),
854
                                .dataout (aligned_os_oct),
855
                                .ena (1'b1),
856
                                .areset (),
857
                                .sreset (),
858
                                .dfflo (),
859
                                .dffhi (),
860
                                .devpor (),
861
                                .devclrn ()
862
                        );
863
                end
864
        end
865
        else
866
        begin
867
                reg oct_oe_reg;
868
                always @(posedge dqs_shifted_clock) oct_oe_reg <= fr_os_oct;
869
                assign aligned_os_oct = oct_oe_reg;
870
        end
871
 
872
        wire predelayed_os_oct;
873
        if (USE_2X_FF == "true")
874
        begin
875
                reg dd_os_oct;
876
                always @(posedge dqs_dr_clock)
877
                begin
878
                        dd_os_oct <= aligned_os_oct;
879
                end
880
                assign predelayed_os_oct = dd_os_oct;
881
        end
882
        else
883
        begin
884
                assign predelayed_os_oct = aligned_os_oct;
885
        end
886
 
887
        if (USE_DYNAMIC_CONFIG == "true")
888
        begin
889
                if (EMIF_BYPASS_OCT_DDIO == "true")
890
                begin
891
                        assign delayed_oct = predelayed_os_oct;
892
                end
893
                else
894
                begin
895
                        cyclonev_delay_chain # (
896
                                .sim_intrinsic_rising_delay(0),
897
                                .sim_intrinsic_falling_delay(0)
898
                        ) oct_delay (
899
                                .datain             (predelayed_os_oct),
900
                                .delayctrlin        (octdelaysetting1_dlc[0]),
901
                                .dataout            (delayed_oct)
902
                        );
903
                end
904
        end
905
        else
906
        begin
907
                assign delayed_oct = predelayed_os_oct;
908
        end
909
endgenerate
910
 
911
 
912
generate
913
if (PIN_TYPE == "input" || PIN_TYPE == "bidir")
914
begin
915
 
916
        assign capture_strobe = dqsbusout;
917
        wire dqsin;
918
 
919
        wire capture_strobe_ibuf_i;
920
        wire capture_strobe_ibuf_ibar;
921
 
922
        if (USE_BIDIR_STROBE == "true")
923
        begin
924
                if (SWAP_CAPTURE_STROBE_POLARITY == "true") begin
925
                        assign capture_strobe_ibuf_i = strobe_n_io;
926
                        assign capture_strobe_ibuf_ibar = strobe_io;
927
                end else begin
928
                        assign capture_strobe_ibuf_i = strobe_io;
929
                        assign capture_strobe_ibuf_ibar = strobe_n_io;
930
                end
931
        end
932
        else
933
        begin
934
                if (SWAP_CAPTURE_STROBE_POLARITY == "true") begin
935
                        assign capture_strobe_ibuf_i = capture_strobe_n_in;
936
                        assign capture_strobe_ibuf_ibar = capture_strobe_in;
937
                end else begin
938
                        assign capture_strobe_ibuf_i = capture_strobe_in;
939
                        assign capture_strobe_ibuf_ibar = capture_strobe_n_in;
940
                end
941
        end
942
 
943
        if (DIFFERENTIAL_CAPTURE_STROBE == "true")
944
        begin
945
                cyclonev_io_ibuf
946
                #(
947
                        .differential_mode(DIFFERENTIAL_CAPTURE_STROBE),
948
                        .bus_hold("false")
949
                ) strobe_in (
950
                        .i(capture_strobe_ibuf_i),
951
                        .ibar(capture_strobe_ibuf_ibar),
952
                        .o(dqsin),
953
                        .dynamicterminationcontrol(1'b0)
954
                );
955
        end
956
        else
957
        begin
958
                cyclonev_io_ibuf
959
                #(
960
                        .bus_hold("false")
961
                ) strobe_in (
962
                        .i(capture_strobe_ibuf_i),
963
                        .o(dqsin),
964
                        .ibar(),
965
                        .dynamicterminationcontrol(1'b0)
966
                );
967
        end
968
 
969
 
970
        wire capture_strobe_ena_fr;
971
        if (USE_HARD_FIFOS == "true")
972
        begin
973
                assign capture_strobe_ena_fr = vfifo_capture_strobe_ena;
974
        end
975
        else
976
        begin
977
                if (DQS_ENABLE_WIDTH > 1)
978
                begin
979
                                cyclonev_ddio_out
980
                                #(
981
                                        .half_rate_mode("true"),
982
                                        .use_new_clocking_model("true"),
983
                                        .async_mode("none")
984
                                ) hr_to_fr_ena (
985
                                                .datainhi(capture_strobe_ena[0]),
986
                                                .datainlo(capture_strobe_ena[1]),
987
                                                .dataout(capture_strobe_ena_fr),
988
                                                .clkhi (strobe_ena_hr_clock_in),
989
                                                .clklo (strobe_ena_hr_clock_in),
990
                                                .hrbypass(dqshalfratebypass[0]),
991
                                                .muxsel (strobe_ena_hr_clock_in)
992
                                );
993
                end
994
                else
995
                begin
996
                        assign capture_strobe_ena_fr = capture_strobe_ena;
997
                end
998
        end
999
 
1000
 
1001
 
1002
        wire dqs_enable_shifted;
1003
        wire dqs_shifted;
1004
        wire dqs_enable_int;
1005
        wire dqs_disable_int;
1006
 
1007
        if (USE_BIDIR_STROBE == "true")
1008
        begin
1009
                wire dqs_pre_delayed;
1010
 
1011
                assign dqs_pre_delayed = capture_strobe_ena_fr;
1012
                if (USE_DYNAMIC_CONFIG == "true")
1013
                begin
1014
                        cyclonev_dqs_enable_ctrl
1015
                        #(
1016
                                .add_phase_transfer_reg(DYNAMIC_MODE),
1017
                                .delay_dqs_enable("one_and_half_cycle")
1018
                        ) dqs_enable_ctrl (
1019
                                .dqsenablein (dqs_pre_delayed),
1020
                                .zerophaseclk (ena_zero_phase_clock),
1021
                                .levelingclk (ena_clock),
1022
                                .dqsenableout (dqs_enable_shifted),
1023
                                .enaphasetransferreg(enadqsenablephasetransferreg[0]),
1024
                          .rstn(),
1025
              .dffin()
1026
                        );
1027
                end
1028
                else
1029
                begin
1030
                        cyclonev_dqs_enable_ctrl
1031
                        #(
1032
                                .delay_dqs_enable("one_and_half_cycle")
1033
                        ) dqs_enable_ctrl (
1034
                                .dqsenablein (dqs_pre_delayed),
1035
                                .zerophaseclk (ena_zero_phase_clock),
1036
                                .levelingclk (ena_clock),
1037
                                .dqsenableout (dqs_enable_shifted),
1038
                          .rstn(),
1039
              .dffin()
1040
                        );
1041
                end
1042
 
1043
                cyclonev_dqs_delay_chain
1044
                #(
1045
                        .dqs_period(INPUT_FREQ_PS),
1046
                        .dqs_phase_shift(DQS_PHASE_SHIFT),
1047
                        .dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)
1048
                )
1049
                dqs_delay_chain (
1050
                        .dqsin (dqsin),
1051
                        .delayctrlin (dll_delay_value),
1052
                        .dqsenable (dqs_enable_int),
1053
                        .dqsdisablen (dqs_disable_int),
1054
                        .dqsbusout (dqs_shifted),
1055
                        .dqsupdateen(),
1056
      .testin(),
1057
      .dffin()
1058
                );
1059
        end
1060
        else
1061
        begin
1062
                if (USE_DYNAMIC_CONFIG == "true")
1063
                begin
1064
                        cyclonev_dqs_delay_chain
1065
                        #(
1066
                                .dqs_period(INPUT_FREQ_PS),
1067
                                .dqs_phase_shift(DQS_PHASE_SHIFT),
1068
                                .dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)
1069
                        ) dqs_delay_chain (
1070
                                .dqsin (dqsin),
1071
                                .delayctrlin (dll_delay_value),
1072
                                .dqsbusout (dqs_shifted),
1073
                          .dqsenable (),
1074
                          .dqsdisablen (),
1075
                          .dqsupdateen(),
1076
        .testin(),
1077
        .dffin()
1078
                        );
1079
                end
1080
                else
1081
                begin
1082
                        cyclonev_dqs_delay_chain
1083
                        #(
1084
                                .dqs_period(INPUT_FREQ_PS),
1085
                                .dqs_phase_shift(DQS_PHASE_SHIFT),
1086
                                .dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)
1087
                        ) dqs_delay_chain (
1088
                                .dqsin (dqsin),
1089
                                .delayctrlin (dll_delay_value),
1090
                                .dqsbusout (dqs_shifted),
1091
                          .dqsenable (),
1092
                          .dqsdisablen (),
1093
                          .dqsupdateen(),
1094
        .testin(),
1095
        .dffin()
1096
                        );
1097
 
1098
                end
1099
        end
1100
 
1101
        if (USE_DYNAMIC_CONFIG == "true")
1102
        begin
1103
                cyclonev_delay_chain
1104
                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1105
                dqs_in_delay_1(
1106
                        .datain             (dqs_shifted),
1107
                        .delayctrlin        (dqsbusoutdelaysetting_dlc[0]),
1108
                        .dataout            (dqsbusout)
1109
                );
1110
 
1111
                cyclonev_delay_chain
1112
                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1113
                dqs_ena_delay_1(
1114
                        .datain             (dqs_enable_shifted),
1115
                        .delayctrlin        (dqsenabledelaysetting_dlc[0]),
1116
                        .dataout            (dqs_enable_int)
1117
                );
1118
 
1119
                cyclonev_delay_chain
1120
                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1121
                dqs_dis_delay_1(
1122
                        .datain             (dqs_enable_shifted),
1123
                        .delayctrlin        (dqsdisabledelaysetting_dlc[0]),
1124
                        .dataout            (dqs_disable_int)
1125
                );
1126
        end
1127
        else
1128
        begin
1129
                assign dqsbusout = dqs_shifted;
1130
                assign dqs_enable_int = dqs_enable_shifted;
1131
                assign dqs_disable_int = dqs_enable_shifted;
1132
        end
1133
 
1134
        if (USE_DQS_TRACKING == "true")
1135
        begin
1136
                reg dqs_ff;
1137
                always @(negedge dqs_enable_int)
1138
                        dqs_ff <= dqsin;
1139
 
1140
                assign capture_strobe_tracking = dqs_ff;
1141
        end
1142
 
1143
        if (SEPARATE_CAPTURE_STROBE == "true")
1144
        begin
1145
 
1146
                wire dqsnin;
1147
 
1148
                cyclonev_io_ibuf
1149
                #(
1150
                        .bus_hold("false")
1151
                ) strobe_n_in (
1152
                        .i(capture_strobe_ibuf_ibar),
1153
                        .o(dqsnin)
1154
                );
1155
 
1156
                wire dqsn_enable_int;
1157
                wire dqsn_disable_int;
1158
                wire dqsn_enable_shifted;
1159
                wire dqsn_shifted;
1160
 
1161
                if (USE_BIDIR_STROBE == "true")
1162
                begin
1163
                        if (USE_DYNAMIC_CONFIG == "true")
1164
                        begin
1165
                                cyclonev_dqs_enable_ctrl
1166
                                #(
1167
                                        .add_phase_transfer_reg(DYNAMIC_MODE),
1168
                                        .delay_dqs_enable("one_and_half_cycle")
1169
                                ) dqs_enable_n_ctrl (
1170
                                        .dqsenablein (capture_strobe_ena_fr),
1171
                                        .zerophaseclk (ena_zero_phase_clock),
1172
                                        .levelingclk (ena_clock),
1173
                                        .dqsenableout (dqsn_enable_shifted),
1174
                                        .enaphasetransferreg(enadqsenablephasetransferreg[0])
1175
                                );
1176
                        end
1177
                        else
1178
                        begin
1179
                                cyclonev_dqs_enable_ctrl
1180
                                #(
1181
                                        .add_phase_transfer_reg("false"),
1182
                                        .delay_dqs_enable("one_and_half_cycle")
1183
                                ) dqs_enable_n_ctrl (
1184
                                        .dqsenablein (capture_strobe_ena_fr),
1185
                                        .zerophaseclk (ena_zero_phase_clock),
1186
                                        .levelingclk (ena_clock),
1187
                                        .dqsenableout (dqsn_enable_shifted)
1188
                                );
1189
                        end
1190
 
1191
                        cyclonev_dqs_delay_chain
1192
                        #(
1193
                                .dqs_period(INPUT_FREQ_PS),
1194
                                .dqs_phase_shift(DQS_PHASE_SHIFT),
1195
                                .dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)
1196
                        ) dqs_n_delay_chain (
1197
                                .dqsin (dqsnin),
1198
                                .delayctrlin (dll_delay_value),
1199
                                .dqsenable (dqsn_enable_int),
1200
                                .dqsdisablen (dqsn_disable_int),
1201
                                .dqsbusout (dqsn_shifted)
1202
                        );
1203
 
1204
                end
1205
                else
1206
                begin
1207
                        cyclonev_dqs_delay_chain
1208
                        #(
1209
                                .dqs_period(INPUT_FREQ_PS),
1210
                                .dqs_phase_shift(DQS_PHASE_SHIFT),
1211
                                .dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)
1212
                        ) dqs_n_delay_chain (
1213
                                .dqsin (dqsnin),
1214
                                .delayctrlin (dll_delay_value),
1215
                                .dqsbusout (dqsn_shifted)
1216
                        );
1217
                end
1218
 
1219
                if (USE_DYNAMIC_CONFIG == "true")
1220
                begin
1221
                        cyclonev_delay_chain
1222
                        #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1223
                        dqs_n_delay_1(
1224
                                .datain             (dqsn_shifted),
1225
                                .delayctrlin        (dqsbusoutdelaysetting_dlc[0]),
1226
                                .dataout            (dqsnbusout)
1227
                        );
1228
 
1229
                        cyclonev_delay_chain
1230
                        #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1231
                        dqs_n_ena_delay_1(
1232
                                .datain             (dqsn_enable_shifted),
1233
                                .delayctrlin        (dqsenabledelaysetting_dlc[0]),
1234
                                .dataout            (dqsn_enable_int)
1235
                        );
1236
 
1237
                        cyclonev_delay_chain
1238
                        #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1239
                        dqs_n_dis_delay_1(
1240
                                .datain             (dqsn_enable_shifted),
1241
                                .delayctrlin        (dqsdisabledelaysetting_dlc[0]),
1242
                                .dataout            (dqsn_disable_int)
1243
                        );
1244
 
1245
                end
1246
                else
1247
                begin
1248
                        assign dqsnbusout = dqsn_shifted;
1249
                        assign dqsn_enable_int = dqsn_enable_shifted;
1250
                        assign dqsn_disable_int = dqsn_enable_shifted;
1251
                end
1252
        end
1253
end
1254
endgenerate
1255
 
1256
generate
1257
if (USE_OUTPUT_STROBE == "true")
1258
begin
1259
        wire os;
1260
        wire os_bar;
1261
        wire os_dtc;
1262
        wire os_dtc_bar;
1263
        wire os_delayed1;
1264
        wire os_delayed2;
1265
 
1266
        wire fr_os_oe;
1267
        wire aligned_os_oe;
1268
        wire aligned_strobe;
1269
 
1270
        wire fr_os_hi;
1271
        wire fr_os_lo;
1272
 
1273
        if (USE_HALF_RATE_OUTPUT == "true")
1274
        begin
1275
                if (USE_BIDIR_STROBE == "true")
1276
                begin
1277
                        wire clk_gate_hi;
1278
                        wire clk_gate_lo;
1279
 
1280
                        if (PREAMBLE_TYPE == "low")
1281
                        begin
1282
                                if (EMIF_UNALIGNED_PREAMBLE_SUPPORT != "true")
1283
                                begin
1284
                                        assign clk_gate_hi = output_strobe_ena[0];
1285
                                        assign clk_gate_lo = output_strobe_ena[0];
1286
                                end
1287
                                else
1288
                                begin
1289
                                        reg [1:0] os_ena_reg;
1290
                                        reg [1:0] os_ena_preamble;
1291
 
1292
                                        always @(posedge core_clock_in)
1293
                                        begin
1294
                                                os_ena_reg[1:0] <= output_strobe_ena[1:0];
1295
                                        end
1296
 
1297
                                        always @(*)
1298
                                        begin
1299
                                                case ({os_ena_reg[0], os_ena_reg[1],
1300
                                                           output_strobe_ena[0], output_strobe_ena[1]})
1301
                                                        4'b00_00: os_ena_preamble[1:0] <= 2'b00;
1302
                                                        4'b00_01: os_ena_preamble[1:0] <= 2'b00;
1303
                                                        4'b00_10: os_ena_preamble[1:0] <= 2'b00;
1304
                                                        4'b00_11: os_ena_preamble[1:0] <= 2'b01;
1305
 
1306
                                                        4'b01_00: os_ena_preamble[1:0] <= 2'b00;
1307
                                                        4'b01_01: os_ena_preamble[1:0] <= 2'b00;
1308
                                                        4'b01_10: os_ena_preamble[1:0] <= 2'b10;
1309
                                                        4'b01_11: os_ena_preamble[1:0] <= 2'b11;
1310
 
1311
                                                        4'b10_00: os_ena_preamble[1:0] <= 2'b00;
1312
                                                        4'b10_01: os_ena_preamble[1:0] <= 2'b00;
1313
                                                        4'b10_10: os_ena_preamble[1:0] <= 2'b00;
1314
                                                        4'b10_11: os_ena_preamble[1:0] <= 2'b01;
1315
 
1316
                                                        4'b11_00: os_ena_preamble[1:0] <= 2'b00;
1317
                                                        4'b11_01: os_ena_preamble[1:0] <= 2'b00;
1318
                                                        4'b11_10: os_ena_preamble[1:0] <= 2'b10;
1319
                                                        4'b11_11: os_ena_preamble[1:0] <= 2'b11;
1320
 
1321
                                                        default:  os_ena_preamble[1:0] <= 2'b00;
1322
                                                endcase
1323
                                        end
1324
 
1325
                                        assign clk_gate_hi = os_ena_preamble[1];
1326
                                        assign clk_gate_lo = os_ena_preamble[0];
1327
                                end
1328
                        end
1329
                        else
1330
                        begin
1331
                                assign clk_gate_hi = 1'b1;
1332
                                assign clk_gate_lo = 1'b1;
1333
                        end
1334
                        cyclonev_ddio_out
1335
                        #(
1336
                                .half_rate_mode("true"),
1337
                                .use_new_clocking_model("true"),
1338
                                .async_mode("none")
1339
                        ) hr_to_fr_os_hi (
1340
                                        .hrbypass(1'b1),
1341
                                        .datainhi(write_strobe[0]),
1342
                                        .datainlo(write_strobe[2]),
1343
                                        .dataout(fr_os_hi),
1344
                                        .clkhi (hr_seq_clock),
1345
                                        .clklo (hr_seq_clock),
1346
                                        .muxsel (hr_seq_clock),
1347
                                        .clk(),
1348
          .ena(1'b1),
1349
          .areset(),
1350
          .sreset(),
1351
          .dfflo(),
1352
          .dffhi(),
1353
          .devpor(),
1354
          .devclrn()
1355
                        );
1356
 
1357
                        cyclonev_ddio_out
1358
                        #(
1359
                                        .half_rate_mode("true"),
1360
                                        .use_new_clocking_model("true"),
1361
                                        .async_mode("none")
1362
                        ) hr_to_fr_os_lo (
1363
                                        .hrbypass(1'b1),
1364
                                        .datainhi(write_strobe[1]),
1365
                                        .datainlo(write_strobe[3]),
1366
                                        .dataout(fr_os_lo),
1367
                                        .clkhi (hr_seq_clock),
1368
                                        .clklo (hr_seq_clock),
1369
                                        .muxsel (hr_seq_clock),
1370
                                        .clk(),
1371
          .ena(1'b1),
1372
          .areset(),
1373
          .sreset(),
1374
          .dfflo(),
1375
          .dffhi(),
1376
          .devpor(),
1377
          .devclrn()
1378
                        );
1379
 
1380
                        cyclonev_ddio_out
1381
                        #(
1382
                                        .half_rate_mode("true"),
1383
                                        .use_new_clocking_model("true"),
1384
                                        .async_mode("none")
1385
                        ) hr_to_fr_os_oe (
1386
                                        .hrbypass(1'b1),
1387
                                        .datainhi(~output_strobe_ena [0]),
1388
                                        .datainlo(~output_strobe_ena [1]),
1389
                                        .dataout(fr_os_oe),
1390
                                        .clkhi (hr_seq_clock),
1391
                                        .clklo (hr_seq_clock),
1392
                                        .muxsel (hr_seq_clock),
1393
                                        .clk(),
1394
          .ena(1'b1),
1395
          .areset(),
1396
          .sreset(),
1397
          .dfflo(),
1398
          .dffhi(),
1399
          .devpor(),
1400
          .devclrn()
1401
                        );
1402
 
1403
                end
1404
                else
1405
                begin
1406
                        wire gnd_lut /* synthesis keep = 1*/;
1407
                        assign gnd_lut = 1'b0;
1408
                        assign fr_os_lo = gnd_lut;
1409
 
1410
                        assign fr_os_oe = 1'b0;
1411
 
1412
                        if (USE_OUTPUT_STROBE_RESET == "true") begin
1413
                                reg clk_h /* synthesis dont_merge */;
1414
                                always @(posedge write_strobe_clock_in or negedge reset_n_core_clock_in)
1415
                                begin
1416
                                        if (~reset_n_core_clock_in)
1417
                                                clk_h <= 1'b0;
1418
                                        else
1419
                                                clk_h <= 1'b1;
1420
                                end
1421
                                assign fr_os_hi = clk_h;
1422
                        end else begin
1423
                                assign fr_os_hi = 1'b1;
1424
                        end
1425
                end
1426
        end
1427
        else
1428
        begin
1429
                if (USE_BIDIR_STROBE == "true")
1430
                begin
1431
                        assign fr_os_oe = ~output_strobe_ena[0];
1432
 
1433
                        wire gnd_lut /* synthesis keep = 1*/;
1434
                        assign gnd_lut = 1'b0;
1435
                        assign fr_os_lo = gnd_lut;
1436
 
1437
                        if (PREAMBLE_TYPE == "low")
1438
                        begin
1439
                                reg os_ena_reg1;
1440
                                initial
1441
                                        os_ena_reg1 = 0;
1442
                                always @(posedge core_clock_in)
1443
                                        os_ena_reg1 <= output_strobe_ena[0];
1444
 
1445
                                assign fr_os_hi = os_ena_reg1 & output_strobe_ena[0];
1446
                        end
1447
                        else
1448
                        begin
1449
 
1450
                                wire vcc_lut /* synthesis keep = 1*/;
1451
                                assign vcc_lut = 1'b1;
1452
                                assign fr_os_hi = vcc_lut;
1453
                        end
1454
                end
1455
                else
1456
                begin
1457
                        wire gnd_lut /* synthesis keep = 1*/;
1458
                        assign gnd_lut = 1'b0;
1459
                        assign fr_os_lo = gnd_lut;
1460
 
1461
                        assign fr_os_oe = 1'b0;
1462
 
1463
                        if (USE_OUTPUT_STROBE_RESET == "true") begin
1464
                                reg clk_h /* synthesis dont_merge */;
1465
                                always @(posedge write_strobe_clock_in or negedge reset_n_core_clock_in)
1466
                                begin
1467
                                        if (~reset_n_core_clock_in)
1468
                                                clk_h <= 1'b0;
1469
                                        else
1470
                                                clk_h <= 1'b1;
1471
                                end
1472
                                assign fr_os_hi = clk_h;
1473
                        end else begin
1474
                                assign fr_os_hi = 1'b1;
1475
                        end
1476
                end
1477
        end
1478
 
1479
        if (USE_OUTPUT_PHASE_ALIGNMENT == "true")
1480
        begin
1481
        end
1482
        else
1483
        begin
1484
 
1485
                /*
1486
                cyclonev_ddio_oe
1487
                os_oe_ddio_oe (
1488
                        .clk (write_strobe_clock_in),
1489
                        .oe (fr_os_oe),
1490
                        .dataout (aligned_os_oe)
1491
                );
1492
                */
1493
                reg os_oe_reg;
1494
                always @(posedge write_strobe_clock) os_oe_reg <= fr_os_oe;
1495
                assign aligned_os_oe = os_oe_reg;
1496
 
1497
                cyclonev_ddio_out
1498
                #(
1499
                                .half_rate_mode("false"),
1500
                                .use_new_clocking_model("true"),
1501
                                .async_mode("none")
1502
                ) phase_align_os (
1503
                        .datainhi(fr_os_hi),
1504
                        .datainlo(fr_os_lo),
1505
                        .dataout(aligned_strobe),
1506
                        .clkhi (write_strobe_clock),
1507
                        .clklo (write_strobe_clock),
1508
                        .muxsel (write_strobe_clock),
1509
                  .clk(),
1510
      .ena(1'b1),
1511
      .areset(),
1512
      .sreset(),
1513
      .dfflo(),
1514
      .dffhi(),
1515
      .devpor(),
1516
      .devclrn(),
1517
                        .hrbypass()
1518
                );
1519
        end
1520
 
1521
        wire delayed_os_oe;
1522
        wire predelayed_os;
1523
        wire predelayed_os_oe;
1524
 
1525
        if (USE_2X_FF == "true")
1526
        begin
1527
                reg dd_os;
1528
                reg dd_os_oe;
1529
                always @(posedge dqs_dr_clock)
1530
                begin
1531
                        dd_os <= aligned_strobe;
1532
                        dd_os_oe <= aligned_os_oe;
1533
                end
1534
                assign predelayed_os = dd_os;
1535
                assign predelayed_os_oe = dd_os_oe;
1536
        end
1537
        else
1538
        begin
1539
                assign predelayed_os = aligned_strobe;
1540
                assign predelayed_os_oe = aligned_os_oe;
1541
        end
1542
 
1543
        if (USE_DYNAMIC_CONFIG == "true")
1544
        begin
1545
`ifndef FAMILY_HAS_NO_DYNCONF
1546
                wire delayed_os_oe_1;
1547
 
1548
                cyclonev_delay_chain
1549
                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1550
                dqs_out_delay_1(
1551
                        .datain             (predelayed_os),
1552
                        .delayctrlin        (dqs_outputdelaysetting_dlc),
1553
                        .dataout            (os_delayed1)
1554
                );
1555
 
1556
                assign os_delayed2 = os_delayed1;
1557
 
1558
                cyclonev_delay_chain
1559
                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
1560
                oe_delay_1(
1561
                        .datain             (predelayed_os_oe),
1562
                        .delayctrlin        (dqs_outputenabledelaysetting_dlc),
1563
                        .dataout            (delayed_os_oe_1)
1564
                );
1565
 
1566
                        assign delayed_os_oe = delayed_os_oe_1;
1567
`endif
1568
        end
1569
        else
1570
        begin
1571
                assign os_delayed2 = aligned_strobe;
1572
                assign delayed_os_oe = aligned_os_oe;
1573
        end
1574
 
1575
        wire diff_oe;
1576
        wire diff_oe_bar;
1577
        wire diff_dtc;
1578
        wire diff_dtc_bar;
1579
 
1580
        if (DIFFERENTIAL_OUTPUT_STROBE=="true")
1581
        begin
1582
                if (USE_BIDIR_STROBE == "true")
1583
                begin
1584
                        cyclonev_pseudo_diff_out   pseudo_diffa_0
1585
                        (
1586
                                .oein(delayed_os_oe),
1587
                                .dtcin(delayed_oct),
1588
                                .oeout(diff_oe),
1589
                                .oebout(diff_oe_bar),
1590
                                .dtc(diff_dtc),
1591
                                .dtcbar(diff_dtc_bar),
1592
                                .i(os_delayed2),
1593
                                .o(os),
1594
                                .obar(os_bar)
1595
                        );
1596
 
1597
                        cyclonev_io_obuf
1598
                        #(
1599
                                .sim_dynamic_termination_control_is_connected("true"),
1600
                                .bus_hold("false"),
1601
                                .open_drain_output("false")
1602
                        ) obuf_os_bar_0
1603
                        (
1604
                                .i(os_bar),
1605
                                .o(strobe_n_io),
1606
                                .obar(),
1607
                                .oe(~diff_oe_bar),
1608
                                .parallelterminationcontrol     (parallelterminationcontrol_in),
1609
                                .dynamicterminationcontrol      (diff_dtc_bar),
1610
                                .seriesterminationcontrol       (seriesterminationcontrol_in),
1611
                                .devoe()
1612
                        );
1613
                end
1614
                else
1615
                begin
1616
                        cyclonev_pseudo_diff_out   pseudo_diffa_0
1617
                        (
1618
                                .oein(1'b0),
1619
                                .oeout(diff_oe),
1620
                                .oebout(diff_oe_bar),
1621
                                .i(os_delayed2),
1622
                                .o(os),
1623
                                .obar(os_bar),
1624
                                .dtcin(),
1625
                                .dtc(),
1626
                                .dtcbar()
1627
                        );
1628
 
1629
                        cyclonev_io_obuf
1630
                        #(
1631
                                .bus_hold("false"),
1632
                                .open_drain_output("false")
1633
                        ) obuf_os_bar_0
1634
                        (
1635
                                .i(os_bar),
1636
                                .o(output_strobe_n_out),
1637
                                .obar(),
1638
                                .oe(~diff_oe_bar),
1639
                                .dynamicterminationcontrol(1'b0),
1640
                                .seriesterminationcontrol(),
1641
                                .parallelterminationcontrol(),
1642
                                .devoe()
1643
                        );
1644
                end
1645
        end
1646
        else
1647
        begin
1648
                assign os = os_delayed2;
1649
                assign diff_dtc = delayed_oct;
1650
                assign diff_oe = delayed_os_oe;
1651
        end
1652
 
1653
 
1654
        if (USE_BIDIR_STROBE == "true")
1655
        begin
1656
                cyclonev_io_obuf
1657
                #(
1658
                        .sim_dynamic_termination_control_is_connected("true"),
1659
                        .bus_hold("false"),
1660
                        .open_drain_output("false")
1661
                ) obuf_os_0
1662
                        (
1663
                        .i(os),
1664
                        .o(strobe_io),
1665
                        .obar(),
1666
                        .oe(~diff_oe),
1667
                        .parallelterminationcontrol     (parallelterminationcontrol_in),
1668
                        .dynamicterminationcontrol      (diff_dtc),
1669
                        .seriesterminationcontrol       (seriesterminationcontrol_in),
1670
                        .devoe()
1671
                );
1672
        end
1673
        else
1674
        begin
1675
                cyclonev_io_obuf
1676
                #(
1677
                        .bus_hold("false"),
1678
                        .open_drain_output("false")
1679
                ) obuf_os_0
1680
                        (
1681
                        .i(os),
1682
                        .o(output_strobe_out),
1683
                        .obar(),
1684
                        .oe(~diff_oe),
1685
                        .parallelterminationcontrol     (),
1686
                        .dynamicterminationcontrol      (1'b0),
1687
                        .seriesterminationcontrol       (),
1688
                        .devoe()
1689
                        );
1690
 
1691
        end
1692
end
1693
endgenerate
1694
 
1695
 
1696
wire [PIN_WIDTH-1:0] aligned_oe ;
1697
wire [PIN_WIDTH-1:0] aligned_data;
1698
wire [PIN_WIDTH-1:0] ddr_data;
1699
wire [PIN_WIDTH-1:0] dq_outputhalfratebypass;
1700
wire [PIN_WIDTH*2-1:0] rfifo_clock_select;
1701
wire [PIN_WIDTH*3-1:0] rfifo_mode;
1702
 
1703
 
1704
generate
1705
        if (PIN_TYPE == "output" || PIN_TYPE == "bidir")
1706
        begin
1707
                genvar opin_num;
1708
                for (opin_num = 0; opin_num < PIN_WIDTH; opin_num = opin_num + 1)
1709
                begin :output_path_gen
1710
                        wire fr_data_hi;
1711
                        wire fr_data_lo;
1712
                        wire fr_oe;
1713
 
1714
                        if (USE_HALF_RATE_OUTPUT == "true")
1715
                        begin
1716
                                wire hr_data_t0;
1717
                                wire hr_data_t1;
1718
                                wire hr_data_t2;
1719
                                wire hr_data_t3;
1720
                                wire write_oe_hi;
1721
                                wire write_oe_lo;
1722
 
1723
                                if (NATURAL_ALIGNMENT == "true")
1724
                                begin
1725
                                        assign hr_data_t0 = write_data_in [opin_num * rate_mult_out];
1726
                                assign hr_data_t1 = write_data_in [opin_num * rate_mult_out + 1];
1727
                                assign hr_data_t2 = write_data_in [opin_num * rate_mult_out + 2];
1728
                                        assign hr_data_t3 = write_data_in [opin_num * rate_mult_out + 3];
1729
                                        assign write_oe_hi = write_oe_in [2*opin_num + 0];
1730
                                        assign write_oe_lo = write_oe_in [2*opin_num + 1];
1731
                                end
1732
                                else if (REGULAR_WRITE_BUS_ORDERING == "true")
1733
                                begin
1734
                                        assign hr_data_t0 = write_data_in [opin_num + 0*PIN_WIDTH];
1735
                                assign hr_data_t1 = write_data_in [opin_num + 1*PIN_WIDTH];
1736
                                assign hr_data_t2 = write_data_in [opin_num + 2*PIN_WIDTH];
1737
                                        assign hr_data_t3 = write_data_in [opin_num + 3*PIN_WIDTH];
1738
                                        assign write_oe_hi = write_oe_in [opin_num + 0];
1739
                                        assign write_oe_lo = write_oe_in [opin_num + PIN_WIDTH];
1740
                                end
1741
                                else
1742
                                begin
1743
                                        assign hr_data_t0 = write_data_in [opin_num + 1*PIN_WIDTH];
1744
                                        assign hr_data_t1 = write_data_in [opin_num + 0*PIN_WIDTH];
1745
                                        assign hr_data_t2 = write_data_in [opin_num + 3*PIN_WIDTH];
1746
                                        assign hr_data_t3 = write_data_in [opin_num + 2*PIN_WIDTH];
1747
                                        assign write_oe_hi = write_oe_in [opin_num + 0];
1748
                                        assign write_oe_lo = write_oe_in [opin_num + PIN_WIDTH];
1749
                                end
1750
 
1751
                                cyclonev_ddio_out
1752
                                #(
1753
                                        .half_rate_mode("true"),
1754
                                        .use_new_clocking_model("true"),
1755
                                        .async_mode("none")
1756
                                ) hr_to_fr_hi (
1757
                                        .datainhi(hr_data_t0),
1758
                                        .datainlo(hr_data_t2),
1759
                                        .dataout(fr_data_hi),
1760
                                        .clkhi (hr_seq_clock),
1761
                                        .clklo (hr_seq_clock),
1762
                                        .hrbypass(dq_outputhalfratebypass[opin_num]),
1763
                                        .muxsel (hr_seq_clock),
1764
                                        .clk(),
1765
          .ena(1'b1),
1766
          .areset(),
1767
          .sreset(),
1768
          .dfflo(),
1769
          .dffhi(),
1770
          .devpor(),
1771
          .devclrn()
1772
                                );
1773
 
1774
                                cyclonev_ddio_out
1775
                                #(
1776
                                        .half_rate_mode("true"),
1777
                                        .use_new_clocking_model("true"),
1778
                                        .async_mode("none")
1779
                                ) hr_to_fr_lo (
1780
                                        .datainhi(hr_data_t1),
1781
                                        .datainlo(hr_data_t3),
1782
                                        .dataout(fr_data_lo),
1783
                                        .clkhi (hr_seq_clock),
1784
                                        .clklo (hr_seq_clock),
1785
                                        .hrbypass(dq_outputhalfratebypass[opin_num]),
1786
                                        .muxsel (hr_seq_clock),
1787
                                        .clk(),
1788
          .ena(1'b1),
1789
          .areset(),
1790
          .sreset(),
1791
          .dfflo(),
1792
          .dffhi(),
1793
          .devpor(),
1794
          .devclrn()
1795
                                );
1796
 
1797
                                cyclonev_ddio_out
1798
                                #(
1799
                                .half_rate_mode("true"),
1800
                                .use_new_clocking_model("true")
1801
                                ) hr_to_fr_oe (
1802
                                        .datainhi(~write_oe_hi),
1803
                                        .datainlo(~write_oe_lo),
1804
                                        .dataout(fr_oe),
1805
                                        .clkhi (hr_seq_clock),
1806
                                        .clklo (hr_seq_clock),
1807
                                        .hrbypass(dq_outputhalfratebypass[opin_num]),
1808
                                        .muxsel (hr_seq_clock),
1809
                                        .clk(),
1810
          .ena(1'b1),
1811
          .areset(),
1812
          .sreset(),
1813
          .dfflo(),
1814
          .dffhi(),
1815
          .devpor(),
1816
          .devclrn()
1817
                                );
1818
                        end
1819
                        else
1820
                        begin
1821
                                if (NATURAL_ALIGNMENT == "true")
1822
                                begin
1823
                                        assign fr_data_lo = write_data_in [opin_num * rate_mult_out + 1];
1824
                                        assign fr_data_hi = write_data_in [opin_num * rate_mult_out];
1825
                                end
1826
                                else
1827
                                begin
1828
                                        assign fr_data_lo = write_data_in [opin_num+PIN_WIDTH];
1829
                                        assign fr_data_hi = write_data_in [opin_num];
1830
                                end
1831
                                assign fr_oe = ~write_oe_in [opin_num];
1832
                        end
1833
 
1834
                        if (USE_OUTPUT_PHASE_ALIGNMENT == "true")
1835
                        begin
1836
                        end
1837
                        else
1838
                        begin
1839
                                cyclonev_ddio_out
1840
                                #(
1841
                                        .async_mode("none"),
1842
                                        .half_rate_mode("false"),
1843
                                        .sync_mode("none"),
1844
                                        .use_new_clocking_model("true")
1845
                                ) ddio_out (
1846
                                        .datainhi(fr_data_hi),
1847
                                        .datainlo(fr_data_lo),
1848
                                        .dataout(aligned_data[opin_num]),
1849
                                        .clkhi (dq_shifted_clock),
1850
                                        .clklo (dq_shifted_clock),
1851
                                        .muxsel (dq_shifted_clock),
1852
                                        .clk(),
1853
          .ena(1'b1),
1854
          .areset(),
1855
          .sreset(),
1856
          .dfflo(),
1857
          .dffhi(),
1858
          .devpor(),
1859
          .devclrn(),
1860
                                        .hrbypass()
1861
                                );
1862
 
1863
 
1864
                                /*
1865
                                cyclonev_ddio_oe
1866
                                dq_oe_ddio_oe (
1867
                                        .clk (fr_clock_in),
1868
                                        .oe (fr_oe),
1869
                                        .dataout (aligned_oe [opin_num])
1870
                                );
1871
                                */
1872
                                reg oe_reg /* synthesis dont_merge altera_attribute="FAST_OUTPUT_ENABLE_REGISTER=on" */;
1873
                                always @(posedge dq_shifted_clock) oe_reg <= fr_oe;
1874
                                assign aligned_oe[opin_num] = oe_reg;
1875
                        end
1876
                end
1877
        end
1878
endgenerate
1879
 
1880
 
1881
generate
1882
if (PIN_TYPE == "input" || PIN_TYPE == "bidir")
1883
begin
1884
        genvar ipin_num;
1885
        for (ipin_num = 0; ipin_num < PIN_WIDTH; ipin_num = ipin_num + 1)
1886
        begin :input_path_gen
1887
 
1888
                wire [1:0] sdr_data;
1889
                wire [1:0] aligned_input;
1890
                wire dqsbusout_to_ddio_in;
1891
                wire dqsnbusout_to_ddio_in;
1892
 
1893
                if (INVERT_CAPTURE_STROBE == "true") begin
1894
                        assign dqsbusout_to_ddio_in = ~dqsbusout;
1895
                        if (SEPARATE_CAPTURE_STROBE == "true") begin
1896
                                assign dqsnbusout_to_ddio_in = ~dqsnbusout;
1897
                        end
1898
                end else begin
1899
                        assign dqsbusout_to_ddio_in = dqsbusout;
1900
                        if (SEPARATE_CAPTURE_STROBE == "true") begin
1901
                                assign dqsnbusout_to_ddio_in = dqsnbusout;
1902
                        end
1903
                end
1904
 
1905
                if (SEPARATE_CAPTURE_STROBE == "true") begin
1906
                        cyclonev_ddio_in
1907
                        #(
1908
                                .use_clkn("true"),
1909
                                .async_mode("none"),
1910
                                .sync_mode("none")
1911
                        ) capture_reg(
1912
                                .datain(ddr_data[ipin_num]),
1913
                                .clk (dqsbusout_to_ddio_in),
1914
                                .clkn (dqsnbusout_to_ddio_in),
1915
                                .regouthi(sdr_data[1]),
1916
                                .regoutlo(sdr_data[0]),
1917
        .ena(1'b1),
1918
        .areset(),
1919
        .sreset(),
1920
        .dfflo(),
1921
        .devpor(),
1922
        .devclrn()
1923
                        );
1924
                end else begin
1925
                        cyclonev_ddio_in
1926
                        #(
1927
                                .use_clkn("false"),
1928
                                .async_mode("none"),
1929
                                .sync_mode("none")
1930
                        )  capture_reg(
1931
                                .datain(ddr_data[ipin_num]),
1932
                                .clk (dqsbusout_to_ddio_in),
1933
                                .regouthi(sdr_data[1]),
1934
                                .regoutlo(sdr_data[0]),
1935
                                .clkn(),
1936
        .ena(1'b1),
1937
        .areset(),
1938
        .sreset(),
1939
        .dfflo(),
1940
        .devpor(),
1941
        .devclrn()
1942
                        );
1943
                end
1944
 
1945
                if (USE_INPUT_PHASE_ALIGNMENT == "true")
1946
                begin
1947
                end
1948
                else
1949
                begin
1950
                        assign aligned_input = sdr_data;
1951
                end
1952
 
1953
                wire [3:0] read_fifo_out;
1954
                if (USE_HARD_FIFOS == "true")
1955
                begin
1956
                        wire wren;
1957
                        if (USE_BIDIR_STROBE == "true")
1958
                        begin
1959
                                assign wren = 1'b1;
1960
                        end
1961
                        else
1962
                        begin
1963
                                assign wren = vfifo_capture_strobe_ena;
1964
                        end
1965
 
1966
                        wire rfifo_rd_clk;
1967
                        if(USE_DYNAMIC_CONFIG == "true") begin
1968
                                cyclonev_read_fifo_read_clock_select
1969
                                read_fifo_clk_sel
1970
                                (
1971
                                        .clkin({hr_seq_clock, dqs_shifted_clock, 1'b0}),
1972
                                        .clksel(rfifo_clock_select[(ipin_num+1)*2-1:ipin_num*2]),
1973
                                        .clkout (rfifo_rd_clk)
1974
                                );
1975
                        end
1976
                        else begin
1977
                                if (USE_HALF_RATE_OUTPUT == "true") begin
1978
                                        assign rfifo_rd_clk = hr_seq_clock;
1979
                                end
1980
                                else begin
1981
                                        assign rfifo_rd_clk = dqs_shifted_clock;
1982
                                end
1983
                        end
1984
 
1985
                        wire writeclk;
1986
 
1987
                        // in skip-cal mode, the read_fifo writeclk cannot be x otherwise we pick up an
1988
                        // extra edge at the beginning and there is no calibration to reset things after the first edge
1989
                        // synthesis translate_off
1990
                        assign writeclk = (dqsbusout_to_ddio_in === 1'b0) ? 1'b0 : 1'b1;
1991
                        // synthesis translate_on
1992
                        // synthesis read_comments_as_HDL on
1993
                        // assign writeclk = dqsbusout_to_ddio_in;
1994
                        // synthesis read_comments_as_HDL off
1995
 
1996
                        localparam READ_FIFO_MODE = (USE_HALF_RATE_OUTPUT == "true") ? "hrate_mode" : "frate_mode";
1997
 
1998
                        cyclonev_ir_fifo_userdes
1999
                        read_fifo
2000
                        (
2001
                                .rstn (rfifo_reset_n),
2002
                                .dinfiforx (aligned_input),
2003
                                .writeclk (writeclk),
2004
                                .writeenable (wren),
2005
                                .dout (read_fifo_out),
2006
                                .readclk (rfifo_rd_clk),
2007
                                .dynfifomode(rfifo_mode[(ipin_num+1)*3-1:ipin_num*3]),
2008
                                .readenable(lfifo_rden),
2009
                          .tstclk(),
2010
        .regscanovrd(),
2011
        .bslipin(),
2012
        .txin(),
2013
        .loaden(),
2014
        .bslipctl(),
2015
        .regscan(),
2016
        .scanin(),
2017
        .lvdsmodeen(),
2018
        .lvdstxsel(),
2019
        .txout(),
2020
        .rxout(),
2021
        .bslipout(),
2022
        .bslipmax(),
2023
        .scanout(),
2024
        .observableout(),
2025
        .observablefout1(),
2026
        .observablefout2(),
2027
        .observablefout3(),
2028
        .observablefout4(),
2029
        .observablewaddrcnt(),
2030
        .observableraddrcnt()
2031
                        );
2032
                        defparam read_fifo.a_use_dynamic_fifo_mode = USE_DYNAMIC_CONFIG;
2033
                        defparam read_fifo.a_rb_fifo_mode = READ_FIFO_MODE;
2034
                        defparam read_fifo.a_sim_wclk_pre_delay = 10;
2035
                        defparam read_fifo.a_sim_readenable_pre_delay = 10;
2036
                end
2037
                else
2038
                begin
2039
                        assign read_fifo_out = aligned_input;
2040
                end
2041
 
2042
                if (REVERSE_READ_WORDS == "true")
2043
                begin
2044
                        if (USE_HALF_RATE_OUTPUT == "true")
2045
                        begin
2046
                                assign read_data_out [ipin_num] = read_fifo_out [3];
2047
                                assign read_data_out [PIN_WIDTH +ipin_num] = read_fifo_out [2];
2048
                                assign read_data_out [PIN_WIDTH*2 +ipin_num] = read_fifo_out [1];
2049
                                assign read_data_out [PIN_WIDTH*3 +ipin_num] = read_fifo_out [0];
2050
                        end
2051
                        else
2052
                        begin
2053
                                assign read_data_out [ipin_num] = read_fifo_out [1];
2054
                                assign read_data_out [PIN_WIDTH +ipin_num] = read_fifo_out [0];
2055
                        end
2056
                end
2057
                else if (NATURAL_ALIGNMENT == "true")
2058
                begin
2059
                        assign read_data_out [ipin_num*rate_mult_out] = read_fifo_out [0];
2060
                        assign read_data_out [ipin_num*rate_mult_out + 1] = read_fifo_out [1];
2061
                        if (USE_HALF_RATE_OUTPUT == "true")
2062
                        begin
2063
                                assign read_data_out [ipin_num*rate_mult_out + 2] = read_fifo_out [2];
2064
                                assign read_data_out [ipin_num*rate_mult_out + 3] = read_fifo_out [3];
2065
                        end
2066
                end
2067
                else
2068
                begin
2069
                        assign read_data_out [ipin_num] = read_fifo_out [0];
2070
                        assign read_data_out [PIN_WIDTH +ipin_num] = read_fifo_out [1];
2071
                        if (USE_HALF_RATE_OUTPUT == "true")
2072
                        begin
2073
                                assign read_data_out [PIN_WIDTH*2 +ipin_num] = read_fifo_out [2];
2074
                                assign read_data_out [PIN_WIDTH*3 +ipin_num] = read_fifo_out [3];
2075
                        end
2076
                end
2077
        end
2078
end
2079
endgenerate
2080
 
2081
generate
2082
        genvar pin_num;
2083
        for (pin_num = 0; pin_num < PIN_WIDTH; pin_num = pin_num + 1)
2084
        begin :pad_gen
2085
                if (PIN_TYPE == "bidir")
2086
                begin
2087
                        assign write_data_out [pin_num] = 1'b0;
2088
                end
2089
                else
2090
                begin
2091
                        assign read_write_data_io [pin_num] = 1'b0;
2092
                end
2093
 
2094
 
2095
                wire delayed_data_in;
2096
                wire delayed_data_out;
2097
                wire delayed_oe;
2098
                wire [4:0] dq_outputdelaysetting;
2099
                wire [4:0] dq_outputenabledelaysetting;
2100
                wire [4:0] dq_inputdelaysetting;
2101
 
2102
                wire [DELAY_CHAIN_WIDTH-1:0] dq_outputdelaysetting_dlc;
2103
                wire [DELAY_CHAIN_WIDTH-1:0] dq_outputenabledelaysetting_dlc;
2104
                wire [DELAY_CHAIN_WIDTH-1:0] dq_inputdelaysetting_dlc;
2105
 
2106
 
2107
                if (USE_DYNAMIC_CONFIG == "true")
2108
                begin
2109
`ifndef FAMILY_HAS_NO_DYNCONF
2110
                cyclonev_io_config config_1 (
2111
                    .datain(config_data_in),
2112
                    .clk(config_clock_in),
2113
                    .ena(config_io_ena[pin_num]),
2114
                    .update(config_update),
2115
 
2116
                    .outputregdelaysetting(dq_outputdelaysetting),
2117
                    .outputenabledelaysetting(dq_outputenabledelaysetting),
2118
                    .outputhalfratebypass(dq_outputhalfratebypass[pin_num]),
2119
                    .readfiforeadclockselect(rfifo_clock_select[(pin_num+1)*2-1:pin_num*2]),
2120
                    .readfifomode(rfifo_mode[(pin_num+1)*3-1:pin_num*3]),
2121
 
2122
                    .padtoinputregisterdelaysetting(dq_inputdelaysetting),
2123
                    .dataout()
2124
                );
2125
`endif
2126
                assign dq_outputdelaysetting_dlc = dq_outputdelaysetting;
2127
                assign dq_outputenabledelaysetting_dlc = dq_outputenabledelaysetting;
2128
                assign dq_inputdelaysetting_dlc = dq_inputdelaysetting;
2129
                end
2130
 
2131
                if (PIN_TYPE == "input" || PIN_TYPE == "bidir")
2132
                begin
2133
                        wire raw_input;
2134
                        if (USE_DYNAMIC_CONFIG == "true")
2135
                        begin
2136
`ifndef FAMILY_HAS_NO_DYNCONF
2137
                                cyclonev_delay_chain in_delay_1(
2138
                                        .datain             (raw_input),
2139
                                        .delayctrlin        (dq_inputdelaysetting_dlc),
2140
                                        .dataout            (ddr_data[pin_num])
2141
                                );
2142
`endif
2143
                        end
2144
                        else
2145
                        begin
2146
                                assign ddr_data[pin_num] = raw_input;
2147
                        end
2148
 
2149
                        if (PIN_TYPE == "bidir")
2150
                        begin
2151
                                cyclonev_io_ibuf data_in (
2152
                                        .i(read_write_data_io[pin_num]),
2153
                                        .o(raw_input),
2154
                                        .ibar(),
2155
                                        .dynamicterminationcontrol(1'b0)
2156
                                );
2157
                        end
2158
                        else
2159
                        begin
2160
                                cyclonev_io_ibuf data_in (
2161
                                        .i(read_data_in[pin_num]),
2162
                                        .o(raw_input),
2163
                                        .ibar(),
2164
                                        .dynamicterminationcontrol(1'b0)
2165
                                );
2166
                        end
2167
                end
2168
 
2169
                if (PIN_TYPE == "output" || PIN_TYPE == "bidir")
2170
                begin
2171
 
2172
                        wire predelayed_data;
2173
                        wire predelayed_oe;
2174
 
2175
                        if (USE_2X_FF == "true")
2176
                        begin
2177
                                reg dd_data;
2178
                                reg dd_oe;
2179
                                always @(posedge dq_dr_clock)
2180
                                begin
2181
                                        dd_data <= aligned_data[pin_num];
2182
                                        dd_oe <= aligned_oe[pin_num];
2183
                                end
2184
                                assign predelayed_data = dd_data;
2185
                                assign predelayed_oe = dd_oe;
2186
                        end
2187
                        else
2188
                        begin
2189
                                assign predelayed_data = aligned_data[pin_num];
2190
                                assign predelayed_oe = aligned_oe[pin_num];
2191
                        end
2192
 
2193
                        if (USE_DYNAMIC_CONFIG == "true")
2194
                        begin
2195
`ifndef FAMILY_HAS_NO_DYNCONF
2196
                                wire delayed_data_1;
2197
                                wire delayed_oe_1;
2198
 
2199
                                cyclonev_delay_chain
2200
                                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
2201
                                out_delay_1(
2202
                                        .datain             (predelayed_data),
2203
                                        .delayctrlin        (dq_outputdelaysetting_dlc),
2204
                                        .dataout            (delayed_data_1)
2205
                                );
2206
 
2207
                                assign delayed_data_out = delayed_data_1;
2208
 
2209
                                cyclonev_delay_chain
2210
                                #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
2211
                                oe_delay_1(
2212
                                        .datain             (predelayed_oe),
2213
                                        .delayctrlin        (dq_outputenabledelaysetting_dlc),
2214
                                        .dataout            (delayed_oe_1)
2215
                                );
2216
 
2217
                                assign delayed_oe = delayed_oe_1;
2218
 
2219
`endif
2220
                        end
2221
                        else
2222
                        begin
2223
                                assign delayed_data_out = predelayed_data;
2224
                                assign delayed_oe = predelayed_oe;
2225
                        end
2226
 
2227
                        if (PIN_TYPE == "output")
2228
                        begin
2229
                                cyclonev_io_obuf data_out (
2230
                                        .i (delayed_data_out),
2231
                                        .o (write_data_out [pin_num]),
2232
                                        .oe (~delayed_oe),
2233
                                        .parallelterminationcontrol     (parallelterminationcontrol_in),
2234
                                        .seriesterminationcontrol       (seriesterminationcontrol_in),
2235
          .obar(),
2236
          .devoe(),
2237
          .dynamicterminationcontrol(1'b0)
2238
                                );
2239
                        end
2240
                        else if (PIN_TYPE == "bidir")
2241
                        begin
2242
                                cyclonev_io_obuf
2243
                        #(
2244
                                .sim_dynamic_termination_control_is_connected("true")
2245
                          ) data_out (
2246
                                        .oe (~delayed_oe),
2247
                                        .i (delayed_data_out),
2248
                                        .o (read_write_data_io [pin_num]),
2249
                                        .parallelterminationcontrol     (parallelterminationcontrol_in),
2250
                                        .dynamicterminationcontrol      (delayed_oct),
2251
                                        .seriesterminationcontrol       (seriesterminationcontrol_in),
2252
          .obar(),
2253
          .devoe()
2254
                                );
2255
 
2256
                                /* synthesis translate_off */
2257
 
2258
                                assert property (@(posedge fr_clock_in or negedge fr_clock_in) (~delayed_oe === 1'b1) |-> delayed_oct === 1'b0)
2259
                                        else $display(1, "OE enabled but dynamic OCT ctrl is not in write mode");
2260
 
2261
`ifndef BOARD_DELAY_MODEL
2262
                                assert property (@(posedge capture_strobe or negedge capture_strobe) (~delayed_oe === 1'b0 && read_write_data_io[pin_num] !== 1'bz) |-> delayed_oct === 1'b1)
2263
                                else $display(1, "Read data comes back but dynamic OCT ctrl is not in read mode");
2264
`endif
2265
 
2266
                                /* synthesis translate_on */
2267
                        end
2268
                end
2269
        end
2270
endgenerate
2271
 
2272
generate
2273
        genvar epin_num;
2274
        for (epin_num = 0; epin_num < EXTRA_OUTPUT_WIDTH; epin_num = epin_num + 1)
2275
        begin :extra_output_pad_gen
2276
                wire fr_data_hi;
2277
                wire fr_data_lo;
2278
                wire aligned_data;
2279
                wire extra_outputhalfratebypass;
2280
 
2281
                if (USE_HALF_RATE_OUTPUT == "true")
2282
                begin
2283
                        wire hr_data_t0;
2284
                        wire hr_data_t1;
2285
                        wire hr_data_t2;
2286
                        wire hr_data_t3;
2287
 
2288
                        if (NATURAL_ALIGNMENT == "true")
2289
                        begin
2290
                                assign hr_data_t0 = extra_write_data_in [epin_num * rate_mult_out];
2291
                                assign hr_data_t1 = extra_write_data_in [epin_num * rate_mult_out + 1];
2292
                                assign hr_data_t2 = extra_write_data_in [epin_num * rate_mult_out + 2];
2293
                                assign hr_data_t3 = extra_write_data_in [epin_num * rate_mult_out + 3];
2294
                        end
2295
                        else if (REGULAR_WRITE_BUS_ORDERING == "true")
2296
                        begin
2297
                                assign hr_data_t0 = extra_write_data_in [epin_num + 0*EXTRA_OUTPUT_WIDTH];
2298
                                assign hr_data_t1 = extra_write_data_in [epin_num + 1*EXTRA_OUTPUT_WIDTH];
2299
                                assign hr_data_t2 = extra_write_data_in [epin_num + 2*EXTRA_OUTPUT_WIDTH];
2300
                                assign hr_data_t3 = extra_write_data_in [epin_num + 3*EXTRA_OUTPUT_WIDTH];
2301
                        end
2302
                        else
2303
                        begin
2304
                                assign hr_data_t0 = extra_write_data_in [epin_num + 2*EXTRA_OUTPUT_WIDTH];
2305
                                assign hr_data_t1 = extra_write_data_in [epin_num + 0*EXTRA_OUTPUT_WIDTH];
2306
                                assign hr_data_t2 = extra_write_data_in [epin_num + 3*EXTRA_OUTPUT_WIDTH];
2307
                                assign hr_data_t3 = extra_write_data_in [epin_num + 1*EXTRA_OUTPUT_WIDTH];
2308
                        end
2309
 
2310
                        cyclonev_ddio_out
2311
                        #(
2312
                                .half_rate_mode("true"),
2313
                                .use_new_clocking_model("true"),
2314
                                .async_mode("none")
2315
                        ) hr_to_fr_hi (
2316
                                .datainhi(hr_data_t0),
2317
                                .datainlo(hr_data_t2),
2318
                                .dataout(fr_data_hi),
2319
                                .clkhi (hr_seq_clock),
2320
                                .clklo (hr_seq_clock),
2321
                                .hrbypass(extra_outputhalfratebypass),
2322
                                .muxsel (hr_seq_clock),
2323
                                .clk(),
2324
        .ena(1'b1),
2325
        .areset(),
2326
        .sreset(),
2327
        .dfflo(),
2328
        .dffhi(),
2329
        .devpor(),
2330
        .devclrn()
2331
                        );
2332
 
2333
                        cyclonev_ddio_out
2334
                        #(
2335
                                .half_rate_mode("true"),
2336
                                .use_new_clocking_model("true"),
2337
                                .async_mode("none")
2338
                        ) hr_to_fr_lo (
2339
                                .datainhi(hr_data_t1),
2340
                                .datainlo(hr_data_t3),
2341
                                .dataout(fr_data_lo),
2342
                                .clkhi (hr_seq_clock),
2343
                                .clklo (hr_seq_clock),
2344
                                .hrbypass(extra_outputhalfratebypass),
2345
                                .muxsel (hr_seq_clock),
2346
                        .clk(),
2347
        .ena(1'b1),
2348
        .areset(),
2349
        .sreset(),
2350
        .dfflo(),
2351
        .dffhi(),
2352
        .devpor(),
2353
        .devclrn()
2354
                        );
2355
                end
2356
                else
2357
                begin
2358
                        if (NATURAL_ALIGNMENT == "true")
2359
                        begin
2360
                                assign fr_data_lo = extra_write_data_in [epin_num * rate_mult_out + 1];
2361
                                assign fr_data_hi = extra_write_data_in [epin_num * rate_mult_out];
2362
                        end
2363
                        else
2364
                        begin
2365
                                assign fr_data_lo = extra_write_data_in [epin_num+EXTRA_OUTPUT_WIDTH];
2366
                                assign fr_data_hi = extra_write_data_in [epin_num];
2367
                        end
2368
                end
2369
 
2370
                if (USE_OUTPUT_PHASE_ALIGNMENT == "true")
2371
                begin
2372
                end
2373
                else
2374
                begin
2375
 
2376
                        cyclonev_ddio_out
2377
                        #(
2378
                                .async_mode("none"),
2379
                                .half_rate_mode("false"),
2380
                                .sync_mode("none"),
2381
                                .use_new_clocking_model("true")
2382
                        ) ddio_out (
2383
                                .datainhi(fr_data_hi),
2384
                                .datainlo(fr_data_lo),
2385
                                .dataout(aligned_data),
2386
                                .clkhi (dq_shifted_clock),
2387
                                .clklo (dq_shifted_clock),
2388
                                .muxsel (dq_shifted_clock),
2389
                        .clk(),
2390
        .ena(1'b1),
2391
        .areset(),
2392
        .sreset(),
2393
        .dfflo(),
2394
        .dffhi(),
2395
        .devpor(),
2396
        .devclrn(),
2397
                                .hrbypass()
2398
                        );
2399
                end
2400
 
2401
                wire delayed_data_out;
2402
                wire [4:0] dq_outputdelaysetting1;
2403
                wire [4:0] dq_inputdelaysetting;
2404
                wire [DELAY_CHAIN_WIDTH-1:0] dq_outputdelaysetting1_dlc;
2405
                wire [DELAY_CHAIN_WIDTH-1:0] dq_inputdelaysetting_dlc;
2406
 
2407
                if (USE_DYNAMIC_CONFIG == "true")
2408
                begin
2409
`ifndef FAMILY_HAS_NO_DYNCONF
2410
                        cyclonev_io_config config_1 (
2411
                                .datain(config_data_in),
2412
                                .clk(config_clock_in),
2413
                                .ena(config_extra_io_ena[epin_num]),
2414
                                .update(config_update),
2415
 
2416
                                .outputregdelaysetting(dq_outputdelaysetting1),
2417
                                .outputhalfratebypass(extra_outputhalfratebypass),
2418
                                .padtoinputregisterdelaysetting(dq_inputdelaysetting),
2419
                                .dataout(),
2420
                                .readfiforeadclockselect(),
2421
        .readfifomode(),
2422
        .outputenabledelaysetting()
2423
 
2424
                        );
2425
 
2426
                        assign dq_outputdelaysetting1_dlc = dq_outputdelaysetting1;
2427
                        assign dq_inputdelaysetting_dlc = dq_inputdelaysetting;
2428
 
2429
                        wire delayed_data_1;
2430
 
2431
                        cyclonev_delay_chain
2432
                        #(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))
2433
                        out_delay_1(
2434
                                .datain             (aligned_data),
2435
                                .delayctrlin        (dq_outputdelaysetting1_dlc),
2436
                                .dataout            (delayed_data_1)
2437
                        );
2438
                        assign delayed_data_out = delayed_data_1;
2439
`endif
2440
                end
2441
                else
2442
                begin
2443
                        assign delayed_data_out = aligned_data;
2444
                end
2445
                cyclonev_io_obuf obuf_1 (
2446
                        .i (delayed_data_out),
2447
                        .o (extra_write_data_out[epin_num]),
2448
                        .parallelterminationcontrol(parallelterminationcontrol_in),
2449
                        .dynamicterminationcontrol(1'b0),
2450
                        .seriesterminationcontrol(seriesterminationcontrol_in),
2451
                        .oe (1'b1),
2452
                        .obar(),
2453
                        .devoe()
2454
                );
2455
        end
2456
endgenerate
2457
endmodule

powered by: WebSVN 2.1.0

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