📄 yadmc_sdram16.v
字号:
if(command_refill) command_refill_pending <= 1'b1; endendreg [4:0] state;reg [4:0] next_state;localparam RESET = 5'd0, INIT_PRECHARGEALL = 5'd1, INIT_AUTOREFRESH1 = 5'd2, INIT_AUTOREFRESH2 = 5'd3, INIT_LOADMODE = 5'd4, IDLE = 5'd5, PRECHARGE_BEFORE_REFRESH = 5'd6, AUTOREFRESH = 5'd7, WAIT_REFRESH = 5'd8, PRECHARGE_BEFORE_WRITE = 5'd9, ACTIVATE_BEFORE_WRITE = 5'd10, WRITE = 5'd11, WRITEBURST = 5'd12, PRECHARGE_BEFORE_READ = 5'd13, ACTIVATE_BEFORE_READ = 5'd14, READ = 5'd15, READREG1 = 5'd16, READREG2 = 5'd17, READREG3 = 5'd18, READFIRST = 5'd19, READBURST = 5'd20;always @(posedge sdram_clk) begin if(sdram_rst) begin state <= RESET; end else begin if(state != next_state) $display("state:%d->%d", state, next_state); state <= next_state; endendalways @(state or init_done or prechargeall_done or precharge_done or autorefresh_done or activate_done or evict_needs_rowswitch_r or refill_needs_rowswitch_r or needs_refresh or command_evict or command_refill or command_evict_pending or command_refill_pending or evict_bank or refill_bank or burst_last or burst_finished or burst_counter) begin next_state = state; /* Do nothing with the SDRAM by default */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_we_n_r = 1'b1; sdram_cas_n_r = 1'b1; sdram_ras_n_r = 1'b1; sdram_dqm_r = 1'b1; sdram_ba_r = 2'b00; sdram_dq_drive = 1'b0; adr_load_mode = 1'b0; adr_load_evictrow = 1'b0; adr_load_evictcolumn = 1'b0; adr_load_refillrow = 1'b0; adr_load_refillcolumn = 1'b0; adr_load_A10 = 1'b0; reload_init_counter = 1'b0; reload_prechargeall_counter = 1'b0; reload_precharge_counter = 1'b0; reload_autorefresh_counter = 1'b0; reload_activate_counter = 1'b0; reload_refresh_counter = 1'b0; track_open = 1'b0; track_close = 1'b0; track_closeall = 1'b0; load_track_with_evict = 1'b0; load_track_with_refill = 1'b0; /* Keep the burst counter in reset by default */ reload_burst_counter = 1'b1; cache_we = 4'b0000; load_cache_msb_evict = 1'b0; load_cache_msb_refill = 1'b0; command_ack = 1'b0; case(state) RESET: begin // 0 reload_init_counter = 1'b1; next_state = INIT_PRECHARGEALL; end /* Initialization */ INIT_PRECHARGEALL: begin // 1 if(init_done) begin /* Issue a PRECHARGE ALL command to the SDRAM array */ sdram_cke_r = 1'b0; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b1; sdram_we_n_r = 1'b0; sdram_dqm_r = 1'b0; sdram_ba_r = 2'b00; adr_load_A10 = 1'b1; track_closeall = 1'b1; reload_prechargeall_counter = 1'b1; next_state = INIT_AUTOREFRESH1; end end INIT_AUTOREFRESH1: begin // 2 if(prechargeall_done) begin /* Issue a first AUTO REFRESH command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b0; sdram_we_n_r = 1'b1; sdram_dqm_r = 1'b0; reload_autorefresh_counter = 1'b1; next_state = INIT_AUTOREFRESH2; end end INIT_AUTOREFRESH2: begin // 3 if(autorefresh_done) begin /* Issue a second AUTO REFRESH command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b0; sdram_we_n_r = 1'b1; sdram_dqm_r = 1'b0; reload_autorefresh_counter = 1'b1; next_state = INIT_LOADMODE; end end INIT_LOADMODE: begin // 4 /* Load the Mode Register */ if(autorefresh_done) begin sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b0; sdram_we_n_r = 1'b0; sdram_dqm_r = 1'b0; sdram_ba_r = 2'b00; adr_load_mode = 1'b1; reload_refresh_counter = 1'b1; next_state = IDLE; end end IDLE: begin // 5 if(needs_refresh) begin next_state = PRECHARGE_BEFORE_REFRESH; end else if(command_evict | command_evict_pending) begin /* prepare the read from the cache */ load_cache_msb_evict = 1'b1; next_state = PRECHARGE_BEFORE_WRITE; end else if(command_refill | command_refill_pending) begin /* prepare the write to the cache */ load_cache_msb_refill = 1'b1; next_state = PRECHARGE_BEFORE_READ; end end /* Refresh */ PRECHARGE_BEFORE_REFRESH: begin // 6 /* Issue a PRECHARGE ALL command to the SDRAM array */ sdram_cke_r = 1'b0; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b1; sdram_we_n_r = 1'b0; sdram_dqm_r = 1'b0; sdram_ba_r = 2'b00; adr_load_A10 = 1'b1; track_closeall = 1'b1; reload_prechargeall_counter = 1'b1; next_state = AUTOREFRESH; end AUTOREFRESH: begin // 7 if(prechargeall_done) begin /* Issue an AUTO REFRESH command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b0; sdram_we_n_r = 1'b1; sdram_dqm_r = 1'b0; reload_autorefresh_counter = 1'b1; next_state = WAIT_REFRESH; end end WAIT_REFRESH: begin // 8 if(autorefresh_done) begin reload_refresh_counter = 1'b1; next_state = IDLE; end end /* Write (evict) */ PRECHARGE_BEFORE_WRITE: begin // 9 /* prepare the update of the row tracker */ load_track_with_evict = 1'b1; if(evict_needs_rowswitch_r) begin /* Issue a PRECHARGE BANK command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b1; sdram_we_n_r = 1'b0; sdram_dqm_r = 1'b0; sdram_ba_r = evict_bank; reload_precharge_counter = 1'b1; next_state = ACTIVATE_BEFORE_WRITE; end else begin next_state = WRITE; end end ACTIVATE_BEFORE_WRITE: begin // 10 if(precharge_done) begin /* Issue an ACTIVATE command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b1; sdram_we_n_r = 1'b1; sdram_dqm_r = 1'b0; sdram_ba_r = evict_bank; adr_load_evictrow = 1'b1; /* update row tracking */ track_open = 1'b1; reload_activate_counter = 1'b1; next_state = WRITE; end end WRITE: begin // 11 if(activate_done) begin /* Issue a WRITE command to the SDRAM array, without auto precharge */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b1; sdram_cas_n_r = 1'b0; sdram_we_n_r = 1'b0; sdram_dqm_r = 1'b0; sdram_ba_r = evict_bank; adr_load_evictcolumn = 1'b1; sdram_dq_drive = 1'b1; reload_burst_counter = 1'b0; next_state = WRITEBURST; end end WRITEBURST: begin // 12 reload_burst_counter = 1'b0; /* Now write the 7 other SDRAM words in a burst */ if(burst_finished) begin /* We leave one idle cycle after the write, * check this meets write recovery time requirements for your SDRAM chip. */ /* Evictions are automatically followed by refills. */ /* prepare the write to the cache */ load_cache_msb_refill = 1'b1; next_state = PRECHARGE_BEFORE_READ; end else begin sdram_dq_drive = 1'b1; sdram_dqm_r = 1'b0; end end /* Read (refill) */ PRECHARGE_BEFORE_READ: begin // 13 /* prepare the update of the row tracker */ load_track_with_refill = 1'b1; if(refill_needs_rowswitch_r) begin /* Issue a PRECHARGE BANK command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b1; sdram_we_n_r = 1'b0; sdram_dqm_r = 1'b0; sdram_ba_r = refill_bank; reload_precharge_counter = 1'b1; next_state = ACTIVATE_BEFORE_READ; end else next_state = READ; end ACTIVATE_BEFORE_READ: begin // 14 if(precharge_done) begin /* Issue an ACTIVATE command to the SDRAM array */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b0; sdram_cas_n_r = 1'b1; sdram_we_n_r = 1'b1; sdram_dqm_r = 1'b0; sdram_ba_r = refill_bank; adr_load_refillrow = 1'b1; /* update row tracking */ track_open = 1'b1; reload_activate_counter = 1'b1; next_state = READ; end end READ: begin // 15 if(activate_done) begin /* Issue a READ command to the SDRAM array, without auto precharge */ sdram_cke_r = 1'b1; sdram_cs_n_r = 1'b0; sdram_ras_n_r = 1'b1; sdram_cas_n_r = 1'b0; sdram_we_n_r = 1'b1; sdram_dqm_r = 1'b0; sdram_ba_r = refill_bank; adr_load_refillcolumn = 1'b1; next_state = READREG1; end end READREG1: begin // 16 /* I/Os are registered, so we must wait one cycle for the READ command to reach SDRAM */ sdram_dqm_r = 1'b0; next_state = READREG2; end READREG2: begin // 17 /* We must wait for the SDRAM to drive its DQ pins upon receiving the READ command */ sdram_dqm_r = 1'b0; next_state = READREG3; end READREG3: begin // 18 /* We must also wait for the first word of the burst sent by the SDRAM to reach our input register */ sdram_dqm_r = 1'b0; next_state = READFIRST; end READFIRST: begin // 19 cache_we = 4'b1100; sdram_dqm_r = 1'b0; next_state = READBURST; end READBURST: begin // 20 reload_burst_counter = 1'b0; /* let the burst counter go up */ if(burst_last) begin command_ack = 1'b1; next_state = IDLE; end else begin sdram_dqm_r = 1'b0; cache_we = {burst_counter[0], burst_counter[0], ~burst_counter[0], ~burst_counter[0]}; end end endcaseendendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -