2013-05-23 2 views
0

수년 후에 VHDL을 다시 방문합니다. 일부 오버플로 기간에 카운터 트리거가있는 기본 상태 시스템을 설정하려고합니다.상태 천이 하강

어떤 이유로 m_tick 클럭의 하강 에지에서 상태 전환이 발생합니다. 상태 프로세스에서 m_tick < = '1'을 기반으로 상승 에지에서만 전환이 발생해야합니까? 나는 뭔가를 간과해야합니다.

isim에서 테스트하고 있습니다. 나는 아마도 내가별로 영리하지 않을 것이라고 확신한다.

감사합니다.

entity nes_ctl is 
generic(
     N: integer := 3;  --17 bit overflow 131k 
); 
port(
     clk : in std_logic; 
     n_reset : in std_logic 
); 
end nes_ctl; 

architecture Behavioral of nes_ctl is 

signal count_reg, count_next: unsigned(N-1 downto 0); --counter to produce tick 
signal m_tick: std_logic; 
--state variable 
type state_type is (s0,s1,s2,s3,s4,s5); 
signal state_reg, state_next: state_type; 
signal reset: std_logic; --inverted reset signal 

begin 

reset <= not(n_reset); --invert the reset signal 

--syncronos logic 
process(clk) 
begin 
    if(reset= '1') then 
     count_reg <= (others=>'0'); 
     state_reg <= s0; 
    elsif (clk'event and clk = '1') then 
     count_reg <= count_next; 
     state_reg <= state_next; 
    end if; 
end process; 

count_next <= count_reg +1;  --increment counter, will overflow 
m_tick <= '1' when count_reg = 0 else '0';  -- tick on every overflow 

--STATE MACHINE 
process(m_tick) 
begin 
    if(m_tick <= '1') then --only when m_tick goes high 
     case state_reg is 
      when s0 => 
       state_next <= s1; 
      when s1 => 
       state_next <= s2; 
      when s2 => 
       state_next <= s3; 
      when s3 => 
       state_next<= s4; 
      when s4 => 
       state_next<= s5; 
      when s5 => 
       state_next <= s0; 
     end case; 
    else 
     state_next <= state_reg; --keep same state. no  latches. 
    end if; 
end process; 


end Behavioral; 
+1

을 무엇 관계 연산자'<='do std_logic? 상승 에지를 감지하고 싶다면'rising_edge (m_tick) '이 명백한 방법이 될 것입니다. –

+0

좋은 지적입니다. 는 if (m_tick = '1')이어야합니다. – fragment

+0

내 논리는 m_tick이 프로세스를 트리거했기 때문에 m_tick에 우위가 있다는 것입니다. if (m_tick = '1')는 상승 에지인지 확인하는 검사입니다. 수표와 같은 기본적인 표준은 무엇입니까? 당신과 같은 rising_edge (m_tick) sugges? – fragment

답변

4

m_tick < = '1'언제든지 m_tick이 아니라 상승 에지, 낮은 사실이 될 것입니다. m_tick을 시계로 사용하려면 clk에서와 같이 m_tick'event 및 m_tick = '1'을 사용해야합니다. 당신이 클럭 신호를 가능하게 할 m_tick의 상승 에지를하려는 대신하는 경우 CLK 신호와 클럭에 과정이 필요하고 지연 버전과 비교하여 m_tick의 상승 에지를 감지 :

process(clk) 
begin 
    if (clk'event and clk = '1') then 
     m_tick_q <= m_tick; 

     -- only when m_tick goes high 
     if m_tick='1' and m_tick_q='0' then 
      case state_reg is 
      ... 
+0

"m_tick <= '1'은 m_tick이 낮을 때마다 true이며, 단지 상승 에지가 아닙니다." 왜 m_tick이 낮을지라도 사실 일 것이라고 설명 할 수 있습니까? 상태 머신을 시계보다 느리게 실행하려고 시도 할 때 어떤 방법을 권하고 싶습니까? – fragment

+0

실제로 m_tick은 0 또는 1 일 수 있으므로 m_tick <= 1은 항상 true이고 시뮬레이션에서는 m_tick이 변경 될 때마다 프로세스가 실행됩니다. 그러나 실제 하드웨어에서는 이것이 사실이 아니며 프로세스가 계속 실행됩니다 (예 : 비동기 논리). 주 컴퓨터보다 느린 상태 시스템을 실행하려면 위 코드에서 예제를 제공했습니다. 이 프로세스는 clk 신호와 동기식이며 "case state_reg"코드는 m_tick이 low에서 high로 전환 될 때에 만 실행됩니다. –

+0

좋아요. 도움이되는 의견에 감사드립니다! – fragment