📄 sdram.vhd
字号:
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 + -