Basic VHDL Tutorial 시리즈 6-11 튜토리얼 완료 후 이 전문가 제작 퀴즈로 도전하세요. 이해 한계를 밀어붙이도록 설계됐으니 불확실할 땐 추리력으로 가장 그럴듯한 답을 고르세요. 각 답변 뒤의 간단한 설명으로 마이크로 러닝하세요. 문제 1 이 코드는 무엇을 출력할까요? MySignal=-2147483648 MySignal=0 MySignal=10 Correct!Wrong!- 계속 >> 문제 2 이 코드는 무엇을 출력할까요? MySignal=0 MySignal=1 MySignal=10 Corr
VHDL에서 signed와 unsigned는 데이터 버스에 산술 연산을 수행하게 해주는 특수 비트 벡터입니다. std_logic_vector가 시그널 라우팅엔 이상적이지만 계산엔 부적합한 반면, 이 타입들은 컴파일러에 의해 숫자값으로 해석됩니다. std_logic_vector를 더하려 하면 No feasible entries for infix operator + 컴파일 에러가 납니다. 도구가 원시 비트 패턴을 숫자로 어떻게 다룰지 판단 못 하기 때문입니다. Basic VHDL Tutorials 시리즈의 일부. 산술을 가능하게 하려면
VHDL에서 동시 문장(concurrent statement)은 process 블록 밖, 아키텍처에 직접 놓인 시그널 할당입니다. 동시 할당(concurrent assignment) 또는 동시 프로세스(concurrent process)라고도 부릅니다. 동시 문장을 쓰면 할당 우변에 나타나는 모든 시그널에 자동으로 민감한 프로세스를 만드는 효과가 있습니다. 즉, 동시 할당은 완전한 민감도 리스트를 가진 프로세스의 문법적 설탕(syntactic sugar)입니다. 이 단축 표현은 단일 시그널을 구동하는 간단한 조합 논리를 구현할 때
Case-When 문은 시그널, 변수, 표현식에 따라 VHDL 프로그램을 여러 경로 중 하나로 이끕니다. 긴 if-then-elsif-else 체인보다 깔끔하고 읽기 쉬운 대안이며, 특히 여러 이산 값을 다룰 때 유용합니다. 많은 프로그래밍 언어가 switch나 case 구문을 쓰는데, VHDL에서 case 구문은 멀티플렉서와 다른 선택 로직 구축의 필수 요소입니다. 이 글은 Basic VHDL Tutorials 시리즈의 일부입니다. 기본 문법 case 문의 정식 구조: case <expression> is when &l
VHDL에서 모듈은 엔티티(entity)를 통해 외부 세계와 소통하는 자기 완결적 단위입니다. 인스턴스화의 포트 맵(port map) 절은 엔티티의 형식 포트를 주변 설계의 시그널에 연결합니다. 모듈, 엔티티, 테스트벤치 FPGA나 ASIC 개발 시 설계 로직은 명확히 정의된 입력/출력 포트를 가진 모듈에 들어갑니다. 포트가 없는 모듈은 테스트벤치입니다—시험 대상 장치(DUT)에 자극을 주는 시뮬레이션 래퍼로, 물리 칩에는 절대 나타나지 않습니다. 앞선 글들에서는 모든 VHDL을 단일 파일에 썼는데, 빠른 실험엔 편하지만 프로덕션
재사용 가능한 모듈 만들기는 효율적 VHDL 설계의 초석이지만, 사소한 변형 때문에 코드 중복이 생기곤 합니다. 제네릭과 제네릭 맵은 모듈 파라미터를 컴파일 타임에 구성하게 해 코드를 DRY(Dont Repeat Yourself)하고 유지보수하기 쉽게 만듭니다. 상수는 같은 값을 반복 하드코딩하는 걸 방지합니다. 시그널 벡터 폭이나 다른 컴파일 타임 파라미터 정의에 이상적이며, 제네릭 상수에 매핑할 수도 있습니다. 시그널이나 변수와 달리 상수 값은 엘라보레이션 후 불변이라 설계 전반에 일관성을 보장합니다. 이 글은 Basic VHD
대부분의 VHDL 설계는 클록된 로직, 흔히 동기 또는 순차 로직이라 불리는 것을 사용합니다. 클록된 프로세스는 다른 입력 시그널 변화와 무관하게 마스터 클록의 에지에서만 활성화됩니다. 클록된 로직의 기본 요소는 플립플롭(flip-flop)입니다. 이 튜토리얼에서는 네거티브 리셋을 가진 양의 에지 트리거 플립플롭에 집중합니다. 아래 회로도를 참조하세요: 샘플-홀드 장치로서 플립플롭은 상승 클록 에지에서 입력 값을 캡처하고, 다음 상승 에지 또는 리셋 신호 어서트 전까지 그 값을 유지합니다. 참고: 이 글은 Basic VHDL Tu
Basic VHDL Tutorial 시리즈 12-17 튜토리얼을 완료하고 이 퀴즈로 지식을 테스트해 보세요. 문제 1: signed 타입에 대한 진술로 옳은 것은? unsigned 타입보다 더 높은 값을 표현할 수 있다 최상위 비트가 1이면 값은 음수여야 한다 오버플로는 런타임 에러다 - 계속 >> 문제 2: 이 동시 프로세스와 등가인 것은? - 계속 >> 문제 3: 이 코드 실행 후 Output 값은? 0000 00
이전 튜토리얼에서는 시뮬레이션에서 시간을 지연시키려고 wait for 문을 썼습니다. 하지만 wait for는 실제 회로에 일시정지 명령을 내릴 수 없으므로 실제 설계(프로덕션)에는 쓸 수 없습니다. VHDL 모듈에서 시간을 측정하는 실용적 방법은 클록 사이클을 세는 것입니다. 모든 디지털 설계는 알려진 주파수로 진동하는 안정된 클록 신호에 접근할 수 있습니다. 클록이 100MHz면 1초는 1억 클록 틱입니다. 이 틱을 세면 초, 분, 시간 등을 신뢰성 있게 생성할 수 있습니다. 이 글은 Basic VHDL Tutorials 시리즈
VHDL에서 프로시저는 설계자가 반복 코드 블록을 피하게 해주는 서브프로그램입니다. 같은 연산이 여러 곳에서 필요할 때 전체 모듈을 만드는 건 과할 수 있습니다. 프로시저는 가벼우면서 재사용 가능한 해결책을 제공합니다. 프로시저는 아키텍처, 패키지, 프로세스 등 모든 선언 영역에 선언 가능하며 그 범위는 해당 영역으로 한정됩니다. 호출 시 프로시저 본문이 마치 제자리에서 작성된 것처럼 실행되어 별도 컴포넌트 오버헤드 없이 모듈러리티 이점을 줍니다. 함수와 달리 프로시저는 직접 값을 반환하지 않습니다. 하지만 파라미터 리스트에 out
유한 상태 머신(FSM)은 현재 입력뿐만 아니라 과거 입력과 출력의 시퀀스에 따라 출력이 결정되는 결정론적 논리 모델입니다. FPGA 설계와 시간 의존적 VHDL 알고리즘에서 FSM은 상태ful 동작을 포착하는 표준 추상화입니다. VHDL에서 FSM은 일반적으로 state 시그널을 사용해 마지막 구성을 기억하는 클록된 프로세스로 구현됩니다. 상태 시그널은 내부 레지스터 역할을 해 설계가 여러 클록 사이클에 걸친 이벤트에 반응할 수 있게 합니다. Basic VHDL Tutorials – Part 3 신호등을 FSM으로 교통 신호등으로
함수는 VHDL에서 자주 쓰이는 알고리즘 구현에 쓰이는 서브프로그램입니다. 함수는 0개 이상의 입력값을 받아 항상 값을 반환합니다. 프로시저와 구별되는 점은 Wait-문장을 포함할 수 없어 항상 0 시뮬레이션 시간을 소모한다는 것입니다. 다른 언어의 함수나 메서드에 익숙하다면 VHDL 함수도 쉽게 익힐 수 있습니다. VHDL에서는 반환값을 생략하거나 void를 반환할 수 없고, 함수는 항상 무언가를 반환해야 하며 반환값은 반드시 어딘가에 할당되어야 합니다. 이 블로그 글은 Basic VHDL Tutorials 시리즈의 일부입니다.
VHDL에서 비순수 함수(impure function)는 파라미터 리스트에 없는 시그널을 포함해 자신의 어휘적 범위 내 모든 시그널에 접근하거나 수정할 수 있습니다. 이 능력으로 함수에 부작용(side effects)이 생기는데, 같은 인수를 줘도 반환값이 달라질 수 있고 직접 반환하지 않는 외부 시그널을 변경할 수도 있습니다. 순수 함수는 결정론적 동작에 한정되지만, 비순수 함수는 복잡한 상태 머신 로직을 정리할 때 반복적이거나 부작용이 있는 작업을 단일하고 잘 명명된 서브프로그램으로 옮기는 데 매우 유용합니다. 참고: 비순수 함
VHDL에서 프로시저는 시그널이 범위 내에 있는 한 외부 시그널을 구동할 수 있습니다. 아키텍처에 선언된 프로시저는 컴파일 시점에 외부 시그널이 보이지 않아 접근할 수 없지만, 프로세스 내부에 정의된 프로시저는 해당 프로세스가 볼 수 있는 모든 시그널을 자유롭게 읽고 쓸 수 있습니다. 프로세스 내 프로시저를 사용하면 상태 머신이나 복잡한 프로토콜에서 반복되는 로직을 정리하는 효과적인 방법입니다. 타이밍 상태 전이 같은 공통 동작을 프로시저로 캡슐화하면 상용구 코드를 줄이고 가독성을 높이며 각 단계의 의도를 명확히 할 수 있습니다.
Basic VHDL Tutorial 시리즈 4부를 완료한 후 이 퀴즈로 진도를 점검해 보세요! 문제 1: VHDL에서 실제 시간을 어떻게 측정하나요? wait for 1 ns 문으로 클록 주기 세기로 전파 지연 활용으로 - 계속 >> 문제 2: 다음 중 참인 문장은? 프로시저는 Wait-문장을 포함할 수 없다 프로시저 파라미터는 항상 입력이다 프로시저에서 return 키워드는 값 없이 써야 한다 - 계속 >> 문제 3: 이 화재 제어 시스템의 근본적 결함을 설명하는
링크드 리스트는 요소가 추가/제거될 때 확장/축소되는 동적 자료구조입니다. VHDL의 객체지향 기능인 액세스 타입, 레코드, 보호 타입을 사용하면 이 구조를 깔끔하고 효율적으로 구현할 수 있습니다. DataStructures 패키지 생성 링크드 리스트 관련 로직을 DataStructures라는 전용 VHDL 패키지에 캡슐화하겠습니다. 이 이름은 향후 트리나 해시맵 같은 다른 구조로 확장하기에도 좋습니다. package DataStructures is -- Public declarations go here end package Dat
자가 검증 테스트벤치는 수동 검사 없이 DUT(시험 대상 장치)의 정확성을 자동으로 검증하는 VHDL 프로그램입니다. 실행하면 OK 또는 Failed 상태를 자동 보고하므로 신뢰할 수 있는 VHDL 개발에 필수적인 도구입니다. 모든 VHDL 모듈은 연관된 자가 검증 테스트벤치를 가져야 합니다. 이렇게 하면 DUT 자체, 서브모듈, 인터페이스 변경 시 회귀 버그가 조용히 생기는 걸 방지할 수 있습니다. 잘 만든 테스트벤치는 미묘한 버그에 대한 첫 번째 방어선입니다. 시험 대상 장치(DUT) 간단하면서도 설명하기 좋은 DUT로 이진-그
인터랙티브 테스트벤치는 시뮬레이터 설정 중 하나로, 실행 중에 연산자가 DUT(시험 대상 장치)에 입력을 제공하는 방식입니다. 주로 시뮬레이터 콘솔에 명령어를 입력해 DUT에 자극을 주는 형태입니다. 항상 자가 검증 테스트벤치를 만들어야 하지만, 인터랙티브 테스트벤치는 좋은 보조 수단이 됩니다. 자가 검증 테스트벤치 코드를 수정하는 것보다 인터랙티브 테스트벤치로 애드혹(ad-hoc) 테스트를 수행하기가 더 쉽습니다. 랩에서 발견한 문제를 테스트벤치에서 재현해보고 싶을 때가 많습니다. 인터랙티브 테스트벤치가 있으면 시뮬레이터에서 관찰
순환 버퍼는 순차 프로그래밍 언어에서 큐를 생성하는 데 널리 쓰이지만, 하드웨어에서도 구현할 수 있습니다. 이 글에서는 VHDL로 링 버퍼를 만들어 블록 RAM에 FIFO를 구현하는 방법을 다룹니다. FIFO를 구현할 때는 여러 설계 결정을 내려야 합니다. 어떤 인터페이스가 필요한가? 리소스 제약이 있는가? 오버리드와 오버라이트에 강건해야 하는가? 레이턴시가 허용되는가? 이런 질문들이 FIFO 설계 시 떠오릅니다. 온라인에는 무료 FIFO 구현체와 Xilinx LogiCORE 같은 FIFO 생성기가 많지만, 여전히 많은 엔지니어가
제약 난수 검증(Constrained Random Verification)은 DUT(시험 대상 장치)에 대한 유사 난수 트랜잭션 생성에 의존하는 테스트벤치 전략. 목표는 DUT와의 무작위 상호작용을 통해 미리 정의된 다수 이벤트의 기능적 커버리지(functional coverage) 달성. OSVVM(Open Source VHDL Verification Methodology)은 제약 난수 테스트벤치 생성에 편리한 다수 패키지 포함된 무료 VHDL 라이브러리. 특히 RandomPkg와 CoveragePck에 관심, 이 글에서 사용.
VHDL