OpenCores
URL https://opencores.org/ocsvn/genesys_ddr2/genesys_ddr2/trunk

Subversion Repositories genesys_ddr2

[/] [genesys_ddr2/] [trunk/] [rtl/] [ddr2_adr_data_gen.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 oana.bonca
//*****************************************************************************
2
// Company: UPT
3
// Engineer: Oana Boncalo & Alexandru Amaricai
4
// 
5
// Create Date:    10:23:39 11/26/2012 
6
// Design Name: 
7
// Module Name:    DDR2 user IF address and data generation
8
// Project Name: 
9
// Target Devices: 
10
// Tool versions: 
11
//Device: Virtex-5
12
//Purpose:
13
//   This module instantiates the addr_gen and the data_gen modules. It takes
14
//   the user data stored in internal FIFOs and gives the data that is to be
15
//   compared with the read data
16
//Reference:
17
//Revision History:
18
//*****************************************************************************
19
 
20
`timescale 1ns/1ps
21
 
22
module ddr2_adr_data_gen #
23
  (
24
   // Following parameters are for 72-bit RDIMM design (for ML561 Reference 
25
   // board design). Actual values may be different. Actual parameters values 
26
   // are passed from design top module MEMCtrl module. Please refer to
27
   // the MEMCtrl module for actual values.
28
   parameter BANK_WIDTH    = 2,
29
   parameter COL_WIDTH     = 10,
30
   parameter DM_WIDTH      = 9,
31
   parameter DQ_WIDTH      = 72,
32
   parameter APPDATA_WIDTH = 144,
33
   parameter ECC_ENABLE    = 0,
34
   parameter ROW_WIDTH     = 14
35
   )
36
  (
37
   input                                  clk,
38
   input                                  rst,
39
   input                                  wr_addr_en,
40
   input                                  wr_data_en,
41
        input                                                                                   rd_op,
42
   input                                  rd_data_valid,
43
        input  [30:0]                                                                    bus_if_addr,
44
   input  [APPDATA_WIDTH-1:0]             bus_if_wr_data,
45
   input  [(APPDATA_WIDTH/8)-1:0]         bus_if_wr_mask_data,
46
   output reg                             app_af_wren,
47
   output [2:0]                           app_af_cmd,
48
   output [30:0]                          app_af_addr,
49
   output                                 app_wdf_wren,
50
   output [APPDATA_WIDTH-1:0]             app_wdf_data,
51
   output [(APPDATA_WIDTH/8)-1:0]         app_wdf_mask_data
52
   );
53
 
54
  //data
55
  localparam RD_IDLE_FIRST_DATA = 2'b00;
56
  localparam RD_SECOND_DATA     = 2'b01;
57
  localparam RD_THIRD_DATA      = 2'b10;
58
  localparam RD_FOURTH_DATA     = 2'b11;
59
 
60
  //address
61
  reg             wr_addr_en_r1;
62
  reg [2:0]       af_cmd_r;//, af_cmd_r0, af_cmd_r1;
63
  reg             af_wren_r;
64
  reg             rst_r
65
                  /* synthesis syn_preserve = 1 */;
66
  reg             rst_r1
67
                  /* synthesis syn_maxfan = 10 */;
68
  reg [5:0]       wr_addr_r;
69
  reg             wr_addr_en_r0;
70
 
71
  //data
72
  reg [APPDATA_WIDTH-1:0]              app_wdf_data_r;
73
  reg [(APPDATA_WIDTH/8)-1:0]          app_wdf_mask_data_r;
74
  wire                                 app_wdf_wren_r;
75
  reg [(APPDATA_WIDTH/2)-1:0]          rd_data_pat_fall;
76
  reg [(APPDATA_WIDTH/2)-1:0]          rd_data_pat_rise;
77
  reg [1:0]                            rd_state;
78
  wire [APPDATA_WIDTH-1:0]             wr_data;
79
  reg                                  wr_data_en_r;
80
  reg [(APPDATA_WIDTH/2)-1:0]          wr_data_fall
81
                                       /* synthesis syn_maxfan = 2 */;
82
  reg [(APPDATA_WIDTH/2)-1:0]          wr_data_rise
83
                                        /* synthesis syn_maxfan = 2 */;
84
  wire [(APPDATA_WIDTH/8)-1:0]         wr_mask_data;
85
 
86
  //***************************************************************************
87
 
88
  // local reset "tree" for controller logic only. Create this to ease timing
89
  // on reset path. Prohibit equivalent register removal on RST_R to prevent
90
  // "sharing" with other local reset trees (caution: make sure global fanout
91
  // limit is set to larger than fanout on RST_R, otherwise SLICES will be
92
  // used for fanout control on RST_R.
93
  always @(posedge clk) begin
94
    rst_r  <= rst;
95
    rst_r1 <= rst_r;
96
  end
97
// register backend enables / FIFO enables
98
  // write enable for Command/Address FIFO is generated 1 CC after WR_ADDR_EN
99
  always @(posedge clk)
100
    if (rst_r1) begin
101
      app_af_wren   <= 1'b0;
102
    end else begin
103
      app_af_wren   <= wr_addr_en;
104
    end
105
 
106
  always @ (posedge clk)
107
    if (rst_r1)
108
      wr_addr_r <= 0;
109
    else if (wr_addr_en && (rd_op == 1'b0))
110
      wr_addr_r <= bus_if_addr;
111
 
112
        assign app_af_addr = wr_addr_r;
113
        assign app_af_cmd = af_cmd_r;
114
 
115
        always @ (posedge clk)
116
        begin
117
                af_cmd_r  <= 0;
118
                if (rd_op)
119
                        af_cmd_r <= 3'b001;
120
        end
121
 
122
 
123
        //data
124
  assign app_wdf_data        = wr_data;
125
  assign app_wdf_mask_data   = wr_mask_data;
126
  // inst ff for timing
127
  FDRSE ff_wdf_wren
128
    (
129
     .Q   (app_wdf_wren),
130
     .C   (clk),
131
     .CE  (1'b1),
132
     .D   (wr_data_en),
133
     .R   (1'b0),
134
     .S   (1'b0)
135
     );
136
 
137
  assign wr_data      = {wr_data_fall, wr_data_rise};
138
  assign wr_mask_data = bus_if_wr_mask_data;
139
 
140
  //data latching
141
  //synthesis attribute max_fanout of wr_data_fall is 2
142
  //synthesis attribute max_fanout of wr_data_rise is 2
143
  always @(posedge clk)
144
  begin
145
    if (rst_r1)
146
                 begin
147
                        wr_data_rise <= {(APPDATA_WIDTH/2){1'bx}};
148
                        wr_data_fall <= {(APPDATA_WIDTH/2){1'bx}};
149
                 end
150
         else
151
                 if (wr_data_en)
152
                 begin
153
                        wr_data_rise <= bus_if_wr_data[(APPDATA_WIDTH/2)-1:0];
154
                        wr_data_fall <= bus_if_wr_data[APPDATA_WIDTH-1:(APPDATA_WIDTH/2)];
155
                 end
156
        end
157
 
158
 
159
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.