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

Subversion Repositories versatile_fifo

[/] [versatile_fifo/] [trunk/] [rtl/] [verilog/] [async_fifo_dw_simplex_actel.v] - Blame information for rev 28

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 28 unneback
module adr_gen ( cke, q, q_bin, rst, clk);
2
   parameter length = 4;
3
   input cke;
4
   output reg [length:1] q;
5
   output [length:1] q_bin;
6
   input rst;
7
   input clk;
8
   reg  [length:1] qi;
9
   wire [length:1] q_next;
10
   assign q_next = qi + {{length-1{1'b0}},1'b1};
11
   always @ (posedge clk or posedge rst)
12
     if (rst)
13
       qi <= {length{1'b0}};
14
     else
15
     if (cke)
16
       qi <= q_next;
17
   always @ (posedge clk or posedge rst)
18
     if (rst)
19
       q <= {length{1'b0}};
20
     else
21
       if (cke)
22
         q <= (q_next>>1) ^ q_next;
23
   assign q_bin = qi;
24
endmodule
25
module vfifo_dual_port_ram_dc_dw
26
  (
27
   d_a,
28
   q_a,
29
   adr_a,
30
   we_a,
31
   clk_a,
32
   q_b,
33
   adr_b,
34
   d_b,
35
   we_b,
36
   clk_b
37
   );
38
   parameter DATA_WIDTH = 32;
39
   parameter ADDR_WIDTH = 8;
40
   input [(DATA_WIDTH-1):0]      d_a;
41
   input [(ADDR_WIDTH-1):0]       adr_a;
42
   input [(ADDR_WIDTH-1):0]       adr_b;
43
   input                         we_a;
44
   output [(DATA_WIDTH-1):0]      q_b;
45
   input [(DATA_WIDTH-1):0]       d_b;
46
   output reg [(DATA_WIDTH-1):0] q_a;
47
   input                         we_b;
48
   input                         clk_a, clk_b;
49
   reg [(DATA_WIDTH-1):0]         q_b;
50
   reg [DATA_WIDTH-1:0] ram [(1<<ADDR_WIDTH)-1:0] ;
51
   always @ (posedge clk_a)
52
     begin
53
        q_a <= ram[adr_a];
54
        if (we_a)
55
             ram[adr_a] <= d_a;
56
     end
57
   always @ (posedge clk_b)
58
     begin
59
          q_b <= ram[adr_b];
60
        if (we_b)
61
          ram[adr_b] <= d_b;
62
     end
63
endmodule
64
module dff_sr ( aclr, aset, clock, data, q);
65
    input         aclr;
66
    input         aset;
67
    input         clock;
68
    input         data;
69
    output reg    q;
70
   always @ (posedge clock or posedge aclr or posedge aset)
71
     if (aclr)
72
       q <= 1'b0;
73
     else if (aset)
74
       q <= 1'b1;
75
     else
76
       q <= data;
77
endmodule
78
module versatile_fifo_async_cmp ( wptr, rptr, fifo_empty, fifo_full, wclk, rclk, rst );
79
   parameter ADDR_WIDTH = 4;
80
   parameter N = ADDR_WIDTH-1;
81
   parameter Q1 = 2'b00;
82
   parameter Q2 = 2'b01;
83
   parameter Q3 = 2'b11;
84
   parameter Q4 = 2'b10;
85
   parameter going_empty = 1'b0;
86
   parameter going_full  = 1'b1;
87
   input [N:0]  wptr, rptr;
88
   output reg   fifo_empty;
89
   output       fifo_full;
90
   input        wclk, rclk, rst;
91
   reg direction;
92
   reg  direction_set, direction_clr;
93
   wire async_empty, async_full;
94
   wire fifo_full2;
95
   reg  fifo_empty2;
96
   always @ (wptr[N:N-1] or rptr[N:N-1])
97
     case ({wptr[N:N-1],rptr[N:N-1]})
98
       {Q1,Q2} : direction_set <= 1'b1;
99
       {Q2,Q3} : direction_set <= 1'b1;
100
       {Q3,Q4} : direction_set <= 1'b1;
101
       {Q4,Q1} : direction_set <= 1'b1;
102
       default : direction_set <= 1'b0;
103
     endcase
104
   always @ (wptr[N:N-1] or rptr[N:N-1] or rst)
105
     if (rst)
106
       direction_clr <= 1'b1;
107
     else
108
       case ({wptr[N:N-1],rptr[N:N-1]})
109
         {Q2,Q1} : direction_clr <= 1'b1;
110
         {Q3,Q2} : direction_clr <= 1'b1;
111
         {Q4,Q3} : direction_clr <= 1'b1;
112
         {Q1,Q4} : direction_clr <= 1'b1;
113
         default : direction_clr <= 1'b0;
114
       endcase
115
   always @ (posedge direction_set or posedge direction_clr)
116
     if (direction_clr)
117
       direction <= going_empty;
118
     else
119
       direction <= going_full;
120
   assign async_empty = (wptr == rptr) && (direction==going_empty);
121
   assign async_full  = (wptr == rptr) && (direction==going_full);
122
    dff_sr dff_sr_empty0( .aclr(rst), .aset(async_full), .clock(wclk), .data(async_full), .q(fifo_full2));
123
    dff_sr dff_sr_empty1( .aclr(rst), .aset(async_full), .clock(wclk), .data(fifo_full2), .q(fifo_full));
124
   always @ (posedge rclk or posedge async_empty)
125
     if (async_empty)
126
       {fifo_empty, fifo_empty2} <= 2'b11;
127
     else
128
       {fifo_empty,fifo_empty2} <= {fifo_empty2,async_empty};
129
endmodule
130
module async_fifo_dw_simplex_top (
131
    a_d, a_wr, a_fifo_full,
132
    a_q, a_rd, a_fifo_empty,
133
        a_clk, a_rst,
134
    b_d, b_wr, b_fifo_full,
135
    b_q, b_rd, b_fifo_empty,
136
        b_clk, b_rst
137
    );
138
parameter data_width = 18;
139
parameter addr_width = 4;
140
input  [data_width-1:0] a_d;
141
input                   a_wr;
142
output                  a_fifo_full;
143
output [data_width-1:0] a_q;
144
input                   a_rd;
145
output                  a_fifo_empty;
146
input                   a_clk;
147
input                   a_rst;
148
input  [data_width-1:0] b_d;
149
input                   b_wr;
150
output                  b_fifo_full;
151
output [data_width-1:0] b_q;
152
input                   b_rd;
153
output                  b_fifo_empty;
154
input                   b_clk;
155
input                   b_rst;
156
wire [addr_width:1] a_wadr, a_wadr_bin, a_radr, a_radr_bin;
157
wire [addr_width:1] b_wadr, b_wadr_bin, b_radr, b_radr_bin;
158
wire [addr_width:0] a_dpram_adr, b_dpram_adr;
159
adr_gen
160
    # ( .length(addr_width))
161
    fifo_a_wr_adr( .cke(a_wr), .q(a_wadr), .q_bin(a_wadr_bin), .rst(a_rst), .clk(a_clk));
162
adr_gen
163
    # (.length(addr_width))
164
    fifo_a_rd_adr( .cke(a_rd), .q(a_radr), .q_bin(a_radr_bin), .rst(a_rst), .clk(a_rst));
165
adr_gen
166
    # ( .length(addr_width))
167
    fifo_b_wr_adr( .cke(b_wr), .q(b_wadr), .q_bin(b_wadr_bin), .rst(b_rst), .clk(b_clk));
168
adr_gen
169
    # (.length(addr_width))
170
    fifo_b_rd_adr( .cke(b_rd), .q(b_radr), .q_bin(b_radr_bin), .rst(b_rst), .clk(b_rst));
171
assign a_dpram_adr = (a_wr) ? {1'b0,a_wadr_bin} : {1'b1,a_radr_bin};
172
assign b_dpram_adr = (b_wr) ? {1'b1,b_wadr_bin} : {1'b0,b_radr_bin};
173
vfifo_dual_port_ram_dc_dw
174
    # (.DATA_WIDTH(data_width), .ADDR_WIDTH(addr_width+1))
175
    dpram ( .d_a(a_d), .q_a(a_q), .adr_a(a_dpram_adr), .we_a(a_wr), .clk_a(a_clk),
176
            .d_b(b_d), .q_b(b_q), .adr_b(b_dpram_adr), .we_b(b_wr), .clk_b(b_clk));
177
versatile_fifo_async_cmp
178
    # (.ADDR_WIDTH(addr_width))
179
    cmp1 ( .wptr(a_wadr), .rptr(b_radr), .fifo_empty(b_fifo_empty), .fifo_full(a_fifo_full), .wclk(a_clk), .rclk(b_clk), .rst(a_rst) );
180
versatile_fifo_async_cmp
181
    # (.ADDR_WIDTH(addr_width))
182
    cmp2 ( .wptr(b_wadr), .rptr(a_radr), .fifo_empty(a_fifo_empty), .fifo_full(b_fifo_full), .wclk(b_clk), .rclk(a_clk), .rst(b_rst) );
183
endmodule

powered by: WebSVN 2.1.0

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