C - Download as PowerPoint by HC12072105489

VIEWS: 14 PAGES: 85

									 VHDL과 디지털회로설계



1. VHDL과 합성 설계

1.1 HDL: Hardware Description Language
     집적회로의 설계환경의 변화

                        70 년대          80 년대       90 년대

         설계레벨          트랜지스터          게이트 or       알고리즘
                                      레지스터        or function
         설계크기                수천        수십만          수백만
                            게이트        게이트          게이트
         설계도구               Layout    Schematic      HDL
                            Editor      Editor    Synthesizer

     설계규모의 대형화 및 복잡화 추세


     - 간결한 하드웨어 표현
     - 편리한 문서화
     - 설계 정보의 교환

     - 상위 레벨에서의 설계 자동화 필요

     - 설계 자동화 도구의 변화 : 모델링, 합성, 검증, 설계 모듈 관리



      HDL의 예


      - C, AHPL, CDL, IDL, TI-HDL, UDL 등
      - VHDL, Verilog-HDL




                                                                1
VHDL과 디지털회로설계


1.2 VHDL의 등장과 특징

  VHDL(VHSIC HDL)의 출현
  - 1981년 6월 미국 Woods Hole에서 개최된 하드웨어 기술언어
   Workshop에서 미국방성의 VHSIC(Very High Speed Integrated
   Circuit) 프로그램에서 요구되는 HDL사양을 근간으로 하는
   미국방성의 HDL 요건(Department of Defense Requirements for
   HDL)이라는 공식 문건을 발간                  VHDL개발의 근간

  - 1983년 7월 Intermetrics, IBM, Texas Instruments 사로 구성된
   공동 개발팀 구성

  - 1985년 VHDL 7.2 Version 탄생         초기개발 목적을 설계의
   문서화와 시뮬레이션에 둠

  - 1987년 12월 IEEE 1076 표준 탄생         미국방성과의 계약 체결 뿐만
   아니라 산업체에서의 상업용으로 사용할 수 있도록 확장

  - 1991년 IEEE 1076에 추가적으로 합성기능의 강화                  관련 CAD
   업체의 본격적인 합성 도구 개발이 시작

  - 1992년 미 정부지원 공인 HDL로 VHDL을 지정

  - 1993년 VHDL응용과정에서의 추가요건을 반영한 IEEE 1076-1993

  - 국내외적으로 VHDL의 사용이 확대되고 있으며 VHDL 시뮬레이터
   및 합성을 대부분의 설계자동화 도구에서 지원



                                                           2
VHDL과 디지털회로설계



 VHDL을 이용한 설계의 특징

  - 설계 싸이클의 단축 :
         초기 설계과정에서의 설계 오류 수정
         합성 설계에 의한 도면 생성 및 관리 작업의 불필요
         설계 변경의 용이


  - 설계의 질 향상 :
          다양한 설계기법의 검색에 의한 최적해 도달
          선택적 최적화 기법을 이용한 합성 설계


  - Technology에 무관한 description 및 설계 :
          특정 ASIC 제조업체 및 특정 구현 기술과 무관하게 초기
          설계 및 기술 가능 ( 설계 싸이클의 마지막에 고려)
          동일한 VHDL 설계의 다른 라이브러리를 이용한 합성
          신속한 칩 원형화 (rapid prototyping) 가능


  - 낮은 설계 비용 :
          상위레벨 설계 도구의 사용에 따른 설계 생산성 향상
          설계 기간 단축에 따른 설계 비용 감소
          설계의 재사용에 의한 설계 비용의 감소




                                             3
VHDL과 디지털회로설계



  - 표준 HDL 및 사용의 확대 :
        IEEE 표준인 동시에 미국 정부의 공인 HDL
        전세계적으로 설계 및 설계정보 교환의 수단으로 사용이
        점차적으로 확대


  - 기술에 따른 성장 :
        반도체 기술 및 ASIC 기술 발전에 따른 VHDL 합성설계
        도구의 기능 및 능력의 확장


  - 효과적인 설계관리 :
        VHDL 언어의 structured design 기능을 이용한 전체 설계의
        기능별 분할 설계 및 설계의 관리 및 문서화 용이




      IC 제조
      기술 발전
                            ASIC
                   (Application Specific IC)
                             등장

      설계 도구
      성능 향상
                    -주문형( semi-custom ) 반도체
                    -소량 ( application specific )
                    -개발 기간 단축
                    ( shorter design turnaround time (DAT) )


                                                               4
VHDL과 디지털회로설계




1.3 VHDL과 ASIC 설계 환경

가. 합성 가능한 함수 및 합성 원칙

   합성 가능한 함수

   - ASIC설계를 사용한 디지털 시스템은 일반적으로 랜덤 로직, 메모리,
    그리고 megafunction 등으로 이루어짐

   - 랜덤 로직 회로 설계는 게이트나 플립플롭과 같은 primitive logic cell을
    building block으로 하여 논리합성함이 효율적이다

   - RAM이나 ROM과 같은 규칙적인 구조의 메모리의 설계는 일반적으로
    전용 컴파일러를 사용함이 적절하다

   - 합성 가능한 조합형 논리 함수 예: Multiplexer, Decoder, Encoder,
                              Comparator, Adder/Subtractor,
                              ALU, Multiplier, Lookup table,
                              Parity generator, PLA, Gates 등

   - 합성 가능한 순차형 논리 함수 예: 각종 Counter, Register, Latch,
                              Parallel/Serial converter, Sequencer,
                              Controller, Finite state machine,
                              Synchronizer 등




                                                                  5
VHDL과 디지털회로설계



   VHDL 합성의 필요성



circuit design   회로가 점차     언어로 기술할 경우
                  복잡해짐     회로 복잡도에 상관없음.
  with HDL


                           잦은 설계 변경 용이.
                  성능 평가
    logic
  synthesis

                   초기      netlist 자동 추출.
                 설계 단계에서       DAT 단축
 simulation       오류 검출




                                            6
VHDL과 디지털회로설계



  VHDL 합성에서의 유의사항

   - VHDL 합성설계 방식은 VHDL로 설계를 기술하고 시뮬레이션하며
    이 VHDL 모델을 합성시스템을 이용하여 논리회로로 변환하는 설계

    방식이다


   1) 합성회로의 결과는 VHDL 표현방식에 따라 크게 좌우된다.
    즉, VHDL 기술방식에 따라 합성된 결과 회로는 기능은 동일하더라도
    게이트의 수 또는 critical path, 그리고 회로의 구조 등이 다를 수 있다
        자신이 원하는 논리구조로 합성해 낼 수 있도록 VHDL 코딩
        할 수 있어야 한다.

   2) 시뮬레이션 가능한 모든 VHDL code 모두 합성 가능한 것은 아니다.
    일반적으로 합성 가능한 code는 RTL(Register Transfer Level) 기술로
    하여야 하며 tool dependent 하다.


   3) 합성 설계를 성공적으로 수행하기 위해서는 논리회로 설계 기법에
    익숙하고 ASIC 설계 경험 또한 풍부하여야 한다


   4) VHDL test bench를 이용하여 합성 전후의 효과적인 시뮬레이션을
    수행함이 바람직하다




                                                  7
VHDL과 디지털회로설계


나. ASIC 설계 프로세스


    System Design &        기본적인 시스템 요건 분석
       Partitioning        적용 가능한 알고리즘의 분석
                          하드웨어, 소프트웨어 설계 분할


   ASIC Block Diagram      ASIC의 설계 사양 및 블록도
     & Specification       ASIC의 논리함수 구현 방법
                           시스템 인터페이스 방식 등



      Logic Design        VHDL 모델링, RTL 시뮬레이션
                            설계의 수정 및 설계최적화
                          Technology Targeting & Synthesis


     Logic Simulation




                            게이트 레벨 시뮬레이션
    Pre and Post-Layout       Layout 및 배선
        Verification       타이밍분석, 설계규칙 검사
                           전기규칙검사 및 I/O 핀 할당



      Prototype ASIC
     Fabrication & Test




                                                         8
VHDL과 디지털회로설계


다. 논리회로 설계 흐름도의 비교




     Schematic Entry           VHDL Coding




                                RTL Level
    Netlist Generation
                              VHDL Simulation




       Gate Level
                               Logic Synthesis
    Logic Simulation




A) 기존의 게이트 레벨 논리회로       B) VHDL 합성을 이용한 논리회로
   설계 흐름도                   설계 흐름도




                                                 9
 VHDL과 디지털회로설계
VHDL 합성설계


2. VHDL 합성설계의 기본과 Coding Issues

2.1 4가지 VHDL code 예

 - D flip flop, Latch, AND 게이트, Multiplexer의 예를 통하여 비슷한
  VHDL 기술 스타일과 원하는 합성 회로의 차이를 유의하여야 한다.



 가. D Flip Flop

    entity D_FF is
           port( b, c : in bit;
                qout : out bit);
    end D_FF;

    architecture test of D_FF is
    begin
          process
          begin
               wait until clk’event and clk = ‘1’;
               qout <= b;
          end process;
    end test;
                         b            D      Q       qout
                         c             clk




                                                            10
VHDL과 디지털회로설계




나. Latch

   entity D_Latch is
          port(data, enable : in bit;
               qout : out bit);
   end D_Latch;

   architecture test of D_Latch is
   begin
         process(data, enable)
         begin
               if (enable = ‘1’) then
                   qout <= data;
         end if;
         end process;
   end test;



            data            D      Q    qout
           enable           Enable




                                               11
VHDL과 디지털회로설계



다. 2-입력 AND 게이트

     entity AND2 is
            port( b, c : in bit;
                 and_out : out bit);
     end AND2;

     architecture test of AND2 is
     begin
           process
           begin
                 if (c = ‘1’) then
                    and_out <= b;
                  else
                    and_out <= ‘0’;
           end if;
           end process;
     end test;



 b
                                       and_out
 c




                                                 12
 VHDL과 디지털회로설계




 라. 2 x 1 Multiplexer

    entity MUX is
            port( b, c, s : in bit;
                 mux_out : out bit);
     end MUX;

    architecture test of MUX is
    begin
          process
          begin
               case s is
                when ‘0’ <= mux_out <= b;
                when ‘1’ <= mux_out <= c;
                end case;
          end process;
    end test;


                  b            0            mux_out
                  c            1 select


                  s


주의 : 위와 같이 s의 값이 ‘1’이 아닐 때 출력의 값이 분명히 명시가 되어
     있으면 멀티플렉서가 합성되지만 그렇지 않을 경우 출력은 이전
     값을 유지하는 latch가 합성된다


                                                      13
VHDL과 디지털회로설계


2.2 일반적인 VHDL Coding Issues

 가. VHDL Types

   - 설계 hierarchy 상에서 서로 다른 레벨에서 합성된 netlist를 통합하고
    자 할 때 변환함수(conversion function)의 사용을 피하기 위해서는
    entity 에서의 port 선언을 위해서 std_logic 자료형(type)을 사용하는
    것이 좋다.
   - 자료형의 일관성을 유지하기 위하여 자료형 ‘buffer’의 사용을 피하
     는 것이 좋다. 아래의 예는 내부 signal을 이용하여 자료형 ‘buffer’의
     사용을 피하는 효과적인 방법을 보여 준다.


     entity buf is
     port ( a, b : in std_logic ;
              c : out std_logic );
     end buf ;

     architecture Behavioral of buf is
     signal c_int : std_logic ;
     begin
     process
            begin
             c_int <= a + b + c_int ;
      end process
            c <= c_int ;
       end Behavioral;


                                                  14
VHDL과 디지털회로설계


나. Signals and Variables

  - 시뮬레이션시 Signal은 값이 update 될 때 delta time이 있지만 Variable은
    delay 없이 즉시 값이 바뀐다.
  - Variable을 사용시 시뮬레이션은 빨라지지만 설계의 기능성에 영향을
    미칠 수 있는 glitch의 검출을 놓칠 수 있다.
  - Variable은 시뮬레이션 중 예상치 않은 결과를 발생시킬 가능성이 높다


다. Priority Encoding Structure


   - 통상 ‘if’ 문의 조건문 순위는 회로 합성시 priority encoding 회로로 추론
     된다. 따라서, 이를 피하기 위해서는 ‘case’ 문을 사용하여야 한다.


     VHDL 예제 : 두개의 load signal을 갖는 8-비트 카운터를 모델링하고자
                 한다. Signal ‘load0’가 active 일 때 bus의 하위 4비트가
                 카운터의 하위 4비트로 load 되고, signal ‘load1’이 active
                 일 때 bus의 상위 4비트가 카운터의 상위 4비트로 load
                 되며, 그 이외의 경우는 카운터가 가산을 한다.

              load1              load0



             MSB                   LSB    8-비트 카운터


                                            8-비트 BUS

                                                        15
VHDL과 디지털회로설계



 Library IEEE
 use IEEE.std_logic_1164.all ;
 use IEEE.std_logic_unsigned.all ;
 entity ld_cnt is
         port ( load      : in std_logic_vector(1 downto 0) ;
                databus : in std_logic_vector(7 downto 0) ;
                   clk    : in std_logic ;
                 count    : out std_logic_vector(7 downto 0) ;
 end ld_cnt ;
 architecture behavior of ld_cnt is
 signal int_cnt : std_logic_vector(7 downto 0) ;
 begin
      count <= int_cnt ;
      process
      begin
             wait until clk=‘1’ and clk’event ;
            if(load = “10”) then
                int_cnt <= databus(7 downto 4) & int_cnt(3 downto 0) ;
            elsif (load = “01”) then
                int_cnt <= int_cnt(7 downto 4) & databus(3 downto 0) ;
            else
                int_cnt <= int_cnt + 1 ;
            end if ;
         end process ;
 end behavior ;



                                                                         16
VHDL과 디지털회로설계


라. 원치 않는 Latches


  - 원치 않는 Latch가 합성되지 않게 하기 위해서는 ‘if’ 문과 ‘case’ 문의
   기술시 모든 조건을 빠짐없이 포함시켜야 한다 (2.1 참조)


마. 동기식과 비동기식 Resets


  - 동기식 reset 신호를 갖는 회로는 ‘if’ 문이 클록문(clock statement) 이
   후에 나타나야 하며, 비동기식 reset 신호를 갖는 회로는 ‘if’ 문이 클
   록문 이전에 나타나야 한다.


      비동기 reset 신호를 갖는 설계의 예:


    entity test_reset is
            port ( X, clk, rst : in bit ;
                           Z : out bit ) ;
    end test_reset ;
    architecture behavior of test_reset is
    type state is (S0, S1, S2, S3);
    signal ST: state;
    begin



                                                     17
VHDL과 디지털회로설계


        process
        begin
              if rst = ‘0’ then
                      ST <= S0 ;
                      Z <= ‘0’ ;
              elsif clk’event and clk = ‘1’ then
                      if X = ‘0’
                                 then Z <= ‘0’ ;
                      else
                           case ST is
                                -
                                -
                                -
                           end case ;
                       end if ;
        end process ;
  end behavior ;

    동기 reset 신호를 갖는 설계 :

  architecture behavior of test_reset is
  begin
       wait until clk’event and clk = ‘1’ ;
       if rst = ‘0’ then
           ST <= S0 ;
          Z <= ‘0’ ;
       elsif
           X = ‘0’ then
           Z <= ‘0’ ;
           else
              case ST is
              -- 이후의 기술은 비동기식에서의 예와 같음 --



                                                   18
 VHDL과 디지털회로설계



3. 기본 논리회로의 설계 예

 - 3장에서의 기본 논리회로의 VHDL 합성설계의 예는 주로 LODECAP
  에서의 Sample 들과 기타 기본 회로들로 구성하였다.


3.1 조합회로의 예

  가. Multiplexer

   2-way 2 x 1 multiplexer : <muxType1.vhd>

       library IEEE;
       use IEEE.std_logic_logic_1164.all;       a      2   2x1   2
                                                b      2              z
       use IEEE.std_logic_signed.all;                      MUX
                                                s
       entity muxType1 is
        port(a, b : IN std_logic_vector(1 downto 0);
                s : IN std_logic;
                z : OUT std_logic_vector(1 downto 0));
        end muxType1;
       architecture RTL of muxType1 is
       signal TMP : std_logic_vector(1 downto 0);
       begin
        z <= a when s = ‘0’ else b;
       end RTL;

                                                                 19
VHDL과 디지털회로설계


 2-way 2 x 1 multiplexer : <muxType2.vhd>



                                             2
                                         a                  2   z
                                                      4x1
                                             2        MUX
      library IEEE;                      b
      use IEEE.std_logic_signed.all;
      use IEEE.std_logic_signed.all;
                                                        s
      entity muxType2 is
       port(a, b : IN std_logic_vector(1 downto 0);
               s : IN std_logic;
               z : OUT std_logic_vector(1 downto 0));
      end muxType2;
      architecture RTL of muxType2 is
      signal TMP : std_logic_vector(1 downto 0);
      begin
       process(a, b, s)
       begin
         if s = ‘0’ then z <= a;
         else z <= b;
         end if;
       end process;
      end RTL;


                                                                    20
VHDL과 디지털회로설계




          그림 1. Muxtype2의 합성 회로




                                  21
VHDL과 디지털회로설계




        그림 2. Muxtype2의 시뮬레이션 결과




                                   22
VHDL과 디지털회로설계



    2-way 4 x 1 multiplexer : <muxType3.vhd>


                                            2
                                        a
                                            2                2   z
                                        b           4x1
     library IEEE;                          2
                                        c           MUX
                                            2
     use IEEE.std_logic_1164.all;       d
     use IEEE.std_logic_signed.all;                 2
     entity muxType3 is                             s(1:0)
       port(a, b, c, d : IN std_logic_vector(1 downto 0);
                 s    : IN std_logic(1 downto 0);
                 z    : OUT std_logic_vector(1 downto 0));
     end muxType3;
     architecture RTL of muxType3 is
     begin
       process(a, b, c, d, s)
       begin
         case s is
             when “00” => z <=a; when “01” => z <=b;
             when “10” => z <=c; when “11” => z <=d;
             when others => z <=“00”;
         end case;
       end process;
     end RTL;

                                                                     23
VHDL과 디지털회로설계

 Enable 갖는 4-way 4 x 1 multiplexer : <mux4.vhd>

  library IEEE;
  use IEEE.std_logic_1164.all;
  use IEEE.std_logic_signed.all;
  entity MUX4 is
    port(l0, l1, l2, l3 : IN std_logic_vector(3 downto 0);
           ENABLE : IN std_logic;
             SEL        : IN std_logic_vector(1 downto 0);
               Y        : OUT std_logic_vector(3 downto 0));
  end MUX4;
  architecture RTL of MUX4 is
  begin
    process ( SEL, ENABLE, l0, l1, l2, l3)
    begin
        if ENABLE = ‘0’ then
            case SEL is
               when “00” => Y <= l0;
               when “01” => Y <= l1;
               when “10” => Y <= l2;
               when others=> Y <= l3;
                                                     ENABLE
           end case;
       else
          Y <= “0000”;                    I0
                                                 4
                                                 4             Y
      else if;                            I1            4x1
                                                 4
      end process;                        I2           MUX
                                                 4
  end RTL;                                I3

                                                    2

                                                   SEL(1:0)

                                                               24
VHDL과 디지털회로설계




        그림 3. 4x1 Multiplexer 의 합성 회로




                                        25
VHDL과 디지털회로설계




        그림 4. 4x1 Multiplxer의 시뮬레이션 결과




                                         26
VHDL과 디지털회로설계



나. Decoder 회로

 2-to-4 decoder <decoder1.vhd>

      library IEEE;                           2                4
      use IEEE.std_logic_1164.all;        a         decoder1        d

      use IEEE.std_logic_signed.all;
      entity decoder1 is
        port(a : IN std_logic_vector(1 downto 0);
              d : OUT std_logic_vector(3 downto 0));
        end decoder1;
      architecture RTL of decoder1 is
      begin
        process
        begin
         case a is
           when “00” => d <= “0001”;
           when “01” => d <= “0010”;
           when “10” => d <= “0100”;
           when others => d <= “1000”;
         end case;
        end process;
      end RTL;


                                                                   27
VHDL과 디지털회로설계




          그림 7. Decoder1의 합성 회로




          그림 8. Decoder1의 시뮬레이션 결과



                                     28
 VHDL과 디지털회로설계


             BCD-to-7segment decoder <BCD_7.vhd>



                               y(6)                  G
                                            G
                               y(5)
                                            F
                               y(4)              F         B
                                            E
      4         BCD-to-7       y(3)                  A
                Segment                     D
BCD_data                       y(2)
                Decoder                     C    E         C
                               y(1)
                                            B        D
                               y(0)
                                            A




           library IEEE;
           use IEEE.std_logic_1164.all;
           entity BCD_7 is
            port(BCD_data : IN std_logic_vector(3 downto 0);
                     Y       : OUT std_logic_vector(6 downto 0));
            end BCD_7;




                                                                    29
VHDL과 디지털회로설계


     architecture RTL of BCD_7 is
     begin
      process(BCD_data)
      begin
        case BCD_data is
         when “0000” => Y <= “1111110”;
         when “0001” => Y <= “0110000”;
         when “0010” => Y <= “1101101”;
         when “0011” => Y <= “1111001”;
         when “0100” => Y <= “0110011”;
         when “0101” => Y <= “1011011”;
         when “0110” => Y <= “1011111”;
         when “0111” => Y <= “1110000”;
         when “1000” => Y <= “1111111”;
         when “1001” => Y <= “1110011”;
         when others => Y <= “0000000”;
        end case;
      end process;
     end RTL;




                                          30
VHDL과 디지털회로설계




         그림 9. BCD_7의 합성 회로




         그림 10. BCD_7의 시뮬레이션 결과



                                  31
VHDL과 디지털회로설계



다. Encoder 회로

 <encoder.vhd> 예제


                                        a(3)
                                        a(2)                 z(1)
                                                   encoder   z(0)
                                        a(1)
                                        a(0)

      library IEEE;

      use IEEE.std_logic_1164.all;
      use IEEE.std_logic_signed.all;
      entity encoder is
       port(a : IN std_logic_vector(3 downto 0);
              z : OUT std_logic_vector(1 downto 0));
      end encoder;
      architecture RTL of encoder is
      begin
       z <= “00” when a(0) = ‘1’
         else “01” when a(1) = ‘1’
         else “10” when a(2) = ‘1’
         else “11”;
      end RTL;




                                                                32
VHDL과 디지털회로설계



 <func2.vhd> 예제

                                        ABCD    ENC_OUT

                                        xx00      00
     library IEEE;                      xx01      01
                                        x011      10
     use IEEE.std_logic_1164.all;       0111      11
     use IEEE.std_logic_signed.all;
     entity FUNC2 is
      port(A, B, C, D : IN std_logic;
             ENC_OUT : OUT std_logic_vector(1 downto 0));
     end FUNC2;
     architecture RTL of FUNC2 is
     begin
      process(A, B, C, D)
      begin
        if D = ‘0’ then ENC_OUT <= “00”;
        elsif C = ‘0’ then ENC_OUT <= “01”;
        elsif B = ‘0’ then ENC_OUT <= “10”;
        elsif A = ‘0’ then ENC_OUT <= “11”;
        elsif ENC_OUT <= “00”;
        end if;
      end process;
     end RTL;

                                                            33
 VHDL과 디지털회로설계


 1-bit Full-Adder :<FA1.vhd> 예제

        library IEEE;
        use IEEE.std_logic_1164.all;
        use IEEE.std_logic_signed.all;
        entity FA1 is
          port( A, B, CIN : IN std_logic;
                SUM,COUT : OUT std_logic);
        end FA1;
        architecture RTL of FA1 is
        begin
          process(A, B, CIN)
           variable TEMP : std_logic_vector(2 downto 0);
          begin
             TEMP := A & B & CIN;
           case TEMP is
             when “000” => SUM <= ‘0’; COUT <= ‘0’;
             when “001” | “010” | “100” => SUM <= ‘1’; COUT <= ‘0’;
             when “011” | “101” | “110” => SUM <= ‘0’; COUT <= ‘1’;
             when “111” => sum <= ‘1’; COUT <= ‘1’;
             when others => SUM <= ‘0’; COUT <=‘0’;
           end case;
          end process;
        end RTL;



                                                                      34
VHDL과 디지털회로설계


 9 bit adder : <adder9.vhd>

         library IEEE;
         use IEEE.std_logic_1164.all;
         entity adder9 is
           port(cin : IN std_logic;
                 a, b : IN std_logic_vector(8 downto 0);
                 sum : OUT std_logic_vector(8 downto 0);
                 cout : OUT std_logic);
         end adder9;
         architecture RTL of adder9 is
         begin
           process ( cin, a, b)
           variable carry : std_logic;
           begin
             carry := cin;
             for i in 0 to 8 loop
              sum(i) <= a(i) XOR b(i) XOR carry;
              carry := (carry and (a(i) XOR b(i))) or (a(i) and b(i));
             end loop;
             cout <= carry;
           end process;
         end RTL;


                                                                         35
VHDL과 디지털회로설계

 Pipelined adder 회로 : < pipeAdder.vhd>
                                                              inBus


    library IEEE;                                 Reg_a
    use IEEE.std_logic_1164.all;
    use IEEE.std_logic_signed.all;                              +
    entity pipeAdder is
                                                              Reg_b
       port ( clk      : in std_logic;
             inBus :in std_logic_vector(7 downto 0);          Out_Bus
             outBus :out std_logic_vector(8 downto 0));
    end pipeAdder;
    architecture RTL of pipeAdder is
    signal reg_a : std_logic_vector(7 downto 0);
    signal reg_b : std_logic_vector(8 downto 0);
    begin
            outBus <= reg_b;
            process ( clk)
            begin
             if ( clk = ‘1’ and clk’event) then
                    reg_a <= inBus;
                    reg_b <= (‘0’ & reg_a) + (‘0’ & inBus);
             end if;
            end process;
    end RTL;

                                                                        36
VHDL과 디지털회로설계




           그림 15. Pipeadder 의 합성 회로




                                      37
VHDL과 디지털회로설계




         그림 16. Pipeadder 의 시뮬레이션 결과




                                       38
VHDL과 디지털회로설계



 4-bit 수 차의 절대값 연산 : < absdiff.vhd>

     library IEEE;
     use IEEE.std_logic_1164.all;
     use IEEE.std_logic_signed.all;
     entity absdiff is
      port (a : IN std_logic_vector(3 downto 0);
             b : IN std_logic_vector(3 downto 0);
             d :OUT std_logic_vector(3 downto 0));
     end absdiff;
     architecture RTL of absdiff is
     begin
      process (a, b)
      begin
        if (a > b) then d <= a - b;
        else d <= b - a;
        end if;
      end process;
     end RTL;




                                                     39
VHDL과 디지털회로설계


 ALU 연산 : <ALU.vhd>

      OPCODE          OPERATION             설 명
         000            OP1 + OP2          ADD
         001             OP1 – 1        DECREMENT
         010            OP1 – OP2      SUBTRACTION
         011             OP1 + 1        INCREMENT
         100          OP1 AND OP2      LOGICAL AND
         101           OP1 OR OP2      LOGICAL OR
         110            NOT OP1           NEGATE
         111              OP1              MOVE

                                        OP1                OP2

                                        8                  8



                           OPCODE       3
                                                  ALU
                                                  8

      library IEEE;                           ALU_OUT

      use IEEE.std_logic_1164.all;
      use IEEE.std_logic_signed.all;
      entity ALU is
       port(OPCODE : IN std_logic_vector(2 downto 0);
            OP1,OP2 : IN std_logic_vector(7 downto 0);
            ALU_OUT : OUT std_logic_vector(7 downto 0));
      end ALU;


                                                                 40
VHDL과 디지털회로설계


    architecture RTL of ALU is
    begin
       process (OPCODE, OP1, OP2)
       begin
       case OPCODE is
         when “000” =>
            ALU_OUT <= OP1 + OP2;
         when “001” =>
            ALU_OUT <= OP1 - 1;
         when “010” =>
            ALU_OUT <= OP1 - OP2;
         when “011” =>
            ALU_OUT <= OP1 + 1;
         when “100” =>
            ALU_OUT <= OP1 and OP2;
         when “101” =>
            ALU_OUT <= OP1 or OP2;
         when “101” =>
            ALU_OUT <= not OP2;
         when others =>
            ALU_OUT <= OP1;
       end case;
     end process;
    end RTL;




                                      41
VHDL과 디지털회로설계




            그림 17. Alu 의 합성 회로




                                 42
VHDL과 디지털회로설계




         그림 18. Alu 의 시뮬레이션 결과




                                 43
VHDL과 디지털회로설계



 Increment 회로 : < inc.vhd>

      library IEEE;

      use IEEE.std_logic_1164.all;
      use IEEE.std_logic_signed.all;
      entity INC is
       port(PC_ADDR : IN std_logic_vector(4 downto 0);
              INC_ADDR : OUT std_logic_vector(4 downto 0));
      end INC;
      architecture RTL of INC is
      begin
       INC_ADDR <= PC_ADDR + 1;
      end RTL;




                                                              44
VHDL과 디지털회로설계




         그림 19. Increment의 합성 회로




                                   45
VHDL과 디지털회로설계




        그림 20. Increment의 시뮬레이션 결과




                                     46
VHDL과 디지털회로설계



 Decrement 회로 : <dec.vhd>

     library IEEE;
     use IEEE.std_logic_1164.all;
     use IEEE.std_logic_signed.all;
     entity DEC is
      port(PC_ADDR : IN std_logic_vector(4 downto 0);
             DEC_ADDR : OUT std_logic_vector(4 downto 0));
     end DEC;
     architecture RTL of DEC is
     begin
      DEC_ADDR <= PC_ADDR -1;
     end RTL;




                                                             47
VHDL과 디지털회로설계


3.2 순차회로의 예

 가. 계수기(counter)

            6-bit up counter 회로 : < upCount.vhd>

     library IEEE;
     use IEEE.std_logic_1164.all;
     use IEEE.std_logic_signed.all;
     entity upCount is
       port(CLK32M, MRESET : in std_logic;
                 upCountOut      : out std_logic_vector(5 downto 0));
     end upCount;
     architecture RTL of upCount is
     signal TMP : std_logic_vector(5 downto 0);
     begin
        upCountOut <= TMP;
       process (CLK32M, MRESET)
       begin
         if MRESET = ‘1’ then
           TMP <= “000000”;
         elsif (CLK32M = ‘0’ and CLK32M’event) then
           TMP <= TMP + ‘1’;
         end if;
       end process;
     end RTL;




                                                                   48
 VHDL과 디지털회로설계

                   Enable과 load가 있는 6-bit up-counter 회로 :
<upCount2.vhd>
         library IEEE;
         use IEEE.std_logic_1164.all;
         use IEEE.std_logic_signed.all;
         entity upCount2 is
          port( clk, reset, enable, load : in std_logic;
                         dataBus          : in std_logic_vector(5 downto 0);
                      upCount2Out         : out std_logic_vector(5 downto 0));
         end upCount2;
         architecture RTL of upCount2 is
         signal TMP : std_logic_vector(5 downto 0);
         signal clkEnable : std_logic;
         begin
          upCount2Out <= TMP; clkEnable <= clk and enable;
          process ( clkEnable, reset, load)
          begin
            if reset ‘1’ then TMP <= “000000”;
            elsif ( clkEnable = ‘1’ and clkEnable’event) then
              if load = ‘1’ then TMP <= dataBus;
              else TMP <= TMP + ‘1’;
              end if;
            end if;
          end process;
         end RTL;
                                                                          49
VHDL과 디지털회로설계




         그림 25. Upcount2 의 합성 회로




                                   50
VHDL과 디지털회로설계




          그림 26. Upcount2 의 합성 회로




                                    51
VHDL과 디지털회로설계

 6-bit up/down counter 회로 : < upDownCount.vhd>

   library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_signed.all;
   entity upDownCount is
     port( clk, reset, up_down, enable, load : in std_logic;
                         dataBus : in std_logic_vector(5 downto 0);
                           count : out std_logic_vector(5 downto 0));
   end upDownCount;
   architecture RTL of upDownCount is
   signal TMP : std_logic_vector(5 downto 0);
   signal clkEnable : std_logic;
   constant ZERO : std_logic_vector := “000000”;
   begin
     count <= TMP;
     clkEnable <= clk and enable;
     process( clkEnable, reset, load)
     begin
       if reset ‘1’ then TMP <= ZERO;
       elsif ( clkEnable = ‘1’ and clkEnable’event) then
          if load = ‘1’ then TMP <= dataBus;
          elsif up_down = ‘1’ then TMP <= TMP + 1;
          else TMP <= TMP - 1;
          end if;
       end if;
     end process;
   end RTL;



                                                                        52
  VHDL과 디지털회로설계

  나. Clock 발생기

 Clock 5 분기 회로 : < clk_gen.vhd>

      library IEEE;
      use IEEE.std_logic_1164.all;
      entity CLK_GEN is
         port(CLK, RST : IN std_logic;
               CLK_HOT : OUT std_logic_vector(4 downto 0);
      end CLK_GEN;
      architecture RTL of CLK_GEN is
      signal CURRENT_STAT, NEXT_STATE : std_logic_vector(4 downto 0);
      begin
        process(CURRNT_STATE)
        begin
         if CURRENT_STATE = “00000” then NEXT_STATE <= “00001”;
         elsif CURRENT_STATE = “00001” then NEXT_STATE <= “00010”;
         elsif CURRENT_STATE = “00010” then NEXT_STATE <= “00100”;
         elsif CURRENT_STATE = “00100” then NEXT_STATE <= “01000”;
         elsif CURRENT_STATE = “01000” then NEXT_STATE <= “10000”;
         elsif CURRENT_STATE = “10000” then NEXT_STATE <= “00001”;
         else NEXT_STATE <= “00001”;
         end if;
        end process;
        process (CLK, RST)
        begin
         if RST = ‘0’ then CURRENT <= “00000”;
         elsif CLK = ‘0’ and CLK’event then CURRENT_STATE <= NEXT_STATE;
         end if;
         end process;
        CLK_HOT <= CURRENT_STATE;
      end RTL;

                                                                53
VHDL과 디지털회로설계




         그림 31. Clock generator 의 합성 회로




                                          54
VHDL과 디지털회로설계




        그림 32. Clock generator 의 시뮬레이션 결과




                                            55
VHDL과 디지털회로설계

< RAM      메모리의 모델링 >
- address bus=8, data bus=8

                              /CE




                          RAM
        ADDRESS     8                 8   DATA




                        /RD     /WR



Modeling Guide
    - 2차원 Memory 공간에 대한 선언.
    - Address 값의 std_logic_vector를 Integer로 변환하는 Subprogram
      인식.
    - RAM 기억공간의 Signal로의 선언.
    - Chip Disable과 Write Mode인 경우에 ‘Z’를 출력.

library IEEE; use IEEE.std_logic_1164.ALL;
use IEEE.std_logic_unsigned.ALL;

entity RAM is
  port ( ADDR : in std_logic_vector(0 to 7);
         CE_N, RD_N, WR_N : in std_logic;
         DATA : inout std_logic(7 downto 0));
end RAM;


                                                     56
VHDL과 디지털회로설계


architecture RTL of RAM is
   subtype RAM_WORD is
             std_logic_vector(7 downto 0);
   type RAM_TABLE is array(0 to 255) of
             RAM_WORD;
   signal RAM_DATA : RAM_TABLE;
begin
  process (CE_N,RD_N,WR_N,ADDR)
     variable TMP : integer;
  begin
     DATA <= “ZZZZZZZZ”;
     TMP := conv_integer(ADDR);
     if CE_N=’0’ and RD_N=’0’ then
        DATA <= RAM_DATA(TMP);
     elsif CE_N=‘0’ and WR_N=’0’ then
        RAM_DATA(TMP) <= DATA;
     end if;
  end process;
end RTL;




                                             57
VHDL과 디지털회로설계


   < ROM      메모리의 모델링 >
- Address bus=3, Data bus=5

                              /CE




                           ROM
                      3             5
              ADDR                      DATA




                              /OE


Modeling Guide
    - 2차원 Memory 공간에 대한 선언.
    - Address 값의 std_logic_vector를 Integer로 변환하는 Subprogram
      인식.
    - ROM 기억공간의 Constant로의 선언.
    - Chip Disable의 경우 ‘Z’를 출력.

library IEEE; use IEEE.std_logic_1164.ALL;
use IEEE.std_logic_unsigned.ALL;

entity ROM is
  port ( ADDR : in std_logic_vector(0 to 2);
         CE_N, OE_N : in std_logic;
  DATA : out std_logic_vector(4 downto 0));
end ROM;



                                                     58
VHDL과 디지털회로설계



architecture RTL of ROM is
  subtype ROM_WORD is
          std_logic_vector(4 downto 0);
  type ROM_TABLE is array(0 to 7) of
          ROM_WORD;
  constant ROM_DATA : ROM_TABLE :=
     ROM_ TABLE’(
          “10101”, “10000”, “11111”, “11011”,
          “10001”, “01100”, “00101”, “10011”);
begin
  process (CE_N,OE_N,ADDR) begin
     if CE_N=’0’ and OE_N=’0’ then
        DATA <= ROM_DATA
                 (conv_integer(ADDR));
     else
        DATA <= “ZZZZZ”;
     end if;
  end process;
end RTL;




                                                 59
VHDL과 디지털회로설계


 Clock 배수에 폭을 갖는 펄스 발생기 : <pgen.vhd>

    library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.std_logic_signed.all;
    entity pgen is
      port( clk, reset, trig : in std_logic;
                   pulse       : OUT std_logic;
                  count       : OUT std_logic_vector(4 downto 0));
    end pgen;
    architecture RTL of pgen is
    signal count_TMP : std_logic_vector(4 downto 0);
    signal pulse_TMP : std_logic;
    constant WIDTH : std_logic_vector := “00111”;
    begin
      count <= count_TMP;
      pulse <= pulse_TMP;
      process ( clk, reset)
      begin
        if reset = ‘1’ then
           pulse_TMP <= ‘0’;
           count_TMP <= “00000”;
        elsif ( clk = ‘1’ and clk’event) then
           if trig = ‘1’ then
              pulse_TMP <= ‘1’;
           end if;
           if pulse_TMP = ‘1’ then
              if count_TMP = WIDTH then
               pulse_TMP <= ‘0’;

                                                                     60
VHDL과 디지털회로설계


            count_TMP <= count_TMP;
          else
             pulse_TMP <= pulse_TMP;
             count_TMP <= count_TMP + ‘1’;
          end if;
        else
            pulse_TMP <= ‘0’;
            count_TMP <= “00000”;
         end if;
        end if;
      end process;
    end RTL;




                                             61
VHDL과 디지털회로설계



다. Memory 응용 회로

   set과 reset이 있는 flip-flop 회로 : <dff1.vhd>

     library IEEE;
     use IEEE.std_logic_1164.all;
     entity dff1 is
       port (set, reset, CLOCK : IN std_logic;
                   DIN           : IN std_logic;
                     q            : OUT std_logic_vector(1 downto 0);
                     qb          : OUT std_logic);
     end dff1;
     architecture rtl of dff1 is
     signal TMP : std_logic;
     begin
       q <= TMP;
      qb <= not TMP;
      process (clock, DIN, set, reset)
      begin
        if (set = ‘0’) then
           TMP <= ‘1’;
        elsif (reset = ‘0’) then
           TMP <= ‘0’;
        elsif(clock = ‘1’ and clock’event) then
           TMP <= DIN;
        end if;
      end process;
     end rtl;


                                                                    62
VHDL과 디지털회로설계




           그림 33. D flip flop 의 합성 회로




                                        63
VHDL과 디지털회로설계




        그림 34. D flip flop 의 시뮬레이션 결과




                                        64
VHDL과 디지털회로설계

    데이터 load가 가능한 8 bit register 회로 : <register1.vhd>

    library IEEE;
    use IEEE.std_logic_1164.all;
    entity register1 is
      port (ENABLE, LOAD, CLOCK : IN std_logic;
                        RESET         : IN std_logic;
                        REGIN         : IN std_logic_vector(7 downto 0);
                     LOADDATA        : IN std_logic_vector(7 downto 0);
                        REGOUT        : OUT std_logic_vector(7 downto 0));
    end register1;
    architecture rtl of register1 is
    signal GATEDCLOCK : std_logic;
    begin
      GATEDCLOCK <= ENABLE and CLOCK;
      process (GATEDCLOCK, LOAD, RESET, ENABLE, CLOCK)
      begin
        if RESET = ‘0’ then
           REGOUT <= “00000000”;
        elsif (GATEDCLOCK = ‘0’ and GATEDCLOCK’event) then
           if LOAD = ‘1’ then
                REGOUT <= LOADDATA;
           else
                REGOUT <= REGIN;
           end if;
        end if;
      end process;
    end RTL;



                                                                 65
VHDL과 디지털회로설계




          그 림 35. Register1 의 합성 회로




                                      66
VHDL과 디지털회로설계




        그 림 36. Register1 의 시뮬레이션 결과




                                       67
VHDL과 디지털회로설계


   Left/right로의 천이가 가능한 shift register : < shiftreg.vhd>

     library IEEE;
     use IEEE.std_logic_1164.all;
     entity shiftreg is
       port (ENABLE, LOAD, CLOCK : IN std_logic;
                          DIN           : IN std_logic;
                        REGIN           : IN std_logic_vector(7 downto 0);
                         MODE            : IN std_logic;
                        REGOUT          : OUT std_logic_vector (7 downto 0));
     end shiftreg;
     architecture rtl of shiftreg is
     signal gatedClock : std_logic;
     signal TMP : std_logic_vector( 7 downto 0);
     begin
       gatedClock <= ENABLE and CLOCK;
       REGOUT <= TMP;
       begin
         if ( gatedClock = ‘1’ and gatedClock’event) then
            if LOAD = ‘1’ then
               TMP <= REGIN;
            elsif MODE = ‘0’ then
               TMP <= TMP(6 downto 0) & DIN;
            else
               TMP <= DIN & TMP(7 downto 1);
            end if;
          end if;
       end process;
     end RTL;

                                                                  68
VHDL과 디지털회로설계


라. FSM(Finite State Machine)

- 디지털 하드웨어를 설계할 때 제어신호를 생성하는 제어기는 FSM으로
 규정되며 FSM의 동작표현은 state transition diagram 또는 state transition
  table 등으로 표현된다
- FSM은 state 변수를 기억하는 레지스터 블록과 state 변수의 천이를 표현하
 는 함수와 출력 값을 결정하는 조합논리 회로로 구성된다
- FSM은 출력이 발생되는 방법에 따라 Mealy Machine과 Moore Machine으로
 분류할 수 있다
- Mealy Machine : 순차회로의 출력이 현재의 상태(state)와 입력에 따라 결정
                 된다


       Next state = function [current state, inputs]
       Outputs = function [current state, inputs]



  Inputs                                               Output Outputs
              Input             State                  Logic
              Logic            Memory

                   Current State


  - Moore Machine : 순차회로의 출력이 입력과 관계없이 현재의 상태의
                    함수로만 결정된다

              Next state = function [current state, inputs]
              Outputs = function [current state]


                                                                    69
VHDL과 디지털회로설계




  Inputs
                   Input              State                 Output Outputs
                   Logic             Memory                 Logic

                      Current State


     Mealy Machine 의 VHDL 예제 1


                             1/1                      X/Z


            S0      1/0    S1        1/0   S2         1/0   S3



           Input           Present              Next             Output
            (X)             State               State             (Z)

            0                S0                  S0                0
            1                S0                  S1                0
            0                S1                  S1                0
            1                S1                  S2                0
            0                S2                  S2                0
            1                S2                  S3                0
            0                S3                  S3                0
            1                S3                  S0                1




                                                                          70
VHDL과 디지털회로설계


 Mealy Machine VHDL 예제 1 : <FSM1.vhd>

   library IEEE ;
   use IEEE.std_logic_1164.all ;
  entity FSM1 is
          port (X, clock : in std_logic ;
                     Z      : out std_logic );
  end FSM1;
  architecture RTL1 of FSM1 is
    type state is (S0, S1, S2, S3) ;
    signal ST : state ;
  begin
     process (clock)
     begin
           if clock’event and clock = ‘1’ then
             if X = ‘0’ then Z = 0 ;
             else
               case ST is
               when S0 => ST <= S1 ; Z <= ‘0’ ;
               when S1 => ST <= S2 ; Z <= ‘0’ ;
               when S2 => ST <= S3 ; Z <= ‘0’ ;
               when S3 => ST <= S0 ; Z <= ‘1’ ;
               end case ;
              end if;
           end if;
      end process ;
   end RTL1 ;

                                                  71
VHDL과 디지털회로설계




        그림 37. Finite State Machine 의 합성 회로




                                              72
VHDL과 디지털회로설계




      그림 38. Finite State Machine 의 시뮬레이션 결과




                                               73
VHDL과 디지털회로설계

 FSM1의 또 다른 모델링 방법

- 다음의 예는 FSM을 합성할 때 추천되는 모델링 기법으로 FSM에서의
설계의 동기회로 부분(SYNCH)을 조합회로 부분 (COMB)과 분리 함
으로써 순차회로와 조합회로의 설계를 용이하게 할 뿐 만 아니라 설계의
수정이나 오류정정이 훨씬 간단하다는 장점을 가지고 있다.


  architecture RTL2 of FSM1 is
    type ST is (S0, S1, S2, S3) ;
    signal Current_ST, Next_ST : state ;
  begin
     COMB : process(Current_ST , X)
     begin
          case Current_ST is
             when S0 =>
             if X = ‘0’ then
                Z <= ‘0’ ; Next_ST <= S0 ;
             else
                Z <= ‘0’ ; Next_ST <= S1 ;
             end if ;
             when S1 =>
             if X = ‘0’ then
                Z <= ‘0’ ; Next_ST <= S1 ;
             else
                Z <= ‘0’ ; Next_ST <= S2 ;
             end if ;


                                             74
VHDL과 디지털회로설계


           when S0 =>
           if X = ‘0’ then
               Z <= ‘0’ ; Next_ST <= S2 ;
           else
               Z <= ‘0’ ; Next_ST <= S3 ;
           end if ;
           when S3 =>
           if X = ‘0’ then
               Z <= ‘0’ ; Next_ST <= S3 ;
           else
               Z <= ‘1’ ; Next_ST <= S0 ;
           end if ;
      end case ;


   SYNCH : process
   begin
        wait until clock’event and clock = ‘1’ ;
        Current_ST <= Next_ST ;
    end process ;
  end RTL2 ;




                                                   75
VHDL과 디지털회로설계


 Mealy Machine VHDL 예제 2 : <FSM2.vhd)

              reset=‘0’
                                         0/0
                             S0
                                                          x/z
               0/1
                                               0/0
                          0/0
                                   1/1
               S1                                    S2
                                 1/0
     Library IEEE ;
     use IEEE.std_logic_1164.all ;
     entity FSM2 is
             port (RESET, CLK, X : in std_logic ;
                             Z           : out std_logic) ;
     end FSM2 ;
     architecture RTL of FSM2 is
          type STATE is (S0, S1, S2);
          signal C_STATE, N_STATE:STATE;
     begin
          SYNC: process(RESET, CLK)
                     begin
                       if RESET=‘0’ then
                             C_STATE <= S0;

                                                                76
VHDL과 디지털회로설계

                   elsif CLK=‘0’ and CLK’event then
                      C_STATE <=N_STATE;
                   end if;
           end process;
   COMB= process (C_STATE, X)
           begin
                   case C_STATE is
                     when S0 => Z <= '0';
                        if X=’0' then
                             N_STATE <= S0;
                       else
                             N_STATE <= S1;
                       end if;
                    when S1 => Z <= '0';
                      if X=‘0’ then
                             N_STATE <= S0;
                      else
                             N_STATE <= S2;
                      end if;
                    when S2 =>
                      if X=‘0’ then
                          N_STATE <= SO;
                          Z <= ‘1’;


                                                      77
 VHDL과 디지털회로설계

                 else
                   N_STATE <= S1;
                   Z <= ‘1’;
                 end if;
             end case;
           end process;
end RTL;




                                    78
VHDL과 디지털회로설계



                  Mealy Machine 예제 3 : <FSM3.vhd>


    library IEEE;
    use IEEE.std_logic_1164.all;
    entity FSM3 is
     port(RESET, CLK, X : in std_logic;
                     z     : out std_logic);
    end FSM3;
      architecture RTL of FSM3 is
       type STATE is (S0, S1, S2);
     signal C_STATE, N_STATE : STATE;
    begin
     SYNC : process (RESET, CLK)
     begin
       if RESET = ‘0’ then C_STATE <= S0;
       elsif CLK = ‘0’ and CLK’event then C_STATE <= N_STATE;
       end if;
     end process;
     COMB : process ( C_STATE, X)
     begin
       case C_STATE is



                                                            79
VHDL과 디지털회로설계


        when S0 => Z <= ‘0’;
          if X = ‘0’ then N_STATE <= S0;
          else N_STATE <= S1;
          end if;
        when S1 => Z <= ‘0’;
          if X = ‘0’ then N_STATE <= S0;
          else N_STATE <= S2;
          end if;
        when S2 =>
          if X = ‘0’ then N_STATE <= S0 ; Z <= ‘0’;
          else N_STATE <= S1 : Z <= ‘1’;
          end if;
       end case;
     end process;
    end RTL;




                                                      80
VHDL과 디지털회로설계


  Moore Machine의 예

       파형발생기의 예제 : <WAVEGEN.vhd>

        RESET=‘0’            PH1,PH2,TMP_PH3

                     110

       010                 001



       111                 101

                     011




CLK

PH1


PH2


PH3

                                         81
  VHDL과 디지털회로설계

library IEEE :
use IEEE.std_logic_1164.all ;
entity WAVEGEN is
  port (RESET, CLOCK : in std_logic;
         PH1, PH2, PH3 : out std_logic);
end WAVEGEN;
architecture RTL of WAVEGEN is
  constant S0 : std_logic_vector(2 downto 0) := ”110";
  constant S1 : std_logic_vector(2 downto 0) := “010”;
  constant S2 : std_logic_vector(2 downto 0) := “111”;
  constant S3 : std_logic_vector(2 downto 0) := “011”;
  constant S4 : std_logic_vector(2 downto 0) := “101”;
  constant S5 : std_logic_vector(2 downto 0) =: “001”;
  signal C_STATE, N_STATE : std_logic_vector(2 downto 0);
  signal TMP_PH3 : std_logic;
  signal PH : std_logic_vector(2 downto 0);
begin
  P1: process (RESET, CLOCK)
  begin
        if RESET=’0' then
              C_STATE <= S0;
        elsif CLOCK =‘1’ and CLOCK'event then
              C_STATE <= N_STATE;
        end if;

                                                            82
  VHDL과 디지털회로설계

end process P1;
P2: process (C_STATE)
 begin


  case C_STATE is
     when S0 => PH <= S0 ; N_STATE <= S1;
     when S1 => PH <= S1; N_STATE <= S2;
     when S2 => PH <= S2; N_STATE <= S3;
     when S3 => PH <= S3; N_STATE <= S4;
     when S4 => PH <= S4; N_STATE <= S5;
     when others => PH <= S5; N_STATE <= S0;
  end case;
  PH1 <= PH(2);
  PH2 <= PH(1);
  TMP_PH3 <= PH(0);
end process P2;


P3: process (CLOCK)
  begin
     if CLOCK=‘0’ and CLOCK’event then
              PH3 <= TMP_PH3
     end if;
end process P3;
end RTL;

                                               83
VHDL과 디지털회로설계




  그림 39. Moore Machine 을 이용한 Wave generator의 합성 회로




                                                     84
VHDL과 디지털회로설계




 그림 40. Moore Machine 을 이용한 Wave generator의 시뮬레이션 결과




                                                   85

								
To top