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

📄 dcm_adv.v

📁 DDR2源代码 DDR2源代码 DDR2源代码
💻 V
📖 第 1 页 / 共 4 页
字号:
  else     clkfx_out = clkfx_out_ph;always @(locked_out or posedge rst_in or clkfx_out_avg )      if (rst_in == 1)          clkfx_out_avg  <= 0;      else if (locked_out == 1)          if (DFS_OSCILLATOR_MODE == "AVE_FREQ_LOCK")            clkfx_out_avg  <= #(period_fxavg) ~clkfx_out_avg;always @(posedge clkin_ps or posedge clkin_lost_out or posedge rst_in)   if (rst_in == 1)         clkfx_out_ph  = 0;  else if (clkin_lost_out == 1'b1 ) begin           if (locked_out == 1)            @(negedge rst_reg[2]);        end  else   if (lock_out[1] == 1 && DFS_OSCILLATOR_MODE == "PHASE_FREQ_LOCK") begin    if (lock_out[1] == 1 ) begin	clkfx_out_ph = 1'b1;	for (p = 0; p < (numerator * 2 - 1); p = p + 1) begin	    #(period_fx);	    if (p < remain_fx)		#1;	    clkfx_out_ph = !clkfx_out_ph;	end	if (period_fx > (period / 2)) begin	    #(period_fx - (period / 2));	end    end  end//// detect_first_time_locked//always @(posedge locked_out)   if (first_time_locked == 0)       first_time_locked <= 1;always @(ps_overflow_out or clkin_lost_out or clkfx_lost_out or         clkfb_lost_out or en_status)  if ( en_status != 1)      do_out_s[3:0] = 4'b0;  else  begin     do_out_s[0] = ps_overflow_out;     do_out_s[1] = clkin_lost_out;     do_out_s[2] = clkfx_lost_out;     do_out_s[3] = clkfb_lost_out;  end assign do_out = (do_stat_en == 0) ? do_out_drp1 : do_out_s;always @(posedge rst_in or posedge LOCKED)  if (rst_in == 1)      en_status <= 0;   else      en_status <= 1;//// drp process//always @(posedge dclk_in or posedge gsr_in)begin  if (gsr_in == 1) begin       drp_lock <= 0;       ps_in_drp <= 0;       ps_kick_off_cmd <= 0;       do_out_drp <= 16'b0;       do_out_drp1 <= 16'b0;       do_stat_en <= 1;       drdy_out <= 0;    end   else begin    valid_daddr = addr_is_valid(daddr_in);    if (DEN == 1) begin         if (drp_lock == 1)          $display(" Warning : DEN is high at DCM_ADV instance %m at time %t. Please wait for DRDY signal before next read/write operation through DRP. ", $time);        else  begin          drp_lock <= 1;                 if (DWE == 0 && sim_device_type == 1 ) begin           if (daddr_in == `DCM_DEFAULT_STATUS_ADDR)               do_stat_en <= 1;           else begin               do_stat_en <= 0;               if (daddr_in == `DFS_FREQ_MODE_ADDR)                   do_out_drp <= dfs_mode_reg;               else if (daddr_in == `DLL_FREQ_MODE_ADDR)                   do_out_drp <= dll_mode_reg;               else if (daddr_in == `CLKFX_MULTIPLY_ADDR)                   do_out_drp <= clkfx_md_reg;               else if (daddr_in == `CLKIN_DIV_BY2_ADDR)                   do_out_drp <= clkin_div2_reg;               else                    do_out_drp <= 16'b0;           end          end                        if (DWE == 1) begin            if (valid_daddr) begin               if (daddr_in == `CLKFX_MULTIPLY_ADDR) begin                   if (sim_device_type == 1) begin                     clkfx_divide_drp <= di_in[7:0] + 1;                     clkfx_multiply_drp <= di_in[15:8] + 1;                     clkfx_md_reg <= di_in;                  end                  else                     clkfx_multiply_drp <= di_in[4:0] + 1;              end              else if (daddr_in == `CLKFX_DIVIDE_ADDR && sim_device_type == 0) begin                 clkfx_divide_drp <= di_in[4:0] + 1;              end              else if (daddr_in == `PHASE_SHIFT_ADDR) begin                 ps_drp <= di_in[10:0];              end              else if (daddr_in == `PHASE_SHIFT_KICK_OFF_ADDR) begin                 if (ps_kick_off_cmd == 0) begin                  ps_kick_off_cmd <= 1;                  ps_in_drp <= ps_drp;                    if (ps_in < ps_drp)                       inc_dec <= 1;                    else if (ps_in > ps_drp)                       inc_dec <= 0;                 end             end             else if (daddr_in == `DFS_FREQ_MODE_ADDR && sim_device_type == 1) begin                   dfs_mode_reg <= di_in;             end             else if (daddr_in == `DLL_FREQ_MODE_ADDR && sim_device_type == 1) begin                   dll_mode_reg <= di_in;             end             else if (daddr_in == `CLKIN_DIV_BY2_ADDR && sim_device_type == 1) begin                   clkin_div2_reg <= di_in;             end             else                 $display(" Warning : Address DADDR=%b is unsupported at DCM_ADV instance %m at time %t.  ",  daddr_in, $time);           end         end      end    end    if (ps_drp_lock == 1)              if (ps_kick_off_cmd == 1)               ps_kick_off_cmd <= 0;    if ( drp_lock == 1)         drp_lock1 <= 1;    if ( drp_lock1 == 1) begin          drp_lock <= 0;          drp_lock1 <= 0;          drdy_out <= 1;          do_out_drp1 <= do_out_drp;          do_out_drp <= 16'b0;    end    if (drdy_out == 1) begin        drdy_out <= 0;        do_out_drp1 <= 16'b0;    end  endendfunction addr_is_valid;input [6:0] daddr_funcin;begin  addr_is_valid = 1;  for (i=0; i<=6; i=i+1)    if ( daddr_funcin[i] != 0 && daddr_funcin[i] != 1)       addr_is_valid = 0;endendfunction// end process drp;////   drive_drdy_out  process////always @(drp_lock or dclk_in or gsr_in)//    @(negedge drp_lock)//      @(posedge dclk_in) begin//         if (gsr_in == 0) //            drdy_out = 1;//         @(posedge dclk_in)//         drdy_out = 0;//    end//// generate all output signal//always @(rst_in)if (rst_in) begin   assign CLK0 = 0;   assign CLK90 = 0;   assign CLK180 = 0;   assign CLK270 = 0;   assign CLK2X = 0;   assign CLK2X180 =0;   assign CLKDV = 0;   assign CLKFX = 0;   assign CLKFX180 = 0;endelse begin   deassign CLK0;   deassign CLK90;   deassign CLK180;   deassign CLK270;   deassign CLK2X;   deassign CLK2X180;   deassign CLKDV;   deassign CLKFX;   deassign CLKFX180;endalways @(clk0_out) begin    CLK0 <= #(clkout_delay) clk0_out;    CLK90 <= #(clkout_delay + period / 4) clk0_out;      CLK180 <= #(clkout_delay + period / 2) clk0_out;      CLK270 <= #(clkout_delay + period / 4) ~clk0_out;  endalways @(clk2x_out)  begin    CLK2X <= #(clkout_delay) clk2x_out;    CLK2X180 <= #(clkout_delay) ~clk2x_out ;endalways @(clkdv_out)     CLKDV <= #(clkout_delay) clkdv_out;always @(clkfx_out )    CLKFX <= #(clkout_delay) clkfx_out;always @( clkfx_out or  first_time_locked or locked_out) begin  if ( ~first_time_locked)     CLKFX180 <= 0;  else    CLKFX180 <=  #(clkout_delay) ~clkfx_out;endendmodule//////////////////////////////////////////////////////module dcm_adv_clock_divide_by_2 (clock, clock_type, clock_out, rst);input clock;input clock_type;input rst;output clock_out;reg clock_out;reg clock_div2;reg [2:0] rst_reg;wire clk_src;initial begin    clock_out = 1'b0;    clock_div2 = 1'b0;endalways @(posedge clock)    clock_div2 <= ~clock_div2;always @(posedge clock) begin    rst_reg[0] <= rst;    rst_reg[1] <= rst_reg[0] & rst;    rst_reg[2] <= rst_reg[1] & rst_reg[0] & rst;endassign clk_src = (clock_type) ? clock_div2 : clock;always @(clk_src or rst or rst_reg)    if (rst == 1'b0)        clock_out = clk_src;    else if (rst == 1'b1) begin        clock_out = 1'b0;        @(negedge rst_reg[2]);        if (clk_src == 1'b1)          @(negedge clk_src);    endendmodulemodule dcm_adv_maximum_period_check (clock,  rst);parameter clock_name = "";parameter maximum_period = 0;input clock;input rst;time clock_edge;time clock_period;initial begin    clock_edge = 0;    clock_period = 0;endalways @(posedge clock )begin    clock_edge <= $time;    clock_period <= $time - clock_edge;    if (clock_period > maximum_period && rst == 0 ) begin	$display(" Warning : Input clock period of, %1.3f ns, on the %s port of instance %m exceeds allowed value of %1.3f ns at simulation time %1.3f ns.", clock_period/1000.0, clock_name, maximum_period/1000.0, $time/1000.0);    endendendmodulemodule dcm_adv_clock_lost (clock, enable, lost, rst);input clock;input enable;input rst;output lost;reg lost_r, lost_f, lost;time clock_edge;reg [63:0] period;reg clock_low, clock_high;reg clock_posedge, clock_negedge;reg clock_second_pos, clock_second_neg;initial begin    clock_edge = 0;    clock_high = 0;    clock_low = 0;    lost_r = 0;    lost_f = 0;    period = 0;    clock_posedge = 0;    clock_negedge = 0;    clock_second_pos = 0;    clock_second_neg = 0;endalways @(posedge clock or negedge clock or posedge rst)  if (rst) begin     clock_second_pos <= 0;     clock_second_neg <= 0;  end  else if (clock)     clock_second_pos <= 1;  else if (~clock)     clock_second_neg <= 1;always @(posedge clock or posedge rst)  if (rst) begin    period <= 0;  end  else begin    clock_edge <= $time;    if (period != 0 && (($time - clock_edge) <= (1.5 * period)))        period <= $time - clock_edge;    else if (period != 0 && (($time - clock_edge) > (1.5 * period)))        period <= 0;    else if ((period == 0) && (clock_edge != 0) && clock_second_pos == 1)        period <= $time - clock_edge;  endalways @(posedge clock or posedge rst)  if (rst)     lost_r <= 0;  else   if (enable == 1 && clock_second_pos == 1) begin      #1;      if ( period != 0)         lost_r <= 0;      #((period * 9.1) / 10)      if ((clock_low != 1'b1) && (clock_posedge != 1'b1) && rst == 0)        lost_r <= 1;    endalways @(negedge clock or posedge rst)  if (rst==1) begin     lost_f <= 0;   end   else begin     if (enable == 1 && clock_second_neg == 1) begin      if ( period != 0)        lost_f <= 0;      #((period * 9.1) / 10)      if ((clock_high != 1'b1) && (clock_negedge != 1'b1) && rst == 0)        lost_f <= 1;      end  endalways @( lost_r or  lost_f or enable)  if (enable == 1)          lost = lost_r | lost_f;  else        lost = 0;always @(posedge clock or negedge clock or posedge rst)  if (rst==1) begin           clock_low   <= 1'b0;           clock_high  <= 1'b0;           clock_posedge  <= 1'b0;           clock_negedge <= 1'b0;  end  else     if (clock ==1) begin           clock_low   <= 1'b0;           clock_high  <= 1'b1;           clock_posedge  <= 1'b0;           clock_negedge <= 1'b1;    end    else if (clock == 0) begin           clock_low   <= 1'b1;           clock_high  <= 1'b0;           clock_posedge  <= 1'b1;           clock_negedge <= 1'b0;    endendmodule

⌨️ 快捷键说明

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