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

📄 ddr2_32mx32_data_read_controller_0.v

📁 Xilinx DDR2存储器接口调试代码
💻 V
字号:
///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2005-2007 Xilinx, Inc.
// This design is confidential and proprietary of Xilinx, All Rights Reserved.
///////////////////////////////////////////////////////////////////////////////
//   ____  ____
//  /   /\/   /
// /___/  \  /   Vendor		    : Xilinx
// \   \   \/    Version	    : $Name: i+IP+131489 $
//  \   \        Application	    : MIG
//  /   /        Filename	    : ddr2_32Mx32_data_read_controller_0.v
// /___/   /\    Date Last Modified : $Date: 2007/09/21 15:23:18 $
// \   \  /  \   Date Created	    : Mon May 2 2005
//  \___\/\___\
// Device	: Spartan-3/3A/3A-DSP
// Design Name	: DDR2 SDRAM
// Purpose	: This module has instantiations fifo_0_wr_en, fifo_1_wr_en, 
//		  dqs_delay and wr_gray_cntr.
///////////////////////////////////////////////////////////////////////////////

`timescale 1ns/100ps
`include "../rtl/ddr2_32Mx32_parameters_0.v"

module ddr2_32Mx32_data_read_controller_0
  (
   input				clk,
   input				clk90,
   input				reset,
   input				reset90,
   input				rst_dqs_div_in,
   input  [4:0]				delay_sel,
   input  [3:0]				fifo0_rd_addr,
   input  [3:0]				fifo1_rd_addr,
   input  [(`DATA_STROBE_WIDTH-1):0]	dqs_int_delay_in,
   output [(`DATA_STROBE_WIDTH-1):0]	fifo_0_wr_en_val,
   output [(`DATA_STROBE_WIDTH-1):0]	fifo_1_wr_en_val,	
   output [(4*`DATA_STROBE_WIDTH)-1:0]	fifo_0_wr_addr_val,
   output [(4*`DATA_STROBE_WIDTH)-1:0]	fifo_1_wr_addr_val,
   output [(`DATA_STROBE_WIDTH-1):0]	dqs_delayed_col0_val,
   output [(`DATA_STROBE_WIDTH-1):0]	dqs_delayed_col1_val,
   output				u_data_val,
   output				read_valid_data_1_val
   );

   reg				     read_valid_data_r;
   reg				     read_valid_data_r1;
   reg [3:0] 			     fifo_0_wr_addr_d;
   reg [3:0] 			     fifo_0_wr_addr_2d;
   reg [3:0]			     fifo_0_wr_addr_3d;
   reg [3:0]			     fifo_1_wr_addr_d;
   reg [3:0]			     fifo_1_wr_addr_2d;
   reg [3:0]			     fifo_1_wr_addr_3d;
   reg				     u_data_val_r;
   reg				     reset90_r;
   reg				     reset_r;

   wire				     fifo_0_empty;
   wire			             fifo_1_empty;
   wire				     read_valid_data_0_1;
   wire				     rst_dqs_div;
   wire [(4*`DATA_STROBE_WIDTH)-1:0] fifo_0_wr_addr;
   wire [(4*`DATA_STROBE_WIDTH)-1:0] fifo_1_wr_addr;
   wire [(`DATA_STROBE_WIDTH-1):0]   dqs_delayed_col0;
   wire [(`DATA_STROBE_WIDTH-1):0]   dqs_delayed_col1;
   wire [(`DATA_STROBE_WIDTH-1):0]   rst_dqs_delay_n;
   wire [(`DATA_STROBE_WIDTH-1):0]   dqs_delayed_col0_n;
   wire [(`DATA_STROBE_WIDTH-1):0]   dqs_delayed_col1_n;
   wire [(`DATA_STROBE_WIDTH-1):0]   fifo_0_wr_en/* synthesis syn_keep=1 */;
   wire [(`DATA_STROBE_WIDTH-1):0]   fifo_1_wr_en/* synthesis syn_keep=1 */;

   assign fifo_0_wr_addr_val    = fifo_0_wr_addr;
   assign fifo_1_wr_addr_val    = fifo_1_wr_addr;
   assign fifo_0_wr_en_val      = fifo_0_wr_en;
   assign fifo_1_wr_en_val      = fifo_1_wr_en;
   assign dqs_delayed_col0_val  = dqs_delayed_col0;
   assign dqs_delayed_col1_val  = dqs_delayed_col1;
   assign dqs_delayed_col0_n    = ~ dqs_delayed_col0;
   assign dqs_delayed_col1_n    = ~ dqs_delayed_col1;
   assign read_valid_data_0_1   = ((~fifo_0_empty) & (~fifo_1_empty));
   assign read_valid_data_1_val = (read_valid_data_0_1);
   assign u_data_val            = u_data_val_r;
   assign fifo_0_empty		= (fifo0_rd_addr == fifo_0_wr_addr_3d) 
				  ? 1'b1 : 1'b0;
   assign fifo_1_empty		= (fifo1_rd_addr == fifo_1_wr_addr_3d) 
				   ? 1'b1 : 1'b0;

   always @(posedge clk)
     reset_r <= reset;

   always @(posedge clk90)
     reset90_r <= reset90;

   always @(posedge clk90) begin
     if(reset90_r)begin
	fifo_0_wr_addr_d  <= 4'h0;
	fifo_1_wr_addr_d  <= 4'h0;
	fifo_0_wr_addr_2d <= 4'h0;
	fifo_1_wr_addr_2d <= 4'h0;
	fifo_0_wr_addr_3d <= 4'h0;
	fifo_1_wr_addr_3d <= 4'h0;
     end
     else begin
        fifo_0_wr_addr_d  <= fifo_0_wr_addr[3:0];
        fifo_1_wr_addr_d  <= fifo_1_wr_addr[3:0];
        fifo_0_wr_addr_2d <= fifo_0_wr_addr_d;
        fifo_1_wr_addr_2d <= fifo_1_wr_addr_d;
        fifo_0_wr_addr_3d <= fifo_0_wr_addr_2d;
        fifo_1_wr_addr_3d <= fifo_1_wr_addr_2d;
     end
   end

   always @(posedge clk90) begin
      if(reset90_r) begin
         u_data_val_r <= 1'b0;
         read_valid_data_r <= 1'b0;
         read_valid_data_r1 <= 1'b0;
      end
      else begin
         read_valid_data_r <= read_valid_data_0_1;
         read_valid_data_r1 <= read_valid_data_r;
         u_data_val_r <= read_valid_data_r1;
      end
   end

// rst_dqs_div instantation. 
   ddr2_32Mx32_dqs_delay rst_dqs_div_delayed1
     (
      .clk_in(rst_dqs_div_in),
      .sel_in(delay_sel),
      .clk_out(rst_dqs_div)
      );

//DQS Internal Delay Circuit implemented in LUTs

   genvar dly_i;
   generate 
      for(dly_i = 0; dly_i < `DATA_STROBE_WIDTH; dly_i = dly_i + 1) 
	begin: gen_delay
	   ddr2_32Mx32_dqs_delay dqs_delay_col0
	     (
	      .clk_in	(dqs_int_delay_in[dly_i]),
	      .sel_in	(delay_sel),
	      .clk_out	(dqs_delayed_col0[dly_i])
	      )/* synthesis syn_preserve=1 */;

	   ddr2_32Mx32_dqs_delay dqs_delay_col1
	     (
	      .clk_in	(dqs_int_delay_in[dly_i]),
	      .sel_in	(delay_sel),
              .clk_out	(dqs_delayed_col1[dly_i])
	      )/* synthesis syn_preserve=1 */;
	end
   endgenerate


// FIFO write enables instances
   genvar wren_i;
   generate 
      for(wren_i = 0; wren_i < `DATA_STROBE_WIDTH;  wren_i = wren_i + 1) 
	begin: gen_wr_en
	   ddr2_32Mx32_fifo_0_wr_en_0 fifo_0_wr_en_inst 
             (
	      .clk		(dqs_delayed_col1_n [wren_i]), 
	      .reset		(reset_r), 
	      .din		(rst_dqs_div),
	      .rst_dqs_delay_n	(rst_dqs_delay_n[wren_i]),
	      .dout		(fifo_0_wr_en[wren_i])
	      );
	   ddr2_32Mx32_fifo_1_wr_en_0 fifo_1_wr_en_inst 
	     (
	      .clk		(dqs_delayed_col0[wren_i]), 
	      .rst_dqs_delay_n	(rst_dqs_delay_n[wren_i]),
	      .reset		(reset_r), 
	      .din		(rst_dqs_div), 
	      .dout		(fifo_1_wr_en[wren_i])
	      );
	end
   endgenerate

//FIFO write pointer instances
   genvar wr_addr_i;
   generate 
      for(wr_addr_i = 0; wr_addr_i < `DATA_STROBE_WIDTH;  wr_addr_i = wr_addr_i + 1) 
	begin: gen_wr_addr
	   ddr2_32Mx32_wr_gray_cntr fifo_0_wr_addr_inst 
             (
              .clk	(dqs_delayed_col1[wr_addr_i]), 
	      .reset	(reset_r), 
	      .cnt_en	(fifo_0_wr_en[wr_addr_i]),
	      .wgc_gcnt	(fifo_0_wr_addr[wr_addr_i*4+:4])
              );
           ddr2_32Mx32_wr_gray_cntr fifo_1_wr_addr_inst 
             (
	      .clk	(dqs_delayed_col0_n[wr_addr_i]), 
	      .reset	(reset_r), 
	      .cnt_en	(fifo_1_wr_en[wr_addr_i]),
	      .wgc_gcnt	(fifo_1_wr_addr[wr_addr_i*4+:4])
	      );
	end
   endgenerate
   
endmodule

⌨️ 快捷键说明

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