📄 ddr2_32mx32_data_read_0.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 + -