VHDL을 사용하여 조합 논리 블록을 설계하고 싶지만 때로는 합성 결과에 의도하지 않은 래치가 포함되어 있습니다.
신시사이저가 래치를 유추하지 않도록하려면 어떤 코딩 지침을 따라야합니까?
예 : 작은 코드 세그먼트에서 if-else 문을 사용해야합니까?
VHDL을 사용하여 조합 논리 블록을 설계하고 싶지만 때로는 합성 결과에 의도하지 않은 래치가 포함되어 있습니다.
신시사이저가 래치를 유추하지 않도록하려면 어떤 코딩 지침을 따라야합니까?
예 : 작은 코드 세그먼트에서 if-else 문을 사용해야합니까?
답변:
래치를 피하려면 가능한 모든 코드 분기에 모든 출력을 할당해야합니다.
예를 들어
if a = '1' then
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
첫 번째 조건에서 b (1)의 값이 지정되지 않았기 때문에 래치를 생성하므로 컴파일러는 b (1)의 이전 값을 유지하기로 결정했습니다. 래치를 생성하지 않는 이것을 작성하는 한 가지 방법은 다음과 같습니다.
if a = '1' then
b <= prev_b;
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
...
if rising_edge (clk)
prev_b <= b;
end if;
여기서 b는 이전 값을 유지해야하며 b (0)을 새 값으로 덮어 써야합니다.
또 다른 방법은 @TomiJ의 답변과 같이 ba 기본값을 제공하는 것입니다.
래치를 받고있는 코드를 게시하면 구체적인 이유를 찾는 데 도움이 될 수 있습니다.
b <= b
여전히 신호 상태를 보존해야하기 때문에 당신의 접근 방식이 래치를 피할 것이라고 생각하지 않습니다 .
래치를 피하기위한 4 가지 규칙 :
또한 여러 조합 프로세스가있는 경우 루프를 작성하지 않아야합니다.
@TomiJ의 답변 스타일과 같은 여러 코딩 스타일이 이러한 규칙을 준수하는 데 도움이 될 수 있습니다. @Martin Thompson이 지적했듯이 조합 논리를 함께 피하는 것이 좋습니다. 대신 클럭킹 된 프로세스에 모든 것을 넣습니다.
@fbo와 @Martin Thompson이 지적했듯이, 프로세스에 의해 구동되는 모든 신호에 프로세스의 모든 브랜치에 어떤 값이 할당되어 있는지 확인해야하며 그 값은 출력의 이전 상태에 의존해서는 안됩니다 과정의.
이를 확인하는 가장 쉬운 방법은 프로세스 시작시 각 출력에 기본값을 할당하는 것입니다 (예 : fbo의 예를 공동 선택).
COMBO: process(a)
begin
b <= (others => '0'); -- Assign default value to b
if a = '1' then
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
end process COMBO;