SDRAM上電

                                                               

  1. //上電
  2. //等待時間100us 取200us
  3. //tRP=20ns 取30ns
  4. //tRFC=66ns 取100ns
  5. //tMRD=2*clk
  6. //clk=50M Hz
  7. //SDR_CLK=50M Hz (一般可設置為100M Hz以上)
  8. //空命令     {CS_N,RAS_N,CAS_N,WE_N}=4'b0111
  9. //模式寄存器 {CS_N,RAS_N,CAS_N,WE_N}=4'b0000
  10. //預充電     {CS_N,RAS_N,CAS_N,WE_N}=4'b0010
  11. //自動刷新   {CS_N,RAS_N,CAS_N,WE_N}=4'b0001
  12.  
  13. module sdr_power_up(
  14.      clk,                          //系統時鐘
  15.      rst,
  16.      pow_done,
  17.      pow_SDR_CLK,    //SDRAM時鐘
  18.      pow_CKE,             //時鐘使能
  19.      pow_CS_N,           //片選信號
  20.      pow_RAS_N,        //行地址選通
  21.      pow_CAS_N,        //列地址選通
  22.      pow_WE_N,          //寫使能
  23.      pow_BA,               //Bank地址
  24.      pow_SA,               //地址總線
  25.      pow_DQM,           //數據掩碼
  26.      pow_DQ               //數據總線
  27. );
  28.  
  29. input  clk,rst;
  30.  
  31. output pow_done;
  32. output pow_SDR_CLK;
  33. output pow_CKE;
  34. output pow_CS_N;
  35. output pow_RAS_N;
  36. output pow_CAS_N;
  37. output pow_WE_N;
  38. output [1:0] pow_BA;
  39. output [12:0] pow_SA;
  40. output [1:0] pow_DQM;
  41.  
  42. inout [15:0] pow_DQ;
  43.  
  44. reg [13:0] pow_cnt;
  45. reg pow_done;
  46. reg pow_CKE;
  47. reg pow_CS_N;
  48. reg pow_RAS_N;
  49. reg pow_CAS_N;
  50. reg pow_WE_N;
  51. reg [1:0] pow_BA;
  52. reg [12:0] pow_SA;
  53. reg pow_en;
  54.  
  55. parameter LMR = 13'b0_0000_0010_0001 // Load Mode Register參數
  56. parameter bank = 2'b00;                               // bank地址參數
  57.  
  58. //====================================================================
  59. // 線性序序列機
  60. //====================================================================
  61.  
  62. always@(posedge clk or negedge rst)   
  63. begin 
  64.     if(!rst)
  65.     begin                                     //Nop命令
  66.         pow_CS_N    <= 1'b0;
  67.         pow_RAS_N <= 1'b1;
  68.         pow_CAS_N <= 1'b1;
  69.         pow_WE_N   <= 1'b1;
  70.         pow_CKE      <= 1'b0;
  71.         pow_en         <= 1'b0;
  72.         pow_done     <= 1'b0
  73.     end
  74.     else
  75.     begin
  76.         case(pow_cnt)
  77.         0:begin                                    //Power up上電
  78.                 pow_CS_N   <= 1'b0;
  79.                 pow_RAS_N <= 1'b1;
  80.                 pow_CAS_N <= 1'b1;
  81.                 pow_WE_N   <= 1'b1;
  82.                 pow_CKE      <= 1'b0;
  83.                 pow_en         <= 1'b1;
  84.                 pow_done     <= 1'b0
  85.             end
  86.        10000:begin                                //Nop
  87.                       pow_CS_N   <= 1'b0;
  88.                       pow_RAS_N <= 1'b1;
  89.                       pow_CAS_N <= 1'b1;
  90.                       pow_WE_N   <= 1'b1;
  91.                       pow_CKE      <= 1'b1;
  92.                       pow_en         <= 1'b1;
  93.                       pow_done     <= 1'b0
  94.                   end
  95.        10001:begin                               //Precharge
  96.                        pow_CS_N    <= 1'b0;
  97.                        pow_RAS_N <= 1'b0;
  98.                        pow_CAS_N <= 1'b1;
  99.                        pow_WE_N   <= 1'b0;
  100.                        pow_SA[10]  <= 1'b1;
  101.                        pow_CKE      <= 1'b1;
  102.                        pow_en         <= 1'b1
  103.                        pow_done     <= 1'b0
  104.                    end
  105.        10003:begin                               //Auto Refresh
  106.                       pow_CS_N    <= 1'b0;
  107.                       pow_RAS_N <= 1'b0;
  108.                       pow_CAS_N <= 1'b0;
  109.                       pow_WE_N   <= 1'b1;
  110.                       pow_CKE      <= 1'b1;
  111.                       pow_en         <= 1'b1
  112.                       pow_done     <= 1'b0
  113.                   end                   
  114.        10008:begin                               //Auto Refresh
  115.                       pow_CS_N   <= 1'b0;
  116.                       pow_RAS_N <= 1'b0;
  117.                       pow_CAS_N <= 1'b0;
  118.                       pow_WE_N   <= 1'b1;
  119.                       pow_CKE      <= 1'b1;
  120.                       pow_en         <= 1'b1;  
  121.                       pow_done     <= 1'b0
  122.                   end
  123.        10013:begin                                //Load Mode Register
  124.                       pow_CS_N    <= 1'b0;
  125.                       pow_RAS_N <= 1'b0;
  126.                       pow_CAS_N <= 1'b0;
  127.                       pow_WE_N   <= 1'b0;
  128.                       pow_SA        <= LMR;
  129.                       pow_CKE      <= 1'b1
  130.                       pow_BA        <= bank;
  131.                       pow_en         <= 1'b1;
  132.                       pow_done     <= 1'b0;
  133.                   end
  134.        10015:begin                                  //給Nop命令
  135.                        pow_CS_N    <= 1'b0;
  136.                        pow_RAS_N <= 1'b1;
  137.                        pow_CAS_N <= 1'b1;
  138.                        pow_WE_N   <= 1'b1
  139.                        pow_CKE      <= 1'b1;     
  140.                        pow_en         <= 1'b0 //結束
  141.                        pow_done     <= 1'b0;                
  142.                    end     
  143.        10016:begin                                    //給Nop命令,pow_done=1結束
  144.                        pow_CS_N    <= 1'b0;
  145.                        pow_RAS_N <= 1'b1;
  146.                        pow_CAS_N <= 1'b1;
  147.                        pow_WE_N   <= 1'b1
  148.                        pow_CKE      <= 1'b1;
  149.                        pow_en         <= 1'b0;
  150.                        pow_done     <= 1'b1;
  151.                    end
  152.        default:begin                                   //給Nop命令
  153.                         pow_CS_N   <= 1'b0;
  154.                         pow_RAS_N <= 1'b1;
  155.                         pow_CAS_N <= 1'b1;
  156.                         pow_WE_N  <= 1'b1
  157.                         pow_CKE     <= 1'b1;
  158.                         pow_en        <= 1'b1;
  159.                         pow_done    <= 1'b0
  160.                     end
  161.         endcase
  162.     end
  163. end
  164.  
  165. //=====================================================================
  166. // SDR_CLK
  167. //=====================================================================
  168.  
  169. assign pow_SDR_CLK = ~clk; //相位相差180度
  170.  
  171. //=====================================================================
  172. // 計數器
  173. //=====================================================================
  174.  
  175. always@(posedge clk or negedge rst)   
  176. begin
  177.     if(!rst)                                       pow_cnt <= 14'd0;
  178.     else if(pow_en)
  179.     begin
  180.         if(pow_cnt == 14'd10016)   pow_cnt <= 14'd0;
  181.         else                                      pow_cnt <= pow_cnt + 14'd1;
  182.     end 
  183.     else                                          pow_cnt <= pow_cnt;    
  184. end
  185. //=====================================================================
  186.  
  187. endmodule


  1. //仿真testbench
  2.  
  3. `timescale 1ns/100ps
  4.  
  5. module sdr_power_up_test1;
  6. reg  clk,rst;
  7. wire pow_done;
  8. wire pow_SDR_CLK;
  9. wire pow_CKE;
  10. wire pow_CS_N;
  11. wire pow_RAS_N;
  12. wire pow_CAS_N;
  13. wire pow_WE_N;
  14. wire [1:0] pow_BA;
  15. wire [12:0] pow_SA;
  16. wire [1:0] pow_DQM;
  17. wire [15:0] pow_DQ;
  18.  
  19. defparam sdram_model_plus.addr_bits =  13;                              //使參數一致
  20. defparam sdram_model_plus.data_bits =   16;                              //使參數一致
  21. defparam sdram_model_plus.col_bits  =    9;                                //使參數一致
  22. defparam sdram_model_plus.mem_sizes =    2*1024*1024;         //使參數一致
  23.  
  24. //SDRAM仿真模型    
  25. sdr_power_up sdr_power_up(
  26.     .clk(clk),
  27.     .rst(rst),
  28.     .pow_done(pow_done),
  29.     .pow_SDR_CLK(pow_SDR_CLK),
  30.     .pow_CKE(pow_CKE),
  31.     .pow_CS_N(pow_CS_N),
  32.     .pow_RAS_N(pow_RAS_N),
  33.     .pow_CAS_N(pow_CAS_N),
  34.     .pow_WE_N(pow_WE_N),
  35.     .pow_BA(pow_BA),
  36.     .pow_DQM(pow_DQM),
  37.     .pow_SA(pow_SA),
  38.     .pow_DQ(pow_DQ)
  39. );
  40.  
  41. sdram_model_plus sdram_model_plus(
  42.     .Dq(pow_DQ),
  43.     .Addr(pow_SA),
  44.     .Ba(pow_BA),
  45.     .Clk(pow_SDR_CLK),
  46.     .Cke(pow_CKE),
  47.     .Cs_n(pow_CS_N),
  48.     .Ras_n(pow_RAS_N),
  49.     .Cas_n(pow_CAS_N),
  50.     .We_n(pow_WE_N),
  51.     .Dqm(pow_DQM),
  52.     .Debug(1'b1)
  53. );
  54.  
  55. initial
  56. begin
  57.     clk=1'b1;
  58.     forever #10 clk=~clk;  
  59. end
  60.  
  61. initial
  62. begin
  63.     #0  
  64.     rst=1'b0
  65.     #1  
  66.     rst=1'b1;  
  67.     #2000000
  68.     $stop;
  69.     #10 
  70.     $finish;
  71. end
  72.  
  73. endmodule
  74.  



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值