verilog状态机死机
本帖最后由 fpgaw 于 2010-11-19 06:37 编辑--状态转换---
process(LCLK1)
begin
if LCLK1'event and LCLK1='1' then
sdram_current<=sdram_next;
end if;
end process;
----状态机逻辑---
process(ADS,LHOLD,LWDRD,ADDR_MSB,LBE)
begin
case sdram_current is
----------
when st0=> ready<='1';sdram_en<='0';
if (ADS='0' and LHOLD='1') then
ADDR_MSB(11 downto 0)<=LA(21 downto 10);
sdram_next<=st1;
else
sdram_next<=st0;
end if;
----------
when st1=> sdram_en<='0';
if (ADS='1') then
ready<='0';
sdram_next<=st2;
else
ready<='1';
sdram_next<=st1;--ADS=0
end if;
-----------
when st2=> sdram_en<='0';
if (ADDR_MSB(11 downto 0)="000000000011" and LBE(3 downto 0)="1111") then
sdram_addr(7 downto 0)<=LA(9 downto 2);
sdram_next<=st3;--valid address
else
sdram_addr(7 downto 0)<=sdram_addr(7 downto 0);
sdram_next<=st0;--invalid address
end if;
-----------
when st3=> ready<='0';
if(LWDRD='1') then
sdram_we<='1';--write data
elsif(LWDRD='0') then
sdram_we<='0';--read data
end if;
sdram_next<=st4;
------------
when st4=> ready<='0';
sdram_en<='1'; ---enable sdram chip select
sdram_next<=st5;
------------
when st5=> ready<='1';
sdram_en<='0';
sdram_next<=st0;--finish one time operation
------------
when others=> ready<='1';
sdram_en<='0';
sdram_next<=st0;
------------
end case;
end process; 本帖最后由 fpgaw 于 2010-7-3 06:12 编辑
以上是我的VHDL代码,请各位路过的帮忙看看,解决问题给你们加分<br>
我用MODELSIM6.1F仿真,发现状态机进入ST2状态就停止了,我看了好久都没发现是那儿错了。<br>
不管运行多久,状态机就是停在ST2不动....很郁闷<br>
高手请帮忙..............
[ 我学了不久,可能没有指到点子上,望见谅!<br>
<br>
<br>
<br>
--状态转换---<br>
process(LCLK1) --这个进程中是否应该设置状态机的初始值st0?<br>
begin<br>
if LCLK1'event and LCLK1='1' then<br>
sdram_current<=sdram_next;<br>
end if;<br>
end process;<br>
<br>
----状态机逻辑---<br>
process(ADS,LHOLD,LWDRD,ADDR_MSB,LBE) --敏感信号表中是否应该包含sdram_current?<br>
begin<br>
case sdram_current is<br>
----------<br>
when st0=> ready<='1';<br>
sdram_en<='0';<br>
if (ADS='0' and LHOLD='1') then <br>
ADDR_MSB(11 downto 0)<=LA(21 downto 10);<br>
sdram_next<=st1;<br>
else<br>
sdram_next<=st0;<br>
end if;<br>
---------- <br>
when st1=> sdram_en<='0'; <br>
if (ADS='1') then<br>
ready<='0';<br>
sdram_next<=st2;<br>
else<br>
ready<='1';<br>
sdram_next<=st1; --ADS=0<br>
end if;<br>
-----------<br>
when st2=> sdram_en<='0';<br>
if (ADDR_MSB(11 downto 0)="000000000011" and LBE(3 downto 0)="1111") then<br>
sdram_addr(7 downto 0)<=LA(9 downto 2);<br>
sdram_next<=st3;--valid address<br>
else<br>
sdram_addr(7 downto 0)<=sdram_addr(7 downto 0);<br>
sdram_next<=st0;--invalid address<br>
end if;<br>
-----------<br>
when st3=> ready<='0';<br>
if(LWDRD='1') then<br>
sdram_we<='1'; --write data<br>
elsif(LWDRD='0') then<br>
sdram_we<='0';--read data<br>
end if;<br>
sdram_next<=st4; --这条语句为什么要放在这里?游离于case语句之外了?<br>
------------<br>
when st4=> ready<='0';<br>
sdram_en<='1'; ---enable sdram chip select<br>
sdram_next<=st5;<br>
------------<br>
when st5=> ready<='1';<br>
sdram_en<='0';<br>
sdram_next<=st0; --finish one time operation<br>
------------<br>
when others=> ready<='1';<br>
sdram_en<='0';<br>
sdram_next<=st0; <br>
------------<br>
end case;<br>
end process;
页:
[1]