blob: 5f61d138b11dbe20ffba902b96b7cfc48b17f340 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
`timescale 1ns / 1ps
module modexpa7_simple_fifo #
(
parameter BUS_WIDTH = 128,
parameter DEPTH_BITS = 2
)
(
input clk,
input rst,
input wr_en,
input rd_en,
input [BUS_WIDTH-1:0] d_in,
output [BUS_WIDTH-1:0] d_out
);
//
// Locals
//
localparam NUM_WORDS = 2 ** DEPTH_BITS;
localparam [DEPTH_BITS:0] PTR_ZERO = {DEPTH_BITS{1'b0}};
localparam [DEPTH_BITS:0] PTR_LAST = {DEPTH_BITS{1'b1}};
//
// Memory
//
(* RAM_STYLE="DISTRIBUTED" *)
reg [BUS_WIDTH-1:0] fifo[0:NUM_WORDS-1];
//
// Pointers
//
reg [DEPTH_BITS-1:0] ptr_wr;
reg [DEPTH_BITS-1:0] ptr_rd;
//
// Output
//
reg [BUS_WIDTH-1:0] d_out_reg;
assign d_out = d_out_reg;
//
// Write Pointer
//
always @(posedge clk)
//
if (wr_en) ptr_wr <= ptr_wr + 1'b1;
else if (rst) ptr_wr <= PTR_ZERO;
//
// Read Pointer
//
always @(posedge clk)
//
if (rst) ptr_rd <= PTR_ZERO;
else if (rd_en) ptr_rd <= ptr_rd + 1'b1;
//
// Read Logic
//
always @(posedge clk)
//
if (rst) d_out_reg <= {BUS_WIDTH{1'b0}};
else if (rd_en) d_out_reg <= fifo[ptr_rd];
//
// Write Logic
//
always @(posedge clk)
//
if (wr_en) fifo[ptr_wr] <= d_in;
endmodule
|