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

📄 sdr_sig.v

📁 sdram 控制器的verilog 实现
💻 V
字号:
`timescale 1ns/100ps
`include  "sdr_par.v"
module sdr_sig(
				//input
				clk,
				rst_n,
				i_state,
				c_state,
				sys_addr,
				//output
				sdr_CKE,    // sdr clock enable
				sdr_CSn,    // sdr chip select
				sdr_RASn,   // sdr row address
				sdr_CASn,   // sdr column select
				sdr_WEn,    // sdr write enable
				sdr_BA,     // sdr bank address
				sdr_DMQ,	// sdr dmq 
				sdr_ADDR    // sdr address
				);




//-------------io port declare------------------
input 			clk;
input 			rst_n;
input[2:0] 		i_state;
input[3:0]		c_state;
input[21:0]		sys_addr;
//-----signal connect to sdram hardware---------
output reg		sdr_CKE;
output reg		sdr_CSn;
output reg		sdr_RASn;
output reg		sdr_CASn;
output reg		sdr_WEn;
output reg[1:0]	sdr_BA;
output reg[1:0]	sdr_DMQ;output reg[11:0]sdr_ADDR;
//----parameter declare------------
parameter Tp	= 2;
`define sdr_COMMAND  {sdr_CSn, sdr_RASn, sdr_CASn, sdr_WEn}

//----varibale declare-------------

//--------------main code start-----------------
always@(posedge clk)
	begin
		if(!rst_n)
			begin
				`sdr_COMMAND<=	#Tp	`INHIBIT;
				sdr_CKE		<=	#Tp	1'b1;
				sdr_DMQ		<=	#Tp	2'b11;
				sdr_BA		<=	#Tp	2'b11;
				sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
			end
		else
			begin	
				//-----to handle the init state machine-------
				case(i_state)
					`i_NOP:
						begin
							`sdr_COMMAND<=	#Tp	`NOP;
							sdr_CKE		<=	#Tp	1'b1;		//初始化要求
							sdr_DMQ		<=	#Tp	2'b11;		//初始化要求
							sdr_BA		<=	#Tp	2'b11;
							sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
						end
					`i_tRP,
					`i_tRFC,
					`i_tMRD:
						begin
							`sdr_COMMAND<=	#Tp	`NOP;
							sdr_CKE		<=	#Tp	1'b1;
							sdr_DMQ		<=	#Tp	2'b00;		//清除信号,允许输入输出
							sdr_BA		<=	#Tp	2'b11;
							sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
						end
					`i_PRE:
						begin
							`sdr_COMMAND<=	#Tp	`PRECHARGE;
							sdr_CKE		<=	#Tp	1'b1;
							sdr_DMQ		<=	#Tp	2'b00;
							sdr_BA		<=	#Tp	2'b11;
							//A10=1,so pre-charge all banks
							sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
						end
					`i_AR:
						begin
							`sdr_COMMAND<=	#Tp	`AUTO_REFRESH;
							sdr_CKE		<=	#Tp	1'b1;
							sdr_DMQ		<=	#Tp	2'b00;
							sdr_BA		<=	#Tp	2'b11;
							sdr_ADDR	<=	#Tp	12'b1111_1111_1111;							
						end
					`i_MRS:
						begin
							`sdr_COMMAND<=	#Tp	`LOAD_MODE_REGISTER;
							sdr_CKE		<=	#Tp	1'b1;
							sdr_DMQ		<=	#Tp	2'b00;
							sdr_BA		<=	#Tp	2'b00;		//auto refresh need
							sdr_ADDR	<=	#Tp {
													2'b00,	//A11,A10
													1'b0,	//A9 burst read and write
													2'b00,	//A8,A7
													3'b010, //A6,A5,A4 cas latency=2
													1'b0,	//A3 sequential
													3'b111	//full page operation
												};
							
						end
					`i_ready:
							begin
				//-----------------to handle the cmd state machine----------------
								case(c_state)
									`c_tRFC,
									`c_RW_tRFC,
									`c_tRCD,
									`c_RD_DATA,
									`c_R_tRP,
									`c_WR_DATA,
									`c_W_tRP,
									`c_IDLE:
										begin
											`sdr_COMMAND<=	#Tp	`NOP;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;		//清除信号,允许输入输出
											sdr_BA		<=	#Tp	2'b11;
											sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
										end
									`c_AR,
									`c_RW_AR:
										begin
											`sdr_COMMAND<=	#Tp	`AUTO_REFRESH;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;
											sdr_BA		<=	#Tp	2'b11;
											sdr_ADDR	<=	#Tp	12'b1111_1111_1111;	
										end
									`c_ACTIVE:
										begin
										//-----------send row addr to sdram----------
											`sdr_COMMAND<=	#Tp	`ACTIVE;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;
										//sample bank addr	
											sdr_BA		<=	#Tp	sys_addr[21:20];
										//sample row  addr	
											sdr_ADDR	<=	#Tp	sys_addr[19:8];	
										end
									`c_READ:
										begin
										//----------send read cmd to sdram------------
											`sdr_COMMAND<=	#Tp	`READ;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;
										//----------sample bank addr------------------		
											sdr_BA		<=	#Tp	sys_addr[21:20];
										//----------send col addr---------------------	
											sdr_ADDR	<=	#Tp	{
																	4'b0000,		//A10=0,disable auto precharge
																	sys_addr[7:0]	//A7-A0
																};	
										end
									`c_R_PRE:
										//-----to terminate the full page read transmit--------
										begin
											`sdr_COMMAND<=	#Tp	`PRECHARGE;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;
											sdr_BA		<=	#Tp	2'b11;
											//A10=1,so pre-charge all banks
											sdr_ADDR	<=	#Tp	12'b1111_1111_1111;							
										end	
									`c_WRITE:
										begin
										//----------send read cmd to sdram------------
											`sdr_COMMAND<=	#Tp	`WRITE;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;
										//----------sample bank addr------------------		
											sdr_BA		<=	#Tp	sys_addr[21:20];
										//----------send col addr---------------------	
											sdr_ADDR	<=	#Tp	{
																	4'b0000,		//A10=0,disable auto precharge
																	sys_addr[7:0]	//A7-A0
																};								
										end
									`c_W_PRE:
										begin
										//-----to terminate the full page write transmit--------
											`sdr_COMMAND<=	#Tp	`PRECHARGE;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b11;				//note here
											sdr_BA		<=	#Tp	2'b11;
											//A10=1,so pre-charge all banks
											sdr_ADDR	<=	#Tp	12'b1111_1111_1111;							
										end	
									default:
										begin
											`sdr_COMMAND<=	#Tp	`NOP;
											sdr_CKE		<=	#Tp	1'b1;
											sdr_DMQ		<=	#Tp	2'b00;		
											sdr_BA		<=	#Tp	2'b11;
											sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
										end
								endcase													
							end
					default:
						begin
							`sdr_COMMAND<=	#Tp	`NOP;
							sdr_CKE		<=	#Tp	1'b1;
							sdr_DMQ		<=	#Tp	2'b00;		//清除信号,允许输入输出
							sdr_BA		<=	#Tp	2'b11;
							sdr_ADDR	<=	#Tp	12'b1111_1111_1111;
						end
				endcase
			end
	end

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -