⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yadmc_sdram16.v

📁 基于FPGA的SDRAM控制器Verilog代码
💻 V
📖 第 1 页 / 共 2 页
字号:
		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 + -