first commit
This commit is contained in:
		
							
								
								
									
										9
									
								
								FIFO/async_fifo.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								FIFO/async_fifo.list
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
async_fifo.v
 | 
			
		||||
fifomem.v
 | 
			
		||||
fifomem_dp.v
 | 
			
		||||
hdl.list
 | 
			
		||||
rptr_empty.v
 | 
			
		||||
sync_ptr.v
 | 
			
		||||
sync_r2w.v
 | 
			
		||||
sync_w2r.v
 | 
			
		||||
wptr_full.v
 | 
			
		||||
							
								
								
									
										98
									
								
								FIFO/async_fifo.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								FIFO/async_fifo.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
// distributed under the mit license
 | 
			
		||||
// https://opensource.org/licenses/mit-license.php
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module async_fifo
 | 
			
		||||
 | 
			
		||||
    #(
 | 
			
		||||
        parameter DSIZE = 8,
 | 
			
		||||
        parameter ASIZE = 4,
 | 
			
		||||
        parameter FALLTHROUGH = "TRUE" // First word fall-through without latency
 | 
			
		||||
    )(
 | 
			
		||||
        input  wire             wclk,
 | 
			
		||||
        input  wire             wrst_n,
 | 
			
		||||
        input  wire             winc,
 | 
			
		||||
        input  wire [DSIZE-1:0] wdata,
 | 
			
		||||
        output wire             wfull,
 | 
			
		||||
        output wire             awfull,
 | 
			
		||||
        input  wire             rclk,
 | 
			
		||||
        input  wire             rrst_n,
 | 
			
		||||
        input  wire             rinc,
 | 
			
		||||
        output wire [DSIZE-1:0] rdata,
 | 
			
		||||
        output wire             rempty,
 | 
			
		||||
        output wire             arempty
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    wire [ASIZE-1:0] waddr, raddr;
 | 
			
		||||
    wire [ASIZE  :0] wptr, rptr, wq2_rptr, rq2_wptr;
 | 
			
		||||
 | 
			
		||||
    // The module synchronizing the read point
 | 
			
		||||
    // from read to write domain
 | 
			
		||||
    sync_r2w
 | 
			
		||||
    #(ASIZE)
 | 
			
		||||
    sync_r2w (
 | 
			
		||||
    .wq2_rptr (wq2_rptr),
 | 
			
		||||
    .rptr     (rptr),
 | 
			
		||||
    .wclk     (wclk),
 | 
			
		||||
    .wrst_n   (wrst_n)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // The module synchronizing the write point
 | 
			
		||||
    // from write to read domain
 | 
			
		||||
    sync_w2r
 | 
			
		||||
    #(ASIZE)
 | 
			
		||||
    sync_w2r (
 | 
			
		||||
    .rq2_wptr (rq2_wptr),
 | 
			
		||||
    .wptr     (wptr),
 | 
			
		||||
    .rclk     (rclk),
 | 
			
		||||
    .rrst_n   (rrst_n)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // The module handling the write requests
 | 
			
		||||
    wptr_full
 | 
			
		||||
    #(ASIZE)
 | 
			
		||||
    wptr_full (
 | 
			
		||||
    .awfull   (awfull),
 | 
			
		||||
    .wfull    (wfull),
 | 
			
		||||
    .waddr    (waddr),
 | 
			
		||||
    .wptr     (wptr),
 | 
			
		||||
    .wq2_rptr (wq2_rptr),
 | 
			
		||||
    .winc     (winc),
 | 
			
		||||
    .wclk     (wclk),
 | 
			
		||||
    .wrst_n   (wrst_n)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // The DC-RAM
 | 
			
		||||
    fifomem
 | 
			
		||||
    #(DSIZE, ASIZE, FALLTHROUGH)
 | 
			
		||||
    fifomem (
 | 
			
		||||
    .rclken (rinc),
 | 
			
		||||
    .rclk   (rclk),
 | 
			
		||||
    .rdata  (rdata),
 | 
			
		||||
    .wdata  (wdata),
 | 
			
		||||
    .waddr  (waddr),
 | 
			
		||||
    .raddr  (raddr),
 | 
			
		||||
    .wclken (winc),
 | 
			
		||||
    .wfull  (wfull),
 | 
			
		||||
    .wclk   (wclk)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // The module handling read requests
 | 
			
		||||
    rptr_empty
 | 
			
		||||
    #(ASIZE)
 | 
			
		||||
    rptr_empty (
 | 
			
		||||
    .arempty  (arempty),
 | 
			
		||||
    .rempty   (rempty),
 | 
			
		||||
    .raddr    (raddr),
 | 
			
		||||
    .rptr     (rptr),
 | 
			
		||||
    .rq2_wptr (rq2_wptr),
 | 
			
		||||
    .rinc     (rinc),
 | 
			
		||||
    .rclk     (rclk),
 | 
			
		||||
    .rrst_n   (rrst_n)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
							
								
								
									
										52
									
								
								FIFO/fifomem.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								FIFO/fifomem.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
// distributed under the mit license
 | 
			
		||||
// https://opensource.org/licenses/mit-license.php
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module fifomem
 | 
			
		||||
 | 
			
		||||
    #(
 | 
			
		||||
        parameter  DATASIZE = 8,    // Memory data word width
 | 
			
		||||
        parameter  ADDRSIZE = 4,    // Number of mem address bits
 | 
			
		||||
        parameter  FALLTHROUGH = "TRUE" // First word fall-through
 | 
			
		||||
    ) (
 | 
			
		||||
        input  wire                wclk,
 | 
			
		||||
        input  wire                wclken,
 | 
			
		||||
        input  wire [ADDRSIZE-1:0] waddr,
 | 
			
		||||
        input  wire [DATASIZE-1:0] wdata,
 | 
			
		||||
        input  wire                wfull,
 | 
			
		||||
        input  wire                rclk,
 | 
			
		||||
        input  wire                rclken,
 | 
			
		||||
        input  wire [ADDRSIZE-1:0] raddr,
 | 
			
		||||
        output wire [DATASIZE-1:0] rdata
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    localparam DEPTH = 1<<ADDRSIZE;
 | 
			
		||||
 | 
			
		||||
    reg [DATASIZE-1:0] mem [0:DEPTH-1];
 | 
			
		||||
    reg [DATASIZE-1:0] rdata_r;
 | 
			
		||||
 | 
			
		||||
    always @(posedge wclk) begin
 | 
			
		||||
        if (wclken && !wfull)
 | 
			
		||||
            mem[waddr] <= wdata;
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    generate
 | 
			
		||||
        if (FALLTHROUGH == "TRUE")
 | 
			
		||||
        begin : fallthrough
 | 
			
		||||
            assign rdata = mem[raddr];
 | 
			
		||||
        end
 | 
			
		||||
        else
 | 
			
		||||
        begin : registered_read
 | 
			
		||||
            always @(posedge rclk) begin
 | 
			
		||||
                if (rclken)
 | 
			
		||||
                    rdata_r <= mem[raddr];
 | 
			
		||||
            end
 | 
			
		||||
            assign rdata = rdata_r;
 | 
			
		||||
        end
 | 
			
		||||
    endgenerate
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
							
								
								
									
										95
									
								
								FIFO/fifomem_dp.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								FIFO/fifomem_dp.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Copyright 2017 Damien Pretet ThotIP
 | 
			
		||||
// Copyright 2018 Julius Baxter
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module fifomem_dp
 | 
			
		||||
 | 
			
		||||
    #(
 | 
			
		||||
        parameter  DATASIZE     = 8,      // Memory data word width
 | 
			
		||||
        parameter  ADDRSIZE     = 4,      // Number of mem address bits
 | 
			
		||||
        parameter  FALLTHROUGH  = "TRUE"  // First word fall-through
 | 
			
		||||
    ) (
 | 
			
		||||
        input  wire                a_clk,
 | 
			
		||||
        input  wire [DATASIZE-1:0] a_wdata,
 | 
			
		||||
        output wire [DATASIZE-1:0] a_rdata,
 | 
			
		||||
        input  wire [ADDRSIZE-1:0] a_addr,
 | 
			
		||||
        input  wire                a_rinc,
 | 
			
		||||
        input  wire                a_winc,
 | 
			
		||||
 | 
			
		||||
        input  wire                b_clk,
 | 
			
		||||
        input  wire [DATASIZE-1:0] b_wdata,
 | 
			
		||||
        output wire [DATASIZE-1:0] b_rdata,
 | 
			
		||||
        input  wire [ADDRSIZE-1:0] b_addr,
 | 
			
		||||
        input  wire                b_rinc,
 | 
			
		||||
        input  wire                b_winc
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    reg [DATASIZE-1:0] a_rdata_r;
 | 
			
		||||
    reg [DATASIZE-1:0] b_rdata_r;
 | 
			
		||||
 | 
			
		||||
    generate
 | 
			
		||||
 | 
			
		||||
        localparam DEPTH = 1<<ADDRSIZE;
 | 
			
		||||
        reg [DATASIZE-1:0] mem [0:DEPTH-1];
 | 
			
		||||
 | 
			
		||||
        if (FALLTHROUGH == "TRUE") begin : fallthrough
 | 
			
		||||
 | 
			
		||||
            always @(posedge a_clk)
 | 
			
		||||
                if (a_winc)
 | 
			
		||||
                    mem[a_addr] <= a_wdata;
 | 
			
		||||
 | 
			
		||||
            assign a_rdata  = mem[a_addr];
 | 
			
		||||
 | 
			
		||||
            always @(posedge b_clk)
 | 
			
		||||
                if (b_winc)
 | 
			
		||||
                    mem[b_addr] <= b_wdata;
 | 
			
		||||
 | 
			
		||||
            assign b_rdata = mem[b_addr];
 | 
			
		||||
 | 
			
		||||
        end else begin : registered
 | 
			
		||||
 | 
			
		||||
            wire a_en = a_rinc | a_winc;
 | 
			
		||||
 | 
			
		||||
            always @(posedge a_clk)
 | 
			
		||||
                if (a_en) begin
 | 
			
		||||
                    if (a_winc)
 | 
			
		||||
                        mem[a_addr] <= a_wdata;
 | 
			
		||||
                    a_rdata_r <= mem[a_addr];
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
            assign a_rdata = a_rdata_r;
 | 
			
		||||
 | 
			
		||||
            wire b_en = b_rinc | b_winc;
 | 
			
		||||
 | 
			
		||||
            always @(posedge b_clk)
 | 
			
		||||
                if (b_en) begin
 | 
			
		||||
                    if (b_winc)
 | 
			
		||||
                        mem[b_addr] <= b_wdata;
 | 
			
		||||
                    b_rdata_r <= mem[b_addr];
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
            assign b_rdata = b_rdata_r;
 | 
			
		||||
 | 
			
		||||
        end // block: registered
 | 
			
		||||
    endgenerate
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
							
								
								
									
										65
									
								
								FIFO/rptr_empty.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								FIFO/rptr_empty.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
// 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
 | 
			
		||||
							
								
								
									
										30
									
								
								FIFO/sync_ptr.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								FIFO/sync_ptr.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
// distributed under the mit license
 | 
			
		||||
// https://opensource.org/licenses/mit-license.php
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module sync_ptr
 | 
			
		||||
 | 
			
		||||
    #(
 | 
			
		||||
    parameter ASIZE = 4
 | 
			
		||||
    )(
 | 
			
		||||
    input  wire              dest_clk,
 | 
			
		||||
    input  wire              dest_rst_n,
 | 
			
		||||
    input  wire [ASIZE:0] src_ptr,
 | 
			
		||||
    output reg  [ASIZE:0] dest_ptr
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    reg [ASIZE:0] ptr_x;
 | 
			
		||||
 | 
			
		||||
    always @(posedge dest_clk or negedge dest_rst_n) begin
 | 
			
		||||
 | 
			
		||||
        if (!dest_rst_n)
 | 
			
		||||
            {dest_ptr,ptr_x} <= 0;
 | 
			
		||||
        else
 | 
			
		||||
            {dest_ptr,ptr_x} <= {ptr_x,src_ptr};
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
							
								
								
									
										31
									
								
								FIFO/sync_r2w.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								FIFO/sync_r2w.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
// distributed under the mit license
 | 
			
		||||
// https://opensource.org/licenses/mit-license.php
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module sync_r2w
 | 
			
		||||
 | 
			
		||||
    #(
 | 
			
		||||
    parameter ASIZE = 4
 | 
			
		||||
    )(
 | 
			
		||||
    input  wire              wclk,
 | 
			
		||||
    input  wire              wrst_n,
 | 
			
		||||
    input  wire [ASIZE:0] rptr,
 | 
			
		||||
    output reg  [ASIZE:0] wq2_rptr
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    reg [ASIZE:0] wq1_rptr;
 | 
			
		||||
 | 
			
		||||
    always @(posedge wclk or negedge wrst_n) begin
 | 
			
		||||
 | 
			
		||||
        if (!wrst_n)
 | 
			
		||||
            {wq2_rptr,wq1_rptr} <= 0;
 | 
			
		||||
        else
 | 
			
		||||
            {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
 | 
			
		||||
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
							
								
								
									
										31
									
								
								FIFO/sync_w2r.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								FIFO/sync_w2r.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
// distributed under the mit license
 | 
			
		||||
// https://opensource.org/licenses/mit-license.php
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module sync_w2r
 | 
			
		||||
 | 
			
		||||
    #(
 | 
			
		||||
    parameter ASIZE = 4
 | 
			
		||||
    )(
 | 
			
		||||
    input  wire              rclk,
 | 
			
		||||
    input  wire              rrst_n,
 | 
			
		||||
    output reg  [ASIZE:0] rq2_wptr,
 | 
			
		||||
    input  wire [ASIZE:0] wptr
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    reg [ASIZE:0] rq1_wptr;
 | 
			
		||||
 | 
			
		||||
    always @(posedge rclk or negedge rrst_n) begin
 | 
			
		||||
 | 
			
		||||
        if (!rrst_n)
 | 
			
		||||
            {rq2_wptr,rq1_wptr} <= 0;
 | 
			
		||||
        else
 | 
			
		||||
            {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
 | 
			
		||||
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
							
								
								
									
										65
									
								
								FIFO/wptr_full.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								FIFO/wptr_full.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
// distributed under the mit license
 | 
			
		||||
// https://opensource.org/licenses/mit-license.php
 | 
			
		||||
 | 
			
		||||
`timescale 1 ns / 1 ps
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module wptr_full
 | 
			
		||||
 | 
			
		||||
	#(
 | 
			
		||||
		parameter ADDRSIZE = 4
 | 
			
		||||
	)(
 | 
			
		||||
		input  wire                wclk,
 | 
			
		||||
		input  wire                wrst_n,
 | 
			
		||||
		input  wire                winc,
 | 
			
		||||
		input  wire [ADDRSIZE  :0] wq2_rptr,
 | 
			
		||||
		output reg                 wfull,
 | 
			
		||||
		output reg                 awfull,
 | 
			
		||||
		output wire [ADDRSIZE-1:0] waddr,
 | 
			
		||||
		output reg  [ADDRSIZE  :0] wptr
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
    reg  [ADDRSIZE:0] wbin;
 | 
			
		||||
    wire [ADDRSIZE:0] wgraynext, wbinnext, wgraynextp1;
 | 
			
		||||
    wire              awfull_val, wfull_val;
 | 
			
		||||
 | 
			
		||||
	// GRAYSTYLE2 pointer
 | 
			
		||||
	always @(posedge wclk or negedge wrst_n) begin
 | 
			
		||||
 | 
			
		||||
		if (!wrst_n)
 | 
			
		||||
			{wbin, wptr} <= 0;
 | 
			
		||||
		else
 | 
			
		||||
			{wbin, wptr} <= {wbinnext, wgraynext};
 | 
			
		||||
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
    // Memory write-address pointer (okay to use binary to address memory)
 | 
			
		||||
    assign waddr = wbin[ADDRSIZE-1:0];
 | 
			
		||||
    assign wbinnext  = wbin + (winc & ~wfull);
 | 
			
		||||
    assign wgraynext = (wbinnext >> 1) ^ wbinnext;
 | 
			
		||||
    assign wgraynextp1 = ((wbinnext + 1'b1) >> 1) ^ (wbinnext + 1'b1);
 | 
			
		||||
 | 
			
		||||
    //------------------------------------------------------------------
 | 
			
		||||
    // Simplified version of the three necessary full-tests:
 | 
			
		||||
    // assign wfull_val=((wgnext[ADDRSIZE] !=wq2_rptr[ADDRSIZE] ) &&
 | 
			
		||||
    //                   (wgnext[ADDRSIZE-1]  !=wq2_rptr[ADDRSIZE-1]) &&
 | 
			
		||||
    // (wgnext[ADDRSIZE-2:0]==wq2_rptr[ADDRSIZE-2:0]));
 | 
			
		||||
    //------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
     assign wfull_val = (wgraynext == {~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]});
 | 
			
		||||
     assign awfull_val = (wgraynextp1 == {~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]});
 | 
			
		||||
 | 
			
		||||
     always @(posedge wclk or negedge wrst_n) begin
 | 
			
		||||
 | 
			
		||||
        if (!wrst_n) begin
 | 
			
		||||
            awfull <= 1'b0;
 | 
			
		||||
            wfull  <= 1'b0;
 | 
			
		||||
        end else begin
 | 
			
		||||
            awfull <= awfull_val;
 | 
			
		||||
            wfull  <= wfull_val;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
`resetall
 | 
			
		||||
		Reference in New Issue
	
	Block a user