module sdram_init( clk , rst_n , //其他信号,举例dout init_done, init_bus );
//参数定义 parameter DATA_W = 20 ; parameter T100us = 10_000 ; parameter TRP = 2 ; parameter TRFC = 7 ; parameter TMRD = 2 ; parameter NOP = 4'b0111 ; parameter PRE = 4'b0010 ; parameter REF = 4'b0001 ; parameter LMR = 4'b0000 ; parameter CODE = 13'b000_000_011_0010 ; parameter CNT_MAX = 10_021 ;
//输入信号定义 input clk ; input rst_n ;
//输出信号定义 output init_done ; output[DATA_W-1:0] init_bus ;
//输出信号reg定义 reg init_done ; wire [DATA_W-1:0] init_bus ;
//中间信号定义 reg [20:0] cnt ; reg sdr_cke ; reg [3:0] sdr_cmd ; reg [1:0] sdr_ba ; reg [12:0] sdr_a ;
wire add_cnt ; wire end_cnt ;
assign init_bus = {sdr_cke, sdr_cmd, sdr_ba, sdr_a};
always @(posedge clk or negedge rst_n)begin if(!rst_n)begin cnt <= 0; end else if(add_cnt)begin if(end_cnt) cnt <= 0; else cnt <= cnt + 1; end end
assign add_cnt = init_done == 0; assign end_cnt = add_cnt && cnt==CNT_MAX - 1 ;
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin sdr_cke <= 1'b0; end else if(add_cnt&&cnt==10_000-1)begin sdr_cke <= 1'b1; end else sdr_cke <= sdr_cke; end
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin sdr_cmd <= NOP; end else if(add_cnt&&cnt==10_001-1)begin sdr_cmd <= PRE; end else if(add_cnt&&cnt==10_003-1)begin sdr_cmd <= REF; end else if(add_cnt&&cnt==10_012-1)begin sdr_cmd <= REF; end else if(add_cnt&&cnt==10_019-1)begin sdr_cmd <= LMR; end else if(add_cnt&&cnt==10_020-1)begin sdr_cmd <= NOP; end else begin sdr_cmd <= NOP; end end
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin sdr_a <= 13'd0; end else if(add_cnt&&cnt==10_001-1)begin sdr_a[10] <= 1'b1; end else if(add_cnt&&cnt==10_019-1)begin sdr_a <= CODE; end else begin sdr_a <= 13'd0; end end
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin init_done <= 1'b0; end else if(add_cnt&&cnt==10_021-1)begin init_done <= 1'b1; end else begin init_done <= init_done; end end
endmodule
|