| 本帖最后由 feihufuture 于 2020-8-26 13:00 编辑 
 
[payamount]1.00[/payamount]
[pay]
        `timescale 1ns / 1ps
        module SRAM_CTRL(
        output reg fifo_in_rdreq,
        input fifo_in_rdfull,
        input [15:0] fifo_in_data,
        input [5:0]  fifo_in_rdusedw,
        
        input FCLK_50M,
        input rst_n,
        output [17:0] SRAM_ADR,
        inout [15:0] SRAM_DAT,
        output SRAM_CSL,
        output SRAM_WEL,
        output SRAM_OEL,
        output SRAM_DQMH,
        output SRAM_DQML,
        
        output reg                                fifo_out_wrreq,
        output reg [15:0]         fifo_out_data
        );
        //
        parameter IDLE = 3'b001;
        parameter S_WR = 3'b010;
        parameter S_RD = 3'b100;
        
        //SRAM TEST
        assign SRAM_DQMH = 1'b0;
        assign SRAM_DQML = 1'b0;
        assign SRAM_CSL = 1'b0;
        
        //------------------------------------------------------------------
        reg [2:0] s_sate;
        reg [5:0] fifo_out_cnt;
        always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
        begin
                if(!rst_n) s_sate <= IDLE;
                else
                        case(s_sate)
                        IDLE: if(fifo_in_rdfull) s_sate <= S_WR;
                        S_WR: if(fifo_in_rdusedw == 6'd1) s_sate <= S_RD;
                        S_RD: if(&fifo_out_cnt) s_sate <= IDLE;
                        endcase
        end
        //------------------------------------------------------------------
        
        
        //------------------------------------------------------------------
        always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
        begin
                if(!rst_n) fifo_in_rdreq <= 1'b0;
                else if(fifo_in_rdfull) fifo_in_rdreq <= 1'b1;
                else if(fifo_in_rdusedw == 6'd2) fifo_in_rdreq <= 1'b0;
        end
        //------------------------------------------------------------------        
        
        
        //------------------------------------------------------------------        
        //SRAM_WEL
        reg sram_wel_o;
        reg [15:0] wr_data;
        assign SRAM_WEL = sram_wel_o;
        always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
        begin
                if(!rst_n) sram_wel_o <= 1'b1;
                else  sram_wel_o <= ~fifo_in_rdreq;
        end
        //------------------------------------------------------------------
        
        
        
        //------------------------------------------------------------------
        //SRAM_DAT,SRAM_ADR
        assign SRAM_DAT[15:0] = (s_sate == S_WR)? fifo_in_data:16'hzzzz;
        //------------------------------------------------------------------
        
        
        
        //------------------------------------------------------------------
        //SRAM_OEL
        reg sram_oel_o;
        assign SRAM_OEL = sram_oel_o;
        always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
        begin
                if(!rst_n) sram_oel_o <= 1'b1;
                else if(s_sate == S_RD) sram_oel_o <= 1'b0;
                else sram_oel_o <= 1'b1;
        end
        //------------------------------------------------------------------
        
        
        //------------------------------------------------------------------
        //fifo_out_cnt
        always @ (posedge FCLK_50M)
        begin
                if(!rst_n) fifo_out_cnt <= 6'b0;
                else if(s_sate == S_RD) fifo_out_cnt <= fifo_out_cnt + 1;
                else fifo_out_cnt <= 6'b0;
        end
        //------------------------------------------------------------------
        
        
        
        //------------------------------------------------------------------
        reg [17:0] sram_adr_o;
        assign SRAM_ADR = sram_adr_o;
        always @ (posedge FCLK_50M)
        begin
                if(!rst_n) sram_adr_o <= 18'd0;
                else if(s_sate == IDLE) sram_adr_o <= 18'd0;
                else if(fifo_in_rdusedw == 6'd1) sram_adr_o <= 18'd0;
                else if(~sram_wel_o) sram_adr_o <= sram_adr_o + 1;
                else if(~sram_oel_o) sram_adr_o <= sram_adr_o + 1;
        end
        //------------------------------------------------------------------
        
        //------------------------------------------------------------------
        always @ (posedge FCLK_50M)
        begin
                if(!rst_n) fifo_out_wrreq <= 1'b0;
                else fifo_out_wrreq <= ~sram_oel_o;
        end
        //------------------------------------------------------------------
        
        //------------------------------------------------------------------
        always @ (posedge FCLK_50M)
        begin
                if(!rst_n) fifo_out_data <= 16'b0;
                else if(~sram_oel_o) fifo_out_data <= SRAM_DAT;
        end
        //------------------------------------------------------------------
endmodule[/pay]
 |