OpenCores
URL https://opencores.org/ocsvn/wbuart32/wbuart32/trunk

Subversion Repositories wbuart32

[/] [wbuart32/] [trunk/] [rtl/] [ufifo.v] - Diff between revs 5 and 6

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 5 Rev 6
Line 49... Line 49...
        output  wire            o_err;
        output  wire            o_err;
 
 
        localparam      FLEN=(1<<LGFLEN);
        localparam      FLEN=(1<<LGFLEN);
 
 
        reg     [(BW-1):0]       fifo[0:(FLEN-1)];
        reg     [(BW-1):0]       fifo[0:(FLEN-1)];
        reg     [(LGFLEN-1):0]   r_first, r_last;
        reg     [(LGFLEN-1):0]   r_first, r_last, r_next;
 
 
        wire    [(LGFLEN-1):0]   w_first_plus_one, w_first_plus_two,
        wire    [(LGFLEN-1):0]   w_first_plus_one, w_first_plus_two,
                                w_last_plus_one;
                                w_last_plus_one;
        assign  w_first_plus_two = r_first + {{(LGFLEN-2){1'b0}},2'b10};
        assign  w_first_plus_two = r_first + {{(LGFLEN-2){1'b0}},2'b10};
        assign  w_first_plus_one = r_first + {{(LGFLEN-1){1'b0}},1'b1};
        assign  w_first_plus_one = r_first + {{(LGFLEN-1){1'b0}},1'b1};
        assign  w_last_plus_one  = r_last  + {{(LGFLEN-1){1'b0}},1'b1};
        assign  w_last_plus_one  = r_next; // r_last  + 1'b1;
 
 
        reg     will_overflow;
        reg     will_overflow;
        initial will_overflow = 1'b0;
        initial will_overflow = 1'b0;
        always @(posedge i_clk)
        always @(posedge i_clk)
                if (i_rst)
                if (i_rst)
Line 118... Line 118...
        initial r_unfl = 1'b0;
        initial r_unfl = 1'b0;
        initial r_last = 0;
        initial r_last = 0;
        always @(posedge i_clk)
        always @(posedge i_clk)
                if (i_rst)
                if (i_rst)
                begin
                begin
                        r_last <= { (LGFLEN){1'b0} };
                        r_last <= 0;
 
                        r_next <= { {(LGFLEN-1){1'b0}}, 1'b1 };
                        r_unfl <= 1'b0;
                        r_unfl <= 1'b0;
                end else if (i_rd)
                end else if (i_rd)
                begin
                begin
                        if ((i_wr)||(!will_underflow)) // (r_first != r_last)
                        if ((i_wr)||(!will_underflow)) // (r_first != r_last)
                                r_last <= w_last_plus_one;
                        begin
 
                                r_last <= r_next;
 
                                r_next <= r_last +{{(LGFLEN-2){1'b0}},2'b10};
                                // Last chases first
                                // Last chases first
                                // Need to be prepared for a possible two
                                // Need to be prepared for a possible two
                                // reads in quick succession
                                // reads in quick succession
                                // o_data <= fifo[r_last+1];
                                // o_data <= fifo[r_last+1];
                        else
                        end else
                                r_unfl <= 1'b1;
                                r_unfl <= 1'b1;
                end
                end
 
 
        reg     [7:0]    fifo_here, fifo_next, r_data;
        reg     [7:0]    fifo_here, fifo_next, r_data;
        always @(posedge i_clk)
        always @(posedge i_clk)
                fifo_here <= fifo[r_last];
                fifo_here <= fifo[r_last];
        always @(posedge i_clk)
        always @(posedge i_clk)
                fifo_next <= fifo[r_last+{{(LGFLEN-1){1'b0}},1'b1}];
                fifo_next <= fifo[r_next];
        always @(posedge i_clk)
        always @(posedge i_clk)
                r_data <= i_data;
                r_data <= i_data;
 
 
        reg     [1:0]    osrc;
        reg     [1:0]    osrc;
        always @(posedge i_clk)
        always @(posedge i_clk)
Line 171... Line 174...
        reg     [(LGFLEN-1):0]   r_fill;
        reg     [(LGFLEN-1):0]   r_fill;
        always @(posedge i_clk)
        always @(posedge i_clk)
                if (i_rst)
                if (i_rst)
                        r_fill <= 0;
                        r_fill <= 0;
                else if ((i_rd)&&(!i_wr))
                else if ((i_rd)&&(!i_wr))
                        r_fill <= r_first - r_last - 1'b1;
                        r_fill <= r_first - r_next;
                else if ((!i_rd)&&(i_wr))
                else if ((!i_rd)&&(i_wr))
                        r_fill <= r_first - r_last + 1'b1;
                        r_fill <= r_first - r_last + 1'b1;
                else
                else
                        r_fill <= r_first - r_last;
                        r_fill <= r_first - r_last;
        assign  o_half_full = r_fill[(LGFLEN-1)];
        assign  o_half_full = r_fill[(LGFLEN-1)];

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.