수색…


비고

D- 플립 플롭 (DFF)과 래치는 메모리 요소입니다. DFF는 클록의 한쪽 또는 다른 쪽 가장자리에서 입력을 샘플링하며 래치는 한쪽 레벨에서 투명하고 다른 쪽에서는 암기합니다. 다음 그림은 차이점을 보여줍니다.

DFF 대 래치 동작

VHDL에서 DFF 또는 래치를 모델링하는 것은 쉽지만 고려해야 할 몇 가지 중요한 측면이 있습니다.

  • DFF 및 래치의 VHDL 모델 간의 차이점.

  • 신호의 가장자리를 나타내는 법.

  • 동기 또는 비동기 설정 또는 재설정을 설명하는 방법.

D- 플립 - 플롭 (DFF)

모든 예에서 :

  • clk 는 시계,
  • d 는 입력이며,
  • q 는 출력이고,
  • srst 는 액티브 하이 동기 리셋이며,
  • srstn 은 액티브 로우 동기 리셋이며,
  • arst 는 액티브 하이 비동기 리셋이며,
  • arstn 은 액티브 로우 비동기 리셋이며,
  • sset 은 활성 하이 동기 세트이며,
  • ssetn 은 활성 낮은 동기 세트이며,
  • aset 은 활성 하이 비동기 세트이며,
  • asetn 은 액티브 로우 비동기식 세트입니다.

모든 신호는 ieee.std_logic_1164.std_ulogic 유형 ieee.std_logic_1164.std_ulogic . 사용 된 신텍스는 모든 신디사이저로 올바른 합성 결과를 이끌어내는 구문입니다. 대체 구문에 대한 설명은 클럭 에지 감지 예제를 참조하십시오.

상승 에지 클록

process(clk)
begin
  if rising_edge(clk) then
    q <= d;
  end if;
end process;

하강 에지 클럭

process(clk)
begin
  if falling_edge(clk) then
    q <= d;
  end if;
end process;

상승 에지 클록, 동기식 활성 하이 리셋

process(clk)
begin
  if rising_edge(clk) then
    if srst = '1' then
      q <= '0';
    else
      q <= d;
    end if;
  end if;
end process;

상승 에지 클럭, 비동기 활성 하이 리셋

process(clk, arst)
begin
  if arst = '1' then
    q <= '0';
  elsif rising_edge(clk) then
    q <= d;
  end if;
end process;

하강 에지 클록, 비동기 활성 로우 리셋, 동기 활성 하이 세트

process(clk, arstn)
begin
  if arstn = '0' then
    q <= '0';
  elsif falling_edge(clk) then
    if sset = '1' then
      q <= '1';
    else
      q <= d;
    end if;
  end if;
end process;

상승 에지 클럭, 비동기 액티브 하이 리셋, 비동기 액티브 로우 셋

참고 : set은 재설정보다 우선 순위가 높습니다.

process(clk, arst, asetn)
begin
  if asetn = '0' then
    q <= '1';
  elsif arst = '1' then
    q <= '0';
  elsif rising_edge(clk) then
    q <= d;
  end if;
end process;

래치

모든 예에서 :

  • en 은 인 에이블 신호이고,
  • d 는 입력이며,
  • q 는 출력이고,
  • srst 는 액티브 하이 동기 리셋이며,
  • srstn 은 액티브 로우 동기 리셋이며,
  • arst 는 액티브 하이 비동기 리셋이며,
  • arstn 은 액티브 로우 비동기 리셋이며,
  • sset 은 활성 하이 동기 세트이며,
  • ssetn 은 활성 낮은 동기 세트이며,
  • aset 은 활성 하이 비동기 세트이며,
  • asetn 은 액티브 로우 비동기식 세트입니다.

모든 신호는 ieee.std_logic_1164.std_ulogic 유형 ieee.std_logic_1164.std_ulogic . 사용 된 신텍스는 모든 신디사이저로 올바른 합성 결과를 이끌어내는 구문입니다. 대체 구문에 대한 설명은 클럭 에지 감지 예제를 참조하십시오.

활성 하이 인 에이블

process(en, d)
begin
  if en = '1' then
    q <= d;
  end if;
end process;

액티브 로우 인 에이블

process(en, d)
begin
  if en = '0' then
    q <= d;
  end if;
end process;

액티브 하이 인 에이블, 동기 액티브 하이 리셋

process(en, d)
begin
  if en = '1' then
    if srst = '1' then
      q <= '0';
    else
      q <= d;
    end if;
  end if;
end process;

액티브 하이 인 에이블, 비동기 액티브 하이 리셋

process(en, d, arst)
begin
  if arst = '1' then
    q <= '0';
  elsif en = '1' then
    q <= d;
  end if;
end process;

액티브 로우 인 에이블, 비동기 액티브 로우 리셋, 동기 액티브 하이 셋

process(en, d, arstn)
begin
  if arstn = '0' then
    q <= '0';
  elsif en = '0' then
    if sset = '1' then
      q <= '1';
    else
      q <= d;
    end if;
  end if;
end process;

액티브 하이 인 에이블, 비동기 액티브 하이 리셋, 비동기 액티브 로우 셋

참고 : set은 재설정보다 우선 순위가 높습니다.

process(en, d, arst, asetn)
begin
  if asetn = '0' then
    q <= '1';
  elsif arst = '1' then
    q <= '0';
  elsif en = '1' then
    q <= d;
  end if;
end process;

클럭 에지 감지

단편 소설

VHDL 2,008 파크 및 클럭의 유형 인 경우 bit , boolean , ieee.std_logic_1164.std_ulogic 또는 ieee.std_logic_1164.std_logic , 클록 에지 검출은 상승 에지에 대해 코딩 될 수있다

  • if rising_edge(clock) then
  • if clock'event and clock = '1' then -- type bit, std_ulogic or std_logic
  • if clock'event and clock then -- type boolean

하강 에지

  • if falling_edge(clock) then
  • if clock'event and clock = '0' then -- type bit, std_ulogic or std_logic
  • if clock'event and not clock then -- type boolean

이것은 시뮬레이션과 합성 모두에 대해 예상대로 동작합니다.

주 : std_ulogic 유형의 신호에서 상승 에지의 정의는 if clock'event and clock = '1' then 단순한 것보다 약간 더 복잡합니다. 예를 들어 표준 rising_edge 함수는 정의가 다릅니다. 아마도 합성에 아무런 차이가 없더라도 시뮬레이션을 위해 만들 수 있습니다.

rising_edgefalling_edge 표준 함수를 사용하는 것이 좋습니다. 이전 버전의 VHDL에서는 이러한 기능을 사용하기 위해 표준 패키지 (예 : bit 유형에 ieee.numeric_bit 의 사용을 명시 적으로 선언하거나 사용자 정의 패키지에서이를 정의해야 할 수도 있습니다.

참고 : rising_edgefalling_edge 표준 함수를 사용하여 비 클럭 신호의 에지를 감지하지 마십시오. 일부 신디사이저는 신호가 시계라고 결론을 내릴 수 있습니다. 힌트 : 비 클럭 신호에서 에지를 검출하는 것은 시프트 레지스터에서 신호를 샘플링하고 시프트 레지스터의 다른 스테이지에서 샘플링 된 값을 비교하여 자주 수행 할 수 있습니다.

긴 이야기

D- 플립 플롭 (DFF)을 모델링 할 때 클럭 신호의 에지 검출을 적절히 기술하는 것이 중요합니다. 정의상 가장자리는 특정 값에서 다른 값으로의 전이입니다. 예를 들어, 우리의 입력 신호의 상승 에지 정의 할 bit (두 값을 취하는 기준 VHDL 열거 형 '0''1' 의 전환으로) '0''1' . boolean 타입의 true false 에서 true 로의 전환으로 정의 할 수 있습니다.

종종 더 복잡한 유형이 사용됩니다. 예를 들어, ieee.std_logic_1164.std_ulogic 유형은 bit 또는 boolean 과 마찬가지로 열거 형이지만 2 대신 9 개의 값 ieee.std_logic_1164.std_ulogic .

의미
'U' 초기화되지 않은
'X' 강제력이 없다.
'0' 강제적으로 낮은 수준
'1' 높은 수준의 강제
'Z' 높은 임피던스
'W' 약한 미지수
'L' 약한 저급
'H' 약한 고수준
'-' 상관 없어.

이러한 유형에서 상승 에지를 정의하는 것은 bit 또는 boolean 보다 bit 복잡합니다. 예를 들어, '0' 에서 '1' 로 전환하는 것으로 결정할 수 있습니다. 그러나 '0' 또는 'L' 에서 '1' 또는 'H' 로 전환하는 것으로 결정할 수도 있습니다.

참고 : ieee.std_logic_1164 정의 된 rising_edge(signal s: std_ulogic) 함수에 표준이 사용하는 두 번째 정의입니다.

가장자리를 감지하는 다양한 방법을 논의 할 때 신호의 유형을 고려하는 것이 중요합니다. 또한 모델링 목표를 고려해야합니다 : 시뮬레이션 만 또는 로직 합성? 몇 가지 예를 들어 설명해 보겠습니다.

비트 유형의 상승 에지 DFF

signal clock, d, q: bit;
...
P1: process(clock)
begin
  if clock = '1' then
    q <= d;
  end if;
end process P1;

기술적으로, 순수 시뮬레이션 시맨틱 관점에서 프로세스 P1 은 상승 에지 트리거 DFF를 모델링합니다. 실제로 q <= d 할당은 다음 경우에만 실행됩니다.

  • clock (이 감도 목록을 표현하는 것입니다) 변경
  • clock 의 현재 값은 '1' 이다.

clock 은 타입 비트이고 타입 비트는 단지 '0''1' 값을 가지므로 정확히 비트 타입의 신호의 상승 에지로 정의됩니다. 모든 시뮬레이터는 우리가 예상 한대로이 모델을 처리 할 것입니다.

주 : 논리 신시사이저의 경우, 나중에 보게 될 것처럼 좀 더 복잡합니다.

비동기 액티브 하이 리셋 및 유형 비트가있는 상승 에지 DFF

DFF에 비동기 액티브 하이 리셋을 추가하기 위해 다음과 같이 시도 할 수 있습니다 :

signal clock, reset, d, q: bit;
...
P2_BOGUS: process(clock, reset)
begin
  if reset = '1' then
    q <= '0';
  elsif clock = '1' then
    q <= d;
  end if;
end process P2_BOGUS;

그러나 이것은 효과가 없습니다 . q <= d 할당을 실행하기위한 조건은 다음과 같아야한다 : reset = '0' 동안 clock 의 상승 에지 . 그러나 우리가 모델 한 것은 :

  • clock 또는 reset 또는 둘 다 변경
  • reset = '0'
  • clock = '1'

어떤 것이 아닌지 : resetclock = '1' 동안 '1' 에서 '0' 변경되면 할당은 clock 의 상승 에지가 아닌 동안 실행됩니다.

실제로 신호 속성을 사용하지 않고 VHDL로 모델링 할 수있는 방법은 없습니다.

P2_OK: process(clock, reset)
begin
  if reset = '1' then
    q <= '0';
  elsif clock = '1' and clock'event then
    q <= d;
  end if;
end process P2_OK;

clock'event 는 신호 clock 적용되는 신호 속성 event 입니다. 이것은 boolean 로 평가되며 현재 실행 단계 직전의 신호 업데이트 단계에서 신호 clock 변경된 경우에만 true 입니다. 덕분에 P2_OK 프로세스 P2_OK 이제 시뮬레이션 (및 합성)에서 원하는 것을 완벽하게 모델링합니다.

합성 의미론

많은 로직 신디사이저는 VHDL 모델의 의미론이 아니라 구문 패턴을 기반으로 신호 에지 탐지를 식별합니다. 즉, VHDL 코드가 어떤 모델인지 모르게 동작하는 것이 아니라 VHDL 코드가 어떻게 보이는지를 고려합니다. 그들이 모두 인식하는 패턴 중 하나는 다음과 같습니다.

if clock = '1' and clock'event then

따라서, 프로세스 P1 의 예제에서조차도 우리의 모델을 모든 로직 신디사이저에서 합성 가능하게 만들려면이를 사용해야합니다.

signal clock, d, q: bit;
...
P1_OK: process(clock)
begin
  if clock = '1' and clock'event then
    q <= d;
  end if;
end process P1_OK;

조건의 and clock'event 부분은 감도 목록과 완전히 중복되지만 일부 신디사이저가 필요하기 때문에 ...

비동기 활성 하이 리셋 및 유형 std_ulogic 상승 에지 DFF

이 경우, 클록의 상승 에지 및 리셋 조건을 표현하는 것은 복잡해질 수있다. 위에서 제안한 상승 에지의 정의를 유지하고 리셋이 '1' 또는 'H' 인 경우 활성화가 고려된다면 모델은 다음과 같이됩니다.

library ieee;
use ieee.std_logic_1164.all;
...
signal clock, reset, d, q: std_ulogic;
...
P4: process(clock, reset)
begin
  if reset = '1' or reset = 'H' then
    q <= '0';
  elsif clock'event and
        (clock'last_value = '0' or clock'last_value = 'L') and
        (clock = '1' or clock = 'H') then
    q <= d;
  end if;
end process P4;

참고 : 'last_value 는 마지막 값이 변경되기 전에 신호에 있던 값을 반환하는 또 다른 신호 속성입니다.

도우미 함수

VHDL 2008 표준은 std_ulogic 과 같은 다중 값 열거 형의 경우 특히 신호 에지 감지를 단순화하는 몇 가지 도우미 기능을 제공 std_ulogic . std.standard 패키지는 bitboolean 유형의 rising_edgefalling_edge 함수를 정의하며 ieee.std_logic_1164 패키지는 유형을 std_ulogicstd_logic 정의합니다.

참고 : 이전 버전의 VHDL에서는 이러한 기능을 사용하기 위해 표준 패키지 (예 : bit 유형에 ieee.numeric_bit) 사용을 명시 적으로 선언하거나 사용자 패키지에서이를 정의 할 수도 있습니다.

앞의 예제를 다시 살펴보고 헬퍼 함수를 ​​사용 해보자.

signal clock, d, q: bit;
...
P1_OK_NEW: process(clock)
begin
  if rising_edge(clock) then
    q <= d;
  end if;
end process P1_OK_NEW;
signal clock, d, q: bit;
...
P2_OK_NEW: process(clock, reset)
begin
  if reset = '1' then
    q <= '0';
  elsif rising_edge(clock) then
    q <= d;
  end if;
end process P2_OK_NEW;
library ieee;
use ieee.std_logic_1164.all;
...
signal clock, reset, d, q: std_ulogic;
...
P4_NEW: process(clock, reset)
begin
  if reset = '1' then
    q <= '0';
  elsif rising_edge(clock) then
    q <= d;
  end if;
end process P4_NEW;

참고 :이 마지막 예에서는 리셋 테스트를 단순화했습니다. 플로팅 하이 임피던스 리셋은 매우 드물며, 대부분의 경우이 단순화 된 버전은 시뮬레이션 및 합성에 사용됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow