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] - Rev 32
Go to most recent revision | Compare with Previous | Blame | View Log
// (C) 2001-2017 Intel Corporation. All rights reserved.// Your use of Intel Corporation's design tools, logic functions and other// software and tools, and its AMPP partner logic functions, and any output// files any of the foregoing (including device programming or simulation// files), and any associated documentation or information are expressly subject// to the terms and conditions of the Intel Program License Subscription// Agreement, Intel MegaCore Function License Agreement, or other applicable// license agreement, including, without limitation, that your use is for the// sole purpose of programming logic devices manufactured by Intel and sold by// Intel or its authorized distributors. Please refer to the applicable// agreement for further details.// altera message_off 10034 10036 10030 10858`timescale 1 ps / 1 ps(* altera_attribute = "-name MESSAGE_DISABLE 12010; -name MESSAGE_DISABLE 12161" *)module altdq_dqs2_acv_connect_to_hard_phy_cyclonev (dll_delayctrl_in,dll_offsetdelay_in,capture_strobe_in,capture_strobe_n_in,capture_strobe_ena,capture_strobe_out,output_strobe_ena,output_strobe_out,output_strobe_n_out,oct_ena_in,strobe_io,strobe_n_io,core_clock_in,fr_clock_in,hr_clock_in,dr_clock_in,strobe_ena_hr_clock_in,write_strobe_clock_in,write_strobe,reset_n_core_clock_in,parallelterminationcontrol_in,seriesterminationcontrol_in,read_data_in,write_data_out,read_write_data_io,write_oe_in,read_data_out,write_data_in,extra_write_data_in,extra_write_data_out,capture_strobe_tracking,lfifo_rdata_en,lfifo_rdata_en_full,lfifo_rd_latency,lfifo_reset_n,lfifo_rdata_valid,vfifo_qvld,vfifo_inc_wr_ptr,vfifo_reset_n,rfifo_reset_n,config_data_in,config_dqs_ena,config_io_ena,config_extra_io_ena,config_dqs_io_ena,config_update,config_clock_in);parameter PIN_WIDTH = 8;parameter PIN_TYPE = "bidir";parameter USE_INPUT_PHASE_ALIGNMENT = "false";parameter USE_OUTPUT_PHASE_ALIGNMENT = "false";parameter USE_HALF_RATE_INPUT = "false";parameter USE_HALF_RATE_OUTPUT = "false";parameter DIFFERENTIAL_CAPTURE_STROBE = "false";parameter SEPARATE_CAPTURE_STROBE = "false";parameter INPUT_FREQ = 0.0;parameter INPUT_FREQ_PS = "0 ps";parameter DELAY_CHAIN_BUFFER_MODE = "high";parameter DQS_PHASE_SETTING = 3;parameter DQS_PHASE_SHIFT = 9000;localparam DQS_DELAYCHAIN_BYPASS = (DQS_PHASE_SHIFT == 0) ? "true" : "false";parameter DQS_ENABLE_PHASE_SETTING = 2;parameter USE_DYNAMIC_CONFIG = "true";parameter INVERT_CAPTURE_STROBE = "false";parameter SWAP_CAPTURE_STROBE_POLARITY = "false";parameter USE_TERMINATION_CONTROL = "false";parameter USE_OCT_ENA_IN_FOR_OCT = "false";parameter USE_DQS_ENABLE = "false";parameter USE_IO_CONFIG = "false";parameter USE_DQS_CONFIG = "false";parameter USE_OFFSET_CTRL = "false";parameter HR_DDIO_OUT_HAS_THREE_REGS = "true";parameter USE_OUTPUT_STROBE = "true";parameter DIFFERENTIAL_OUTPUT_STROBE = "false";parameter USE_OUTPUT_STROBE_RESET = "true";parameter USE_BIDIR_STROBE = "false";parameter REVERSE_READ_WORDS = "false";parameter NATURAL_ALIGNMENT = "false";parameter EXTRA_OUTPUT_WIDTH = 0;parameter PREAMBLE_TYPE = "none";parameter USE_DATA_OE_FOR_OCT = "false";parameter DQS_ENABLE_WIDTH = 1;parameter EMIF_UNALIGNED_PREAMBLE_SUPPORT = "false";parameter EMIF_BYPASS_OCT_DDIO = "false";parameter USE_2X_FF = "false";parameter USE_DQS_TRACKING = "false";parameter SEPERATE_LDC_FOR_WRITE_STROBE = "false";localparam rate_mult_in = (USE_HALF_RATE_INPUT == "true") ? 4 : 2;localparam rate_mult_out = (USE_HALF_RATE_OUTPUT == "true") ? 4 : 2;localparam fpga_width_in = PIN_WIDTH * rate_mult_in;localparam fpga_width_out = PIN_WIDTH * rate_mult_out;localparam extra_fpga_width_out = EXTRA_OUTPUT_WIDTH * rate_mult_out;localparam OS_ENA_WIDTH = rate_mult_out / 2;localparam WRITE_OE_WIDTH = PIN_WIDTH * rate_mult_out / 2;parameter DQS_ENABLE_PHASECTRL = "true";parameter DYNAMIC_MODE = "dynamic";parameter OCT_SERIES_TERM_CONTROL_WIDTH = 16;parameter OCT_PARALLEL_TERM_CONTROL_WIDTH = 16;parameter DLL_WIDTH = 6;parameter REGULAR_WRITE_BUS_ORDERING = "true";parameter ALTERA_ALTDQ_DQS2_FAST_SIM_MODEL = 0;parameter USE_HARD_FIFOS = "false";parameter CALIBRATION_SUPPORT = "false";parameter USE_DQSIN_FOR_VFIFO_READ = "false";parameter HHP_HPS = "false";localparam READ_FIFO_MODE = (USE_HALF_RATE_OUTPUT == "true") ? "hrate_mode" : "frate_mode";localparam DATA_RATE = 1;localparam DELAY_CHAIN_WIDTH = 5;localparam OUTPUT_ALIGNMENT_DELAY = "two_cycle";input [DLL_WIDTH-1:0] dll_delayctrl_in;input [DLL_WIDTH-1:0] dll_offsetdelay_in;input core_clock_in;input fr_clock_in;input hr_clock_in;input strobe_ena_hr_clock_in;input write_strobe_clock_in;input [3:0] write_strobe;input [PIN_WIDTH-1:0] read_data_in;output [PIN_WIDTH-1:0] write_data_out;inout [PIN_WIDTH-1:0] read_write_data_io;input capture_strobe_in;input capture_strobe_n_in;input [DQS_ENABLE_WIDTH-1:0] capture_strobe_ena;input reset_n_core_clock_in;parameter USE_LDC_AS_LOW_SKEW_CLOCK = "false";parameter DLL_USE_2X_CLK = "false";parameter DQS_ENABLE_AFTER_T7 = "true";input [OS_ENA_WIDTH-1:0] output_strobe_ena;output output_strobe_out;output output_strobe_n_out;input [1:0] oct_ena_in;inout strobe_io;inout strobe_n_io;output [fpga_width_out-1:0] read_data_out;input [fpga_width_out-1:0] write_data_in;input [WRITE_OE_WIDTH-1:0] write_oe_in;output capture_strobe_out;input [extra_fpga_width_out-1:0] extra_write_data_in;output [EXTRA_OUTPUT_WIDTH-1:0] extra_write_data_out;output capture_strobe_tracking;parameter LFIFO_OCT_EN_MASK = 4294967295;input [(rate_mult_out / 2)-1:0] lfifo_rdata_en;input [(rate_mult_out / 2)-1:0] lfifo_rdata_en_full;localparam LFIFO_RD_LATENCY_WIDTH = 5;input [LFIFO_RD_LATENCY_WIDTH-1:0] lfifo_rd_latency;input lfifo_reset_n;output lfifo_rdata_valid;input [(rate_mult_out / 2)-1:0] vfifo_qvld;input [(rate_mult_out / 2)-1:0] vfifo_inc_wr_ptr;input vfifo_reset_n;input rfifo_reset_n;input dr_clock_in;input [OCT_PARALLEL_TERM_CONTROL_WIDTH-1:0] parallelterminationcontrol_in;input [OCT_SERIES_TERM_CONTROL_WIDTH-1:0] seriesterminationcontrol_in;input config_data_in;input config_update;input config_dqs_ena;input [PIN_WIDTH-1:0] config_io_ena;input [EXTRA_OUTPUT_WIDTH-1:0] config_extra_io_ena;input config_dqs_io_ena;input config_clock_in;wire [DLL_WIDTH-1:0] dll_delay_value;assign dll_delay_value = dll_delayctrl_in;wire dqsbusout;wire dqsnbusout;wire capture_strobe;wire [1:0] inputclkdelaysetting;wire [1:0] inputclkndelaysetting;wire [4:0] dqs_outputdelaysetting;wire [4:0] dqs_outputenabledelaysetting;wire [DELAY_CHAIN_WIDTH-1:0] dqs_outputdelaysetting_dlc;wire [DELAY_CHAIN_WIDTH-1:0] dqs_outputenabledelaysetting_dlc;`ifndef FAMILY_HAS_NO_DYNCONFgenerateif (USE_DYNAMIC_CONFIG =="true" && (USE_OUTPUT_STROBE == "true" || PIN_TYPE =="input" || PIN_TYPE == "bidir"))begincyclonev_io_config dqs_io_config_1 (.outputhalfratebypass(),.readfiforeadclockselect(),.readfifomode(),.padtoinputregisterdelaysetting(),.datain(config_data_in),.clk(config_clock_in),.ena(config_dqs_io_ena),.update(config_update),.outputregdelaysetting(dqs_outputdelaysetting),.outputenabledelaysetting(dqs_outputenabledelaysetting),.dataout());assign dqs_outputdelaysetting_dlc = dqs_outputdelaysetting;assign dqs_outputenabledelaysetting_dlc = dqs_outputenabledelaysetting;/*cyclonev_io_config dqsn_io_config_1 (.datain(config_data_in),.clk(config_clock_in),.ena(config_dqs_io_ena),.update(config_update),.outputregdelaysetting(dqsn_outputdelaysetting),.outputenabledelaysetting(dqsn_outputenabledelaysetting),.padtoinputregisterdelaysetting(dqsn_inputdelaysetting),.dataout());*/endendgenerate`endifwire [1:0] oct_ena;wire fr_term;wire [1:0] oct_source;generateif (USE_DATA_OE_FOR_OCT == "true")beginassign oct_source = ~write_oe_in;endelsebeginassign oct_source = ~output_strobe_ena;endendgenerategenerateif (USE_HARD_FIFOS == "true")beginif (USE_HALF_RATE_OUTPUT == "true")beginif (USE_OCT_ENA_IN_FOR_OCT == "true")beginassign oct_ena = oct_ena_in;endelsebeginassign oct_ena = oct_source;endendelsebeginif (USE_OCT_ENA_IN_FOR_OCT == "true")beginassign fr_term = oct_ena_in[0];endelsebeginassign fr_term = oct_source[0];endendendelsebeginif (USE_HALF_RATE_OUTPUT == "true")begin : oct_ena_hr_genif (USE_OCT_ENA_IN_FOR_OCT == "true")beginassign oct_ena = oct_ena_in;endelsebeginreg oct_ena_hr_reg;always @(posedge hr_clock_in)oct_ena_hr_reg <= oct_source[1];assign oct_ena[1] = ~oct_source[1];assign oct_ena[0] = ~(oct_ena_hr_reg | oct_source[1]);endendelsebegin : oct_ena_fr_genif (USE_OCT_ENA_IN_FOR_OCT == "true")beginassign fr_term = oct_ena_in[0];endelsebeginreg oct_ena_fr_reg;initialoct_ena_fr_reg = 0;always @(posedge hr_clock_in)oct_ena_fr_reg <= oct_source[0];assign fr_term = ~(oct_source[0] | oct_ena_fr_reg);endendendendgeneratelocalparam PINS_PER_DQS_CONFIG = 6;localparam NUM_STROBES = (DIFFERENTIAL_CAPTURE_STROBE == "true" || SEPARATE_CAPTURE_STROBE == "true") ? 2 : 1;localparam DQS_CONFIGS = (PIN_WIDTH + EXTRA_OUTPUT_WIDTH + NUM_STROBES) / PINS_PER_DQS_CONFIG;wire dividerphasesetting [DQS_CONFIGS:0];wire dqoutputphaseinvert [DQS_CONFIGS:0];wire [1:0] dqoutputphasesetting [DQS_CONFIGS:0];wire [4:0] dqsbusoutdelaysetting [DQS_CONFIGS:0];wire [1:0] dqsoutputphasesetting [DQS_CONFIGS:0];wire [1:0] resyncinputphasesetting [DQS_CONFIGS:0];wire [4:0] dqsenabledelaysetting [DQS_CONFIGS:0];wire [4:0] dqsdisabledelaysetting [DQS_CONFIGS:0];wire dqshalfratebypass [DQS_CONFIGS:0];wire [1:0] dqsinputphasesetting [DQS_CONFIGS:0];wire [1:0] dqsenablectrlphasesetting [DQS_CONFIGS:0];wire dqoutputpowerdown [DQS_CONFIGS:0];wire dqsoutputpowerdown [DQS_CONFIGS:0];wire resyncinputpowerdown [DQS_CONFIGS:0];wire dqsenablectrlpowerdown [DQS_CONFIGS:0];wire [1:0] dq2xoutputphasesetting [DQS_CONFIGS:0];wire dq2xoutputphaseinvert [DQS_CONFIGS:0];wire [1:0] dqs2xoutputphasesetting [DQS_CONFIGS:0];wire dqs2xoutputphaseinvert [DQS_CONFIGS:0];wire dqsbusoutfinedelaysetting [DQS_CONFIGS:0];wire dqsenablectrlphaseinvert [DQS_CONFIGS:0];wire dqsenablefinedelaysetting [DQS_CONFIGS:0];wire dqsoutputphaseinvert [DQS_CONFIGS:0];wire enadataoutbypass [DQS_CONFIGS:0];wire enadqsenablephasetransferreg [DQS_CONFIGS:0];wire enainputcycledelaysetting [DQS_CONFIGS:0];wire enainputphasetransferreg [DQS_CONFIGS:0];wire enaoctphasetransferreg [DQS_CONFIGS:0];wire enaoutputphasetransferreg [DQS_CONFIGS:0];wire enadqsphasetransferreg [DQS_CONFIGS:0];wire [2:0] enadqscycledelaysetting [DQS_CONFIGS:0];wire [2:0] enaoctcycledelaysetting [DQS_CONFIGS:0];wire [2:0] enaoutputcycledelaysetting [DQS_CONFIGS:0];wire [4:0] octdelaysetting1 [DQS_CONFIGS:0];wire resyncinputphaseinvert [DQS_CONFIGS:0];wire [DELAY_CHAIN_WIDTH-1:0] dqsbusoutdelaysetting_dlc[DQS_CONFIGS:0];wire [DELAY_CHAIN_WIDTH-1:0] dqsenabledelaysetting_dlc[DQS_CONFIGS:0];wire [DELAY_CHAIN_WIDTH-1:0] dqsdisabledelaysetting_dlc[DQS_CONFIGS:0];wire [DELAY_CHAIN_WIDTH-1:0] octdelaysetting1_dlc[DQS_CONFIGS:0];`ifndef FAMILY_HAS_NO_DYNCONFgenerateif (USE_DYNAMIC_CONFIG == "true")begingenvar c_num;for (c_num = 0; c_num <= DQS_CONFIGS; c_num = c_num + 1)begin :dqs_config_gencyclonev_dqs_config dqs_config_inst(.clk(config_clock_in),.datain(config_data_in),.dataout(),.ena(config_dqs_ena),.update(config_update),.postamblephasesetting(dqsenablectrlphasesetting[c_num]),.postamblephaseinvert(dqsenablectrlphaseinvert[c_num]),.dqsenablegatingdelaysetting(dqsenabledelaysetting[c_num]),.dqsenableungatingdelaysetting(dqsdisabledelaysetting[c_num]),.dqshalfratebypass(dqshalfratebypass[c_num]),.enadqsenablephasetransferreg(enadqsenablephasetransferreg[c_num]),.octdelaysetting(octdelaysetting1[c_num]),.dqsbusoutdelaysetting(dqsbusoutdelaysetting[c_num]));assign dqsbusoutdelaysetting_dlc[c_num] = dqsbusoutdelaysetting[c_num];assign dqsenabledelaysetting_dlc[c_num] = dqsenabledelaysetting[c_num];assign dqsdisabledelaysetting_dlc[c_num] = dqsdisabledelaysetting[c_num];assign octdelaysetting1_dlc[c_num] = octdelaysetting1[c_num];endendendgenerate`endifgenerateif (USE_BIDIR_STROBE == "true")beginassign output_strobe_out = 1'b0;assign output_strobe_n_out = 1'b1;endelsebeginassign strobe_io = 1'b0;assign strobe_n_io = 1'b1;endendgeneratewire dq_dr_clock;wire dqs_dr_clock;wire dq_shifted_clock;wire dqs_shifted_clock;wire write_strobe_clock;wire hr_seq_clock;wire ena_clock;wire ena_zero_phase_clock;wire phy_clk_dqs_2x;wire phy_clk_dqs;wire phy_clk_dq;wire phy_clk_hr;generateif (HHP_HPS == "true") beginassign phy_clk_hr = hr_clock_in;assign phy_clk_dq = fr_clock_in;assign phy_clk_dqs = write_strobe_clock_in;assign phy_clk_dqs_2x = dr_clock_in;end else begincyclonev_phy_clkbuf phy_clkbuf (.inclk ({hr_clock_in, fr_clock_in, write_strobe_clock_in, dr_clock_in}),.outclk ({phy_clk_hr, phy_clk_dq, phy_clk_dqs, phy_clk_dqs_2x}));endendgeneratewire [3:0] leveled_dqs_clocks;wire [3:0] leveled_dq_clocks;wire [3:0] leveled_hr_clocks;cyclonev_leveling_delay_chain leveling_delay_chain_dqs (.clkin (phy_clk_dqs),.delayctrlin (dll_delay_value),.clkout(leveled_dqs_clocks));defparam leveling_delay_chain_dqs.physical_clock_source = "DQS";cyclonev_clk_phase_select clk_phase_select_dqs (.phasectrlin(),.phaseinvertctrl(),.dqsin(),.clkin (leveled_dqs_clocks[0]),.clkout (dqs_shifted_clock));defparam clk_phase_select_dqs.physical_clock_source = "DQS";defparam clk_phase_select_dqs.use_phasectrlin = "false";defparam clk_phase_select_dqs.phase_setting = 0;generateif (SEPERATE_LDC_FOR_WRITE_STROBE == "true") beginwire extra_phy_clk_dqs_2x;wire extra_phy_clk_dqs;wire extra_phy_clk_dq;wire extra_phy_clk_hr;cyclonev_phy_clkbuf phy_clkbuf (.inclk ({hr_clock_in, fr_clock_in, write_strobe_clock_in, dr_clock_in}),.outclk ({extra_phy_clk_hr, extra_phy_clk_dq, extra_phy_clk_dqs, extra_phy_clk_dqs_2x}));wire [3:0] extra_leveled_dqs_clocks;cyclonev_leveling_delay_chain leveling_delay_chain_dqs (.clkin (extra_phy_clk_dqs),.delayctrlin (dll_delay_value),.clkout(extra_leveled_dqs_clocks));defparam leveling_delay_chain_dqs.physical_clock_source = "DQS";cyclonev_clk_phase_select clk_phase_select_dqs (.phasectrlin(),.phaseinvertctrl(),.dqsin(),.clkin (extra_leveled_dqs_clocks[0]),.clkout (write_strobe_clock));defparam clk_phase_select_dqs.physical_clock_source = "DQS";defparam clk_phase_select_dqs.use_phasectrlin = "false";defparam clk_phase_select_dqs.phase_setting = 0;end else beginassign write_strobe_clock = dqs_shifted_clock;endendgeneratecyclonev_clk_phase_select clk_phase_select_pst_0p (.phasectrlin(),.phaseinvertctrl(),.dqsin(dqsbusout),.clkin (leveled_dqs_clocks[0]),.clkout (ena_zero_phase_clock));defparam clk_phase_select_pst_0p.physical_clock_source = "PST_0P";defparam clk_phase_select_pst_0p.use_phasectrlin = "false";defparam clk_phase_select_pst_0p.phase_setting = 0;defparam clk_phase_select_pst_0p.use_dqs_input = USE_DQSIN_FOR_VFIFO_READ;generateif (USE_DYNAMIC_CONFIG == "true")begincyclonev_clk_phase_select clk_phase_select_pst (.clkin (leveled_dqs_clocks),.phasectrlin(dqsenablectrlphasesetting[0]),.phaseinvertctrl(dqsenablectrlphaseinvert[0]),.clkout (ena_clock),.dqsin());defparam clk_phase_select_pst.physical_clock_source = "PST";defparam clk_phase_select_pst.invert_phase = "dynamic";endelsebegincyclonev_clk_phase_select clk_phase_select_pst (.clkin (leveled_dqs_clocks),.phasectrlin(),.phaseinvertctrl(),.clkout (ena_clock),.dqsin());defparam clk_phase_select_pst.physical_clock_source = "PST";defparam clk_phase_select_pst.use_phasectrlin = "false";endendgeneratecyclonev_leveling_delay_chain leveling_delay_chain_dq (.clkin (phy_clk_dq),.delayctrlin (),.clkout(leveled_dq_clocks));defparam leveling_delay_chain_dq.physical_clock_source = "DQ";cyclonev_clk_phase_select clk_phase_select_dq (.phasectrlin(),.phaseinvertctrl(),.dqsin(),.clkin (leveled_dq_clocks[0]),.clkout (dq_shifted_clock));defparam clk_phase_select_dq.physical_clock_source = "DQ";defparam clk_phase_select_dq.use_phasectrlin = "false";defparam clk_phase_select_dq.phase_setting = 0;cyclonev_leveling_delay_chain leveling_delay_chain_hr (.clkin (phy_clk_hr),.delayctrlin (),.clkout(leveled_hr_clocks));defparam leveling_delay_chain_hr.physical_clock_source = "HR";cyclonev_clk_phase_select clk_phase_select_hr (.phasectrlin(),.phaseinvertctrl(),.dqsin(),.clkin (leveled_hr_clocks[0]),.clkout (hr_seq_clock));defparam clk_phase_select_hr.physical_clock_source = "HR";defparam clk_phase_select_hr.use_phasectrlin = "false";defparam clk_phase_select_hr.phase_setting = 0;generateif (USE_2X_FF == "true")beginwire [3:0] leveled_dqs_2x_clocks;cyclonev_leveling_delay_chain leveling_delay_chain_dqs_2x (.clkin (phy_clk_dqs_2x),.delayctrlin (),.clkout(leveled_dqs_2x_clocks));defparam leveling_delay_chain_dqs_2x.physical_clock_source = "DQS_2X";cyclonev_clk_phase_select clk_phase_select_dqs_2x (.phasectrlin(),.phaseinvertctrl(),.dqsin(),.clkin (leveled_dqs_2x_clocks[0]),.clkout (dqs_dr_clock));defparam clk_phase_select_dqs_2x.physical_clock_source = "DQS_2X";defparam clk_phase_select_dqs_2x.use_phasectrlin = "false";defparam clk_phase_select_dqs_2x.phase_setting = 0;assign dq_dr_clock = dqs_dr_clock;endendgenerategeneratewire vfifo_capture_strobe_ena;wire lfifo_rden;wire lfifo_oct;if (USE_HARD_FIFOS == "true" && (PIN_TYPE == "input" || PIN_TYPE == "bidir"))beginwire vfifo_qvld_fr;wire vfifo_inc_wr_ptr_fr;wire lfifo_rdata_en_fr;wire lfifo_rdata_en_full_fr;if (USE_HALF_RATE_OUTPUT == "true")begincyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_vfifo_qvld (.datainhi(vfifo_qvld[0]),.datainlo(vfifo_qvld[1]),.dataout(vfifo_qvld_fr),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dqshalfratebypass[0]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_vfifo_inc_wr_ptr (.datainhi(vfifo_inc_wr_ptr[0]),.datainlo(vfifo_inc_wr_ptr[1]),.dataout(vfifo_inc_wr_ptr_fr),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dqshalfratebypass[0]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_lfifo_rdata_en (.datainhi(lfifo_rdata_en[0]),.datainlo(lfifo_rdata_en[1]),.dataout(lfifo_rdata_en_fr),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dqshalfratebypass[0]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_lfifo_rdata_en_full (.datainhi(lfifo_rdata_en_full[0]),.datainlo(lfifo_rdata_en_full[1]),.dataout(lfifo_rdata_en_full_fr),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dqshalfratebypass[0]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());endelsebeginassign vfifo_qvld_fr = vfifo_qvld[0];assign vfifo_inc_wr_ptr_fr = vfifo_inc_wr_ptr[0];assign lfifo_rdata_en_fr = lfifo_rdata_en[0];assign lfifo_rdata_en_full_fr = lfifo_rdata_en_full[0];endcyclonev_vfifovfifo (.rstn (vfifo_reset_n),.qvldin (vfifo_qvld_fr),.qvldreg (vfifo_capture_strobe_ena),.incwrptr (vfifo_inc_wr_ptr_fr),.wrclk (dqs_shifted_clock),.rdclk (ena_zero_phase_clock));wire [LFIFO_RD_LATENCY_WIDTH-1:0] lfifo_rd_latency_full_rate;assign lfifo_rd_latency_full_rate = lfifo_rd_latency << (DATA_RATE-1);cyclonev_lfifo#(.oct_lfifo_enable(LFIFO_OCT_EN_MASK)) lfifo (.rdataen (lfifo_rdata_en_fr),.rdataenfull (lfifo_rdata_en_full_fr),.rdlatency (lfifo_rd_latency_full_rate),.rstn (lfifo_reset_n),.clk (dqs_shifted_clock),.rden (lfifo_rden),.rdatavalid(lfifo_rdata_valid),.octlfifo(lfifo_oct));endelsebeginassign vfifo_capture_strobe_ena = 1'b0;assign lfifo_rden = 1'b0;assign lfifo_rdata_valid = 1'b0;assign lfifo_oct = 1'b0;endendgeneratewire delayed_oct;generatewire fr_os_oct;wire aligned_os_oct;if (USE_HALF_RATE_OUTPUT == "true")beginif (EMIF_BYPASS_OCT_DDIO == "true")beginassign fr_os_oct = oct_ena[0];endelsebegincyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_os_oct (.datainhi(oct_ena[0]),.datainlo(oct_ena[1]),.dataout(fr_os_oct),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dqshalfratebypass[0]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());endendelsebeginassign fr_os_oct = fr_term;endif (USE_HARD_FIFOS == "true")beginif (EMIF_BYPASS_OCT_DDIO == "true")beginassign aligned_os_oct = fr_os_oct;endelsebegincyclonev_ddio_oe # (.disable_second_level_register("true")) os_oct_ddio_oe (.clk (dqs_shifted_clock),.oe (fr_os_oct),.octreadcontrol (lfifo_oct),.dataout (aligned_os_oct),.ena (1'b1),.areset (),.sreset (),.dfflo (),.dffhi (),.devpor (),.devclrn ());endendelsebeginreg oct_oe_reg;always @(posedge dqs_shifted_clock) oct_oe_reg <= fr_os_oct;assign aligned_os_oct = oct_oe_reg;endwire predelayed_os_oct;if (USE_2X_FF == "true")beginreg dd_os_oct;always @(posedge dqs_dr_clock)begindd_os_oct <= aligned_os_oct;endassign predelayed_os_oct = dd_os_oct;endelsebeginassign predelayed_os_oct = aligned_os_oct;endif (USE_DYNAMIC_CONFIG == "true")beginif (EMIF_BYPASS_OCT_DDIO == "true")beginassign delayed_oct = predelayed_os_oct;endelsebegincyclonev_delay_chain # (.sim_intrinsic_rising_delay(0),.sim_intrinsic_falling_delay(0)) oct_delay (.datain (predelayed_os_oct),.delayctrlin (octdelaysetting1_dlc[0]),.dataout (delayed_oct));endendelsebeginassign delayed_oct = predelayed_os_oct;endendgenerategenerateif (PIN_TYPE == "input" || PIN_TYPE == "bidir")beginassign capture_strobe = dqsbusout;wire dqsin;wire capture_strobe_ibuf_i;wire capture_strobe_ibuf_ibar;if (USE_BIDIR_STROBE == "true")beginif (SWAP_CAPTURE_STROBE_POLARITY == "true") beginassign capture_strobe_ibuf_i = strobe_n_io;assign capture_strobe_ibuf_ibar = strobe_io;end else beginassign capture_strobe_ibuf_i = strobe_io;assign capture_strobe_ibuf_ibar = strobe_n_io;endendelsebeginif (SWAP_CAPTURE_STROBE_POLARITY == "true") beginassign capture_strobe_ibuf_i = capture_strobe_n_in;assign capture_strobe_ibuf_ibar = capture_strobe_in;end else beginassign capture_strobe_ibuf_i = capture_strobe_in;assign capture_strobe_ibuf_ibar = capture_strobe_n_in;endendif (DIFFERENTIAL_CAPTURE_STROBE == "true")begincyclonev_io_ibuf#(.differential_mode(DIFFERENTIAL_CAPTURE_STROBE),.bus_hold("false")) strobe_in (.i(capture_strobe_ibuf_i),.ibar(capture_strobe_ibuf_ibar),.o(dqsin),.dynamicterminationcontrol(1'b0));endelsebegincyclonev_io_ibuf#(.bus_hold("false")) strobe_in (.i(capture_strobe_ibuf_i),.o(dqsin),.ibar(),.dynamicterminationcontrol(1'b0));endwire capture_strobe_ena_fr;if (USE_HARD_FIFOS == "true")beginassign capture_strobe_ena_fr = vfifo_capture_strobe_ena;endelsebeginif (DQS_ENABLE_WIDTH > 1)begincyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_ena (.datainhi(capture_strobe_ena[0]),.datainlo(capture_strobe_ena[1]),.dataout(capture_strobe_ena_fr),.clkhi (strobe_ena_hr_clock_in),.clklo (strobe_ena_hr_clock_in),.hrbypass(dqshalfratebypass[0]),.muxsel (strobe_ena_hr_clock_in));endelsebeginassign capture_strobe_ena_fr = capture_strobe_ena;endendwire dqs_enable_shifted;wire dqs_shifted;wire dqs_enable_int;wire dqs_disable_int;if (USE_BIDIR_STROBE == "true")beginwire dqs_pre_delayed;assign dqs_pre_delayed = capture_strobe_ena_fr;if (USE_DYNAMIC_CONFIG == "true")begincyclonev_dqs_enable_ctrl#(.add_phase_transfer_reg(DYNAMIC_MODE),.delay_dqs_enable("one_and_half_cycle")) dqs_enable_ctrl (.dqsenablein (dqs_pre_delayed),.zerophaseclk (ena_zero_phase_clock),.levelingclk (ena_clock),.dqsenableout (dqs_enable_shifted),.enaphasetransferreg(enadqsenablephasetransferreg[0]),.rstn(),.dffin());endelsebegincyclonev_dqs_enable_ctrl#(.delay_dqs_enable("one_and_half_cycle")) dqs_enable_ctrl (.dqsenablein (dqs_pre_delayed),.zerophaseclk (ena_zero_phase_clock),.levelingclk (ena_clock),.dqsenableout (dqs_enable_shifted),.rstn(),.dffin());endcyclonev_dqs_delay_chain#(.dqs_period(INPUT_FREQ_PS),.dqs_phase_shift(DQS_PHASE_SHIFT),.dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS))dqs_delay_chain (.dqsin (dqsin),.delayctrlin (dll_delay_value),.dqsenable (dqs_enable_int),.dqsdisablen (dqs_disable_int),.dqsbusout (dqs_shifted),.dqsupdateen(),.testin(),.dffin());endelsebeginif (USE_DYNAMIC_CONFIG == "true")begincyclonev_dqs_delay_chain#(.dqs_period(INPUT_FREQ_PS),.dqs_phase_shift(DQS_PHASE_SHIFT),.dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)) dqs_delay_chain (.dqsin (dqsin),.delayctrlin (dll_delay_value),.dqsbusout (dqs_shifted),.dqsenable (),.dqsdisablen (),.dqsupdateen(),.testin(),.dffin());endelsebegincyclonev_dqs_delay_chain#(.dqs_period(INPUT_FREQ_PS),.dqs_phase_shift(DQS_PHASE_SHIFT),.dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)) dqs_delay_chain (.dqsin (dqsin),.delayctrlin (dll_delay_value),.dqsbusout (dqs_shifted),.dqsenable (),.dqsdisablen (),.dqsupdateen(),.testin(),.dffin());endendif (USE_DYNAMIC_CONFIG == "true")begincyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_in_delay_1(.datain (dqs_shifted),.delayctrlin (dqsbusoutdelaysetting_dlc[0]),.dataout (dqsbusout));cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_ena_delay_1(.datain (dqs_enable_shifted),.delayctrlin (dqsenabledelaysetting_dlc[0]),.dataout (dqs_enable_int));cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_dis_delay_1(.datain (dqs_enable_shifted),.delayctrlin (dqsdisabledelaysetting_dlc[0]),.dataout (dqs_disable_int));endelsebeginassign dqsbusout = dqs_shifted;assign dqs_enable_int = dqs_enable_shifted;assign dqs_disable_int = dqs_enable_shifted;endif (USE_DQS_TRACKING == "true")beginreg dqs_ff;always @(negedge dqs_enable_int)dqs_ff <= dqsin;assign capture_strobe_tracking = dqs_ff;endif (SEPARATE_CAPTURE_STROBE == "true")beginwire dqsnin;cyclonev_io_ibuf#(.bus_hold("false")) strobe_n_in (.i(capture_strobe_ibuf_ibar),.o(dqsnin));wire dqsn_enable_int;wire dqsn_disable_int;wire dqsn_enable_shifted;wire dqsn_shifted;if (USE_BIDIR_STROBE == "true")beginif (USE_DYNAMIC_CONFIG == "true")begincyclonev_dqs_enable_ctrl#(.add_phase_transfer_reg(DYNAMIC_MODE),.delay_dqs_enable("one_and_half_cycle")) dqs_enable_n_ctrl (.dqsenablein (capture_strobe_ena_fr),.zerophaseclk (ena_zero_phase_clock),.levelingclk (ena_clock),.dqsenableout (dqsn_enable_shifted),.enaphasetransferreg(enadqsenablephasetransferreg[0]));endelsebegincyclonev_dqs_enable_ctrl#(.add_phase_transfer_reg("false"),.delay_dqs_enable("one_and_half_cycle")) dqs_enable_n_ctrl (.dqsenablein (capture_strobe_ena_fr),.zerophaseclk (ena_zero_phase_clock),.levelingclk (ena_clock),.dqsenableout (dqsn_enable_shifted));endcyclonev_dqs_delay_chain#(.dqs_period(INPUT_FREQ_PS),.dqs_phase_shift(DQS_PHASE_SHIFT),.dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)) dqs_n_delay_chain (.dqsin (dqsnin),.delayctrlin (dll_delay_value),.dqsenable (dqsn_enable_int),.dqsdisablen (dqsn_disable_int),.dqsbusout (dqsn_shifted));endelsebegincyclonev_dqs_delay_chain#(.dqs_period(INPUT_FREQ_PS),.dqs_phase_shift(DQS_PHASE_SHIFT),.dqs_delay_chain_bypass(DQS_DELAYCHAIN_BYPASS)) dqs_n_delay_chain (.dqsin (dqsnin),.delayctrlin (dll_delay_value),.dqsbusout (dqsn_shifted));endif (USE_DYNAMIC_CONFIG == "true")begincyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_n_delay_1(.datain (dqsn_shifted),.delayctrlin (dqsbusoutdelaysetting_dlc[0]),.dataout (dqsnbusout));cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_n_ena_delay_1(.datain (dqsn_enable_shifted),.delayctrlin (dqsenabledelaysetting_dlc[0]),.dataout (dqsn_enable_int));cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_n_dis_delay_1(.datain (dqsn_enable_shifted),.delayctrlin (dqsdisabledelaysetting_dlc[0]),.dataout (dqsn_disable_int));endelsebeginassign dqsnbusout = dqsn_shifted;assign dqsn_enable_int = dqsn_enable_shifted;assign dqsn_disable_int = dqsn_enable_shifted;endendendendgenerategenerateif (USE_OUTPUT_STROBE == "true")beginwire os;wire os_bar;wire os_dtc;wire os_dtc_bar;wire os_delayed1;wire os_delayed2;wire fr_os_oe;wire aligned_os_oe;wire aligned_strobe;wire fr_os_hi;wire fr_os_lo;if (USE_HALF_RATE_OUTPUT == "true")beginif (USE_BIDIR_STROBE == "true")beginwire clk_gate_hi;wire clk_gate_lo;if (PREAMBLE_TYPE == "low")beginif (EMIF_UNALIGNED_PREAMBLE_SUPPORT != "true")beginassign clk_gate_hi = output_strobe_ena[0];assign clk_gate_lo = output_strobe_ena[0];endelsebeginreg [1:0] os_ena_reg;reg [1:0] os_ena_preamble;always @(posedge core_clock_in)beginos_ena_reg[1:0] <= output_strobe_ena[1:0];endalways @(*)begincase ({os_ena_reg[0], os_ena_reg[1],output_strobe_ena[0], output_strobe_ena[1]})4'b00_00: os_ena_preamble[1:0] <= 2'b00;4'b00_01: os_ena_preamble[1:0] <= 2'b00;4'b00_10: os_ena_preamble[1:0] <= 2'b00;4'b00_11: os_ena_preamble[1:0] <= 2'b01;4'b01_00: os_ena_preamble[1:0] <= 2'b00;4'b01_01: os_ena_preamble[1:0] <= 2'b00;4'b01_10: os_ena_preamble[1:0] <= 2'b10;4'b01_11: os_ena_preamble[1:0] <= 2'b11;4'b10_00: os_ena_preamble[1:0] <= 2'b00;4'b10_01: os_ena_preamble[1:0] <= 2'b00;4'b10_10: os_ena_preamble[1:0] <= 2'b00;4'b10_11: os_ena_preamble[1:0] <= 2'b01;4'b11_00: os_ena_preamble[1:0] <= 2'b00;4'b11_01: os_ena_preamble[1:0] <= 2'b00;4'b11_10: os_ena_preamble[1:0] <= 2'b10;4'b11_11: os_ena_preamble[1:0] <= 2'b11;default: os_ena_preamble[1:0] <= 2'b00;endcaseendassign clk_gate_hi = os_ena_preamble[1];assign clk_gate_lo = os_ena_preamble[0];endendelsebeginassign clk_gate_hi = 1'b1;assign clk_gate_lo = 1'b1;endcyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_os_hi (.hrbypass(1'b1),.datainhi(write_strobe[0]),.datainlo(write_strobe[2]),.dataout(fr_os_hi),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_os_lo (.hrbypass(1'b1),.datainhi(write_strobe[1]),.datainlo(write_strobe[3]),.dataout(fr_os_lo),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_os_oe (.hrbypass(1'b1),.datainhi(~output_strobe_ena [0]),.datainlo(~output_strobe_ena [1]),.dataout(fr_os_oe),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());endelsebeginwire gnd_lut /* synthesis keep = 1*/;assign gnd_lut = 1'b0;assign fr_os_lo = gnd_lut;assign fr_os_oe = 1'b0;if (USE_OUTPUT_STROBE_RESET == "true") beginreg clk_h /* synthesis dont_merge */;always @(posedge write_strobe_clock_in or negedge reset_n_core_clock_in)beginif (~reset_n_core_clock_in)clk_h <= 1'b0;elseclk_h <= 1'b1;endassign fr_os_hi = clk_h;end else beginassign fr_os_hi = 1'b1;endendendelsebeginif (USE_BIDIR_STROBE == "true")beginassign fr_os_oe = ~output_strobe_ena[0];wire gnd_lut /* synthesis keep = 1*/;assign gnd_lut = 1'b0;assign fr_os_lo = gnd_lut;if (PREAMBLE_TYPE == "low")beginreg os_ena_reg1;initialos_ena_reg1 = 0;always @(posedge core_clock_in)os_ena_reg1 <= output_strobe_ena[0];assign fr_os_hi = os_ena_reg1 & output_strobe_ena[0];endelsebeginwire vcc_lut /* synthesis keep = 1*/;assign vcc_lut = 1'b1;assign fr_os_hi = vcc_lut;endendelsebeginwire gnd_lut /* synthesis keep = 1*/;assign gnd_lut = 1'b0;assign fr_os_lo = gnd_lut;assign fr_os_oe = 1'b0;if (USE_OUTPUT_STROBE_RESET == "true") beginreg clk_h /* synthesis dont_merge */;always @(posedge write_strobe_clock_in or negedge reset_n_core_clock_in)beginif (~reset_n_core_clock_in)clk_h <= 1'b0;elseclk_h <= 1'b1;endassign fr_os_hi = clk_h;end else beginassign fr_os_hi = 1'b1;endendendif (USE_OUTPUT_PHASE_ALIGNMENT == "true")beginendelsebegin/*cyclonev_ddio_oeos_oe_ddio_oe (.clk (write_strobe_clock_in),.oe (fr_os_oe),.dataout (aligned_os_oe));*/reg os_oe_reg;always @(posedge write_strobe_clock) os_oe_reg <= fr_os_oe;assign aligned_os_oe = os_oe_reg;cyclonev_ddio_out#(.half_rate_mode("false"),.use_new_clocking_model("true"),.async_mode("none")) phase_align_os (.datainhi(fr_os_hi),.datainlo(fr_os_lo),.dataout(aligned_strobe),.clkhi (write_strobe_clock),.clklo (write_strobe_clock),.muxsel (write_strobe_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn(),.hrbypass());endwire delayed_os_oe;wire predelayed_os;wire predelayed_os_oe;if (USE_2X_FF == "true")beginreg dd_os;reg dd_os_oe;always @(posedge dqs_dr_clock)begindd_os <= aligned_strobe;dd_os_oe <= aligned_os_oe;endassign predelayed_os = dd_os;assign predelayed_os_oe = dd_os_oe;endelsebeginassign predelayed_os = aligned_strobe;assign predelayed_os_oe = aligned_os_oe;endif (USE_DYNAMIC_CONFIG == "true")begin`ifndef FAMILY_HAS_NO_DYNCONFwire delayed_os_oe_1;cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))dqs_out_delay_1(.datain (predelayed_os),.delayctrlin (dqs_outputdelaysetting_dlc),.dataout (os_delayed1));assign os_delayed2 = os_delayed1;cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))oe_delay_1(.datain (predelayed_os_oe),.delayctrlin (dqs_outputenabledelaysetting_dlc),.dataout (delayed_os_oe_1));assign delayed_os_oe = delayed_os_oe_1;`endifendelsebeginassign os_delayed2 = aligned_strobe;assign delayed_os_oe = aligned_os_oe;endwire diff_oe;wire diff_oe_bar;wire diff_dtc;wire diff_dtc_bar;if (DIFFERENTIAL_OUTPUT_STROBE=="true")beginif (USE_BIDIR_STROBE == "true")begincyclonev_pseudo_diff_out pseudo_diffa_0(.oein(delayed_os_oe),.dtcin(delayed_oct),.oeout(diff_oe),.oebout(diff_oe_bar),.dtc(diff_dtc),.dtcbar(diff_dtc_bar),.i(os_delayed2),.o(os),.obar(os_bar));cyclonev_io_obuf#(.sim_dynamic_termination_control_is_connected("true"),.bus_hold("false"),.open_drain_output("false")) obuf_os_bar_0(.i(os_bar),.o(strobe_n_io),.obar(),.oe(~diff_oe_bar),.parallelterminationcontrol (parallelterminationcontrol_in),.dynamicterminationcontrol (diff_dtc_bar),.seriesterminationcontrol (seriesterminationcontrol_in),.devoe());endelsebegincyclonev_pseudo_diff_out pseudo_diffa_0(.oein(1'b0),.oeout(diff_oe),.oebout(diff_oe_bar),.i(os_delayed2),.o(os),.obar(os_bar),.dtcin(),.dtc(),.dtcbar());cyclonev_io_obuf#(.bus_hold("false"),.open_drain_output("false")) obuf_os_bar_0(.i(os_bar),.o(output_strobe_n_out),.obar(),.oe(~diff_oe_bar),.dynamicterminationcontrol(1'b0),.seriesterminationcontrol(),.parallelterminationcontrol(),.devoe());endendelsebeginassign os = os_delayed2;assign diff_dtc = delayed_oct;assign diff_oe = delayed_os_oe;endif (USE_BIDIR_STROBE == "true")begincyclonev_io_obuf#(.sim_dynamic_termination_control_is_connected("true"),.bus_hold("false"),.open_drain_output("false")) obuf_os_0(.i(os),.o(strobe_io),.obar(),.oe(~diff_oe),.parallelterminationcontrol (parallelterminationcontrol_in),.dynamicterminationcontrol (diff_dtc),.seriesterminationcontrol (seriesterminationcontrol_in),.devoe());endelsebegincyclonev_io_obuf#(.bus_hold("false"),.open_drain_output("false")) obuf_os_0(.i(os),.o(output_strobe_out),.obar(),.oe(~diff_oe),.parallelterminationcontrol (),.dynamicterminationcontrol (1'b0),.seriesterminationcontrol (),.devoe());endendendgeneratewire [PIN_WIDTH-1:0] aligned_oe ;wire [PIN_WIDTH-1:0] aligned_data;wire [PIN_WIDTH-1:0] ddr_data;wire [PIN_WIDTH-1:0] dq_outputhalfratebypass;wire [PIN_WIDTH*2-1:0] rfifo_clock_select;wire [PIN_WIDTH*3-1:0] rfifo_mode;generateif (PIN_TYPE == "output" || PIN_TYPE == "bidir")begingenvar opin_num;for (opin_num = 0; opin_num < PIN_WIDTH; opin_num = opin_num + 1)begin :output_path_genwire fr_data_hi;wire fr_data_lo;wire fr_oe;if (USE_HALF_RATE_OUTPUT == "true")beginwire hr_data_t0;wire hr_data_t1;wire hr_data_t2;wire hr_data_t3;wire write_oe_hi;wire write_oe_lo;if (NATURAL_ALIGNMENT == "true")beginassign hr_data_t0 = write_data_in [opin_num * rate_mult_out];assign hr_data_t1 = write_data_in [opin_num * rate_mult_out + 1];assign hr_data_t2 = write_data_in [opin_num * rate_mult_out + 2];assign hr_data_t3 = write_data_in [opin_num * rate_mult_out + 3];assign write_oe_hi = write_oe_in [2*opin_num + 0];assign write_oe_lo = write_oe_in [2*opin_num + 1];endelse if (REGULAR_WRITE_BUS_ORDERING == "true")beginassign hr_data_t0 = write_data_in [opin_num + 0*PIN_WIDTH];assign hr_data_t1 = write_data_in [opin_num + 1*PIN_WIDTH];assign hr_data_t2 = write_data_in [opin_num + 2*PIN_WIDTH];assign hr_data_t3 = write_data_in [opin_num + 3*PIN_WIDTH];assign write_oe_hi = write_oe_in [opin_num + 0];assign write_oe_lo = write_oe_in [opin_num + PIN_WIDTH];endelsebeginassign hr_data_t0 = write_data_in [opin_num + 1*PIN_WIDTH];assign hr_data_t1 = write_data_in [opin_num + 0*PIN_WIDTH];assign hr_data_t2 = write_data_in [opin_num + 3*PIN_WIDTH];assign hr_data_t3 = write_data_in [opin_num + 2*PIN_WIDTH];assign write_oe_hi = write_oe_in [opin_num + 0];assign write_oe_lo = write_oe_in [opin_num + PIN_WIDTH];endcyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_hi (.datainhi(hr_data_t0),.datainlo(hr_data_t2),.dataout(fr_data_hi),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dq_outputhalfratebypass[opin_num]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_lo (.datainhi(hr_data_t1),.datainlo(hr_data_t3),.dataout(fr_data_lo),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dq_outputhalfratebypass[opin_num]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true")) hr_to_fr_oe (.datainhi(~write_oe_hi),.datainlo(~write_oe_lo),.dataout(fr_oe),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(dq_outputhalfratebypass[opin_num]),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());endelsebeginif (NATURAL_ALIGNMENT == "true")beginassign fr_data_lo = write_data_in [opin_num * rate_mult_out + 1];assign fr_data_hi = write_data_in [opin_num * rate_mult_out];endelsebeginassign fr_data_lo = write_data_in [opin_num+PIN_WIDTH];assign fr_data_hi = write_data_in [opin_num];endassign fr_oe = ~write_oe_in [opin_num];endif (USE_OUTPUT_PHASE_ALIGNMENT == "true")beginendelsebegincyclonev_ddio_out#(.async_mode("none"),.half_rate_mode("false"),.sync_mode("none"),.use_new_clocking_model("true")) ddio_out (.datainhi(fr_data_hi),.datainlo(fr_data_lo),.dataout(aligned_data[opin_num]),.clkhi (dq_shifted_clock),.clklo (dq_shifted_clock),.muxsel (dq_shifted_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn(),.hrbypass());/*cyclonev_ddio_oedq_oe_ddio_oe (.clk (fr_clock_in),.oe (fr_oe),.dataout (aligned_oe [opin_num]));*/reg oe_reg /* synthesis dont_merge altera_attribute="FAST_OUTPUT_ENABLE_REGISTER=on" */;always @(posedge dq_shifted_clock) oe_reg <= fr_oe;assign aligned_oe[opin_num] = oe_reg;endendendendgenerategenerateif (PIN_TYPE == "input" || PIN_TYPE == "bidir")begingenvar ipin_num;for (ipin_num = 0; ipin_num < PIN_WIDTH; ipin_num = ipin_num + 1)begin :input_path_genwire [1:0] sdr_data;wire [1:0] aligned_input;wire dqsbusout_to_ddio_in;wire dqsnbusout_to_ddio_in;if (INVERT_CAPTURE_STROBE == "true") beginassign dqsbusout_to_ddio_in = ~dqsbusout;if (SEPARATE_CAPTURE_STROBE == "true") beginassign dqsnbusout_to_ddio_in = ~dqsnbusout;endend else beginassign dqsbusout_to_ddio_in = dqsbusout;if (SEPARATE_CAPTURE_STROBE == "true") beginassign dqsnbusout_to_ddio_in = dqsnbusout;endendif (SEPARATE_CAPTURE_STROBE == "true") begincyclonev_ddio_in#(.use_clkn("true"),.async_mode("none"),.sync_mode("none")) capture_reg(.datain(ddr_data[ipin_num]),.clk (dqsbusout_to_ddio_in),.clkn (dqsnbusout_to_ddio_in),.regouthi(sdr_data[1]),.regoutlo(sdr_data[0]),.ena(1'b1),.areset(),.sreset(),.dfflo(),.devpor(),.devclrn());end else begincyclonev_ddio_in#(.use_clkn("false"),.async_mode("none"),.sync_mode("none")) capture_reg(.datain(ddr_data[ipin_num]),.clk (dqsbusout_to_ddio_in),.regouthi(sdr_data[1]),.regoutlo(sdr_data[0]),.clkn(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.devpor(),.devclrn());endif (USE_INPUT_PHASE_ALIGNMENT == "true")beginendelsebeginassign aligned_input = sdr_data;endwire [3:0] read_fifo_out;if (USE_HARD_FIFOS == "true")beginwire wren;if (USE_BIDIR_STROBE == "true")beginassign wren = 1'b1;endelsebeginassign wren = vfifo_capture_strobe_ena;endwire rfifo_rd_clk;if(USE_DYNAMIC_CONFIG == "true") begincyclonev_read_fifo_read_clock_selectread_fifo_clk_sel(.clkin({hr_seq_clock, dqs_shifted_clock, 1'b0}),.clksel(rfifo_clock_select[(ipin_num+1)*2-1:ipin_num*2]),.clkout (rfifo_rd_clk));endelse beginif (USE_HALF_RATE_OUTPUT == "true") beginassign rfifo_rd_clk = hr_seq_clock;endelse beginassign rfifo_rd_clk = dqs_shifted_clock;endendwire writeclk;// in skip-cal mode, the read_fifo writeclk cannot be x otherwise we pick up an// extra edge at the beginning and there is no calibration to reset things after the first edge// synthesis translate_offassign writeclk = (dqsbusout_to_ddio_in === 1'b0) ? 1'b0 : 1'b1;// synthesis translate_on// synthesis read_comments_as_HDL on// assign writeclk = dqsbusout_to_ddio_in;// synthesis read_comments_as_HDL offlocalparam READ_FIFO_MODE = (USE_HALF_RATE_OUTPUT == "true") ? "hrate_mode" : "frate_mode";cyclonev_ir_fifo_userdesread_fifo(.rstn (rfifo_reset_n),.dinfiforx (aligned_input),.writeclk (writeclk),.writeenable (wren),.dout (read_fifo_out),.readclk (rfifo_rd_clk),.dynfifomode(rfifo_mode[(ipin_num+1)*3-1:ipin_num*3]),.readenable(lfifo_rden),.tstclk(),.regscanovrd(),.bslipin(),.txin(),.loaden(),.bslipctl(),.regscan(),.scanin(),.lvdsmodeen(),.lvdstxsel(),.txout(),.rxout(),.bslipout(),.bslipmax(),.scanout(),.observableout(),.observablefout1(),.observablefout2(),.observablefout3(),.observablefout4(),.observablewaddrcnt(),.observableraddrcnt());defparam read_fifo.a_use_dynamic_fifo_mode = USE_DYNAMIC_CONFIG;defparam read_fifo.a_rb_fifo_mode = READ_FIFO_MODE;defparam read_fifo.a_sim_wclk_pre_delay = 10;defparam read_fifo.a_sim_readenable_pre_delay = 10;endelsebeginassign read_fifo_out = aligned_input;endif (REVERSE_READ_WORDS == "true")beginif (USE_HALF_RATE_OUTPUT == "true")beginassign read_data_out [ipin_num] = read_fifo_out [3];assign read_data_out [PIN_WIDTH +ipin_num] = read_fifo_out [2];assign read_data_out [PIN_WIDTH*2 +ipin_num] = read_fifo_out [1];assign read_data_out [PIN_WIDTH*3 +ipin_num] = read_fifo_out [0];endelsebeginassign read_data_out [ipin_num] = read_fifo_out [1];assign read_data_out [PIN_WIDTH +ipin_num] = read_fifo_out [0];endendelse if (NATURAL_ALIGNMENT == "true")beginassign read_data_out [ipin_num*rate_mult_out] = read_fifo_out [0];assign read_data_out [ipin_num*rate_mult_out + 1] = read_fifo_out [1];if (USE_HALF_RATE_OUTPUT == "true")beginassign read_data_out [ipin_num*rate_mult_out + 2] = read_fifo_out [2];assign read_data_out [ipin_num*rate_mult_out + 3] = read_fifo_out [3];endendelsebeginassign read_data_out [ipin_num] = read_fifo_out [0];assign read_data_out [PIN_WIDTH +ipin_num] = read_fifo_out [1];if (USE_HALF_RATE_OUTPUT == "true")beginassign read_data_out [PIN_WIDTH*2 +ipin_num] = read_fifo_out [2];assign read_data_out [PIN_WIDTH*3 +ipin_num] = read_fifo_out [3];endendendendendgenerategenerategenvar pin_num;for (pin_num = 0; pin_num < PIN_WIDTH; pin_num = pin_num + 1)begin :pad_genif (PIN_TYPE == "bidir")beginassign write_data_out [pin_num] = 1'b0;endelsebeginassign read_write_data_io [pin_num] = 1'b0;endwire delayed_data_in;wire delayed_data_out;wire delayed_oe;wire [4:0] dq_outputdelaysetting;wire [4:0] dq_outputenabledelaysetting;wire [4:0] dq_inputdelaysetting;wire [DELAY_CHAIN_WIDTH-1:0] dq_outputdelaysetting_dlc;wire [DELAY_CHAIN_WIDTH-1:0] dq_outputenabledelaysetting_dlc;wire [DELAY_CHAIN_WIDTH-1:0] dq_inputdelaysetting_dlc;if (USE_DYNAMIC_CONFIG == "true")begin`ifndef FAMILY_HAS_NO_DYNCONFcyclonev_io_config config_1 (.datain(config_data_in),.clk(config_clock_in),.ena(config_io_ena[pin_num]),.update(config_update),.outputregdelaysetting(dq_outputdelaysetting),.outputenabledelaysetting(dq_outputenabledelaysetting),.outputhalfratebypass(dq_outputhalfratebypass[pin_num]),.readfiforeadclockselect(rfifo_clock_select[(pin_num+1)*2-1:pin_num*2]),.readfifomode(rfifo_mode[(pin_num+1)*3-1:pin_num*3]),.padtoinputregisterdelaysetting(dq_inputdelaysetting),.dataout());`endifassign dq_outputdelaysetting_dlc = dq_outputdelaysetting;assign dq_outputenabledelaysetting_dlc = dq_outputenabledelaysetting;assign dq_inputdelaysetting_dlc = dq_inputdelaysetting;endif (PIN_TYPE == "input" || PIN_TYPE == "bidir")beginwire raw_input;if (USE_DYNAMIC_CONFIG == "true")begin`ifndef FAMILY_HAS_NO_DYNCONFcyclonev_delay_chain in_delay_1(.datain (raw_input),.delayctrlin (dq_inputdelaysetting_dlc),.dataout (ddr_data[pin_num]));`endifendelsebeginassign ddr_data[pin_num] = raw_input;endif (PIN_TYPE == "bidir")begincyclonev_io_ibuf data_in (.i(read_write_data_io[pin_num]),.o(raw_input),.ibar(),.dynamicterminationcontrol(1'b0));endelsebegincyclonev_io_ibuf data_in (.i(read_data_in[pin_num]),.o(raw_input),.ibar(),.dynamicterminationcontrol(1'b0));endendif (PIN_TYPE == "output" || PIN_TYPE == "bidir")beginwire predelayed_data;wire predelayed_oe;if (USE_2X_FF == "true")beginreg dd_data;reg dd_oe;always @(posedge dq_dr_clock)begindd_data <= aligned_data[pin_num];dd_oe <= aligned_oe[pin_num];endassign predelayed_data = dd_data;assign predelayed_oe = dd_oe;endelsebeginassign predelayed_data = aligned_data[pin_num];assign predelayed_oe = aligned_oe[pin_num];endif (USE_DYNAMIC_CONFIG == "true")begin`ifndef FAMILY_HAS_NO_DYNCONFwire delayed_data_1;wire delayed_oe_1;cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))out_delay_1(.datain (predelayed_data),.delayctrlin (dq_outputdelaysetting_dlc),.dataout (delayed_data_1));assign delayed_data_out = delayed_data_1;cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))oe_delay_1(.datain (predelayed_oe),.delayctrlin (dq_outputenabledelaysetting_dlc),.dataout (delayed_oe_1));assign delayed_oe = delayed_oe_1;`endifendelsebeginassign delayed_data_out = predelayed_data;assign delayed_oe = predelayed_oe;endif (PIN_TYPE == "output")begincyclonev_io_obuf data_out (.i (delayed_data_out),.o (write_data_out [pin_num]),.oe (~delayed_oe),.parallelterminationcontrol (parallelterminationcontrol_in),.seriesterminationcontrol (seriesterminationcontrol_in),.obar(),.devoe(),.dynamicterminationcontrol(1'b0));endelse if (PIN_TYPE == "bidir")begincyclonev_io_obuf#(.sim_dynamic_termination_control_is_connected("true")) data_out (.oe (~delayed_oe),.i (delayed_data_out),.o (read_write_data_io [pin_num]),.parallelterminationcontrol (parallelterminationcontrol_in),.dynamicterminationcontrol (delayed_oct),.seriesterminationcontrol (seriesterminationcontrol_in),.obar(),.devoe());/* synthesis translate_off */assert property (@(posedge fr_clock_in or negedge fr_clock_in) (~delayed_oe === 1'b1) |-> delayed_oct === 1'b0)else $display(1, "OE enabled but dynamic OCT ctrl is not in write mode");`ifndef BOARD_DELAY_MODELassert property (@(posedge capture_strobe or negedge capture_strobe) (~delayed_oe === 1'b0 && read_write_data_io[pin_num] !== 1'bz) |-> delayed_oct === 1'b1)else $display(1, "Read data comes back but dynamic OCT ctrl is not in read mode");`endif/* synthesis translate_on */endendendendgenerategenerategenvar epin_num;for (epin_num = 0; epin_num < EXTRA_OUTPUT_WIDTH; epin_num = epin_num + 1)begin :extra_output_pad_genwire fr_data_hi;wire fr_data_lo;wire aligned_data;wire extra_outputhalfratebypass;if (USE_HALF_RATE_OUTPUT == "true")beginwire hr_data_t0;wire hr_data_t1;wire hr_data_t2;wire hr_data_t3;if (NATURAL_ALIGNMENT == "true")beginassign hr_data_t0 = extra_write_data_in [epin_num * rate_mult_out];assign hr_data_t1 = extra_write_data_in [epin_num * rate_mult_out + 1];assign hr_data_t2 = extra_write_data_in [epin_num * rate_mult_out + 2];assign hr_data_t3 = extra_write_data_in [epin_num * rate_mult_out + 3];endelse if (REGULAR_WRITE_BUS_ORDERING == "true")beginassign hr_data_t0 = extra_write_data_in [epin_num + 0*EXTRA_OUTPUT_WIDTH];assign hr_data_t1 = extra_write_data_in [epin_num + 1*EXTRA_OUTPUT_WIDTH];assign hr_data_t2 = extra_write_data_in [epin_num + 2*EXTRA_OUTPUT_WIDTH];assign hr_data_t3 = extra_write_data_in [epin_num + 3*EXTRA_OUTPUT_WIDTH];endelsebeginassign hr_data_t0 = extra_write_data_in [epin_num + 2*EXTRA_OUTPUT_WIDTH];assign hr_data_t1 = extra_write_data_in [epin_num + 0*EXTRA_OUTPUT_WIDTH];assign hr_data_t2 = extra_write_data_in [epin_num + 3*EXTRA_OUTPUT_WIDTH];assign hr_data_t3 = extra_write_data_in [epin_num + 1*EXTRA_OUTPUT_WIDTH];endcyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_hi (.datainhi(hr_data_t0),.datainlo(hr_data_t2),.dataout(fr_data_hi),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(extra_outputhalfratebypass),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());cyclonev_ddio_out#(.half_rate_mode("true"),.use_new_clocking_model("true"),.async_mode("none")) hr_to_fr_lo (.datainhi(hr_data_t1),.datainlo(hr_data_t3),.dataout(fr_data_lo),.clkhi (hr_seq_clock),.clklo (hr_seq_clock),.hrbypass(extra_outputhalfratebypass),.muxsel (hr_seq_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn());endelsebeginif (NATURAL_ALIGNMENT == "true")beginassign fr_data_lo = extra_write_data_in [epin_num * rate_mult_out + 1];assign fr_data_hi = extra_write_data_in [epin_num * rate_mult_out];endelsebeginassign fr_data_lo = extra_write_data_in [epin_num+EXTRA_OUTPUT_WIDTH];assign fr_data_hi = extra_write_data_in [epin_num];endendif (USE_OUTPUT_PHASE_ALIGNMENT == "true")beginendelsebegincyclonev_ddio_out#(.async_mode("none"),.half_rate_mode("false"),.sync_mode("none"),.use_new_clocking_model("true")) ddio_out (.datainhi(fr_data_hi),.datainlo(fr_data_lo),.dataout(aligned_data),.clkhi (dq_shifted_clock),.clklo (dq_shifted_clock),.muxsel (dq_shifted_clock),.clk(),.ena(1'b1),.areset(),.sreset(),.dfflo(),.dffhi(),.devpor(),.devclrn(),.hrbypass());endwire delayed_data_out;wire [4:0] dq_outputdelaysetting1;wire [4:0] dq_inputdelaysetting;wire [DELAY_CHAIN_WIDTH-1:0] dq_outputdelaysetting1_dlc;wire [DELAY_CHAIN_WIDTH-1:0] dq_inputdelaysetting_dlc;if (USE_DYNAMIC_CONFIG == "true")begin`ifndef FAMILY_HAS_NO_DYNCONFcyclonev_io_config config_1 (.datain(config_data_in),.clk(config_clock_in),.ena(config_extra_io_ena[epin_num]),.update(config_update),.outputregdelaysetting(dq_outputdelaysetting1),.outputhalfratebypass(extra_outputhalfratebypass),.padtoinputregisterdelaysetting(dq_inputdelaysetting),.dataout(),.readfiforeadclockselect(),.readfifomode(),.outputenabledelaysetting());assign dq_outputdelaysetting1_dlc = dq_outputdelaysetting1;assign dq_inputdelaysetting_dlc = dq_inputdelaysetting;wire delayed_data_1;cyclonev_delay_chain#(.sim_intrinsic_rising_delay(0), .sim_intrinsic_falling_delay(0))out_delay_1(.datain (aligned_data),.delayctrlin (dq_outputdelaysetting1_dlc),.dataout (delayed_data_1));assign delayed_data_out = delayed_data_1;`endifendelsebeginassign delayed_data_out = aligned_data;endcyclonev_io_obuf obuf_1 (.i (delayed_data_out),.o (extra_write_data_out[epin_num]),.parallelterminationcontrol(parallelterminationcontrol_in),.dynamicterminationcontrol(1'b0),.seriesterminationcontrol(seriesterminationcontrol_in),.oe (1'b1),.obar(),.devoe());endendgenerateendmodule
Go to most recent revision | Compare with Previous | Blame | View Log
