⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcm_adv.v

📁 DDR2源代码 DDR2源代码 DDR2源代码
💻 V
📖 第 1 页 / 共 4 页
字号:
        end    endcase    case (DESKEW_ADJUST)	"SOURCE_SYNCHRONOUS" : deskew_adjust_mode = 0;	"SYSTEM_SYNCHRONOUS" : deskew_adjust_mode = 11;	"0"		     : deskew_adjust_mode = 0;	"1"		     : deskew_adjust_mode = 1;	"2"		     : deskew_adjust_mode = 2;	"3"		     : deskew_adjust_mode = 3;	"4"		     : deskew_adjust_mode = 4;	"5"		     : deskew_adjust_mode = 5;	"6"		     : deskew_adjust_mode = 6;	"7"		     : deskew_adjust_mode = 7;	"8"		     : deskew_adjust_mode = 8;	"9"		     : deskew_adjust_mode = 9;	"10"		     : deskew_adjust_mode = 10;	"11"		     : deskew_adjust_mode = 11;	"12"		     : deskew_adjust_mode = 12;	"13"		     : deskew_adjust_mode = 13;	"14"		     : deskew_adjust_mode = 14;	"15"		     : deskew_adjust_mode = 15;        "16"                 : deskew_adjust_mode = 16;        "17"                 : deskew_adjust_mode = 17;        "18"                 : deskew_adjust_mode = 18;        "19"                 : deskew_adjust_mode = 19;        "20"                 : deskew_adjust_mode = 20;        "21"                 : deskew_adjust_mode = 21;        "22"                 : deskew_adjust_mode = 22;        "23"                 : deskew_adjust_mode = 23;        "24"                 : deskew_adjust_mode = 24;        "25"                 : deskew_adjust_mode = 25;        "26"                 : deskew_adjust_mode = 26;        "27"                 : deskew_adjust_mode = 27;        "28"                 : deskew_adjust_mode = 28;        "29"                 : deskew_adjust_mode = 29;        "30"                 : deskew_adjust_mode = 30;        "31"                 : deskew_adjust_mode = 31;	default : begin	    $display("Attribute Syntax Error : The attribute DESKEW_ADJUST on DCM_ADV instance %m is set to %s.  Legal values for this attribute are SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or 0 ... 15.", DESKEW_ADJUST);	    $finish;	end    endcase    case (DFS_FREQUENCY_MODE)	"HIGH" : dfs_mode_type_i = 1;	"LOW"  : dfs_mode_type_i = 0;	default : begin	    $display(" Attribute Syntax Error : The attribute DFS_FREQUENCY_MODE on DCM_ADV instance %m is set to %s. Legal values for this attribute are HIGH or LOW.", DFS_FREQUENCY_MODE);	    $finish;	end     endcase    period_jitter = SIM_CLKIN_PERIOD_JITTER;    cycle_jitter = SIM_CLKIN_CYCLE_JITTER;    case (DLL_FREQUENCY_MODE)	"HIGH" : dll_mode_type_i = 2'b11;	"LOW"  : dll_mode_type_i = 2'b00;	default : begin	    $display("Attribute Syntax Error : The attribute DLL_FREQUENCY_MODE on DCM_ADV instance %m is set to %s.  Legal values for this attribute are HIGH or LOW.", DLL_FREQUENCY_MODE);	    $finish;	end    endcase    case (FACTORY_JF)      16'hF0F0 : ;      default : 	    $display("Attribute Syntax Warning : The attribute FACTORY_JF on DCM_ADV instance %m is set to %h.  Legal value is F0F0.", FACTORY_JF);    endcase    case (DUTY_CYCLE_CORRECTION)	"FALSE" : clk1x_type = 0;	"TRUE"  : clk1x_type = 1;	default : begin	    $display("Attribute Syntax Error : The attribute DUTY_CYCLE_CORRECTION on DCM_ADV instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", DUTY_CYCLE_CORRECTION);	    $finish;	end    endcase    case (STARTUP_WAIT)	"FALSE" : ;	"TRUE"  : ;	default : begin	    $display("Attribute Syntax Error : The attribute STARTUP_WAIT on DCM_ADV instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", STARTUP_WAIT);	    $finish;	end    endcase    case (DCM_AUTOCALIBRATION)        "FALSE" : ;        "TRUE"  : ;        default : begin            $display("Attribute Syntax Error : The attribute DCM_AUTOCALIBRATION on DCM_ADV instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", DCM_AUTOCALIBRATION);            $finish;        end    endcase        case (SIM_DEVICE)                "VIRTEX5" : sim_device_type = 1;                "VIRTEX4" : sim_device_type = 0;                default : begin                        $display("Attribute Syntax Error : The Attribute SIM_DEVICE on DCM_ADV instance %m is set to %s.  Legal values for this attribute are VIRTEX5 or VIRTEX4.", SIM_DEVICE);                        $finish;                end        endcaseend//// input wire delays//      assign #100 LOCKED = locked_out_out;      assign #100 PSDONE = psdone_out;      assign #100 DO = do_out;      assign #100 DRDY = drdy_out;      assign clkin_in = CLKIN;      assign clkfb_in = CLKFB;      assign psclk_in = PSCLK;      assign  psen_in = PSEN;      assign psincdec_in = PSINCDEC;      assign gsr_in = GSR;      assign  rst_input = RST;      assign daddr_in = DADDR;      assign  di_in = DI;      assign dwe_in = DWE;      assign  den_in = DEN;      assign  dclk_in = DCLK;assign rst_in = rst_input;dcm_adv_clock_divide_by_2 i_clock_divide_by_2 (clkin_in, clkin_type, clkin_div, rst_in);dcm_adv_maximum_period_check #("CLKIN", MAXPERCLKIN) i_max_clkin (clkin_in, rst_in);dcm_adv_maximum_period_check #("PSCLK", MAXPERPSCLK) i_max_psclk (psclk_in, rst_in);dcm_adv_clock_lost i_clkin_lost (clkin_in, first_time_locked, clkin_lost_out, rst_in);dcm_adv_clock_lost i_clkfx_lost (CLKFX, first_time_locked, clkfx_lost_out, rst_in);dcm_adv_clock_lost i_clkfb_lost (CLKFB, first_time_locked, clkfb_lost_out, rst_in);always @(clkin_div)     clkin_ps <= #(ps_delay) clkin_div;always @(clkin_ps or lock_fb)    clkin_fb =  clkin_ps & lock_fb;always @(posedge clkin_fb or posedge chk_rst)    if (chk_rst)       clkin_chkin <= 0;    else       clkin_chkin <= 1;always @(posedge clkfb_in or posedge chk_rst)    if (chk_rst)       clkfb_chkin <= 0;    else       clkfb_chkin <= 1;    assign chk_rst = (rst_in==1 || clock_stopped==1 ) ? 1 : 0;    assign chk_enable = (clkin_chkin == 1 && clkfb_chkin == 1 &&                         lock_ps ==1 && lock_fb ==1 ) ? 1 : 0;always @(posedge clkin_div or posedge rst_in)  if (rst_in) begin     period_div <= 0;     clkin_div_edge <= 0;   end  else if ( clkin_div == 1) begin    clkin_div_edge <= $time;    if (($time - clkin_div_edge) <= (1.5 * period_div))	period_div <= $time - clkin_div_edge;    else if ((period_div == 0) && (clkin_div_edge != 0))	period_div <= $time - clkin_div_edge; endalways @(posedge clkin_ps or posedge rst_in)   if (rst_in) begin        period_ps <= 0;        clkin_ps_edge <= 0;  end  else  if (clkin_ps==1) begin    clkin_ps_edge <= $time;    if (($time - clkin_ps_edge) <= (1.5 * period_ps))	period_ps <= $time - clkin_ps_edge;    else if ((period_ps == 0) && (clkin_ps_edge != 0))	period_ps <= $time - clkin_ps_edge;   endalways @(posedge clkin_ps) begin    lock_ps <= lock_period;    lock_ps_dly <= lock_ps;    lock_fb <= lock_ps_dly;endalways @(period or fb_delay)  if (fb_delay ==0)    clkout_delay = 0;  else    clkout_delay = period - fb_delay;//// generate master reset signal//always @(posedge clkin_in) begin    rst_reg[0] <= rst_input;    rst_reg[1] <= rst_reg[0] & rst_input;    rst_reg[2] <= rst_reg[1] & rst_reg[0] & rst_input;endreg rst_tmp1, rst_tmp2;initialbeginrst_tmp1 = 0;rst_tmp2 = 0;rst_flag = 0;endalways @(rst_input)begin   if (rst_input)      rst_flag = 0;   rst_tmp1 = rst_input;   if (rst_tmp1 == 0 && rst_tmp2 == 1) begin    if ((rst_reg[2] & rst_reg[1] & rst_reg[0]) == 0) begin        rst_flag = 1;	$display("Input Error : RST on instance %m must be asserted for 3 CLKIN clock cycles.");     end   end   rst_tmp2 = rst_tmp1;endinitial begin    CLK0 = 0;    CLK2X =0;    CLK2X180 = 0;    CLK90 = 0;    CLK180 =0;    CLK270 = 0;    CLKDV = 0;    CLKFX = 0;    CLKFX180 =0;    clk0_out = 0;    clk2x_out = 0;    clkdv_cnt = 0;    clkdv_out = 0;    clkfb_window = 0;    clkfx_out = 0;    clkfx_out_avg = 0;    clkfx_out_ph = 0;    clkin_div_edge = 0;    clkin_period[0] = 0;    clkin_period[1] = 0;    clkin_period[2] = 0;    period = 0;    clkin_ps_edge = 0;    clkin_window = 0;    clkout_delay = 0;    clock_stopped = 1;    fb_delay  = 0;    fb_delay_found = 0;    lock_clkfb = 0;    lock_clkin = 0;    lock_delay = 0;    lock_fb = 0;    lock_out = 2'b00;    lock_out1_neg = 0;    lock_period = 0;    lock_ps = 0;    lock_ps_dly = 0;    locked_out = 0;    period = 0;    period_div = 0;    period_fx = 0;    period_fxavg = 0;    period_orig = 0;    period_stop_ck = 0;    period_ps = 0;    delay_edge = 0;    psdone_out = 0;    ps_delay = 0;    ps_lock = 0;    inc_dec = 0;    ps_overflow_out = 0;    ps_delay_ps = 0;    ps_delay_drp = 0;    rst_reg = 3'b000;    numerator = CLKFX_MULTIPLY;    denominator = CLKFX_DIVIDE;    clkfx_multiply_drp = CLKFX_MULTIPLY;    clkfx_divide_drp = CLKFX_DIVIDE;    clkfx_m_reg = CLKFX_MULTIPLY;    clkfx_d_reg = CLKFX_DIVIDE;    clkfx_md_reg = {clkfx_m_reg, clkfx_d_reg};    gcd = 1;    drdy_out = 0;    do_out_drp = 16'h0000;    do_out_drp1 = 16'h0000;    do_out_s = 16'h0000;    valid_daddr = 0;        first_time_locked = 0;    en_status = 0;    drp_lock = 0;    ps_drp = 0;    ps_kick_off_cmd = 0;    single_step_lock = 0;    single_step_lock_tmp = 0;    single_step_done = 0;    ps_drp_lock = 0;    ps_drp_lock_tmp = 0;    clkin_chkin = 0;    clkfb_chkin = 0;    dfs_mode_reg = {13'bxxxxxxxxxxxxx, dfs_mode_type_i, 2'bxx};    dll_mode_reg = {12'bxxxxxxxxxxxx, dll_mode_type_i, 2'bxx};    clkin_div2_reg = {5'bxxxxx, clkin_type_i, 10'bxxxxxxxxxx};    do_stat_en = 1;end   assign dfs_mode_type = dfs_mode_reg[2];   assign dll_mode_type = dll_mode_reg[3:2];   assign clkin_type = clkin_div2_reg[10];//// phase shift parameters//always @(posedge lock_period) begin  if ((ps_type == 3'b000) || (ps_type == 3'b001) || (ps_type == 3'b011) || (ps_type == 3'b100))  begin    if (PHASE_SHIFT > 0) begin	if ((ps_in * period_orig / 256) > period_orig + FINE_SHIFT_RANGE) begin            $display("Function Error : Instance %m Requested Phase Shift = PHASE_SHIFT * PERIOD / 256 = %d * %1.3f / 256 = %1.3f. This exceeds the FINE_SHIFT_RANGE of %1.3f ns.", PHASE_SHIFT, period_orig / 1000.0, PHASE_SHIFT * period_orig/ 256 / 1000.0, FINE_SHIFT_RANGE / 1000.0);	      $finish;	end    end    else if (PHASE_SHIFT < 0) begin	if ((period_orig > FINE_SHIFT_RANGE) &&	    ((ps_in * period_orig / 256) < period_orig - FINE_SHIFT_RANGE)) begin            $display("Function Error : Instance %m Requested Phase Shift = PHASE_SHIFT * PERIOD / 256 = %d * %1.3f / 256 = %1.3f. This exceeds the FINE_SHIFT_RANGE of %1.3f ns.", PHASE_SHIFT, period_orig / 1000.0, -(PHASE_SHIFT) * period_orig / 256 / 1000.0, FINE_SHIFT_RANGE / 1000.0);	      $finish;	end    end  end  else if (ps_type == 3'b101) begin            if ((ps_in * tap_delay_step) > FINE_SHIFT_RANGE) begin	    $display(" Phase shift Error : Allowed phase shift range on instance %m is between 0 to  %d. ", FINE_SHIFT_RANGE / tap_delay_step);	      $finish;            end  endendalways @(posedge lock_period_pulse or posedge rst_in or ps_delay_ps or ps_delay_drp or ps_in_ps          or ps_in_psdrp)   if (rst_in) begin     ps_delay <= 0;     ps_in_curr <= ps_in;  end  else  if (lock_period_pulse) begin     if ((ps_type == 3'b000) || (ps_type == 3'b001) || (ps_type == 3'b011) || (ps_type == 3'b100))          ps_delay <= (ps_in * period_div / 256);     else if (ps_type == 3'b101)           ps_delay <= ps_in * tap_delay_step;  end  else  begin    if (((ps_type == 3'b011) || (ps_type == 3'b100) ) )      begin          ps_in_curr = ps_in_ps;          ps_delay = (ps_in_ps * period_div / 256);     end    else if ((ps_type == 3'b101) && (ps_lock==1))    begin          ps_in_curr = ps_in_ps;          ps_delay = ps_in_ps * tap_delay_step;    end    else if ((ps_type == 3'b101) && (ps_drp_lock==1))    begin          ps_in_curr = ps_in_psdrp;          ps_delay = ps_delay_drp;    end  end     always @(posedge psclk_in or posedge rst_in)   if (rst_in) begin    ps_in_ps <= ps_in;    ps_overflow_out <= 0;//    ps_delay_ps <= 0;  end  else begin    if ((ps_type == 3'b011) || (ps_type == 3'b100) ) begin	if (psen_in)	    if (ps_lock == 1)		  $display(" Warning : Please wait for PSDONE signal before adjusting the Phase Shift.");	    else	    if (psincdec_in == 1) begin		if (ps_in_ps == ps_max)		    ps_overflow_out <= 1;		else if (((ps_in_ps + 1) * period_orig / 256) > period_orig + FINE_SHIFT_RANGE)		    ps_overflow_out <= 1;		else begin		    ps_in_ps <= ps_in_ps + 1;		    ps_overflow_out <= 0;		end		ps_lock <= 1;	    end	    else if (psincdec_in == 0) begin		if (ps_in_ps == ps_min)		    ps_overflow_out <= 1;		else if ((period_orig > FINE_SHIFT_RANGE) &&		     (((ps_in_ps - 1) * period_orig / 256) < period_orig - FINE_SHIFT_RANGE))		      ps_overflow_out <= 1;		else begin		    ps_in_ps <= ps_in_ps - 1;		    ps_overflow_out <= 0;		end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -