[FPGA] SRAM FPGA控制源码公布

[复制链接]
555|0
 楼主| feihufuture 发表于 2020-8-26 12:52 | 显示全部楼层 |阅读模式
本帖最后由 feihufuture 于 2020-8-26 13:00 编辑

  1. [payamount]1.00[/payamount]
  2. [pay]
  3.         `timescale 1ns / 1ps
  4.         module SRAM_CTRL(
  5.         output reg fifo_in_rdreq,
  6.         input fifo_in_rdfull,
  7.         input [15:0] fifo_in_data,
  8.         input [5:0]  fifo_in_rdusedw,
  9.         
  10.         input FCLK_50M,
  11.         input rst_n,
  12.         output [17:0] SRAM_ADR,
  13.         inout [15:0] SRAM_DAT,
  14.         output SRAM_CSL,
  15.         output SRAM_WEL,
  16.         output SRAM_OEL,
  17.         output SRAM_DQMH,
  18.         output SRAM_DQML,
  19.         
  20.         output reg                                fifo_out_wrreq,
  21.         output reg [15:0]         fifo_out_data
  22.         );
  23.         //
  24.         parameter IDLE = 3'b001;
  25.         parameter S_WR = 3'b010;
  26.         parameter S_RD = 3'b100;

  27.         
  28.         //SRAM TEST
  29.         assign SRAM_DQMH = 1'b0;
  30.         assign SRAM_DQML = 1'b0;
  31.         assign SRAM_CSL = 1'b0;

  32.         
  33.         //------------------------------------------------------------------
  34.         reg [2:0] s_sate;
  35.         reg [5:0] fifo_out_cnt;
  36.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
  37.         begin
  38.                 if(!rst_n) s_sate <= IDLE;
  39.                 else
  40.                         case(s_sate)
  41.                         IDLE: if(fifo_in_rdfull) s_sate <= S_WR;
  42.                         S_WR: if(fifo_in_rdusedw == 6'd1) s_sate <= S_RD;
  43.                         S_RD: if(&fifo_out_cnt) s_sate <= IDLE;
  44.                         endcase
  45.         end
  46.         //------------------------------------------------------------------
  47.         
  48.         
  49.         //------------------------------------------------------------------
  50.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
  51.         begin
  52.                 if(!rst_n) fifo_in_rdreq <= 1'b0;
  53.                 else if(fifo_in_rdfull) fifo_in_rdreq <= 1'b1;
  54.                 else if(fifo_in_rdusedw == 6'd2) fifo_in_rdreq <= 1'b0;
  55.         end
  56.         //------------------------------------------------------------------        
  57.         
  58.         
  59.         //------------------------------------------------------------------        
  60.         //SRAM_WEL
  61.         reg sram_wel_o;
  62.         reg [15:0] wr_data;
  63.         assign SRAM_WEL = sram_wel_o;
  64.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
  65.         begin
  66.                 if(!rst_n) sram_wel_o <= 1'b1;
  67.                 else  sram_wel_o <= ~fifo_in_rdreq;
  68.         end
  69.         //------------------------------------------------------------------
  70.         
  71.         
  72.         
  73.         //------------------------------------------------------------------
  74.         //SRAM_DAT,SRAM_ADR
  75.         assign SRAM_DAT[15:0] = (s_sate == S_WR)? fifo_in_data:16'hzzzz;
  76.         //------------------------------------------------------------------
  77.         
  78.         
  79.         
  80.         //------------------------------------------------------------------
  81.         //SRAM_OEL
  82.         reg sram_oel_o;
  83.         assign SRAM_OEL = sram_oel_o;
  84.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge FCLK_50M)
  85.         begin
  86.                 if(!rst_n) sram_oel_o <= 1'b1;
  87.                 else if(s_sate == S_RD) sram_oel_o <= 1'b0;
  88.                 else sram_oel_o <= 1'b1;
  89.         end
  90.         //------------------------------------------------------------------
  91.         
  92.         
  93.         //------------------------------------------------------------------
  94.         //fifo_out_cnt
  95.         always @ (posedge FCLK_50M)
  96.         begin
  97.                 if(!rst_n) fifo_out_cnt <= 6'b0;
  98.                 else if(s_sate == S_RD) fifo_out_cnt <= fifo_out_cnt + 1;
  99.                 else fifo_out_cnt <= 6'b0;
  100.         end
  101.         //------------------------------------------------------------------
  102.         
  103.         
  104.         
  105.         //------------------------------------------------------------------
  106.         reg [17:0] sram_adr_o;
  107.         assign SRAM_ADR = sram_adr_o;
  108.         always @ (posedge FCLK_50M)
  109.         begin
  110.                 if(!rst_n) sram_adr_o <= 18'd0;
  111.                 else if(s_sate == IDLE) sram_adr_o <= 18'd0;
  112.                 else if(fifo_in_rdusedw == 6'd1) sram_adr_o <= 18'd0;
  113.                 else if(~sram_wel_o) sram_adr_o <= sram_adr_o + 1;
  114.                 else if(~sram_oel_o) sram_adr_o <= sram_adr_o + 1;
  115.         end
  116.         //------------------------------------------------------------------

  117.         
  118.         //------------------------------------------------------------------
  119.         always @ (posedge FCLK_50M)
  120.         begin
  121.                 if(!rst_n) fifo_out_wrreq <= 1'b0;
  122.                 else fifo_out_wrreq <= ~sram_oel_o;
  123.         end
  124.         //------------------------------------------------------------------

  125.         
  126.         //------------------------------------------------------------------
  127.         always @ (posedge FCLK_50M)
  128.         begin
  129.                 if(!rst_n) fifo_out_data <= 16'b0;
  130.                 else if(~sram_oel_o) fifo_out_data <= SRAM_DAT;
  131.         end
  132.         //------------------------------------------------------------------





  133. endmodule[/pay]
  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

171

主题

1029

帖子

101

粉丝
快速回复 在线客服 返回列表 返回顶部