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

powered by: WebSVN 2.1.0

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