Dernière activité 1 month ago

fifo.v Brut
1module FIFO
2 #(
3 parameter NUMSAMPLES = 16,
4 parameter NUMBITS = 16
5) (
6 input wire rclk,
7 input wire wclk,
8 input wire reset,
9 input wire [NUMBITS-1:0] wdata,
10 input wire readEnable,
11 input wire writeEnable,
12 output [NUMBITS-1:0] rdata,
13 output wire isEmpty,
14 output wire isFull
15);
16localparam ABITS = $clog2(NUMSAMPLES); // Minimum required address bits
17
18reg [NUMBITS-1:0] rdata;
19reg [NUMBITS-1:0] fifo [0:NUMSAMPLES];
20wire [ABITS:0] writePtr;
21wire [ABITS:0] readPtr;
22
23GrayCounter #(
24 .BITS(ABITS+1)
25) writeCounter (
26 wclk,
27 reset,
28 writeEnable,
29 writePtr
30);
31
32wire fullOrEmpty = (writePtr[ABITS-1:0] == readPtr[ABITS-1:0]);
33wire empty = (writePtr == readPtr);
34wire [ABITS-1:0] wAddr = writePtr[ABITS-1:0];
35wire [ABITS-1:0] rAddr = readPtr[ABITS-1:0];
36
37GrayCounter #(
38 .BITS(ABITS+1)
39) readCounter (
40 .clk(rclk),
41 .reset(reset),
42 .enable(readEnable && !empty),
43 .out(readPtr)
44);
45
46
47assign isEmpty = empty;
48assign isFull = fullOrEmpty && !empty;
49
50always @(posedge rclk)
51begin
52 if (readEnable)
53 rdata <= reset ? 0 : fifo[rAddr];
54 else
55 rdata <= 0;
56end
57
58always @(posedge wclk)
59begin
60 if (!reset && writeEnable) fifo[wAddr] <= wdata;
61end
62
63endmodule
64