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

Subversion Repositories usb_fpga_2_14

[/] [usb_fpga_2_14/] [trunk/] [examples/] [memfifo/] [fpga-2.13/] [memfifo.srcs/] [sources_1/] [ip/] [mig_7series_0/] [mig_7series_0/] [user_design/] [rtl/] [ui/] [mig_7series_v2_3_ui_cmd.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
//*****************************************************************************
2
// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
3
//
4
// This file contains confidential and proprietary information
5
// of Xilinx, Inc. and is protected under U.S. and
6
// international copyright and other intellectual property
7
// laws.
8
//
9
// DISCLAIMER
10
// This disclaimer is not a license and does not grant any
11
// rights to the materials distributed herewith. Except as
12
// otherwise provided in a valid license issued to you by
13
// Xilinx, and to the maximum extent permitted by applicable
14
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19
// (2) Xilinx shall not be liable (whether in contract or tort,
20
// including negligence, or under any other theory of
21
// liability) for any loss or damage of any kind or nature
22
// related to, arising under or in connection with these
23
// materials, including for any direct, or any indirect,
24
// special, incidental, or consequential loss or damage
25
// (including loss of data, profits, goodwill, or any type of
26
// loss or damage suffered as a result of any action brought
27
// by a third party) even if such damage or loss was
28
// reasonably foreseeable or Xilinx had been advised of the
29
// possibility of the same.
30
//
31
// CRITICAL APPLICATIONS
32
// Xilinx products are not designed or intended to be fail-
33
// safe, or for use in any application requiring fail-safe
34
// performance, such as life-support or safety devices or
35
// systems, Class III medical devices, nuclear facilities,
36
// applications related to the deployment of airbags, or any
37
// other applications that could lead to death, personal
38
// injury, or severe property or environmental damage
39
// (individually and collectively, "Critical
40
// Applications"). Customer assumes the sole risk and
41
// liability of any use of Xilinx products in Critical
42
// Applications, subject only to applicable laws and
43
// regulations governing limitations on product liability.
44
//
45
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46
// PART OF THIS FILE AT ALL TIMES.
47
//
48
//*****************************************************************************
49
//   ____  ____
50
//  /   /\/   /
51
// /___/  \  /    Vendor                : Xilinx
52
// \   \   \/     Version               : %version
53
//  \   \         Application           : MIG
54
//  /   /         Filename              : ui_cmd.v
55
// /___/   /\     Date Last Modified    : $date$
56
// \   \  /  \    Date Created          : Tue Jun 30 2009
57
//  \___\/\___\
58
//
59
//Device            : 7-Series
60
//Design Name       : DDR3 SDRAM
61
//Purpose           :
62
//Reference         :
63
//Revision History  :
64
//*****************************************************************************
65
 
66
`timescale 1 ps / 1 ps
67
 
68
// User interface command port.
69
 
70
module mig_7series_v2_3_ui_cmd #
71
  (
72
   parameter TCQ = 100,
73
   parameter ADDR_WIDTH           = 33,
74
   parameter BANK_WIDTH           = 3,
75
   parameter COL_WIDTH            = 12,
76
   parameter DATA_BUF_ADDR_WIDTH  = 5,
77
   parameter RANK_WIDTH           = 2,
78
   parameter ROW_WIDTH            = 16,
79
   parameter RANKS                = 4,
80
   parameter MEM_ADDR_ORDER       = "BANK_ROW_COLUMN"
81
  )
82
  (/*AUTOARG*/
83
  // Outputs
84
  app_rdy, use_addr, rank, bank, row, col, size, cmd, hi_priority,
85
  rd_accepted, wr_accepted, data_buf_addr,
86
  // Inputs
87
  rst, clk, accept_ns, rd_buf_full, wr_req_16, app_addr, app_cmd,
88
  app_sz, app_hi_pri, app_en, wr_data_buf_addr, rd_data_buf_addr_r
89
  );
90
 
91
  input rst;
92
  input clk;
93
 
94
  input accept_ns;
95
  input rd_buf_full;
96
  input wr_req_16;
97
  wire app_rdy_ns = accept_ns && ~rd_buf_full && ~wr_req_16;
98
  reg app_rdy_r = 1'b0 /* synthesis syn_maxfan = 10 */;
99
  always @(posedge clk) app_rdy_r <= #TCQ app_rdy_ns;
100
  output wire app_rdy;
101
  assign app_rdy = app_rdy_r;
102
 
103
  input [ADDR_WIDTH-1:0] app_addr;
104
  input [2:0] app_cmd;
105
  input app_sz;
106
  input app_hi_pri;
107
  input app_en;
108
 
109
  reg [ADDR_WIDTH-1:0] app_addr_r1 = {ADDR_WIDTH{1'b0}};
110
  reg [ADDR_WIDTH-1:0] app_addr_r2 = {ADDR_WIDTH{1'b0}};
111
  reg [2:0] app_cmd_r1;
112
  reg [2:0] app_cmd_r2;
113
  reg app_sz_r1;
114
  reg app_sz_r2;
115
  reg app_hi_pri_r1;
116
  reg app_hi_pri_r2;
117
  reg app_en_r1;
118
  reg app_en_r2;
119
 
120
  wire [ADDR_WIDTH-1:0] app_addr_ns1 = app_rdy_r && app_en ? app_addr : app_addr_r1;
121
  wire [ADDR_WIDTH-1:0] app_addr_ns2 = app_rdy_r ? app_addr_r1 : app_addr_r2;
122
  wire [2:0] app_cmd_ns1 = app_rdy_r ? app_cmd : app_cmd_r1;
123
  wire [2:0] app_cmd_ns2 = app_rdy_r ? app_cmd_r1 : app_cmd_r2;
124
  wire app_sz_ns1 = app_rdy_r ? app_sz : app_sz_r1;
125
  wire app_sz_ns2 = app_rdy_r ? app_sz_r1 : app_sz_r2;
126
  wire app_hi_pri_ns1 = app_rdy_r ? app_hi_pri : app_hi_pri_r1;
127
  wire app_hi_pri_ns2 = app_rdy_r ? app_hi_pri_r1 : app_hi_pri_r2;
128
  wire app_en_ns1 = ~rst && (app_rdy_r ? app_en : app_en_r1);
129
  wire app_en_ns2 = ~rst && (app_rdy_r ? app_en_r1 : app_en_r2);
130
 
131
  always @(posedge clk) begin
132
    if (rst) begin
133
      app_addr_r1 <= #TCQ {ADDR_WIDTH{1'b0}};
134
      app_addr_r2 <= #TCQ {ADDR_WIDTH{1'b0}};
135
    end else begin
136
      app_addr_r1 <= #TCQ app_addr_ns1;
137
      app_addr_r2 <= #TCQ app_addr_ns2;
138
    end
139
    app_cmd_r1 <= #TCQ app_cmd_ns1;
140
    app_cmd_r2 <= #TCQ app_cmd_ns2;
141
    app_sz_r1 <= #TCQ app_sz_ns1;
142
    app_sz_r2 <= #TCQ app_sz_ns2;
143
    app_hi_pri_r1 <= #TCQ app_hi_pri_ns1;
144
    app_hi_pri_r2 <= #TCQ app_hi_pri_ns2;
145
    app_en_r1 <= #TCQ app_en_ns1;
146
    app_en_r2 <= #TCQ app_en_ns2;
147
  end // always @ (posedge clk)
148
 
149
  wire use_addr_lcl = app_en_r2 && app_rdy_r;
150
  output wire use_addr;
151
  assign use_addr = use_addr_lcl;
152
 
153
  output wire [RANK_WIDTH-1:0] rank;
154
  output wire [BANK_WIDTH-1:0] bank;
155
  output wire [ROW_WIDTH-1:0] row;
156
  output wire [COL_WIDTH-1:0] col;
157
  output wire size;
158
  output wire [2:0] cmd;
159
  output wire hi_priority;
160
 
161
/*  assign col = app_rdy_r
162
                 ? app_addr_r1[0+:COL_WIDTH]
163
                 : app_addr_r2[0+:COL_WIDTH];*/
164
  generate
165
    begin
166
      if (MEM_ADDR_ORDER == "TG_TEST")
167
      begin
168
        assign col[4:0] = app_rdy_r
169
                      ? app_addr_r1[0+:5]
170
                      : app_addr_r2[0+:5];
171
 
172
        if (RANKS==1)
173
        begin
174
          assign col[COL_WIDTH-1:COL_WIDTH-2] = app_rdy_r
175
                        ? app_addr_r1[5+3+BANK_WIDTH+:2]
176
                        : app_addr_r2[5+3+BANK_WIDTH+:2];
177
          assign col[COL_WIDTH-3:5] = app_rdy_r
178
                        ? app_addr_r1[5+3+BANK_WIDTH+2+2+:COL_WIDTH-7]
179
                        : app_addr_r2[5+3+BANK_WIDTH+2+2+:COL_WIDTH-7];
180
        end
181
        else
182
        begin
183
          assign col[COL_WIDTH-1:COL_WIDTH-2] = app_rdy_r
184
                        ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+:2]
185
                        : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+:2];
186
          assign col[COL_WIDTH-3:5] = app_rdy_r
187
                        ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+2+2+:COL_WIDTH-7]
188
                        : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+2+2+:COL_WIDTH-7];
189
        end
190
        assign row[2:0] = app_rdy_r
191
                       ? app_addr_r1[5+:3]
192
                       : app_addr_r2[5+:3];
193
        if (RANKS==1)
194
        begin
195
          assign row[ROW_WIDTH-1:ROW_WIDTH-2] = app_rdy_r
196
                        ? app_addr_r1[5+3+BANK_WIDTH+2+:2]
197
                         : app_addr_r2[5+3+BANK_WIDTH+2+:2];
198
          assign row[ROW_WIDTH-3:3] = app_rdy_r
199
                         ? app_addr_r1[5+3+BANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5]
200
                         : app_addr_r2[5+3+BANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5];
201
        end
202
        else
203
        begin
204
          assign row[ROW_WIDTH-1:ROW_WIDTH-2] = app_rdy_r
205
                        ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+2+:2]
206
                         : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+2+:2];
207
          assign row[ROW_WIDTH-3:3] = app_rdy_r
208
                         ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5]
209
                         : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5];
210
        end
211
        assign bank = app_rdy_r
212
                       ? app_addr_r1[5+3+:BANK_WIDTH]
213
                       : app_addr_r2[5+3+:BANK_WIDTH];
214
        assign rank = (RANKS == 1)
215
                        ? 1'b0
216
                        : app_rdy_r
217
                          ? app_addr_r1[5+3+BANK_WIDTH+:RANK_WIDTH]
218
                          : app_addr_r2[5+3+BANK_WIDTH+:RANK_WIDTH];
219
      end
220
      else if (MEM_ADDR_ORDER == "ROW_BANK_COLUMN")
221
      begin
222
        assign col = app_rdy_r
223
                      ? app_addr_r1[0+:COL_WIDTH]
224
                      : app_addr_r2[0+:COL_WIDTH];
225
        assign row = app_rdy_r
226
                       ? app_addr_r1[COL_WIDTH+BANK_WIDTH+:ROW_WIDTH]
227
                       : app_addr_r2[COL_WIDTH+BANK_WIDTH+:ROW_WIDTH];
228
        assign bank = app_rdy_r
229
                        ? app_addr_r1[COL_WIDTH+:BANK_WIDTH]
230
                        : app_addr_r2[COL_WIDTH+:BANK_WIDTH];
231
        assign rank = (RANKS == 1)
232
                        ? 1'b0
233
                        : app_rdy_r
234
                          ? app_addr_r1[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH]
235
                          : app_addr_r2[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH];
236
      end
237
      else
238
      begin
239
        assign col = app_rdy_r
240
                      ? app_addr_r1[0+:COL_WIDTH]
241
                      : app_addr_r2[0+:COL_WIDTH];
242
        assign row = app_rdy_r
243
                       ? app_addr_r1[COL_WIDTH+:ROW_WIDTH]
244
                       : app_addr_r2[COL_WIDTH+:ROW_WIDTH];
245
        assign bank = app_rdy_r
246
                        ? app_addr_r1[COL_WIDTH+ROW_WIDTH+:BANK_WIDTH]
247
                        : app_addr_r2[COL_WIDTH+ROW_WIDTH+:BANK_WIDTH];
248
        assign rank = (RANKS == 1)
249
                        ? 1'b0
250
                        : app_rdy_r
251
                          ? app_addr_r1[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH]
252
                          : app_addr_r2[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH];
253
      end
254
     end
255
  endgenerate
256
 
257
/*  assign rank = (RANKS == 1)
258
                  ? 1'b0
259
                  : app_rdy_r
260
                    ? app_addr_r1[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH]
261
                    : app_addr_r2[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH];*/
262
  assign size = app_rdy_r
263
                  ? app_sz_r1
264
                  : app_sz_r2;
265
  assign cmd = app_rdy_r
266
                 ? app_cmd_r1
267
                 : app_cmd_r2;
268
  assign hi_priority = app_rdy_r
269
                         ? app_hi_pri_r1
270
                         : app_hi_pri_r2;
271
 
272
  wire request_accepted = use_addr_lcl && app_rdy_r;
273
  wire rd = app_cmd_r2[1:0] == 2'b01;
274
  wire wr = app_cmd_r2[1:0] == 2'b00;
275
  wire wr_bytes = app_cmd_r2[1:0] == 2'b11;
276
  wire write = wr || wr_bytes;
277
  output wire rd_accepted;
278
  assign rd_accepted = request_accepted && rd;
279
  output wire wr_accepted;
280
  assign wr_accepted = request_accepted && write;
281
 
282
  input [DATA_BUF_ADDR_WIDTH-1:0] wr_data_buf_addr;
283
  input [DATA_BUF_ADDR_WIDTH-1:0] rd_data_buf_addr_r;
284
  output wire [DATA_BUF_ADDR_WIDTH-1:0] data_buf_addr;
285
 
286
  assign data_buf_addr = ~write ? rd_data_buf_addr_r : wr_data_buf_addr;
287
 
288
endmodule // ui_cmd
289
 
290
// Local Variables:
291
// verilog-library-directories:(".")
292
// End:

powered by: WebSVN 2.1.0

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