66 lines
1.7 KiB
Coq
66 lines
1.7 KiB
Coq
|
// distributed under the mit license
|
||
|
// https://opensource.org/licenses/mit-license.php
|
||
|
|
||
|
`timescale 1 ns / 1 ps
|
||
|
`default_nettype none
|
||
|
|
||
|
module rptr_empty
|
||
|
|
||
|
#(
|
||
|
parameter ADDRSIZE = 4
|
||
|
)(
|
||
|
input wire rclk,
|
||
|
input wire rrst_n,
|
||
|
input wire rinc,
|
||
|
input wire [ADDRSIZE :0] rq2_wptr,
|
||
|
output reg rempty,
|
||
|
output reg arempty,
|
||
|
output wire [ADDRSIZE-1:0] raddr,
|
||
|
output reg [ADDRSIZE :0] rptr
|
||
|
);
|
||
|
|
||
|
reg [ADDRSIZE:0] rbin;
|
||
|
wire [ADDRSIZE:0] rgraynext, rbinnext, rgraynextm1;
|
||
|
wire arempty_val, rempty_val;
|
||
|
|
||
|
//-------------------
|
||
|
// GRAYSTYLE2 pointer
|
||
|
//-------------------
|
||
|
always @(posedge rclk or negedge rrst_n) begin
|
||
|
|
||
|
if (!rrst_n)
|
||
|
{rbin, rptr} <= 0;
|
||
|
else
|
||
|
{rbin, rptr} <= {rbinnext, rgraynext};
|
||
|
|
||
|
end
|
||
|
|
||
|
// Memory read-address pointer (okay to use binary to address memory)
|
||
|
assign raddr = rbin[ADDRSIZE-1:0];
|
||
|
assign rbinnext = rbin + (rinc & ~rempty);
|
||
|
assign rgraynext = (rbinnext >> 1) ^ rbinnext;
|
||
|
assign rgraynextm1 = ((rbinnext + 1'b1) >> 1) ^ (rbinnext + 1'b1);
|
||
|
|
||
|
//---------------------------------------------------------------
|
||
|
// FIFO empty when the next rptr == synchronized wptr or on reset
|
||
|
//---------------------------------------------------------------
|
||
|
assign rempty_val = (rgraynext == rq2_wptr);
|
||
|
assign arempty_val = (rgraynextm1 == rq2_wptr);
|
||
|
|
||
|
always @ (posedge rclk or negedge rrst_n) begin
|
||
|
|
||
|
if (!rrst_n) begin
|
||
|
arempty <= 1'b0;
|
||
|
rempty <= 1'b1;
|
||
|
end
|
||
|
else begin
|
||
|
arempty <= arempty_val;
|
||
|
rempty <= rempty_val;
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
endmodule
|
||
|
|
||
|
`resetall
|