本帖最后由 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]
|