산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> VHDL

Pmod SSD용 VHDL 듀얼 7세그먼트 디스플레이 컨트롤러 - 쉬운 FPGA 통합

7세그먼트 디스플레이 작동 원리

시중에는 다양한 7세그먼트 디스플레이가 있습니다. 자릿수, 물리적 인터페이스, 핀아웃이 모두 다릅니다. 모든 가능한 7세그먼트 디스플레이를 다루는 범용 솔루션은 사용자 친화적이지 않을 수 있습니다. 하지만 이 글의 코드를 기초로 수정해 필요에 맞게 사용할 수 있습니다.

디지전트 Pmod 모듈 데이터시트 이미지는 7세그먼트 디스플레이가 Pmod 핀에 어떻게 연결되는지 보여줍니다. 이 핀들은 iCEstick의 FPGA에 직접 접근 가능합니다. 7개 핀이 디스플레이의 각 세그먼트를 제어합니다. 로직 하이 값을 드라이브하면 해당 세그먼트가 점등됩니다. 하지만 이 디스플레이는 두 자릿수인데 한 번에 하나만 제어할 수 있습니다. J2 커넥터의 P4/C 핀이 왼쪽 또는 오른쪽 자릿수를 선택합니다. 이 핀의 로직 전압이 '0'이면 오른쪽 자릿수, '1'이면 왼쪽 자릿수가 활성화됩니다. "DP" 소수점은 미연결 상태로 접근 불가합니다.

엔티티(Entity)

아래 코드는 seg7 VHDL 모듈의 엔티티를 보여줍니다. 제네릭 포트에 clk_cnt_bits 상수가 있어 디스플레이 리프레시 비율(왼쪽·오른쪽 자릿수 교대 주파수)을 제어하는 내부 카운터 길이를 정의합니다. 정확한 주파수는 중요하지 않으며 50~수백 헤르츠 범위의 카운터 길이를 선택하면 됩니다. 공식: refresh_hz = 2^clk_cnt_bits / clk_hz.

entity seg7 is
  generic (
    -- refresh_hz = (2 ** clk_cnt_bits) / clk_hz
    clk_cnt_bits : integer
  );
  port (
    clk       : in  std_logic;
    rst       : in  std_logic;
    value     : in  integer range 0 to 99;
    segments  : out std_logic_vector(6 downto 0);
    digit_sel : out std_logic
  );
end seg7;

클럭과 리셋 외에 표시할 값을 입력하는 value 신호가 있습니다. 0~99 범위의 정수 타입으로 두 자릿수로 표시 가능한 숫자만 허용합니다. 출력은 7개 세그먼트 벡터와 자릿수 선택 신호입니다.

이진화 십진수(BCD) 표현

디스플레이에 표시할 숫자를 표현하기 위해 이진화 십진수(BCD) 형식을 사용합니다. 이진 표현이 십진수를 저장하는 가장 효율적인 방법이지만, 왼쪽·오른쪽 자릿수로 분할하려 할 때 문제가 됩니다. 숫자를 저장하는 벡터를 슬라이싱하는 것만으로는 십진수 자릿수를 구분할 수 없습니다.

subtype digit_type is integer range 0 to 9;
type digits_type is array (1 downto 0) of digit_type;
signal digit  : digit_type;
signal digits : digits_type;

digit_type은 한 십진 자릿수로 표현 가능한 값(0~9)의 정수 서브타입입니다. digits_type은 두 개의 BCD 값을 담는 배열 타입입니다. digit 신호는 현재 왼쪽 또는 오른쪽 디스플레이에 표시되는 숫자를 보관합니다. digits 신호는 화면에 나타날 두 자릿수의 개별 십진 문자를 담습니다.

십진수를 BCD로 변환

이 모듈의 입력 value는 0~99 범위의 정수로, 숫자의 이진 표현입니다. 이를 0~9 범위의 두 정수(BCD)로 변환해야 합니다. 표준 알고리즘은 더블 대블(Double Dabble) 또는 '시프트-앤드-애드-3' 알고리즘이지만, 두 자릿수만 분리하면 되므로 더 짧은 해결책을 사용합니다.

digits(1) <= value / 10;
digits(0) <= value - ((value / 10) * 10);

위 코드처럼 정수 나눗셈으로 최상위 십진 자릿수를 분리해 digits(1)에 할당합니다. 최하위 자릿수는 value에서 최상위 자릿수를 빼서 digits(0)에 할당합니다.

클럭 사이클 카운팅

FPGA에서 시간 지연은 단순히 클럭 사이클을 세는 문제입니다. 클럭 주기는 VHDL 코드에서 의존할 수 있는 유일한 예측 가능한 시간 간격입니다. clk_cnt_bits 제네릭이 비트 수를 결정하는 부호 없는 clk_cnt 신호로 클럭 사이클을 셉니다.

signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);

정확한 리프레시 비율은 덜 중요하므로 부호 없는 타입을 사용해 자동 랩어라운드 동작을 활용합니다. 클럭 상승 에지마다 카운터를 증가시키는 동기 프로세스(리셋 포함)가 이를 처리합니다.

COUNT_PROC : process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      clk_cnt <= (others => '0');
    else
      clk_cnt <= clk_cnt + 1;
    end if;
  end if;
end process;

자릿수 교대

자유 실행 카운터가 작동하면 부호 없는 카운터 신호의 최상위 비트(MSB)를 사용해 두 자릿수를 전환합니다. MSB는 50% 듀티 사이클로 '0'과 '1' 사이를 번갈아 가며 변경됩니다. 첫 줄은 MSB 값에 따라 digit_sel 신호를 설정합니다. 두 번째 줄은 MSB를 선택자로 사용하는 멀티플렉서를 구현해 활성 자릿수의 값을 digits 배열에서 digit 신호로 전달합니다.

digit_sel <= clk_cnt(clk_cnt'high);
digit     <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);

BCD to 7세그먼트 인코더

마지막 단계는 digit 신호에 저장된 BCD를 7세그먼트 디스플레이의 시각적 표현으로 변환하는 것입니다. 아래 프로세스는 case 문으로 이를 수행합니다. 벡터의 각 비트 위치가 디스플레이의 한 세그먼트에 대응합니다. 인덱스 0 = 세그먼트 A, 1 = B, ..., 6 = 세그먼트 G. 매핑은 디지전트 7세그먼트 디스플레이 데이터시트에서 유래했습니다.

ENCODER_PROC : process(digit)
begin
  case digit is
    when 0 => segments <= "0111111";
    when 1 => segments <= "0000110";
    when 2 => segments <= "1011011";
    when 3 => segments <= "1001111";
    when 4 => segments <= "1100110";
    when 5 => segments <= "1101101";
    when 6 => segments <= "1111101";
    when 7 => segments <= "0000111";
    when 8 => segments <= "1111111";
    when 9 => segments <= "1101111";
  end case;
end process;

출력 결과

seg7 VHDL 모듈은 value 입력 신호에 할당된 내용을 디스플레이에 렌더링합니다. 테스트벤치에서는 value 신호를 1초마다 증가시키고 100초 이상 시뮬레이션해 value 카운터의 랩어라운드 지점을 관찰합니다. ModelSim 파형은 0~15까지 카운트되는 초기 부분을 보여줍니다. digits 배열의 숫자들도 함께 카운트됩니다. 일의 자리(0)는 value가 바뀔 때마다, 십의 자리(1)는 10번마다 증가합니다.

ModelSim 프로젝트(테스트벤치 포함)는 아래 폼에서 다운로드 가능합니다. seg7 모듈을 FPGA의 최상위 모듈로 구현하면 디스플레이에 안정적인 "00"이 표시될 것입니다. FPGA에서 초기화되지 않은 신호의 가장 일반적인 기본값이 '0'이기 때문입니다. value가 모두 0으로 설정되면 디스플레이는 그대로 표시합니다.

모든 가능한 입력 숫자를 순환하기 위해 value 신호를 초당 10번 증가시키는 래퍼 VHDL 모듈을 만들었습니다. seg7 모듈을 래퍼에 인스턴스화한 후 Lattice iCEstick에 구현했습니다. 아래 루핑 GIF 비디오는 구현된 디자인이 7세그먼트 디스플레이에 어떻게 보이는지 보여줍니다.

Pmod SSD: 7세그먼트 디스플레이 구매

이 블로그 게시물에서 사용한 7세그먼트 디스플레이는 디지전트(Digilent) 제품입니다. 디지전트 웹샵이나 여러 리셀러에서 구매할 수 있습니다. 아래 목록에서 몇 가지 온라인 전자제품 매장의 제품 페이지를 링크했습니다.

Lattice iCEstick이나 6×2핀 Pmod 커넥터가 있는 다른 FPGA 개발 보드와 디지전트 7세그먼트 디스플레이를 함께 사용하려면 스플리터 케이블도 필요합니다. 케이블은 Digilent, Digi-key, Mouser, RS Electronics에서 구할 수 있습니다. 또한 모든 구성품은 아마존과 이베이의 다양한 판매자로부터 구매 가능합니다.

디지전트 7세그먼트 디스플레이를 활용한 VHDL 강좌

초보자를 위한 새로운 VHDL 및 FPGA 강좌를 개설했습니다. 이 강좌에서는 디지전트 7세그먼트 디스플레이와 Lattice iCEstick FPGA 개발 보드를 사용해 VHDL을 가르칩니다. 아래 링크를 클릭해 강좌에 대해 자세히 알아보세요!

FPGA and VHDL Fast-Track: Hands-On for Absolute Beginners

자세히 읽고 등록하기: FPGA and VHDL Fast-Track: Hands-On for Absolute Beginners

VHDL

  1. VHDL 함수 마스터하기: 효율적 설계를 위한 실전 가이드
  2. VHDL 자가 검증 테스트벤치 구축 실전 가이드
  3. VUnit 101: 자동화된 VHDL 검증을 위한 실용 가이드
  4. Pmod SSD용 VHDL 듀얼 7세그먼트 디스플레이 컨트롤러 - 쉬운 FPGA 통합
  5. VHDL Generate 문 마스터하기: 재사용 가능한 디바운서 손쉽게 만들기
  6. VHDL 입문: 첫 AND 게이트 만들기
  7. 고급 VHDL 퀴즈 2부: HDL 전문성 테스트
  8. VHDL 마스터하기: FPGA 및 ASIC 설계를 위한 종합 입문서
  9. VHDL 조건문 마스터하기: If-Then-Elsif-Else 완벽 가이드
  10. VHDL For-루프 마스터하기: 실용 가이드