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

📄 sdramcnt.v

📁 sdram控制的内核
💻 V
📖 第 1 页 / 共 2 页
字号:
`include "inc.h"//*******************************************************************************//  S Y N T H E S I Z A B L E      S D R A M     C O N T R O L L E R    C O R E////  This core adheres to the GNU Public License  // //  This is a synthesizable Synchronous DRAM controller Core.  As it stands,//  it is ready to work with 8Mbyte SDRAMs, organized as 2M x 32 at 100MHz//  and 125MHz. For example: Samsung KM432S2030CT,  Fujitsu MB81F643242B.////  The core has been carefully coded so as to be "platform-independent".  //  It has been successfully compiled and simulated under three separate//  FPGA/CPLD platforms://      Xilinx Foundation Base Express V2.1i//      Altera Max+PlusII V9.21//      Lattice ispExpert V7.0//  //  The interface to the host (i.e. microprocessor, DSP, etc) is synchronous//  and supports ony one transfer at a time.  That is, burst-mode transfers//  are not yet supported.  In may ways, the interface to this core is much//  like that of a typical SRAM.  The hand-shaking between the host and the //  SDRAM core is done through the "sdram_busy_l" signal generated by the //  core.  Whenever this signal is active low, the host must hold the address,//  data (if doing a write), size and the controls (cs, rd/wr).  ////  Connection Diagram://  SDRAM side://  sd_wr_l                     connect to -WR pin of SDRAM//  sd_cs_l                     connect to -CS pin of SDRAM//  sd_ras_l                    connect to -RAS pin of SDRAM//  sd_cas_l                    connect to -CAS pin of SDRAM//  sd_dqm[3:0]                 connect to the DQM3,DQM2,DQM1,DQM0 pins//  sd_addx[10:0]               connect to the Address bus [10:0]//  sd_data[31:0]               connect to the data bus [31:0]//  sd_ba[1:0]                  connect to BA1, BA0 pins of SDRAM//   //  HOST side://  mp_addx[22:0]               connect to the address bus of the host. //                              23 bit address bus give access to 8Mbyte//                              of the SDRAM, as byte, half-word (16bit)//                              or word (32bit)//  mp_data_in[31:0]            Unidirectional bus connected to the data out//                              of the host. To use this, enable //                              "databus_is_unidirectional" in INC.H//  mp_data_out[31:0]           Unidirectional bus connected to the data in //                              of the host.  To use this, enable//                              "databus_is_unidirectional" in INC.H//  mp_data[31:0]               Bi-directional bus connected to the host's//                              data bus.  To use the bi-directionla bus,//                              disable "databus_is_unidirectional" in INC.H//  mp_rd_l                     Connect to the -RD output of the host//  mp_wr_l                     Connect to the -WR output of the host//  mp_cs_l                     Connect to the -CS of the host//  mp_size[1:0]                Connect to the size output of the host//                              if there is one.  When set to 0//                              all trasnfers are 32 bits, when set to 1//                              all transfers are 8 bits, and when set to//                              2 all xfers are 16 bits.  If you want the//                              data to be lower order aligned, turn on//                              "align_data_bus" option in INC.H//  sdram_busy_l                Connect this to the wait or hold equivalent//                              input of the host.  The host, must hold the//                              bus if it samples this signal as low.//  sdram_mode_set_l            When a write occurs with this set low,//                              the SDRAM's mode set register will be programmed//                              with the data supplied on the data_bus[10:0].//////  Author:  Jeung Joon Lee  joon.lee@quantum.com,  cmosexod@ix.netcom.com//  //*******************************************************************************////  Hierarchy:////  SDRAM.V         Top Level Module//  HOSTCONT.V      Controls the interfacing between the micro and the SDRAM//  SDRAMCNT.V      This is the SDRAM controller.  All data passed to and from//                  is with the HOSTCONT.//  optional//  MICRO.V         This is the built in SDRAM tester.  This module generates //                  a number of test logics which is used to test the SDRAM//                  It is basically a Micro bus generator. //  /**/ module sdramcnt(			// system level stuff			sys_rst_l,			sys_clk,				// SDRAM connections			sd_wr_l,		    sd_cs_l,			sd_ras_l,			sd_cas_l,			sd_dqm,						// Host Controller connections	    	do_mode_set,	  		do_read,            do_write,            doing_refresh,            sd_addx_mux,            sd_addx10_mux,            sd_rd_ena,            sd_data_ena,            modereg_cas_latency,            modereg_burst_length,            mp_data_mux,			decoded_dqm,            do_write_ack,            do_read_ack,            do_modeset_ack,            pwrup,			// debug            next_state,			autorefresh_cntr,			autorefresh_cntr_l,			cntr_limit		);parameter N1 = 4;// ****************************************////   I/O  DEFINITION//// ****************************************// System level stuffinput	        sys_rst_l;input	        sys_clk;// SDRAM connectionsoutput	        sd_wr_l;output	        sd_cs_l;output	        sd_ras_l;output	        sd_cas_l;output	[(N1-1):0]  sd_dqm;// Host Controller connectionsinput           do_mode_set;input           do_read;input           do_write;output          doing_refresh;output  [1:0]   sd_addx_mux;output  [1:0]   sd_addx10_mux;output          sd_rd_ena;output          sd_data_ena;input   [2:0]   modereg_cas_latency;input   [2:0]   modereg_burst_length;output          mp_data_mux;input	[3:0]	decoded_dqm;output          do_write_ack;output          do_read_ack;output          do_modeset_ack;output	        pwrup;// Debugoutput  [3:0]   next_state;output	[3:0]	autorefresh_cntr;output			autorefresh_cntr_l;output	[12:0]	cntr_limit;// ****************************************//// Memory Elements //// ****************************************//reg     [3:0]	next_state;reg     [7:0]   refresh_timer;reg 	        sd_wr_l;reg		        sd_cs_l;reg		        sd_ras_l;reg		        sd_cas_l;reg     [3:0]   sd_dqm;reg     [1:0]   sd_addx_mux;reg     [1:0]   sd_addx10_mux;reg             sd_data_ena;reg		        pwrup;			// this variable holds the power up conditionreg     [12:0]  refresh_cntr;   // this is the refresh counterreg				refresh_cntr_l;	// this is the refresh counter reset signalreg     [3:0]   burst_length_cntr;reg             burst_cntr_ena;reg             sd_rd_ena;      // read latch gate, active highreg     [12:0]  cntr_limit;reg     [3:0]   modereg_burst_count;reg     [2:0]   refresh_state;reg             mp_data_mux;wire            do_refresh;     // this bit indicates autorefresh is duereg             doing_refresh;  // this bit indicates that the state machine is                                 // doing refresh.reg     [3:0]   autorefresh_cntr;reg             autorefresh_cntr_l;reg             do_write_ack;reg             do_read_ack;reg             do_modeset_ack;reg             do_refresh_ack;wire            Trc_expired, Ref_expired;assign Trc_expired = (autorefresh_cntr == 4'h6); assign Ref_expired = (refresh_cntr == cntr_limit);   //// State Machinealways @(posedge sys_clk or negedge sys_rst_l)  if (~sys_rst_l) begin    next_state	<= `state_powerup;     //state_powerup is b1010    autorefresh_cntr_l <= `LO;	refresh_cntr_l  <= `LO;    pwrup       <= `HI;				// high indicates we've just power'd up or RESET    sd_wr_l     <= `HI;    sd_cs_l     <= `HI;    sd_ras_l    <= `HI;    sd_cas_l    <= `HI;    sd_dqm      <= 4'hF;    sd_data_ena <= `LO;    sd_addx_mux <= 2'b10;           // select the mode reg default value    sd_addx10_mux <= 2'b11;         // select 1 as default    sd_rd_ena   <= `LO;    mp_data_mux <= `LO;//    refresh_cntr<= 13'h0000;    burst_cntr_ena <= `LO;          // do not enable the burst counter    doing_refresh  <= `LO;    do_write_ack <= `LO;            // do not ack as reset default    do_read_ack  <= `LO;            // do not ack as reset default    do_modeset_ack <= `LO;          // do not ack as reset default    do_refresh_ack <= `LO;  end   else case (next_state)         // Power Up state    `state_powerup:  begin                //if next_state is equal to state_powetup then execute the following sentence        next_state  <= `state_precharge;     //state_precharge equal to b1110        sd_wr_l     <= `HI;        sd_cs_l     <= `HI;    	sd_ras_l    <= `HI;    	sd_cas_l    <= `HI;        sd_dqm      <= 4'hF;        sd_data_ena <= `LO;        sd_addx_mux <= 2'b10;        sd_rd_ena   <= `LO;        pwrup       <= `HI;         // this is the power up run        burst_cntr_ena <= `LO;      // do not enable the burst counter		refresh_cntr_l <= `HI;		// allow the refresh cycle counter to count     end    // PRECHARGE both (or all) banks        	    `state_precharge:  begin     //if the next_state is state_precharge,the enable the control signal of SDRAM         sd_wr_l     <= `LO;        sd_cs_l     <= `LO;    	sd_ras_l    <= `LO;    	sd_cas_l    <= `HI;        sd_dqm      <= 4'hF;        sd_addx10_mux <= 2'b11;      // A10 = 1'b1   		next_state  <= `state_idle;        if (do_write_ack)            do_write_ack<= `LO;         // done acknowledging the write request        if (do_read_ack)            do_read_ack <= `LO;         // done acknowledging the read request    end      // Delay Trp     // this delay is needed to meet the minimum precharge to new command    // delay.  For most parts, this is 20nS, which means you need 1 clock cycle    // of NOP at 100MHz    `state_delay_Trp:  begin      //state_delay_Trp equal to b0000        sd_wr_l     <= `HI;        sd_cs_l     <= `HI;      	sd_ras_l    <= `HI;        if ( (refresh_cntr == cntr_limit) & (pwrup == `HI) ) begin            doing_refresh <= `LO;                // refresh cycle is done            refresh_cntr_l  <= `LO;             // ..reset refresh counter            next_state <= `state_modeset;      // if this was power-up, then go and set mode reg        end else begin            doing_refresh <= `HI;        // indicate that we're doing refresh            next_state	 <= `state_auto_refresh;	    end    end    // Autorefresh    `state_auto_refresh: begin        sd_wr_l     <= `HI;        sd_cs_l     <= `LO;    	sd_ras_l    <= `LO;    	sd_cas_l    <= `LO;        sd_addx10_mux <= 2'b01;      // A10 = 0           next_state  <= `state_auto_refresh_dly;        autorefresh_cntr_l  <= `HI;  //allow refresh delay cntr (Trc) to tick        do_refresh_ack <= `HI;      // acknowledge refresh request     end        // This state generates the Trc delay.    // this delay is the delay from the refresh command to the next valid command    // most parts require this to be 60 to 70nS.  So at 100MHz, we need at least    // 6 NOPs.      `state_auto_refresh_dly:  begin          sd_wr_l     <= `HI;          sd_cs_l     <= `HI;          sd_ras_l    <= `HI;          sd_cas_l    <= `HI;          sd_addx10_mux <= 2'b00;      // select ROW again A10 = A20   /*		  casex ( {Trc_expired, Ref_expired, pwrup, (do_write|do_read)} )          // Trc not expired yet          4'b0xxx: begin          		next_state <= `state_auto_refresh_dly;				do_refresh_ack <= `LO;		  end		            // Back-back refreshes not done yet		  4'b10xx: begin

⌨️ 快捷键说明

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