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

📄 sdram.vhd

📁 SDRAM基础性控制核 很有用的 VHDL状态机实现
💻 VHD
📖 第 1 页 / 共 2 页
字号:
        WHEN WRITE_REFRESH =>
          IF CMDACK = '1' THEN
             WRITESTATE <= WRITE_REFRESH_NOP;
          END IF;
        WHEN WRITE_REFRESH_NOP =>  
        
          IF sig_write='1' THEN
            WRITESTATE <=WRITEa;
          ELSIF COUNT_DATA=100 THEN
             WRITESTATE <=WRITE_REFRESH;
                END IF;
        WHEN WRITEa =>
          IF CMDACK = '1' THEN
            WRITESTATE <= WRITE_NOP;
          END IF;
        WHEN WRITE_NOP =>
          IF COUNT_DATA = 256 THEN     -----------产生CMDACK的时间一定固定吗?使用COUNT_DATA计数存在潜在的错误
            WRITESTATE <= WRITE_TERMINATE;
          END IF;
        WHEN WRITE_TERMINATE =>
          IF CMDACK ='1' THEN
            WRITESTATE <= WRITE_TERMINATE_NOP;
          END IF;
        WHEN WRITE_TERMINATE_NOP =>
           IF COUNT_DATA =12  THEN
            WRITESTATE <= WRITE_PRE;------changed here!!!
           END IF;
        WHEN OTHERS =>
          WRITESTATE <= WRITE_IDLE;
      END CASE;
     ELSE
        WRITESTATE <= WRITE_IDLE;
     END IF;
 END IF;
END PROCESS;
-----------------------------------------
PROCESS(CLK)
BEGIN
  IF CLK = '0' AND CLK'EVENT THEN
    
      IF READSTATE = READ_IDLE OR READSTATE=READ_PRE OR READSTATE=READ_REFRESH OR READSTATE = READA  THEN  
        COUNT_READ <= (others=>'0');
      ELSE
        COUNT_READ <= COUNT_READ + 1;
      END IF;
  END IF;
  
END PROCESS;
PROCESS(RESET,CLK)----------------READ SDRAM
BEGIN
 IF RESET='0' THEN
     READSTATE <= READ_IDLE;
  ELSIF CLK = '0' AND CLK'EVENT THEN
    IF PRESENTSTATE = IDLE or PRESENTSTATE = save_data THEN
       READSTATE <= READ_IDLE;
    ELSIF PRESENTSTATE = READ_DATA THEN
      CASE READSTATE IS 
        WHEN READ_IDLE =>
             READSTATE <= READ_PRE;
        WHEN READ_PRE =>
          IF CMDACK = '1' THEN
             READSTATE <= READ_PRE_NOP;
		  END IF;
        WHEN READ_PRE_NOP =>
            IF COUNT_READ=10 THEN
                READSTATE <= READ_REFRESH;
            END IF;
        WHEN READ_REFRESH =>
          IF CMDACK = '1' THEN
             READSTATE <= READ_REFRESH_NOP;
          END IF;
        WHEN READ_REFRESH_NOP =>
                IF sig_read='1' THEN
                    READSTATE <= READa;
                ELSIF COUNT_READ=100 THEN
                    READSTATE <=READ_REFRESH;
                END IF;
        WHEN READa =>
          IF CMDACK = '1' THEN
             READSTATE <= READ_NOP;
          END IF;
        WHEN READ_NOP =>
          IF COUNT_READ=257 THEN------************2008.03.15 re-debuged
             READSTATE <= READ_TERMINATE;
         END IF;
        WHEN READ_TERMINATE =>
         IF CMDACK='1' THEN
              READSTATE<=READ_TERMINATE_NOP;
         END IF;
        WHEN READ_TERMINATE_NOP =>
          IF COUNT_READ=272 THEN
              READSTATE<=READ_PRE; --changed here!!!
          END IF;
        WHEN OTHERS =>
          READSTATE <= READ_IDLE;
      END CASE;
    END IF;
  END IF;
END PROCESS;

process(clk)
BEGIN
 if clk'event and clk ='1' then
  IF PRESENTSTATE = SAVE_DATA THEN
    IF WRITESTATE = WRITE_IDLE THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
      RESET_ADDR<='0';
    ELSIF WRITESTATE = WRITE_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF WRITESTATE = WRITEa THEN
      CMD <= "010";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF WRITESTATE = WRITE_PRE THEN
      CMD <= "100";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
      RESET_ADDR<='1';
    ELSIF WRITESTATE = WRITE_PRE_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF WRITESTATE = WRITE_TERMINATE THEN
      CMD <= "100";
      ADDRESSCLK <= '1';
      ADDRESS <= ADDRESSRW;
    ELSIF WRITESTATE = WRITE_TERMINATE_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF WRITESTATE = WRITE_REFRESH THEN
      CMD <= "011";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF WRITESTATE = WRITE_REFRESH_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    END IF;
  ELSIF PRESENTSTATE = READ_DATA THEN
    IF READSTATE = READ_IDLE THEN
      RESET_ADDR<='0';
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READ_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READa THEN
      RESET_ADDR<='1';
      CMD <= "001";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READ_PRE THEN
      CMD <= "100";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
      RESET_ADDR<='1';
    ELSIF READSTATE = READ_PRE_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READ_TERMINATE_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '1';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READ_TERMINATE THEN
      CMD <= "100";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READ_REFRESH_NOP THEN
      CMD <= "000";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    ELSIF READSTATE = READ_REFRESH THEN
      CMD <= "011";
      ADDRESSCLK <= '0';
      ADDRESS <= ADDRESSRW;
    END IF;
  ELSIF PRESENTSTATE = IDLE THEN
    IF INISTATE = NOP THEN
       --         FLAG <= '0';
      CMD <= "000";
      ADDRESS <= "0000000000000000000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = INI_PRECHARGE THEN
      CMD <= "100";
      ADDRESS <= "0000000000000000000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = INI_PRECHARGE_NOP THEN
       --         FLAG <= '1';
      CMD <= "000";
      ADDRESS <= "0000000000000000000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = INI_REFRESH_NOP THEN
      CMD <= "000";
      ADDRESS <= "0000000000000000000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = LOADREG1_NOP THEN
      CMD <= "000";
      ADDRESS <= "0000000000000000000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = LOADREG2_NOP THEN
      CMD <= "000";
      ADDRESS <= "0000000000000000000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = LOADMODE THEN
      CMD <= "101";
      ADDRESS <= "0000000000000000100111";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = LOADREG1 THEN
      CMD <= "110";
      ADDRESS <= "0000000000000100011010";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = LOADREG2 THEN
      CMD <= "111";
      ADDRESS <= "0000000000000010000000";
      ADDRESSCLK <= '0';
    ELSIF INISTATE = INI_REFRESH THEN
      CMD <= "011";
      ADDRESSCLK <= '0';
    END IF;
  end if;  
  END IF;
END PROCESS;
-------------------------------------------
----------------------------------
PROCESS(CLK,RESET)
BEGIN
    IF RESET='0' THEN
       DATAVALID<='0';
     --  DATADELAY<=(OTHERS=>'0');
    ELSIF CLK'EVENT AND CLK='1' THEN
        IF  READSTATE=READ_NOP and COUNT_READ>10 THEN   ----2008.03.16
            DATAVALID<='1';
        ELSif COUNT_READ>266 then
            DATAVALID<='0';
        END IF;

    END IF;
END PROCESS;


--------------------------------------------------------------
U1:ADDR
   PORT MAP(ADDRESSCLK,LEN,ADDRESSRW,ADDR_FULL_reg,RESET,RESET_ADDR);
U2:SDR_SDRAM
   PORT MAP(CLK,RESET,ADDRESS,CMD,CMDACK,data_in,
            TO_ld,SA,BA,RAS,CAS,WE,DQ,IDATAVALIDTEMP);

--------------------------------------------------------

end sdram_a;

⌨️ 快捷键说明

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