std_logic_vector 타입은 VHDL에서 시그널 버스를 정의하는 표준입니다. std_logic이 단일 와이어 상태를 모델링한다면, std_logic_vector는 이를 와이어 배열로 확장해 멀티비트 버스 표현을 가능케 합니다.
단일 비트 std_logic과 달리 std_logic_vector는 복합 타입—std_logic 요소의 인덱스된 컬렉션입니다. 임의 개수 비트를 담을 수 있어 멀티비트 데이터를 교환하는 컴포넌트 연결에 이상적입니다.
이 블로그 글은 Basic VHDL Tutorials 시리즈의 일부입니다.
std_logic_vector 시그널 선언 문법: signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>; 또는 signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>; 여기서 <name>은 사용자 선택 식별자, <initial_value>는 선택 사항. <lsb>와 <msb>는 각각 최하위/최상위 비트 인덱스.
to 또는 downto 키워드는 범위 방향(엔디안)을 지정합니다. 둘 다 작동하지만 대부분 설계자는 명확성을 위해 downto를 선호합니다. 비트 벡터 선언 시 일관되게 downto 사용을 권장합니다.
바이트 크기 벡터 VHDL 코드:
signal MySlv : std_logic_vector(7 downto 0);
1비트 벡터 VHDL 코드:
signal MySlv : std_logic_vector(0 downto 0);
빈 범위(0비트) VHDL 코드:
signal MySlv : std_logic_vector(-1 downto 0);
실습
이 비디오 튜토리얼에서 std_logic_vector 시그널 선언과 초기값 주기, For-Loop로 벡터 비트 순회하며 시프트 레지스터 만드는 법을 배웁니다:
이 튜토리얼에서 만든 최종 코드:
library ieee; use ieee.std_logic_1164.all; entity T11_StdLogicVectorTb is end entity; architecture sim of T11_StdLogicVectorTb is signal Slv1 : std_logic_vector(7 downto 0); signal Slv2 : std_logic_vector(7 downto 0) := (others => '0'); signal Slv3 : std_logic_vector(7 downto 0) := (others => '1'); signal Slv4 : std_logic_vector(7 downto 0) := x"AA"; signal Slv5 : std_logic_vector(0 to 7) := "10101010"; signal Slv6 : std_logic_vector(7 downto 0) := "00000001"; begin -- Shift register process is begin wait for 10 ns; for i in Slv6'left downto Slv6'right + 1 loop Slv6(i) <= Slv6(i-1); end loop; Slv6(Slv6'right) <= Slv6(Slv6'left); end process; end architecture;
ModelSim 파형 창에서 run 후 타임라인 확대:
분석
이 실습에서 여섯 개의 std_logic_vector 버스를 선언했는데, 각각 8비트(1바이트) 길이입니다.
Slv1은 초기값 없이 선언됐습니다. 버스 파형 스크린샷에 XX로 나오는 건 16진수 디스플레이가 미정의 값을 표현 못 하기 때문. 자세히 보면 개별 비트는 실제 U입니다.
Slv2는 애그리게이트 할당 (others => '0')로 모든 비트를 0으로 설정. 이 간결한 문법은 벡터 폭에 관계없이 모든 요소가 지정된 값을 받게 합니다.
Slv3도 같은 애그리게이트 기법으로 모든 비트를 1로 초기화, 파형에 FF(8개 1의 16진수)로 표시.
Slv4는 16진수 이니셜라이저 AA 시연. 16진수 한 자리가 4비트라 두 자리가 8비트 벡터 커버.
Slv5는 같은 값을 이진(10101010)로 표현. Slv4와 Slv5 모두 파형에서 AA로 렌더링.
Slv6은 최하위 비트만 1로 설정된 상태로 시작. 프로세스가 10ns마다 1을 벡터를 순환시키는 좌측 시프트 레지스터 구현.
프로세스는 left와 right 속성을 활용해 코드를 제네릭하게 유지; 벡터 크기 변경 시 코드 수정 불필요.