Register Transfer Logic (RTL)은 레지스터 간의 데이터 흐름과 데이터에 대한 논리 및 산술 연산 적용 방식을 설명하는 언어입니다. 엔지니어는 RTL 설계를 사용하여 기능 블록을 기술하고, 특정 기능을 수행하는 데 사용되는 개별 구성 요소의 동작을 정의합니다. 각 기능 블록에는 블록 내 레지스터에 대한 설명(순차 회로라고 함)과 기능 블록에 대한 논리 연산을 포함하는 조합 회로가 있습니다. 또한 하드웨어 기술 언어(HDL)를 사용하여 기능 블록의 연결 방식을 설명하여 회로를 통한 데이터 흐름을 정의합니다.
RTL 설계의 강점은 복잡한 시스템을 HDL 코드로 표현되는 비교적 단순한 블록으로 분할하는 방식에 있습니다. RTL 설계 사용 방법을 이해하는 데 중요한 몇 가지 기본 개념은 다음과 같습니다.
레지스터(Registers)
RTL 설계에서 특정 양의 데이터를 저장할 수 있는 하드웨어 요소를 레지스터라고 합니다. 일반적으로 D 플립플롭으로 구현됩니다. 레지스터의 값은 논리 연산의 입력으로 읽거나 연산의 출력으로 설정할 수 있습니다. 레지스터 간의 데이터 흐름 방식과 연산에 의해 데이터가 변경되는 방식을 특징짓는 것이 RTL 설계의 기본 목적입니다.
하드웨어 기술 언어(HDL)
RTL 설계의 가장 중요한 부분은 회로의 동작을 설명하는 코드입니다. HDL은 변수, 함수 호출, if-then-else 및 CASE와 같은 논리 문, 부울 및 산술 문과 같은 프로그래밍 언어와 매우 유사하게 보이는 사양 언어입니다. 하지만 HDL은 전자 회로, 일반적으로 집적 회로의 동작과 구조를 설명하도록 특별히 설계되었습니다. HDL을 프로그래밍 언어와 차별화하는 한 가지는 회로의 클럭 펄스에 의해 작업이 트리거될 수 있도록 시간 개념이 언어에 포함되어 있다는 것입니다.
이는 회로의 디지털 클럭 펄스 값을 정의하는 변수를 사용하여 수행됩니다. 다음은 인버터에 대한 간단한 VHDL 예제입니다. 여기서 출력(Q)은 클럭 값 clk가 낮은 상태에서 높은 상태로 전환될 때(상승 에지) 입력(D) 값으로 설정됩니다.
D
process(clk) begin if rising_edge(clk) then Q end if; end process;
VHDL(초고속 집적 회로 하드웨어 기술 언어)은 C 언어와는 다른 구문을 가진 장황하고 강력한 형식의 언어입니다. 보다 복잡한 시스템 설계를 설명하는 데 선호되는 HDL입니다.
Verilog 또는 확장 버전인 SystemVerilog는 또 다른 널리 사용되는 HDL입니다. 더 간潔하고 형식이 약하며 유연하며 구문은 C 코드와 유사합니다. 배우고 설명하기 쉽기 때문에 엔지니어는 시작할 때 또는 회로가 너무 복잡하지 않을 때 선호합니다. IEEE는 Verilog와 VHDL 모두를 산업 표준으로 정의합니다.
다음은 두 언어 모두에서 AND 게이트에 대한 간단한 예입니다. AND 게이트에는 두 개의 입력과 하나의 출력이 있습니다. 두 입력이 모두 1이면 출력은 1입니다. 같지 않거나 둘 다 0으로 설정된 경우 출력은 0입니다.
논리 연산
RTL 설계에는 두 가지 유형의 연산이 있습니다. 첫째, 논리 연산은 비트 평가를 수행하고 레지스터에 저장된 데이터를 수정합니다. AND, OR, NOT, XOR 및 시프트와 같은 논리 연산은 HDL에서 논리 동작을 정의하여 생성됩니다. 위의 예는 VHDL 및 Verilog에서 AND를 표현하는 방법을 보여줍니다. 논리 연산은 하드웨어의 논리 게이트를 나타냅니다.
산술 연산
RTL 설계의 두 번째 유형의 연산은 산술 연산입니다. 레지스터의 데이터를 가져와 더하고, 빼고, 곱하고, 나눕니다. 표준 산술 연산자를 사용하여 HDL로 표현됩니다. 예를 들어 VHDL에서 두 숫자를 더하려면 다음 줄을 사용합니다.
rst
— 여기서 inp1과 inp2는 두 개의 입력 레지스터이고 rst는 출력 레지스터에 할당됩니다. RTL의 산술 연산은 가산기, 감산기, 곱셈기 및 나눗셈기와 같은 전용 물리적 요소를 나타냅니다.
동기 및 비동기 동작
RTL 설계는 동기 또는 비동기 방식으로 데이터 흐름을 나타낼 수 있습니다. 동기의 경우 함수에 대한 시스템 클럭 입력에 의해 서브루틴이 실행되거나 트리거됩니다. 비동기의 경우 하나 이상의 입력 포트의 값이 특정 방식으로 변경될 때 서브루틴이 실행됩니다. 이는 if 문을 사용하여 클럭 입력 또는 비클럭 입력의 입력 값이 변경되는지 확인하여 수행됩니다.