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

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

이 기사에서는 Pmod SSD에 두 자리 숫자를 표시할 수 있는 VHDL 모듈인 Digilent의 7세그먼트 디스플레이를 소개하겠습니다. 듀얼 7세그먼트 디스플레이는 Pmod 인터페이스와 호환되므로 납땜 없이 사용할 수 있습니다. 이는 많은 FPGA 개발 보드의 표준인 Pmod 커넥터에 맞습니다.

VHDL 구현을 테스트하기 위해 Pmod 커넥터가 있는 저가형 FPGA 개발 보드인 Lattice iCEstick을 사용하고 있습니다. iCEstick 외에도 iCEstick의 병렬 Pmod 커넥터를 7세그먼트 디스플레이에 필요한 직렬 버전 플러그로 변환하려면 2×6핀-듀얼 6핀 Pmod 분배기 케이블이 필요합니다. 마지막으로, iCEstick을 컴퓨터의 USB 포트에 직접 연결하는 것은 비현실적이므로 USB A형 연장 케이블을 구입하는 것이 좋습니다.

7세그먼트 디스플레이 작동 방식

시중에는 다양한 7세그먼트 디스플레이가 있습니다. 자릿수는 서로 다르며 물리적 인터페이스와 핀아웃도 마찬가지입니다. 접할 수 있는 모든 7세그먼트 디스플레이를 포괄하는 일반적인 솔루션은 아마도 사용자 친화적이지 않을 것입니다. 그러나 이 문서에 제시된 코드를 기초로 사용하여 필요에 맞게 수정할 수 있습니다.

위 이미지는 Digilent Pmod 모듈의 데이터시트에서 가져온 것입니다. 7세그먼트 디스플레이가 Pmod 핀에 연결되는 방식을 보여줍니다. 이 핀은 iCEstick의 FPGA에 직접 액세스할 수 있습니다.

핀 중 7개가 디스플레이의 각 세그먼트를 제어합니다. 이러한 핀에 로직 하이 값을 구동하면 해당 세그먼트가 디스플레이에 켜집니다. 하지만 이 디스플레이에는 두 개의 숫자가 있으며, 우리는 한 번에 하나만 제어할 수 있습니다. J2 커넥터의 P4/C 핀은 하나 또는 다른 숫자를 선택합니다. 이 핀의 논리 전압이 '0'인 경우 , '1'인 경우 오른쪽 숫자가 켜집니다. , 왼쪽 숫자가 활성화됩니다.

"DP" 소수점은 연결되지 않아 접근할 수 없습니다.

엔티티

아래 코드는 seg7 VHDL 모듈의 엔터티를 보여줍니다. 엔터티에 clk_cnt_bits라는 상수가 있는 일반 포트가 있습니다. . 이는 디스플레이의 새로 고침 빈도, 왼쪽과 오른쪽 숫자 사이의 교대 빈도를 제어하는 내부 카운터의 길이를 정의합니다.

정확한 빈도는 필수가 아닙니다. 50~200Hz 범위의 카운터 길이를 선택합니다. 새로고침 빈도를 결정하는 공식은 refresh_hz =2clk_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;

시계 및 재설정 외에도 엔터티에는 하나의 입력 신호, 즉 7세그먼트 디스플레이에 표시할 값이 있습니다. value signal은 0에서 99까지의 범위로 제한되는 정수 유형입니다. 이는 두 자리 숫자만 사용하여 표시할 수 있는 유일한 숫자 값이기 때문입니다.

출력 신호는 벡터로서의 7개 세그먼트와 조명할 왼쪽 또는 오른쪽 숫자를 선택하기 위한 숫자 선택기 신호입니다.

이진 코드 십진수 표현

디스플레이에 표시된 숫자를 표시하기 위해 BCD(Binary-Coded Decimal)라는 형식을 사용합니다. 이진 표현은 십진수를 저장하는 가장 효율적인 방법이지만 디스플레이에 표시하기 위해 왼쪽과 오른쪽 숫자로 분할하려고 하면 문제가 발생합니다. 숫자를 저장하는 데 사용되는 벡터를 쪼개는 것만으로는 소수점 이하 자릿수를 구분할 수 없습니다.

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;

위의 코드에서 볼 수 있듯이 십진수 한 자리로 표현할 수 있는 값을 설명하기 위해 0~9 범위의 정수 하위 유형을 선언합니다. 그런 다음 두 개의 BCD 값을 보유할 수 있는 새로운 배열 유형을 선언합니다. digit 신호는 현재 디스플레이의 왼쪽이나 오른쪽에 표시되는 숫자를 보유합니다. 반면 digits 신호에는 화면을 보는 사람에게 표시되는 두 자리의 개별 십진 문자가 포함되어 있습니다.

십진수를 BCD로 변환

이 모듈에 대한 입력, value 는 0~99 범위의 정수로, 숫자를 이진수로 표현한 것입니다. 이 단일 정수를 0~9 범위의 두 정수(BCD)로 변환해야 합니다.

이에 대한 표준 알고리즘은 shift-and-add-3이라고도 알려진 Double Dabble입니다. 알고리즘. 사용해도 좋지만 우리의 경우에는 구분할 숫자가 두 자리뿐이므로 더 짧은 솔루션을 선택하겠습니다.

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

위 코드에 표시된 것처럼 정수 나누기를 사용하면 가장 중요한 십진수를 분리하여 digits(1)에 할당할 수 있습니다. 신호. 최하위 숫자를 가져오려면 value에서 최상위 숫자를 뺄 수 있습니다. 신호를 보내면 digits(0)에 할당할 번호만 남게 됩니다. 신호.

클럭 주기 계산

FPGA에서 시간 지연은 단순히 클록 사이클을 계산하는 문제입니다. 클록 주기는 VHDL 코드에서 신뢰할 수 있는 유일한 예측 가능한 시간 간격입니다. 아래 코드는 clk_count를 보여줍니다. 클럭 사이클을 계산하는 데 사용되는 신호입니다. clk_cnt_bits generic은 이 부호 없는 신호에 대해 예약할 비트 수를 결정합니다.

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는 '0'을 번갈아 사용합니다. 및 '1' 50% 듀티 사이클로. 아래 코드의 첫 번째 줄은 digit_sel를 설정합니다. MSB 값을 기반으로 신호를 보냅니다. 두 번째 줄은 MSB를 선택기로 사용하는 멀티플렉서를 구현합니다. digits에서 활성 숫자 값을 전달합니다. digit에 배열 신호.

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

BCD-7세그먼트 인코더


seg7 모듈의 마지막 단계는 digit에 저장된 BCD를 번역하는 것입니다. 7세그먼트 디스플레이의 시각적 표현으로 신호를 보냅니다. 아래 코드는 Case 문을 사용하여 이를 달성하는 프로세스를 보여줍니다.

각 비트 리터럴의 벡터 위치는 디스플레이의 한 세그먼트에 해당합니다. 인덱스 0은 세그먼트 A와 같고, 인덱스 1은 B이며, 인덱스 6까지 계속해서 세그먼트 G를 제어합니다. 세그먼트와 벡터 인덱스의 매핑은 Digilent 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을 증가시킵니다. 매초마다 신호를 보냅니다. 그런 다음 value의 래핑 지점을 관찰할 수 있도록 100초가 조금 넘는 시간을 시뮬레이션합니다. 카운터.

위의 파형은 ModelSim에서 가져온 것입니다. 값이 0부터 15까지 계산되는 시뮬레이션의 첫 번째 부분을 보여줍니다. digits의 숫자를 볼 수 있습니다. 배열도 계산됩니다. (0) value가 올 때마다 계산됩니다. 신호가 바뀌는 동안 수십 개의 (1) 10번째 숫자마다 증가합니다.

아래 양식을 사용하여 테스트벤치를 포함한 ModelSim 프로젝트를 다운로드할 수 있습니다.

seg7 모듈을 FPGA의 최상위 모듈로 구현하면 디스플레이에 안정적인 "00"이 표시될 가능성이 높습니다. '0' 때문이에요 FPGA에서 초기화되지 않은 신호에 제공되는 가장 일반적인 기본값입니다. value일 때 신호가 모두 0으로 설정되면 디스플레이에 바로 그 내용이 표시됩니다.

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

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

이 블로그 게시물에 사용된 7세그먼트 디스플레이는 Digilent의 제품입니다. Digilent 웹샵에서 Pmod 모듈을 구입하거나 여러 리셀러 중 한 곳에서 얻을 수 있습니다. 아래 목록에는 해당 품목을 취급하는 몇몇 온라인 전자제품 매장에 전시할 수 있는 제품 페이지 링크가 나와 있습니다.

Lattice iCEstick을 사용하여 Digilent 7-segment 디스플레이를 사용하려는 경우 참고하세요. , 또는 6×2핀 Pmod 커넥터가 있는 기타 FPGA 개발 보드의 경우 스플리터 케이블도 필요합니다. 케이블은 Digilent에서 구입할 수 있습니다. , Digi 키 , 마우저RS 전자 .

또한 모든 구성 요소는 Amazon 및 eBay의 다양한 판매자로부터 구입할 수 있습니다.

Digilent 7세그먼트 디스플레이를 사용한 VHDL 과정

완전 초보자를 위한 새로운 VHDL 및 FPGA 과정을 시작했습니다. 이 과정에서는 VHDL 교육을 위해 Digilent의 7세그먼트 디스플레이와 Lattice iCEstick FPGA 개발 보드를 사용합니다. 강좌에 대한 자세한 내용을 보려면 아래 링크를 클릭하세요!

FPGA 및 VHDL Fast-Track:

완전 초보자를 위한 실습

프로그래밍에는 익숙하지만 VHDL은 처음이신가요?

이 익숙하지 않은 주제에 대한 짧은 소개가 필요하십니까?

공부할 시간도 없이 스케줄이 꽉 차있나요?

며칠 저녁에 VHDL을 사용한 FPGA 개발의 기본 사항을 이해하십시오! 이 과정은 해당 주제에 대한 빠른 요약이 필요한 IT 전문가 및 학생을 위한 것입니다. 이 과정과 저렴한 Lattice iCEstick 개발 보드를 사용하면 몇 시간 내에 실제 하드웨어를 개발할 수 있습니다.

자세한 내용을 읽고 등록하려면 여기를 클릭하세요.
FPGA 및 VHDL Fast-Track:완전 초보자를 위한 실습


VHDL

  1. VHDL에서 문자열 목록을 만드는 방법
  2. PSL을 사용한 VHDL 형식 검증
  3. VHDL에서 서명된 것과 서명되지 않은 것
  4. VUnit 시작하기
  5. VHDL에서 동시 문을 만드는 방법
  6. TEXTIO를 사용하여 BMP 파일 비트맵 이미지 읽기
  7. VHDL에서 신호 벡터를 만드는 방법:std_logic_vector
  8. 레코드 - VHDL 예
  9. VHDL에서 클럭 프로세스를 만드는 방법
  10. 제한된 무작위 검증