liminfo

VHDL Reference

VHDL 엔티티/아키텍처/프로세스 문법 레퍼런스

29개 결과

VHDL Reference 소개

VHDL Reference는 FPGA 및 ASIC 설계에 사용되는 VHSIC Hardware Description Language를 포괄적으로 다루는 검색 가능한 치트 시트입니다. 포트 모드(in, out, inout, buffer)를 포함한 엔티티 선언, 설정 가능한 상수를 위한 제네릭 파라미터, 포트 맵/제네릭 맵을 사용한 컴포넌트 선언 및 인스턴스화, 컴포넌트 선언 없이 VHDL-93 직접 엔티티 인스턴스화를 문서화합니다. 시그널 선언(내부 연결선), 프로세스 내 변수 사용(즉시 할당 vs 시그널 프로세스 종료 시 갱신), 조건부(when/else) 및 선택(with/select) 형태의 동시 시그널 할당을 포함한 아키텍처 정의를 다룹니다.

타입 시스템 섹션은 IEEE STD_LOGIC_1164 9값 논리(0, 1, Z, X, U, W, L, H, -), 완전한 타입 변환 예제(std_logic_vector에서 unsigned, integer로의 변환 및 역변환)를 포함한 IEEE NUMERIC_STD unsigned/signed 산술 타입, FSM 상태를 위한 사용자 정의 열거형 타입, 버스 인터페이스(AXI Stream 등)를 위한 레코드 타입, 메모리/ROM/RAM 선언을 위한 배열 타입, 상수 선언을 다룹니다. 프로세스 및 제어 섹션은 플립플롭 추론을 위한 동기 프로세스(동기/비동기 리셋 패턴), 감도 리스트 요구사항이 있는 조합 프로세스(및 VHDL-2008 process(all)), case 문을 사용한 FSM 상태머신 설계 패턴, 반복(for generate) 및 조건부(if generate) 하드웨어 인스턴스화를 위한 generate 문을 상세히 설명합니다.

연산자 및 함수 섹션은 논리 연산자(and, or, xor, nand, nor, xnor, not, sll, srl, rol), numeric_std 산술(캐리 포함 덧셈, 곱셈, signed/unsigned 비교), 사용자 정의 합성 가능 함수(비트 폭 계산을 위한 log2ceil 등), others 키워드와 결합 연산자를 사용한 집합체 표기법을 포함합니다. 테스트벤치 섹션은 클럭 생성, DUT 인스턴스화, 자극 프로세스, 심각도 수준이 있는 assert/report 문, wait 문(시간, 조건, 클럭 사이클), 테스트 벡터 읽기를 위한 std.textio 파일 I/O 템플릿을 제공합니다. 패키지 및 라이브러리 섹션은 패키지 선언/바디, library/use 임포트(IEEE vs 비표준), 벤더 특정 합성 속성(fsm_encoding, dont_touch, IOB)을 다룹니다. 모든 콘텐츠는 브라우저에서만 실행됩니다.

주요 기능

  • 모든 포트 모드(in, out, inout, buffer), 제네릭, 컴포넌트 인스턴스화를 포함한 엔티티/포트 선언
  • 아키텍처 패턴: signal vs variable, 동시 할당(when/else, with/select), 직접 인스턴스화
  • 완전한 타입 시스템: std_logic(9값), 타입 변환이 포함된 unsigned/signed, 열거형, 레코드, 배열
  • 리셋 스타일과 VHDL-2008 process(all)을 포함한 동기 및 조합 프로세스 패턴
  • case 문과 적절한 리셋 처리를 포함한 FSM 상태머신 설계 템플릿
  • 연산자 레퍼런스: 논리, 산술, 시프트, 비교, 집합체 표기법과 예제
  • 테스트벤치 템플릿: 클럭 생성, assert/report, wait 문, 테스트 벡터를 위한 파일 I/O
  • 패키지/라이브러리 사용: IEEE 표준 임포트, 사용자 패키지, 벤더 특정 합성 속성

자주 묻는 질문

VHDL에서 signal과 variable의 차이는 무엇인가요?

Signal은 물리적 와이어를 나타내며 현재 프로세스 실행 종료 시(델타 사이클) 갱신됩니다. Variable은 프로세스 내부에만 존재하며 할당 시 즉시 갱신됩니다. 프로세스 내에서 시그널을 여러 번 할당하면 마지막 할당만 적용됩니다. 변수는 각 할당을 즉시 반영하여 중간 계산에 유용합니다. 시그널은 <=로, 변수는 :=로 할당합니다. 합성 가능한 RTL에서 시그널은 컨텍스트에 따라 레지스터나 와이어를 추론하고, 변수는 일반적으로 조합 논리를 생성합니다.

조합 프로세스에서 의도하지 않은 래치를 어떻게 피하나요?

의도하지 않은 래치는 조합 프로세스의 모든 가능한 분기에서 시그널이 할당되지 않을 때 추론됩니다. 방지하려면: (1) 감도 리스트에 모든 읽기 시그널을 포함하거나 VHDL-2008의 process(all)을 사용, (2) if/case 문 전에 프로세스 상단에서 모든 출력에 기본값 할당, (3) case 문에 항상 "others" 절 포함, (4) 모든 가능한 실행 경로에서 모든 시그널이 할당되도록 보장. 기본값 없이 조건부로만 시그널을 할당하면 합성기가 이전 값을 유지하기 위해 래치를 추론합니다.

동기 리셋과 비동기 리셋 중 어떤 것을 사용해야 하나요?

동기 리셋(rising_edge(clk) 내부에서 확인)이 FPGA 설계에서 일반적으로 선호됩니다. 플립플롭의 동기 리셋 입력을 사용하고, 더 깨끗한 타이밍을 제공하며, 메타안정성 문제를 피합니다. 비동기 리셋(감도 리스트에 포함, rising_edge 전에 확인)은 전원 투입 시퀀스 등 리셋 중 클럭이 동작하지 않을 수 있을 때 필요합니다. Xilinx는 대부분의 FPGA 설계에 동기 리셋을 권장합니다. 핵심 패턴: 동기는 "if rising_edge(clk) then if rst..."이고 비동기는 "if rst... elsif rising_edge(clk)"입니다.

std_logic_arith 대신 numeric_std를 사용해야 하는 이유는?

IEEE NUMERIC_STD는 std_logic_vector 기반 타입의 산술 연산을 위한 공식 IEEE 표준(1076.3)입니다. std_logic_arith와 std_logic_unsigned는 IEEE 표준이 아닌 Synopsys 독점 패키지로, 역사적으로 많은 도구에 포함되었습니다. numeric_std를 사용하면 모호성을 피하고(unsigned와 signed 타입을 명시적으로 분리), 모든 도구에서 이식 가능하며, 보편적으로 권장되는 방식입니다. 같은 파일에서 numeric_std와 std_logic_arith를 절대 혼합하지 마세요.

std_logic_vector, unsigned, integer, signed 간 변환 방법은?

IEEE.NUMERIC_STD의 변환 함수를 사용합니다: std_logic_vector에서 unsigned: unsigned(slv). unsigned에서 std_logic_vector: std_logic_vector(u). unsigned에서 integer: to_integer(u). integer에서 unsigned: to_unsigned(int_val, width). signed의 경우: signed(slv), std_logic_vector(s), to_integer(s), to_signed(int_val, width). std_logic_vector와 integer 간 직접 변환은 unsigned 또는 signed를 중간 단계로 거쳐야 합니다.

generate 문은 무엇이고 언제 사용해야 하나요?

generate 문은 정교화 시간(합성 전)에 반복적이거나 조건부 하드웨어 구조를 생성합니다. "for generate"는 동일한 컴포넌트의 여러 인스턴스를 생성합니다 — 예를 들어 시프트 레지스터에 N개의 레지스터 셀을 인스턴스화합니다. "if generate"는 제네릭이나 상수에 따라 조건부로 하드웨어를 포함합니다 — 예를 들어 USE_PARITY가 참일 때만 패리티 생성기를 포함합니다. generate 문은 반복 구조의 수동 복사/붙여넣기를 대체하여 설계를 매개변수화하고 유지보수 가능하게 합니다. 런타임이 아닌 컴파일 타임에 실행됩니다.

올바른 VHDL 테스트벤치를 작성하는 방법은?

테스트벤치 엔티티는 포트가 없습니다(entity tb_name is end entity). 아키텍처에서: (1) DUT 포트에 맞는 시그널 선언, (2) "clk <= not clk after CLK_PERIOD/2"로 클럭 생성, (3) port map으로 DUT 인스턴스화, (4) wait 문으로 입력을 적용하고 결과를 기다리는 자극 프로세스 생성. assert 문으로 출력을 검증합니다: "assert actual = expected report error_message severity error". 시뮬레이션을 멈추려면 자극 프로세스를 "wait;"로 종료합니다. 철저한 테스트를 위해 외부 파일에서 테스트 벡터를 읽는 파일 I/O(std.textio)를 사용하세요.

VHDL의 벤더 특정 합성 속성이란 무엇인가요?

합성 속성은 VHDL 코드가 하드웨어에 어떻게 구현되는지 제어하는 합성 도구 지시자입니다. 일반적인 예: fsm_encoding은 상태머신 인코딩 제어(one_hot, sequential, gray), dont_touch는 옵티마이저가 시그널/컴포넌트를 제거하거나 수정하는 것을 방지, IOB는 더 나은 타이밍을 위해 레지스터를 I/O 블록에 강제 배치합니다. "attribute attr_name : string"으로 선언하고 "attribute attr_name of signal_name : signal is value"로 적용합니다. 속성은 벤더(Xilinx, Intel/Altera, Lattice)별로 다르므로 도구 문서에서 지원되는 속성을 확인하세요.