D 플립플롭 - VHDL 예제

 

블로그를 써야지 써야지 하면서 지금까지 미뤄왔다.

이제야 겨우 마음 먹고 글을 쓰게된다.

 

몇년간 VHDL로 FPGA회로를 설계해오면서 가지는 의문이 있다.

그것은 바로

내가 설계하는게 맞는지 틀린지 잘 알수가 없다.

근데 잘 생각해보니까, 만든 회로도 잘 돌아가고 그러니까 얼추 맞는것 같다.

지금부터 내가 아는것을 하나씩 써보려고 한다.

틀리면 틀렸다고 코멘트 달아줄것.

 

------------------------------------

 

첫번째 회로로 FPGA에서 어쩌면 가장 자주 쓰는 회로가 D 플립플롭 (DFF)이다.

디지털회로 수업을 들은 사람들은 "데이터를 저장하고 어쩌고 저쩌고..." 하는것을 기억 할것이다.

내가 회로를 설계할때 DFF를 주로 쓰는 이유는 타이밍을 맞출때다.

DFF는 좀전에 말했던것처럼 '클럭에 동기되어서' 데이터를 저장할때 쓴다.

컨트롤 시그널들을 반클럭, 아니 한클럭, 아니 몇클럭씩 딜레이 시킬때 DFF를 주로 사용했다.

 

일반적인 DFF의 블록다이어그램을 그림.1에 표시한다.







<그림.1>



 

동작 설명을 하면 Reset이 Enable이면 Dout에는 0이 출력이 되고, 
그렇지 않으면 DIN을 한클럭씩 지연시켜서 Dout의 출력으로 내보낸다.
위에DFF를 VHDL코드로 작성해보면 다음과 같이 될것이다.

 Library IEEE;
use ieee.std_logic_1164.all;
entity DFF is port(
  RESET : in std_logic;
  CLK : in std_logic;
  DIN : in std_logic;
  DOUT : out std_logic
);
end DFF;
architecture rtl of DFF is
begin
process(RESET,CLK,DIN)
begin
  if RESET = '1' then
    DOUT &lt;= '0';
  elsif CLK'event and CLK = '1' then
    DOUT &lt;= DIN;
  end if;
end process;
end rtl;





테스트벤치를 작성해서 파형을 관찰해보면 그림.2 와 같은 결과를 얻을수 있다.

 

 

결과에서 볼수 있듯이 Reset = '1'일 경우에 출력이 0이 되고, 
그 이외의 경우에는 DIN의 입력을 한클럭 지연시켜서 DOUT으로 출력을 내보내는 것을 알수 있다.

이 코드는 아주 기본적인것임에도 불구하고, 이런 코드를 작성하는 버릇을 들이는것은 좋지 않은 습관이다.
왜일까?

후훗.
다음번 포스팅에 그 이유를 설명하도록 하겠다.


 

728x90
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유