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.18/] [memfifo.srcs/] [sources_1/] [ip/] [mig_7series_0/] [mig_7series_0/] [user_design/] [rtl/] [ecc/] [mig_7series_v2_3_ecc_merge_enc.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              : ecc_merge_enc.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 1ps/1ps
67
 
68
module mig_7series_v2_3_ecc_merge_enc
69
  #(
70
    parameter TCQ = 100,
71
    parameter PAYLOAD_WIDTH         = 64,
72
    parameter CODE_WIDTH            = 72,
73
    parameter DATA_BUF_ADDR_WIDTH   = 4,
74
    parameter DATA_BUF_OFFSET_WIDTH = 1,
75
    parameter DATA_WIDTH            = 64,
76
    parameter DQ_WIDTH              = 72,
77
    parameter ECC_WIDTH             = 8,
78
    parameter nCK_PER_CLK           = 4
79
   )
80
   (
81
    /*AUTOARG*/
82
  // Outputs
83
  mc_wrdata, mc_wrdata_mask,
84
  // Inputs
85
  clk, rst, wr_data, wr_data_mask, rd_merge_data, h_rows, raw_not_ecc
86
  );
87
 
88
  input clk;
89
  input rst;
90
 
91
  input [2*nCK_PER_CLK*PAYLOAD_WIDTH-1:0] wr_data;
92
  input [2*nCK_PER_CLK*DATA_WIDTH/8-1:0] wr_data_mask;
93
  input [2*nCK_PER_CLK*DATA_WIDTH-1:0] rd_merge_data;
94
 
95
  reg [2*nCK_PER_CLK*PAYLOAD_WIDTH-1:0] wr_data_r;
96
  reg [2*nCK_PER_CLK*DATA_WIDTH/8-1:0] wr_data_mask_r;
97
  reg [2*nCK_PER_CLK*DATA_WIDTH-1:0] rd_merge_data_r;
98
 
99
  always @(posedge clk) wr_data_r <= #TCQ wr_data;
100
  always @(posedge clk) wr_data_mask_r <= #TCQ wr_data_mask;
101
  always @(posedge clk) rd_merge_data_r <= #TCQ rd_merge_data;
102
 
103
  // Merge new data with memory read data.
104
  wire [2*nCK_PER_CLK*PAYLOAD_WIDTH-1:0] merged_data;
105
  genvar h;
106
  genvar i;
107
  generate
108
    for (h=0; h<2*nCK_PER_CLK; h=h+1) begin : merge_data_outer
109
      for (i=0; i<DATA_WIDTH/8; i=i+1) begin : merge_data_inner
110
        assign merged_data[h*PAYLOAD_WIDTH+i*8+:8] =
111
                wr_data_mask[h*DATA_WIDTH/8+i]
112
                  ? rd_merge_data[h*DATA_WIDTH+i*8+:8]
113
                  : wr_data[h*PAYLOAD_WIDTH+i*8+:8];
114
      end
115
      if (PAYLOAD_WIDTH > DATA_WIDTH)
116
        assign merged_data[(h+1)*PAYLOAD_WIDTH-1-:PAYLOAD_WIDTH-DATA_WIDTH]=
117
                      wr_data[(h+1)*PAYLOAD_WIDTH-1-:PAYLOAD_WIDTH-DATA_WIDTH];
118
 
119
    end
120
  endgenerate
121
 
122
  // Generate ECC and overlay onto mc_wrdata.
123
  input [CODE_WIDTH*ECC_WIDTH-1:0] h_rows;
124
  input [2*nCK_PER_CLK-1:0] raw_not_ecc;
125
  reg [2*nCK_PER_CLK-1:0] raw_not_ecc_r;
126
  always @(posedge clk) raw_not_ecc_r <= #TCQ raw_not_ecc;
127
  output reg [2*nCK_PER_CLK*DQ_WIDTH-1:0] mc_wrdata;
128
  reg [2*nCK_PER_CLK*DQ_WIDTH-1:0] mc_wrdata_c;
129
  genvar j;
130
  integer k;
131
  generate
132
    for (j=0; j<2*nCK_PER_CLK; j=j+1) begin : ecc_word
133
      always @(/*AS*/h_rows or merged_data or raw_not_ecc_r) begin
134
        mc_wrdata_c[j*DQ_WIDTH+:DQ_WIDTH] =
135
          {{DQ_WIDTH-PAYLOAD_WIDTH{1'b0}},
136
           merged_data[j*PAYLOAD_WIDTH+:PAYLOAD_WIDTH]};
137
        for (k=0; k<ECC_WIDTH; k=k+1)
138
          if (~raw_not_ecc_r[j])
139
            mc_wrdata_c[j*DQ_WIDTH+CODE_WIDTH-k-1] =
140
              ^(merged_data[j*PAYLOAD_WIDTH+:DATA_WIDTH] &
141
                h_rows[k*CODE_WIDTH+:DATA_WIDTH]);
142
      end
143
    end
144
  endgenerate
145
always @(posedge clk) mc_wrdata <= mc_wrdata_c;
146
 
147
  // Set all DRAM masks to zero.
148
  output wire[2*nCK_PER_CLK*DQ_WIDTH/8-1:0] mc_wrdata_mask;
149
  assign mc_wrdata_mask = {2*nCK_PER_CLK*DQ_WIDTH/8{1'b0}};
150
 
151
endmodule

powered by: WebSVN 2.1.0

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