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

Subversion Repositories rxaui_interface_and_xaui_to_rxaui_interface_adapter

[/] [rxaui_interface_and_xaui_to_rxaui_interface_adapter/] [RxPath/] [sip_phase_sync_fifo_fast_2_slow.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tsahidanie
//-----------------------------------------------------------------------------
2
// Title         : Phase sync fifo
3
// Project       : SIP
4
//-----------------------------------------------------------------------------
5
// File          : sip_phase_sync_fifo_fast_2_slow.v
6
// Author        : Lior Valency
7
// Created       : 13/02/2008 
8
// Last modified : 13/02/2008 
9
//-----------------------------------------------------------------------------
10
// Description : This module is a free-running fifo which syncs the data between 
11
// 2 clocks domain, the write is double frequency and half-width from the read. 
12
//-----------------------------------------------------------------------------
13
// Copyright (c) 2007  Marvell International Ltd.
14
//
15
// THIS CODE CONTAINS CONFIDENTIAL INFORMATION OF MARVELL SEMICONDUCTOR, INC.
16
// NO RIGHTS ARE GRANTED HEREIN UNDER ANY PATENT, MASK WORK RIGHT OR COPYRIGHT
17
// OF MARVELL OR ANY THIRD PARTY. MARVELL RESERVES THE RIGHT AT ITS SOLE
18
// DISCRETION TO REQUEST THAT THIS CODE BE IMMEDIATELY RETURNED TO MARVELL.
19
// THIS CODE IS PROVIDED "AS IS". MARVELL MAKES NO WARRANTIES, EXPRESS,
20
// IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE.
21
//
22
//------------------------------------------------------------------------------
23
// Modification history :
24
// 12/12/2007  : created
25
//-----------------------------------------------------------------------------
26
 
27
//`timescale 1ns / 10ps
28
`timescale 10ps / 10ps
29
 
30
module sip_phase_sync_fifo_fast_2_slow (/*AUTOARG*/
31
   // Outputs
32
   fifo_data_out,
33
   // Inputs
34
   wr_clk, rd_clk, wr_reset_, rd_reset_, fifo_data_in
35
   );
36
 
37
   parameter FAST_DATA_WIDTH = 20;
38
   parameter SYNC_FIFO_WIDTH = 2*FAST_DATA_WIDTH;
39
   parameter SYNC_FIFO_DEPTH = 8;
40
   parameter SYNC_FIFO_ADDR_WIDTH = 3;
41
   parameter SYNC_FIFO_LAST_ENTRY = 3'd7;
42
   parameter FIFO_RD_PTR_INIT = 3'd4;
43
   parameter FIFO_ONE = 3'd1;
44
 
45
   input                                wr_clk;
46
   input                                rd_clk;
47
   input                                wr_reset_;
48
   input                                rd_reset_;
49
   input [FAST_DATA_WIDTH-1:0]           fifo_data_in;
50
   output [SYNC_FIFO_WIDTH-1:0]  fifo_data_out;
51
   //
52
   reg [SYNC_FIFO_WIDTH-1:0]             fifo_entry [SYNC_FIFO_DEPTH-1:0];
53
   reg [SYNC_FIFO_WIDTH-1:0]             fifo_entry_d [SYNC_FIFO_DEPTH-1:0];
54
   reg [SYNC_FIFO_WIDTH-1:0]             fifo_data_out;
55
   wire [SYNC_FIFO_WIDTH-1:0]            fifo_data_out_d;
56
   reg [SYNC_FIFO_ADDR_WIDTH-1:0]        fifo_wr_addr;
57
   wire [SYNC_FIFO_ADDR_WIDTH-1:0]       fifo_wr_addr_d;
58
   reg [SYNC_FIFO_ADDR_WIDTH-1:0]        fifo_rd_addr;
59
   wire [SYNC_FIFO_ADDR_WIDTH-1:0]       fifo_rd_addr_d;
60
   wire                                 inc_wr_addr_d_;
61
   reg                                  inc_wr_addr_;
62
 
63
   integer                              wr_addr,i;
64
 
65
   //Internal signals
66
   // increment write address every 2cc
67
   assign inc_wr_addr_d_ = ~inc_wr_addr_;
68
   assign fifo_wr_addr_d = (inc_wr_addr_ == 1'b0) ?
69
                           ((fifo_wr_addr == SYNC_FIFO_LAST_ENTRY) ? {SYNC_FIFO_ADDR_WIDTH{1'b0}} :
70
                            (fifo_wr_addr + FIFO_ONE)) :
71
                           fifo_wr_addr;
72
   assign fifo_rd_addr_d = (fifo_rd_addr == SYNC_FIFO_LAST_ENTRY) ? {SYNC_FIFO_ADDR_WIDTH{1'b0}} :
73
                           (fifo_rd_addr + FIFO_ONE);
74
   //read from fifo
75
   assign fifo_data_out_d = fifo_entry[fifo_rd_addr];
76
 
77
   //write to fifo
78
   always @ (fifo_entry[0] or fifo_entry[1] or fifo_entry[2] or fifo_entry[3] or
79
             fifo_entry[4] or fifo_entry[5] or fifo_entry[6] or fifo_entry[7] or
80
             /*AUTOSENSE*/ /*memory or*/ fifo_data_in or fifo_wr_addr
81
             or inc_wr_addr_)
82
     begin
83
       for (wr_addr = 0; wr_addr < SYNC_FIFO_DEPTH; wr_addr = wr_addr + 1)
84
         begin
85
           fifo_entry_d[wr_addr] = (fifo_wr_addr == wr_addr) ?
86
                                   ((inc_wr_addr_ == 1'b1) ? ({fifo_entry[wr_addr][SYNC_FIFO_WIDTH-1:FAST_DATA_WIDTH],fifo_data_in})
87
                                    : ({fifo_data_in,fifo_entry[wr_addr][FAST_DATA_WIDTH-1:0]})) : fifo_entry[wr_addr];
88
         end
89
     end // always @ (...
90
   //write clock domain FF
91
     always @ (posedge wr_clk or negedge wr_reset_)
92
     begin
93
       if (!wr_reset_)
94
         begin
95
           for (i = 0; i < SYNC_FIFO_DEPTH; i = i + 1)
96
             begin
97
               fifo_entry[i] <= #1 {SYNC_FIFO_WIDTH{1'b0}};
98
             end
99
           fifo_wr_addr      <= #1 {SYNC_FIFO_ADDR_WIDTH{1'b0}};
100
           inc_wr_addr_      <= #1 1'b1;
101
         end
102
       else
103
         begin
104
           for (i = 0; i < SYNC_FIFO_DEPTH; i = i + 1)
105
             begin
106
               fifo_entry[i] <= #1 fifo_entry_d[i];
107
             end
108
           fifo_wr_addr      <= #1 fifo_wr_addr_d;
109
           inc_wr_addr_      <= #1 inc_wr_addr_d_;
110
         end
111
     end // always @ (negedge wr_clk or negedge wr_reset_)
112
 
113
   //read clock domain FF
114
   always @(posedge rd_clk or negedge rd_reset_)
115
     begin
116
       if(!rd_reset_)
117
         begin
118
           fifo_rd_addr  <= #1 FIFO_RD_PTR_INIT;
119
           fifo_data_out <= #1 {SYNC_FIFO_WIDTH{1'b0}};
120
         end
121
       else
122
         begin
123
           fifo_rd_addr  <= #1 fifo_rd_addr_d;
124
           fifo_data_out <= #1 fifo_data_out_d;
125
         end
126
     end // always @ (posedge rd_clk or negedge rd_reset_)
127
 
128
 
129
endmodule // tc_qsgmii_phase_sync_fifo_fast_2_slow
130
 
131
 
132
 
133
 
134
 

powered by: WebSVN 2.1.0

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