- //上電
- //等待時間100us 取200us
- //tRP=20ns 取30ns
- //tRFC=66ns 取100ns
- //tMRD=2*clk
- //clk=50M Hz
- //SDR_CLK=50M Hz (一般可設置為100M Hz以上)
- //空命令 {CS_N,RAS_N,CAS_N,WE_N}=4'b0111
- //模式寄存器 {CS_N,RAS_N,CAS_N,WE_N}=4'b0000
- //預充電 {CS_N,RAS_N,CAS_N,WE_N}=4'b0010
- //自動刷新 {CS_N,RAS_N,CAS_N,WE_N}=4'b0001
- module sdr_power_up(
- clk, //系統時鐘
- rst,
- pow_done,
- pow_SDR_CLK, //SDRAM時鐘
- pow_CKE, //時鐘使能
- pow_CS_N, //片選信號
- pow_RAS_N, //行地址選通
- pow_CAS_N, //列地址選通
- pow_WE_N, //寫使能
- pow_BA, //Bank地址
- pow_SA, //地址總線
- pow_DQM, //數據掩碼
- pow_DQ //數據總線
- );
- input clk,rst;
- output pow_done;
- output pow_SDR_CLK;
- output pow_CKE;
- output pow_CS_N;
- output pow_RAS_N;
- output pow_CAS_N;
- output pow_WE_N;
- output [1:0] pow_BA;
- output [12:0] pow_SA;
- output [1:0] pow_DQM;
- inout [15:0] pow_DQ;
- reg [13:0] pow_cnt;
- reg pow_done;
- reg pow_CKE;
- reg pow_CS_N;
- reg pow_RAS_N;
- reg pow_CAS_N;
- reg pow_WE_N;
- reg [1:0] pow_BA;
- reg [12:0] pow_SA;
- reg pow_en;
- parameter LMR = 13'b0_0000_0010_0001; // Load Mode Register參數
- parameter bank = 2'b00; // bank地址參數
- //====================================================================
- // 線性序序列機
- //====================================================================
- always@(posedge clk or negedge rst)
- begin
- if(!rst)
- begin //Nop命令
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b1;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b0;
- pow_en <= 1'b0;
- pow_done <= 1'b0;
- end
- else
- begin
- case(pow_cnt)
- 0:begin //Power up上電
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b1;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b0;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- 10000:begin //Nop
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b1;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- 10001:begin //Precharge
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b0;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b0;
- pow_SA[10] <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- 10003:begin //Auto Refresh
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b0;
- pow_CAS_N <= 1'b0;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- 10008:begin //Auto Refresh
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b0;
- pow_CAS_N <= 1'b0;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- 10013:begin //Load Mode Register
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b0;
- pow_CAS_N <= 1'b0;
- pow_WE_N <= 1'b0;
- pow_SA <= LMR;
- pow_CKE <= 1'b1;
- pow_BA <= bank;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- 10015:begin //給Nop命令
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b1;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b0; //結束
- pow_done <= 1'b0;
- end
- 10016:begin //給Nop命令,pow_done=1結束
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b1;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b0;
- pow_done <= 1'b1;
- end
- default:begin //給Nop命令
- pow_CS_N <= 1'b0;
- pow_RAS_N <= 1'b1;
- pow_CAS_N <= 1'b1;
- pow_WE_N <= 1'b1;
- pow_CKE <= 1'b1;
- pow_en <= 1'b1;
- pow_done <= 1'b0;
- end
- endcase
- end
- end
- //=====================================================================
- // SDR_CLK
- //=====================================================================
- assign pow_SDR_CLK = ~clk; //相位相差180度
- //=====================================================================
- // 計數器
- //=====================================================================
- always@(posedge clk or negedge rst)
- begin
- if(!rst) pow_cnt <= 14'd0;
- else if(pow_en)
- begin
- if(pow_cnt == 14'd10016) pow_cnt <= 14'd0;
- else pow_cnt <= pow_cnt + 14'd1;
- end
- else pow_cnt <= pow_cnt;
- end
- //=====================================================================
- endmodule
- //仿真testbench
- `timescale 1ns/100ps
- module sdr_power_up_test1;
- reg clk,rst;
- wire pow_done;
- wire pow_SDR_CLK;
- wire pow_CKE;
- wire pow_CS_N;
- wire pow_RAS_N;
- wire pow_CAS_N;
- wire pow_WE_N;
- wire [1:0] pow_BA;
- wire [12:0] pow_SA;
- wire [1:0] pow_DQM;
- wire [15:0] pow_DQ;
- defparam sdram_model_plus.addr_bits = 13; //使參數一致
- defparam sdram_model_plus.data_bits = 16; //使參數一致
- defparam sdram_model_plus.col_bits = 9; //使參數一致
- defparam sdram_model_plus.mem_sizes = 2*1024*1024; //使參數一致
- //SDRAM仿真模型
- sdr_power_up sdr_power_up(
- .clk(clk),
- .rst(rst),
- .pow_done(pow_done),
- .pow_SDR_CLK(pow_SDR_CLK),
- .pow_CKE(pow_CKE),
- .pow_CS_N(pow_CS_N),
- .pow_RAS_N(pow_RAS_N),
- .pow_CAS_N(pow_CAS_N),
- .pow_WE_N(pow_WE_N),
- .pow_BA(pow_BA),
- .pow_DQM(pow_DQM),
- .pow_SA(pow_SA),
- .pow_DQ(pow_DQ)
- );
- sdram_model_plus sdram_model_plus(
- .Dq(pow_DQ),
- .Addr(pow_SA),
- .Ba(pow_BA),
- .Clk(pow_SDR_CLK),
- .Cke(pow_CKE),
- .Cs_n(pow_CS_N),
- .Ras_n(pow_RAS_N),
- .Cas_n(pow_CAS_N),
- .We_n(pow_WE_N),
- .Dqm(pow_DQM),
- .Debug(1'b1)
- );
- initial
- begin
- clk=1'b1;
- forever #10 clk=~clk;
- end
- initial
- begin
- #0
- rst=1'b0;
- #1
- rst=1'b1;
- #2000000
- $stop;
- #10
- $finish;
- end
- endmodule