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

📄 dcm_sp.v

📁 ddr ram controller vhdl code
💻 V
📖 第 1 页 / 共 3 页
字号:
1 // $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/unisims/DCM_SP.v,v 1.9.4.3 2007/04/11 20:30:19 yanx Exp $ 2 /////////////////////////////////////////////////////////////////////////////// 3 // Copyright (c) 1995/2004 Xilinx, Inc. 4 // All Right Reserved. 5 /////////////////////////////////////////////////////////////////////////////// 6 //   ____  ____ 7 //  /   /\/   / 8 // /___/  \  /    Vendor : Xilinx 9 // \   \   \/     Version : 9.2i (J.36) 10 //  \   \         Description : Xilinx Function Simulation Library Component 11 //  /   /                  Digital Clock Manager 12 // /___/   /\     Filename : DCM_SP.v 13 // \   \  /  \    Timestamp :  14 //  \___\/\___\ 15 // 16 // Revision: 17 //    02/28/06 - Initial version. 18 //    05/09/06 - Add clkin_ps_mkup and clkin_ps_mkup_win for phase shifting (CR 229789). 19 //    06/14/06 - Add clkin_ps_mkup_flag for multiple cycle delays (CR233283). 20 //    07/21/06 - Change range of variable phase shifting to +/- integer of 20*(Period-3ns). 21 //               Give warning not support initial phase shifting for variable phase shifting. 22 //               (CR 235216). 23 //    09/22/06 - Add lock_period and lock_fb to clkfb_div block (CR 418722). 24 //    12/19/06 - Add clkfb_div_en for clkfb2x divider (CR431210). 25 //    04/06/07 - Enable the clock out in clock low time after reset in model  26 //               clock_divide_by_2  (CR 437471). 27 // End Revision 28  29  30 `timescale  1 ps / 1 ps 31  32 module DCM_SP ( 33         CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90, 34         CLKDV, CLKFX, CLKFX180, LOCKED, PSDONE, STATUS, 35         CLKFB, CLKIN, DSSEN, PSCLK, PSEN, PSINCDEC, RST); 36  37 parameter CLKDV_DIVIDE = 2.0; 38 parameter integer CLKFX_DIVIDE = 1; 39 parameter integer CLKFX_MULTIPLY = 4; 40 parameter CLKIN_DIVIDE_BY_2 = "FALSE"; 41 parameter CLKIN_PERIOD = 10.0;                  // non-simulatable 42 parameter CLKOUT_PHASE_SHIFT = "NONE"; 43 parameter CLK_FEEDBACK = "1X"; 44 parameter DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS"; // non-simulatable 45 parameter DFS_FREQUENCY_MODE = "LOW"; 46 parameter DLL_FREQUENCY_MODE = "LOW"; 47 parameter DSS_MODE = "NONE";                    // non-simulatable 48 parameter DUTY_CYCLE_CORRECTION = "TRUE"; 49 parameter FACTORY_JF = 16'hC080;                // non-simulatable 50 parameter integer MAXPERCLKIN = 1000000;                // non-modifiable simulation parameter 51 parameter integer MAXPERPSCLK = 100000000;              // non-modifiable simulation parameter 52 parameter integer PHASE_SHIFT = 0; 53 parameter integer SIM_CLKIN_CYCLE_JITTER = 300;         // non-modifiable simulation parameter 54 parameter integer SIM_CLKIN_PERIOD_JITTER = 1000;       // non-modifiable simulation parameter 55 parameter STARTUP_WAIT = "FALSE";               // non-simulatable 56  57  58 localparam PS_STEP = 25; 59  60 input CLKFB, CLKIN, DSSEN; 61 input PSCLK, PSEN, PSINCDEC, RST; 62  63 output CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90; 64 output CLKDV, CLKFX, CLKFX180, LOCKED, PSDONE; 65 output [7:0] STATUS; 66  67 reg CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90; 68 reg CLKDV, CLKFX, CLKFX180; 69  70 wire locked_out_out; 71 wire clkfb_in, clkin_in, dssen_in; 72 wire psclk_in, psen_in, psincdec_in, rst_in; 73 reg clk0_out; 74 reg clk2x_out, clkdv_out; 75 reg clkfx_out, clkfx180_en; 76 reg rst_flag; 77 reg locked_out, psdone_out, ps_overflow_out, ps_lock; 78 reg clkfb_div, clkfb_chk, clkfb_div_en; 79 integer clkdv_cnt; 80  81 reg [1:0] clkfb_type; 82 reg [8:0] divide_type; 83 reg clkin_type; 84 reg [1:0] ps_type; 85 reg [3:0] deskew_adjust_mode; 86 reg dfs_mode_type; 87 reg dll_mode_type; 88 reg clk1x_type; 89 integer ps_in; 90  91 reg lock_period, lock_delay, lock_clkin, lock_clkfb; 92 reg first_time_locked; 93 reg en_status; 94 reg ps_overflow_out_ext; 95 reg clkin_lost_out_ext; 96 reg clkfx_lost_out_ext; 97 reg [1:0] lock_out; 98 reg lock_out1_neg; 99 reg lock_fb, lock_ps, lock_ps_dly, lock_fb_dly, lock_fb_dly_tmp; 100 reg fb_delay_found; 101 reg clock_stopped; 102 reg clkin_chkin, clkfb_chkin; 103  104 wire chk_enable, chk_rst; 105 wire clkin_div; 106 wire lock_period_pulse; 107 wire lock_period_dly, lock_period_dly1; 108  109 reg clkin_ps, clkin_ps_tmp, clkin_ps_mkup, clkin_ps_mkup_win, clkin_ps_mkup_flag; 110 reg clkin_fb; 111  112 time FINE_SHIFT_RANGE; 113 //time ps_delay, ps_delay_init, ps_delay_md, ps_delay_all, ps_max_range; 114 integer ps_delay, ps_delay_init, ps_delay_md, ps_delay_all, ps_max_range; 115 integer ps_delay_last; 116 integer ps_acc; 117 time clkin_edge; 118 time clkin_div_edge; 119 time clkin_ps_edge; 120 time delay_edge; 121 time clkin_period [2:0]; 122 time period; 123 integer period_int, period_int2, period_int3, period_ps_tmp; 124 time period_div; 125 integer period_orig_int; 126 time period_orig; 127 time period_ps; 128 time clkout_delay; 129 time fb_delay; 130 time period_fx, remain_fx; 131 time period_dv_high, period_dv_low; 132 time cycle_jitter, period_jitter; 133  134 reg clkin_window, clkfb_window; 135 reg [2:0] rst_reg; 136 reg [12:0] numerator, denominator, gcd; 137 reg [23:0] i, n, d, p; 138  139 reg notifier; 140  141 initial begin 142     #1; 143     if ($realtime == 0) begin 144         $display ("Simulator Resolution Error : Simulator resolution is set to a value greater than 1 ps."); 145         $display ("In order to simulate the DCM_SP, the simulator resolution must be set to 1ps or smaller."); 146         $finish; 147     end 148 end 149  150 initial begin 151     case (2.0) 152         1.5  : divide_type = 'd3; 153         2.0  : divide_type = 'd4; 154         2.5  : divide_type = 'd5; 155         3.0  : divide_type = 'd6; 156         3.5  : divide_type = 'd7; 157         4.0  : divide_type = 'd8; 158         4.5  : divide_type = 'd9; 159         5.0  : divide_type = 'd10; 160         5.5  : divide_type = 'd11; 161         6.0  : divide_type = 'd12; 162         6.5  : divide_type = 'd13; 163         7.0  : divide_type = 'd14; 164         7.5  : divide_type = 'd15; 165         8.0  : divide_type = 'd16; 166         9.0  : divide_type = 'd18; 167         10.0 : divide_type = 'd20; 168         11.0 : divide_type = 'd22; 169         12.0 : divide_type = 'd24; 170         13.0 : divide_type = 'd26; 171         14.0 : divide_type = 'd28; 172         15.0 : divide_type = 'd30; 173         16.0 : divide_type = 'd32; 174         default : begin 175             $display("Attribute Syntax Error : The attribute CLKDV_DIVIDE on DCM_SP instance %m is set to %0.1f.  Legal values for this attribute are 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, or 16.0.", CLKDV_DIVIDE); 176             $finish; 177         end 178     endcase 179  180     if ((CLKFX_DIVIDE <= 0) || (32 < CLKFX_DIVIDE)) begin 181         $display("Attribute Syntax Error : The attribute CLKFX_DIVIDE on DCM_SP instance %m is set to %d.  Legal values for this attribute are 1 ... 32.", CLKFX_DIVIDE); 182         $finish; 183     end 184  185     if ((CLKFX_MULTIPLY <= 1) || (32 < CLKFX_MULTIPLY)) begin 186         $display("Attribute Syntax Error : The attribute CLKFX_MULTIPLY on DCM_SP instance %m is set to %d.  Legal values for this attribute are 2 ... 32.", CLKFX_MULTIPLY); 187         $finish; 188     end 189  190     case (CLKIN_DIVIDE_BY_2) 191         "false" : clkin_type = 0; 192         "FALSE" : clkin_type = 0; 193         "true"  : clkin_type = 1; 194         "TRUE"  : clkin_type = 1; 195         default : begin 196             $display("Attribute Syntax Error : The attribute CLKIN_DIVIDE_BY_2 on DCM_SP instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", CLKIN_DIVIDE_BY_2); 197             $finish; 198         end 199     endcase 200  201     case (CLKOUT_PHASE_SHIFT) 202         "NONE"     : begin 203                          ps_in = 256; 204                          ps_type = 0; 205                      end 206         "none"     : begin 207                          ps_in = 256; 208                          ps_type = 0; 209                      end 210         "FIXED"    : begin 211                          ps_in = PHASE_SHIFT + 256; 212                          ps_type = 1; 213                      end 214         "fixed"    : begin 215                          ps_in = PHASE_SHIFT + 256; 216                          ps_type = 1; 217                      end 218         "VARIABLE" : begin 219                          ps_in = PHASE_SHIFT + 256; 220                          ps_type = 2; 221                      end 222         "variable" : begin 223                          ps_in = PHASE_SHIFT + 256; 224                          ps_type = 2; 225                          if (PHASE_SHIFT != 0) 226                              $display("Attribute Syntax Warning : The attribute PHASE_SHIFT on DCM_SP instance %m is set to %d.  The maximum variable phase shift range is only valid when initial phase shift PHASE_SHIFT is zero.", PHASE_SHIFT); 227                      end 228         default : begin 229             $display("Attribute Syntax Error : The attribute CLKOUT_PHASE_SHIFT on DCM_SP instance %m is set to %s.  Legal values for this attribute are NONE, FIXED or VARIABLE.", CLKOUT_PHASE_SHIFT); 230             $finish; 231         end 232     endcase 233  234  235     case (CLK_FEEDBACK) 236         "none" : clkfb_type = 2'b00; 237         "NONE" : clkfb_type = 2'b00; 238         "1x"   : clkfb_type = 2'b01; 239         "1X"   : clkfb_type = 2'b01; 240         "2x"   : clkfb_type = 2'b10; 241         "2X"   : clkfb_type = 2'b10; 242         default : begin 243             $display("Attribute Syntax Error : The attribute CLK_FEEDBACK on DCM_SP instance %m is set to %s.  Legal values for this attribute are NONE, 1X or 2X.", CLK_FEEDBACK); 244             $finish; 245         end 246     endcase 247  248     case (DESKEW_ADJUST) 249         "source_synchronous" : deskew_adjust_mode = 8; 250         "SOURCE_SYNCHRONOUS" : deskew_adjust_mode = 8; 251         "system_synchronous" : deskew_adjust_mode = 11; 252         "SYSTEM_SYNCHRONOUS" : deskew_adjust_mode = 11; 253         "0"                  : deskew_adjust_mode = 0; 254         "1"                  : deskew_adjust_mode = 1; 255         "2"                  : deskew_adjust_mode = 2; 256         "3"                  : deskew_adjust_mode = 3; 257         "4"                  : deskew_adjust_mode = 4; 258         "5"                  : deskew_adjust_mode = 5; 259         "6"                  : deskew_adjust_mode = 6; 260         "7"                  : deskew_adjust_mode = 7; 261         "8"                  : deskew_adjust_mode = 8; 262         "9"                  : deskew_adjust_mode = 9; 263         "10"                 : deskew_adjust_mode = 10; 264         "11"                 : deskew_adjust_mode = 11; 265         "12"                 : deskew_adjust_mode = 12; 266         "13"                 : deskew_adjust_mode = 13; 267         "14"                 : deskew_adjust_mode = 14; 268         "15"                 : deskew_adjust_mode = 15; 269         default : begin 270             $display("Attribute Syntax Error : The attribute DESKEW_ADJUST on DCM_SP instance %m is set to %s.  Legal values for this attribute are SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or 0 ... 15.", DESKEW_ADJUST); 271             $finish; 272         end 273     endcase 274  275     case (DFS_FREQUENCY_MODE) 276         "high" : dfs_mode_type = 1; 277         "HIGH" : dfs_mode_type = 1; 278         "low"  : dfs_mode_type = 0; 279         "LOW"  : dfs_mode_type = 0; 280         default : begin 281             $display("Attribute Syntax Error : The attribute DFS_FREQUENCY_MODE on DCM_SP instance %m is set to %s.  Legal values for this attribute are HIGH or LOW.", DFS_FREQUENCY_MODE); 282             $finish; 283         end 284     endcase 285  286     period_jitter = SIM_CLKIN_PERIOD_JITTER; 287     cycle_jitter = SIM_CLKIN_CYCLE_JITTER; 288  289     case (DLL_FREQUENCY_MODE) 290         "high" : dll_mode_type = 1; 291         "HIGH" : dll_mode_type = 1; 292         "low"  : dll_mode_type = 0; 293         "LOW"  : dll_mode_type = 0; 294         default : begin 295             $display("Attribute Syntax Error : The attribute DLL_FREQUENCY_MODE on DCM_SP instance %m is set to %s.  Legal values for this attribute are HIGH or LOW.", DLL_FREQUENCY_MODE); 296             $finish; 297         end 298     endcase 299  300     if ((dll_mode_type ==1) && (clkfb_type == 2'b10)) begin 301             $display("Attribute Syntax Error : The attributes DLL_FREQUENCY_MODE on DCM_SP instance %m is set to %s and CLK_FEEDBACK is set to %s.  CLK_FEEDBACK 2X is not supported when DLL_FREQUENCY_MODE is  HIGH.", DLL_FREQUENCY_MODE, CLK_FEEDBACK); 302            $finish; 303     end  304  305     case (DSS_MODE) 306         "none" : ; 307         "NONE" : ; 308         default : begin 309             $display("Attribute Syntax Error : The attribute DSS_MODE on DCM_SP instance %m is set to %s.  Legal values for this attribute is NONE.", DSS_MODE); 310             $finish; 311         end 312     endcase 313  314     case (DUTY_CYCLE_CORRECTION) 315         "false" : clk1x_type = 0; 316         "FALSE" : clk1x_type = 0; 317         "true"  : clk1x_type = 1; 318         "TRUE"  : clk1x_type = 1; 319         default : begin 320             $display("Attribute Syntax Error : The attribute DUTY_CYCLE_CORRECTION on DCM_SP instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", DUTY_CYCLE_CORRECTION); 321             $finish; 322         end 323     endcase 324  325     if ((PHASE_SHIFT < -255) || (PHASE_SHIFT > 255)) begin 326         $display("Attribute Syntax Error : The attribute PHASE_SHIFT on DCM_SP instance %m is set to %d.  Legal values for this attribute are -255 ... 255.", PHASE_SHIFT); 327         $display("Error : PHASE_SHIFT = %d is not -255 ... 255.", PHASE_SHIFT); 328         $finish; 329     end 330  331     case (STARTUP_WAIT) 332         "false" : ; 333         "FALSE" : ; 334         "true"  : ; 335         "TRUE"  : ; 336         default : begin 337             $display("Attribute Syntax Error : The attribute STARTUP_WAIT on DCM_SP instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", STARTUP_WAIT); 338             $finish; 339         end 340     endcase 341 end 342  343 // 344 // fx parameters 345 // 346  347 initial begin 348     gcd = 1; 349     for (i = 2; i <= CLKFX_MULTIPLY; i = i + 1) begin 350         if (((CLKFX_MULTIPLY % i) == 0) && ((CLKFX_DIVIDE % i) == 0)) 351             gcd = i; 352     end 353     numerator = CLKFX_MULTIPLY / gcd; 354     denominator = CLKFX_DIVIDE / gcd; 355 end 356  357 // 358 // input wire delays 359 // 360  361 buf b_clkin (clkin_in, CLKIN); 362 buf b_clkfb (clkfb_in, CLKFB); 363 buf b_dssen (dssen_in, DSSEN); 364 buf b_psclk (psclk_in, PSCLK); 365 buf b_psen (psen_in, PSEN); 366 buf b_psincdec (psincdec_in, PSINCDEC); 367 buf b_rst (rst_in, RST); 368 buf #100 b_LOCKED (LOCKED, locked_out_out); 369 buf #100 b_PSDONE (PSDONE, psdone_out); 370 buf b_ps_overflow (STATUS[0], ps_overflow_out_ext); 371 buf b_clkin_lost (STATUS[1], clkin_lost_out_ext); 372 buf b_clkfx_lost (STATUS[2], clkfx_lost_out_ext); 373  374 assign STATUS[7:3] = 5'b0; 375  376 dcm_sp_clock_divide_by_2 i_clock_divide_by_2 (clkin_in, clkin_type, clkin_div, rst_in); 377  378 dcm_sp_maximum_period_check #("CLKIN", MAXPERCLKIN) i_max_clkin (clkin_in, rst_in); 379 dcm_sp_maximum_period_check #("PSCLK", MAXPERPSCLK) i_max_psclk (psclk_in, rst_in); 380  381 dcm_sp_clock_lost i_clkin_lost (clkin_in, first_time_locked, clkin_lost_out, rst_in); 382 dcm_sp_clock_lost i_clkfx_lost (CLKFX, first_time_locked, clkfx_lost_out, rst_in); 383  384 always @(rst_in or en_status or clkfx_lost_out or clkin_lost_out or ps_overflow_out) 385    if (rst_in == 1 || en_status == 0)  begin 386        ps_overflow_out_ext = 0; 387        clkin_lost_out_ext = 0; 388        clkfx_lost_out_ext = 0; 389     end 390    else 391    begin 392       ps_overflow_out_ext = ps_overflow_out; 393       clkin_lost_out_ext = clkin_lost_out; 394       clkfx_lost_out_ext = clkfx_lost_out; 395    end 396  397 always @(posedge rst_in or posedge LOCKED) 398   if (rst_in == 1) 399       en_status <= 0; 400    else 401       en_status <= 1; 402  403  404 always @(clkin_div) 405     clkin_ps_tmp <= #(ps_delay_md) clkin_div; 406  407 always @(clkin_ps_tmp or clkin_ps_mkup or clkin_ps_mkup_win) 408   if (clkin_ps_mkup_win) 409        clkin_ps = clkin_ps_mkup; 410   else 411        clkin_ps = clkin_ps_tmp;    412  413 always @(ps_delay_last or period_int or ps_delay) begin 414     period_int2 = 2 * period_int; 415     period_int3 = 3 * period_int; 

⌨️ 快捷键说明

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