From 6aff3f26db8d8477ed7cab43b9dc03473627b172 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Mon, 28 Mar 2022 10:36:35 -0700 Subject: Integrate wrap bits into grey code for FIFO. --- hdl/fifo.sv | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'hdl') diff --git a/hdl/fifo.sv b/hdl/fifo.sv index a067914..374f051 100644 --- a/hdl/fifo.sv +++ b/hdl/fifo.sv @@ -19,13 +19,14 @@ module fifo typedef bit [WIDTH_BITS-1:0] data_t; typedef bit [DEPTH_BITS-1:0] addr_t; + typedef bit [DEPTH_BITS:0] grey_t; data_t data [DEPTH-1:0]; addr_t oldest, youngest; bit oldest_wrap, youngest_wrap; - addr_t oldest_grey, youngest_grey; + grey_t oldest_grey, oldest_plus_one_wrap_grey, youngest_grey; always @(posedge clock_in, posedge reset) begin if (reset) begin @@ -40,9 +41,9 @@ module fifo ++youngest_wrap; end - youngest_grey = youngest ^ (youngest >> 1); + youngest_grey = {youngest_wrap, youngest} ^ ({youngest_grey, youngest} >> 1); - in_ready = oldest_grey != youngest_grey || youngest_wrap == oldest_wrap; + in_ready = oldest_plus_one_wrap_grey != youngest_grey; end end @@ -52,15 +53,17 @@ module fifo oldest = 0; oldest_wrap = 0; oldest_grey = 0; + oldest_plus_one_wrap_grey = {!oldest_wrap, oldest} ^ ({!oldest_wrap, oldest} >> 1); end else begin if (out_ready && out_valid) begin if (++oldest == 0) ++oldest_wrap; end - oldest_grey = oldest ^ (oldest >> 1); + oldest_grey = {oldest_grey, oldest} ^ ({oldest_grey, oldest} >> 1); + oldest_plus_one_wrap_grey = {!oldest_wrap, oldest} ^ ({!oldest_wrap, oldest} >> 1); - out_valid = oldest_grey != youngest_grey || youngest_wrap != oldest_wrap; + out_valid = oldest_grey != youngest_grey; out_data = data[oldest]; end end -- cgit v1.2.3