SDRAM 不帶自動預充電寫操作

weixin_53288871發表於2020-12-26

                                                   

  1. //不帶自動預充電寫操作
  2. //tRCD = 20ns, 取30ns 
  3. //tWR = 1clk + 7.5ns
  4. //tRP = 20ns, 取30ns 
  5. //tRAS(max) = 12_0000ns, tRAS(min) = 44ns
  6. //tRC(min) = 66ns
  7. //clk=50M Hz
  8. //預充電    {CS_N,RAS_N,CAS_N,WE_N} = 4'b0010
  9. //空命令    {CS_N,RAS_N,CAS_N,WE_N} = 4'b0111
  10. //寫命令    {CS_N,RAS_N,CAS_N,WE_N} = 4'b0100
  11. //啟用命令 {CS_N,RAS_N,CAS_N,WE_N} = 4'b0011
  12. //BL = 4
  13.  
  14. module sdr_w_n_a(
  15.       clk,
  16.       rst,
  17.       w_en,
  18.       w_done,
  19.       w_SDR_CLK,
  20.       w_CKE,
  21.       w_CS_N,
  22.       w_RAS_N,
  23.       w_CAS_N,
  24.       w_WE_N,
  25.       w_BA,
  26.       w_SA,
  27.       w_DQM,
  28.       w_DQ
  29. ); 
  30. input   clk,rst;
  31. input   w_en;
  32.  
  33. output w_done;
  34. output w_SDR_CLK;
  35. output w_CKE;
  36. output w_CS_N;
  37. output w_RAS_N;
  38. output w_CAS_N;
  39. output w_WE_N;
  40. output [1:0] w_BA;
  41. output [12:0] w_SA;
  42. output [1:0] w_DQM;
  43. output [15:0] w_DQ;
  44.  
  45. reg [3:0] w_cnt;
  46. reg w_done;
  47. reg w_CKE;
  48. reg w_CS_N;
  49. reg w_RAS_N;
  50. reg w_CAS_N;
  51. reg w_WE_N;
  52. reg [12:0] w_SA;
  53. reg [1:0] w_DQM;
  54. reg [1:0] w_BA;
  55. reg [15:0] w_DQ;
  56.  
  57. parameter   row = 13'b0_0000_0000_0000;   //行地址
  58. parameter   col = 9'b0_0000_0000;                //列地址
  59. parameter   bank = 2'b00;                               //bank地址
  60.  
  61. //==============================================
  62. //線性序列機
  63. //==============================================
  64.  
  65. always@(posedge clk or negedge rst)   
  66. begin
  67.     if(!rst)
  68.     begin
  69.          w_CS_N  <= 1'b0;
  70.          w_RAS_N <= 1'b1;
  71.          w_CAS_N <= 1'b1;
  72.          w_WE_N  <= 1'b1; 
  73.          w_CKE <= 1'b0;
  74.          w_done <= 1'b0;
  75.     end
  76.     else
  77.     begin
  78.         case(w_cnt)
  79.         0:begin                                //Active
  80.                 w_CS_N  <= 1'b0;
  81.                 w_RAS_N <= 1'b0;
  82.                 w_CAS_N <= 1'b1;
  83.                 w_WE_N  <= 1'b1; 
  84.                 w_CKE <= 1'b1;
  85.                 w_done <= 1'b0;
  86.                 w_SA <= row;
  87.                 w_BA <= bank;       
  88.            end
  89.         2:begin                                //Write
  90.                 w_CS_N  <= 1'b0;
  91.                 w_RAS_N <= 1'b1;
  92.                 w_CAS_N <= 1'b0;
  93.                 w_WE_N  <= 1'b0; 
  94.                 w_CKE <= 1'b1;
  95.                 w_done <= 1'b0;
  96.                 w_DQM <= 1'b0;  
  97.                 w_SA <= col;
  98.                 w_SA[10] <= 1'b0;
  99.                 w_BA <= bank;
  100.                 w_DQ <= 16'd0; 
  101.            end
  102.         3:begin                              //Nop
  103.                 w_CS_N  <= 1'b0;
  104.                 w_RAS_N <= 1'b1;
  105.                 w_CAS_N <= 1'b1;
  106.                 w_WE_N  <= 1'b1; 
  107.                 w_DQM <= 1'b0;
  108.                 w_DQ <= 16'd1;
  109.            end
  110.         4:begin                             //Nop
  111.                 w_CS_N  <= 1'b0;
  112.                 w_RAS_N <= 1'b1;
  113.                 w_CAS_N <= 1'b1;
  114.                 w_WE_N  <= 1'b1;
  115.                 w_DQM <= 1'b0;
  116.                 w_DQ <= 16'd2;
  117.            end
  118.         5:begin                              //Nop
  119.                 w_CS_N  <= 1'b0;
  120.                 w_RAS_N <= 1'b1;
  121.                 w_CAS_N <= 1'b1;
  122.                 w_WE_N  <= 1'b1;
  123.                 w_DQM <= 1'b0;
  124.                 w_DQ <= 16'd3;
  125.            end
  126.         7:begin                              //Precharge
  127.                 w_CS_N  <= 1'b0;
  128.                 w_RAS_N <= 1'b0;
  129.                 w_CAS_N <= 1'b1;
  130.                 w_WE_N  <= 1'b0; 
  131.                 w_CKE <= 1'b1;
  132.                 w_done <= 1'b0;
  133.                 w_SA[10] <= 1'b1;
  134.                 w_BA <= bank;
  135.            end
  136.         9:begin                              //結束給Nop命令
  137.                 w_CS_N  <= 1'b0;
  138.                 w_RAS_N <= 1'b1;
  139.                 w_CAS_N <= 1'b1;
  140.                 w_WE_N  <= 1'b1; 
  141.                 w_CKE <= 1'b0;
  142.                 w_done <= 1'b1;
  143.            end
  144.         10:begin                             //結束給Nop命令
  145.                   w_CS_N  <= 1'b0;
  146.                   w_RAS_N <= 1'b1;
  147.                   w_CAS_N <= 1'b1;
  148.                   w_WE_N  <= 1'b1; 
  149.                   w_CKE <= 1'b0;
  150.                   w_done <= 1'b1;
  151.            end
  152.         default:begin                              //其他給Nop命令
  153.                           w_CS_N  <= 1'b0;
  154.                           w_RAS_N <= 1'b1;
  155.                           w_CAS_N <= 1'b1;
  156.                           w_WE_N  <= 1'b1; 
  157.                           w_CKE <= 1'b1;
  158.                           w_done <= 1'b0;
  159.                      end
  160.         endcase 
  161.     end
  162. end
  163.  
  164. //==============================================
  165. // 計數器
  166. //==============================================
  167.  
  168. always@(posedge clk or negedge rst)   
  169. begin
  170.      if(!rst)                                     w_cnt <= 4'd0;
  171.      else if(w_en & (!w_done))
  172.      begin
  173.           if(w_cnt == 4'd10)             w_cnt <= 4'd0;
  174.           else                                    w_cnt <= w_cnt + 4'd1;
  175.      end 
  176.      else                                         w_cnt <= w_cnt;
  177.       
  178. end
  179.  
  180. //==============================================
  181. // SDR_CLK
  182. //==============================================
  183.  
  184. assign   w_SDR_CLK = ~clk;   //相位相差180度
  185.  
  186. //==============================================
  187.  
  188. endmodule

相關文章