수년 후에 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;
을 무엇 관계 연산자'<='do std_logic? 상승 에지를 감지하고 싶다면'rising_edge (m_tick) '이 명백한 방법이 될 것입니다. –
좋은 지적입니다. 는 if (m_tick = '1')이어야합니다. – fragment
내 논리는 m_tick이 프로세스를 트리거했기 때문에 m_tick에 우위가 있다는 것입니다. if (m_tick = '1')는 상승 에지인지 확인하는 검사입니다. 수표와 같은 기본적인 표준은 무엇입니까? 당신과 같은 rising_edge (m_tick) sugges? – fragment