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

📄 ddr2_32mx32_data_read_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_0.v
// /___/   /\    Date Last Modified	: $Date: 2007/09/21 15:23:17 $
// \   \  /  \   Date Created		: Mon May 2 2005
//  \___\/\___\
// Device	: Spartan-3/3A/3A-DSP
// Design Name	: DDR2 SDRAM
// Purpose	: ram8d modules are instantiated for Read data FIFOs. RAM8D is 
//		  each 8 bits or 4 bits depending on number data bits per strobe.
//		  Each strobe  will have two instances, one for rising edge data
//		  and one for falling edge data. 
///////////////////////////////////////////////////////////////////////////////

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


module ddr2_32Mx32_data_read_0
  (
   input                              clk90,
   input                              reset90,
   input [(`DATA_WIDTH-1):0]          ddr_dq_in,
   input                              read_valid_data_1,
   input [(`DATA_STROBE_WIDTH-1):0]   fifo_0_wr_en,
   input [(`DATA_STROBE_WIDTH-1):0]   fifo_1_wr_en,
   input [(4*`DATA_STROBE_WIDTH)-1:0] fifo_0_wr_addr ,
   input [(4*`DATA_STROBE_WIDTH)-1:0] fifo_1_wr_addr ,
   input [(`DATA_STROBE_WIDTH-1):0]   dqs_delayed_col0,
   input [(`DATA_STROBE_WIDTH-1):0]   dqs_delayed_col1,    
   output [((`DATA_WIDTH*2)-1):0]     user_output_data,
   output [3:0]                       fifo0_rd_addr_val,
   output [3:0]                       fifo1_rd_addr_val
   );

   reg 				      read_valid_data_1_r;
   reg 				      read_valid_data_1_r1;
   reg 				      reset90_r;

   reg [(4*`DATA_STROBE_WIDTH)-1:0]   fifo0_rd_addr_r;
   /* synthesis syn_preserve=1 *//* synthesis syn_noprune=1 */
   reg [(4*`DATA_STROBE_WIDTH)-1:0]   fifo1_rd_addr_r;
   /* synthesis syn_preserve=1 *//* synthesis syn_noprune=1 */

   reg [`DATA_WIDTH-1:0] 	      fifo_0_data_out_r;
   /* synthesis syn_preserve=1 */ /* synthesis syn_noprune=1 */
   reg [`DATA_WIDTH-1:0] 	      fifo_1_data_out_r;
   /* synthesis syn_preserve=1 */ /* synthesis syn_noprune=1 */

   reg [((`DATA_WIDTH*2)-1):0] 	      first_sdr_data;
   
   wire [3:0] 			      fifo0_rd_addr;
   wire [3:0] 			      fifo1_rd_addr;
   wire [`DATA_WIDTH-1:0] 	      fifo_0_data_out;
   wire [`DATA_WIDTH-1:0] 	      fifo_1_data_out;
   wire [(`DATA_STROBE_WIDTH-1):0]    dqs_delayed_col0_n;
   wire [(`DATA_STROBE_WIDTH-1):0]    dqs_delayed_col1_n;


   assign dqs_delayed_col0_n  = ~ dqs_delayed_col0;
   assign dqs_delayed_col1_n  = ~ dqs_delayed_col1;
   assign user_output_data    = first_sdr_data;
   assign fifo0_rd_addr_val   = fifo1_rd_addr;
   assign fifo1_rd_addr_val   = fifo0_rd_addr;

   always @( posedge clk90 )
     reset90_r <= reset90;

      always@(posedge clk90) begin
	 fifo_0_data_out_r <= fifo_0_data_out;
	 fifo_1_data_out_r <= fifo_1_data_out;
      end

   genvar addr_i;
   generate for(addr_i = 0; addr_i < `DATA_STROBE_WIDTH;  addr_i = addr_i + 1) begin: gen_rd_addr
      always@(posedge clk90) begin
	 fifo0_rd_addr_r[addr_i*4+:4] <= fifo0_rd_addr;
	 fifo1_rd_addr_r[addr_i*4+:4] <= fifo1_rd_addr;
      end   
   end
   endgenerate
   always @(posedge clk90)begin
      if(reset90_r)begin
         first_sdr_data   <= {(`DATA_WIDTH*2){1'b0}};
         read_valid_data_1_r <= 1'b0;
         read_valid_data_1_r1 <= 1'b0;
      end
      else begin
         read_valid_data_1_r <= read_valid_data_1;
         read_valid_data_1_r1 <= read_valid_data_1_r;
         if(read_valid_data_1_r1)begin
            first_sdr_data  <= {fifo_0_data_out_r[31:24],fifo_0_data_out_r[23:16],fifo_0_data_out_r[15:8],fifo_0_data_out_r[7:0],
	                        fifo_1_data_out_r[31:24],fifo_1_data_out_r[23:16],fifo_1_data_out_r[15:8],fifo_1_data_out_r[7:0]};
         end
      end
   end


   ddr2_32Mx32_rd_gray_cntr fifo0_rd_addr_inst
     (
      .clk90    (clk90),
      .reset90  (reset90),
      .cnt_en   (read_valid_data_1),
      .rgc_gcnt (fifo0_rd_addr)
      );

   ddr2_32Mx32_rd_gray_cntr fifo1_rd_addr_inst
     (
      .clk90	(clk90),
      .reset90  (reset90),
      .cnt_en   (read_valid_data_1),
      .rgc_gcnt (fifo1_rd_addr)
       );



   genvar strobe_i;
   generate for(strobe_i = 0; strobe_i < `DATA_STROBE_WIDTH;  strobe_i = strobe_i + 1) 
     begin: gen_strobe
      ddr2_32Mx32_ram8d_0 strobe   
	( 
	  .dout  (fifo_0_data_out[strobe_i*`DATABITSPERSTROBE+:`DATABITSPERSTROBE]), 
	  .waddr (fifo_0_wr_addr[strobe_i*4+:4]),
	  .din   (ddr_dq_in[strobe_i*`DATABITSPERSTROBE+:`DATABITSPERSTROBE]), 
	  .raddr (fifo0_rd_addr_r[strobe_i*4+:4]), 
	  .wclk0 (dqs_delayed_col0[strobe_i]), 
	  .wclk1 (dqs_delayed_col1[strobe_i]),
	  .we    (fifo_0_wr_en[strobe_i]) 
	  );
      
      ddr2_32Mx32_ram8d_0 strobe_n 
	( 
	  .dout  (fifo_1_data_out[strobe_i*`DATABITSPERSTROBE+:`DATABITSPERSTROBE]), 
	  .waddr (fifo_1_wr_addr[strobe_i*4+:4]), 
	  .din   (ddr_dq_in[strobe_i*`DATABITSPERSTROBE+:`DATABITSPERSTROBE]), 
	  .raddr (fifo1_rd_addr_r[strobe_i*4+:4]), 
	  .wclk0 (dqs_delayed_col0_n[strobe_i]),
	  .wclk1 (dqs_delayed_col1_n[strobe_i]),
	  .we	 (fifo_1_wr_en[strobe_i])
	  );
   end 
   endgenerate

endmodule

⌨️ 快捷键说明

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