OpenCores
URL https://opencores.org/ocsvn/1g_ethernet_dpi/1g_ethernet_dpi/trunk

Subversion Repositories 1g_ethernet_dpi

[/] [1g_ethernet_dpi/] [tags/] [vmblite_base/] [hw/] [src/] [rtl/] [wb_uart/] [hdl/] [wb_uart_mscfifo.v] - Rev 7

Compare with Previous | Blame | View Log

//////////////////////////////////////////////////////////////////////////////////
// Company:         
// Engineer:        IK
// 
// Create Date:     
// Design Name:     
// Module Name:     wb_uart_mscfifo
// Project Name:    
// Target Devices:  
// Tool versions:   
// Description:     
//                  
//                  single clock FWFT FIFO
//                  
//                  
//                  
// Revision: 
// Revision 0.01 - File Created, 
//
//////////////////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
 
module wb_uart_mscfifo #(parameter p_DW = 0, p_AW = 0)
(
    // SYS_CON
    input   i_clk,
    input   i_arst,
    // DIN
    input               i_wr,
    input   [p_DW-1:0]  iv_data,
    // DOUT
    input               i_rd,
    output  [p_DW-1:0]  ov_data,
    // STS-OUT
    output  [p_AW-1:0]  ov_count,
    output              o_full,
    output  reg         o_empty
);
//////////////////////////////////////////////////////////////////////////////////
    // LEN
    reg     [p_AW-1:0]  sv_length;
    wire                s_last_data;
    // ADDR
    reg     [p_AW-1:0]  sv_raddr;
    reg     [p_AW-1:0]  sv_waddr;
    wire                s_rd;
    reg                 s_1st_wr;
    // FWFT
    reg                 s_fwft_flag;
    reg     [p_DW-1:0]  sv_fwft_data;
    // BRAM
    wire    [p_DW-1:0]  sv_data_bram;
 
//////////////////////////////////////////////////////////////////////////////////
    // LAST-DATA flag
    assign  s_last_data =   (sv_length == 1);
    // inner-RD 
    assign  s_rd        =   s_1st_wr | (i_rd & ((!s_last_data & !o_empty) | i_wr));
    //
    // DOUT
    assign  ov_data     =   (s_fwft_flag)? sv_fwft_data : sv_data_bram;
    // FF
    assign  o_full      =   (sv_length == {p_AW{1'b1}});
    // CNT
    assign  ov_count    =   sv_length;
 
//////////////////////////////////////////////////////////////////////////////////
//
// Construct FIFO-CTRL logic
//
always @ (posedge i_clk or posedge i_arst)
begin   :   FIFO_CTRL_LOGIC
    if (i_arst)
        begin   :   RST
            sv_length <= 0;
            s_1st_wr <= 0;
            sv_raddr <= 0;
            sv_waddr <= 0;
            s_fwft_flag <= 0;
            sv_fwft_data <= 0;
        end
    else
        begin   :   WRK
            // FIFO-LEN
            if (i_wr & !i_rd & !o_full)
                sv_length <= sv_length + 1'b1;
            else if (!i_wr & i_rd & !o_empty)
                sv_length <= sv_length - 1'b1;
            // 1st-wr flag (in empty fifo)
            s_1st_wr <= i_wr & (sv_length == 0);
            // rd-addr
            if (s_rd)
                sv_raddr <= sv_raddr + 1'b1;
            // wr-addr
            if (i_wr)
                sv_waddr <= sv_waddr + 1'b1;
            // fwft-flag
            if (i_rd & !i_wr)
                s_fwft_flag <= 0;
            else if (i_rd & i_wr & s_last_data)
                s_fwft_flag <= 1;
            // fwft-data
            if (i_rd & i_wr & s_last_data)
                sv_fwft_data <= iv_data;
        end
end
//////////////////////////////////////////////////////////////////////////////////
//
// Construct EF
//
always @ (posedge i_clk or posedge i_arst)
begin   :   EF_LOGIC
    if (i_arst)
        begin   :   RST
            o_empty <= 1;
        end
    else
        begin   :   WRK
            if (s_1st_wr)
                o_empty <= 0;
            else if (i_rd & !i_wr & s_last_data)
                o_empty <= 1;
        end
end
//////////////////////////////////////////////////////////////////////////////////
//
// Instantiate BRAM
//
sdpram      #(p_DW, p_AW) // p_DW, p_AW
            U_SDPRAM
(
// SYS_CON
.i_clk      (i_clk),
// IN / port-a
.i_we_a     (i_wr),
.iv_addr_a  (sv_waddr),
.iv_data_a  (iv_data),
// OUT / port-b
.i_rd_b     (s_rd),
.iv_addr_b  (sv_raddr),
.ov_data_b  (sv_data_bram)
);
//////////////////////////////////////////////////////////////////////////////////
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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