저는 VHDL을 처음 사용하며 FSM 구현에 대한 질문이 있습니다. 그림에 표시된 동작을 원합니다 (여기서 AHDL과 동일한 FSM을 구현했습니다). 내가 VHDL에서 구현할 때 나는 리셋 동작이 다르다 : 리셋 = 1을 감지하고 동시에 FSM이 진행되지 않는 상승 에지가 있지만 S0에서 PS를 계속 유지한다. 문제는 if ... elsif (첫 번째 조건을 올바르게 감지하고 2 번째에 입력하지 않음)입니다. 여러 가지 방법으로 시도했지만 여전히 작동하지 않으며 출력은 00의 첫 번째 상승 에지 이후에도 유지됩니다. VHDL 구현의 유한 상태 기계 VHDL 재설정
파형 : AHDL 구현의
LIBRARY ieee; -- Bibliotheksvereinbarung
USE ieee.std_logic_1164.all;
ENTITY sumconvol IS -- Schaltungssymbol
PORT
(
x : IN STD_LOGIC; --input of 1st FF
clk : IN STD_LOGIC; --clock of all the 3 FFs
clrn : IN STD_LOGIC;
y : OUT STD_LOGIC_VECTOR (1 downto 0) --vector of output data
);
END sumconvol;
ARCHITECTURE a OF sumconvol IS -- Creation of architecture
--SIGNAL output_tmp : STD_LOGIC_VECTOR (1 downto 0); -- temporary variables (e.g. input/output between FFs)7
TYPE state_type IS (S0,S1,S2,S3);
SIGNAL NS,PS : state_type;
SIGNAL stato : STD_LOGIC;
BEGIN
sync_proc: PROCESS (clk,clrn)
BEGIN
if ((clrn='1')) THEN
PS<=S0;
y <= "00";
elsif (rising_edge(clk)) then
PS <= NS;
CASE PS IS
when S0 =>
if ((x='0'))then
NS <= S0;
y <= "00";
else
NS <= S1;
y <= "11";
end if;
when S1 =>
if (x='0') then
NS <= S2;
y<="10";
else
NS <= S3;
y <= "01";
end if;
when S2 =>
if (x='0') then
NS <= S0;
y <="11";
else
NS <= S1;
y <= "00";
end if;
when S3 =>
if (x='0') then
NS <= S2;
y <="01";
else
NS <= S3;
y <= "10";
end if;
end case;
end if;
end process sync_proc;
END a;
'clrn'은 활성 낮음을 의미하지만 액티브 하이로 사용하고 있습니다 ... 당신은 혼란 스럽습니까? –
아아 예 신호를 잘못명했습니다 ... 활성이 높음 – AM93
테스트 벤치를 보여주십시오. – JHBonarius