이미지 파일을 비트맵 형식으로 변환하면 VHDL을 사용하여 그림을 읽는 가장 쉬운 방법이 됩니다. BMP 래스터 그래픽 이미지 파일 형식에 대한 지원은 Microsoft Windows 운영 체제에 내장되어 있습니다. 따라서 BMP는 VHDL 테스트벤치에서 사용할 사진을 저장하는 데 적합한 이미지 형식입니다.
이 기사에서는 BMP와 같은 바이너리 이미지 파일을 읽고 시뮬레이터의 동적 메모리에 데이터를 저장하는 방법을 배웁니다. 이미지를 그레이스케일로 변환하기 위해 예제 이미지 처리 모듈을 사용할 것입니다. 이것은 테스트 중인 장치(DUT)가 될 것입니다. 마지막으로 DUT의 출력을 원본과 시각적으로 비교할 수 있는 새 이미지에 씁니다.
이 블로그 게시물은 VHDL에서 TEXTIO 라이브러리를 사용하는 방법에 대한 시리즈의 일부입니다. 여기에서 다른 기사를 읽으십시오:
TEXTIO를 사용하여 파일에서 RAM을 초기화하는 방법
TEXTIO를 사용하여 테스트벤치에서 읽은 자극 파일
비트맵이 VHDL에 가장 적합한 형식인 이유
인터넷에서 가장 일반적인 이미지 파일 형식은 JPEG와 PNG입니다. 둘 다 압축을 사용하며 JPEG는 손실이 있고 PNG는 손실이 없습니다. 대부분의 형식은 이미지의 저장 크기를 크게 줄일 수 있는 압축 형식을 제공합니다. 일반적인 사용에는 괜찮지만 VHDL 테스트벤치에서 읽기에는 적합하지 않습니다.
그림>
소프트웨어나 하드웨어에서 이미지를 처리할 수 있으려면 응용 프로그램 내에서 원시 픽셀 데이터에 액세스할 수 있어야 합니다. 색상 및 휘도 데이터를 바이트 행렬에 저장하려고 합니다. 이를 비트맵 또는 래스터 그래픽이라고 합니다.
Photoshop 또는 GIMP와 같은 잘 알려진 이미지 편집기는 대부분 래스터 기반입니다. 다양한 이미지 형식을 열 수 있지만 모두 편집기에서 내부적으로 래스터 그래픽으로 변환됩니다.
VHDL에서도 이 작업을 수행할 수 있지만 압축된 이미지를 디코딩하기 위한 기성 솔루션이 없기 때문에 상당한 코딩 노력이 필요합니다. 더 나은 솔루션은 테스트 입력 이미지를 수동으로 BMP와 같은 비트맵 형식으로 변환하거나 테스트벤치를 시작하는 스크립트에 통합하여 변환하는 것입니다.
BMP 이미지 파일 형식
BMP 파일 형식은 Wikipedia에 잘 설명되어 있습니다. 이 형식에는 다양한 변형이 있지만 훨씬 더 쉽게 만들 수 있는 몇 가지 특정 설정에 동의할 것입니다. 입력 이미지를 생성하기 위해 Windows와 함께 사전 설치된 Microsoft 그림판에서 이미지를 엽니다. 그런 다음 파일→다른 이름으로 저장을 클릭합니다. , 파일 형식:24비트 비트맵(*bmp; *.dib)을 선택합니다. . .bmp 접미사로 끝나는 파일 이름을 지정하고 저장을 클릭합니다.
파일이 이와 같이 생성되었는지 확인하면 헤더가 항상 Wikipedia 페이지에 언급된 픽셀 형식 RGB24를 사용하는 54바이트 길이의 BITMAPINFOHEADER 변형이라고 가정할 수 있습니다. 또한 헤더 내에서 선택된 몇 개의 필드에만 관심을 둘 것입니다. 아래 표는 우리가 읽을 헤더 필드를 보여줍니다.
오프셋(12월)
사이즈(B)
예상(16진수)
설명
0
2
"BM"(42 4D)
ID 필드
10
4
54 (36 00 00 00)
픽셀 배열 오프셋
14
4
40 (28 00 00 00)
헤더 크기
18
4
값 읽기
픽셀 단위의 이미지 너비
22
4
값 읽기
픽셀 단위의 이미지 높이
26
1
1 (01)
색상 평면의 수
28
1
24 (18)
픽셀당 비트 수
녹색으로 표시된 값은 다른 헤더 필드에서 예상되는 값을 알고 있기 때문에 실제로 살펴봐야 하는 유일한 값입니다. 매번 미리 정의된 고정 치수의 이미지만 사용하기로 동의했다면 전체 헤더를 건너뛰고 BMP 파일 내의 바이트 오프셋 번호 54에서 읽기를 시작할 수 있습니다. 여기에서 픽셀 데이터를 찾을 수 있습니다.
그럼에도 불구하고 다른 나열된 값이 예상대로인지 확인할 것입니다. 이미 헤더를 읽고 있기 때문에 어렵지 않습니다. 또한 귀하 또는 귀하의 동료 중 한 명이 향후 언제든지 테스트벤치에 잘못된 인코딩 이미지를 제공할 경우 사용자 오류에 대한 보호 기능을 제공합니다.
테스트 케이스
이 블로그 게시물은 VHDL 테스트벤치의 파일에서 이미지를 읽는 방법에 관한 것이지만 완성도를 위해 예제 DUT를 포함했습니다. 이미지를 읽을 때 DUT를 통해 픽셀 데이터를 스트리밍합니다. 마지막으로 좋아하는 사진 뷰어에서 검사할 수 있는 다른 출력 BMP 파일에 결과를 기록합니다.
entity grayscale is
port (
-- RGB input
r_in : in std_logic_vector(7 downto 0);
g_in : in std_logic_vector(7 downto 0);
b_in : in std_logic_vector(7 downto 0);
-- RGB output
r_out : out std_logic_vector(7 downto 0);
g_out : out std_logic_vector(7 downto 0);
b_out : out std_logic_vector(7 downto 0)
);
end grayscale;
위의 코드는 DUT의 엔티티를 보여줍니다. 그레이스케일 모듈은 한 픽셀에 대한 24비트 RGB 데이터를 입력으로 받아 출력에 표시되는 그레이스케일 표현으로 변환합니다. 출력 픽셀은 여전히 RGB 색상 공간 내에서 회색 음영을 나타내며 BMP를 다른 형식인 회색조 BMP로 변환하지 않습니다.
모듈은 순전히 조합형이며 클럭 또는 리셋 입력이 없습니다. 입력에 무언가가 할당되면 결과가 즉시 출력에 나타납니다. 단순성을 위해 그레이스케일로 변환할 때 ITU-R BT.2100 RGB에서 루마 코딩 시스템에 따른 루마(밝기) 값의 고정 소수점 근사값을 사용합니다.
아래 양식을 사용하여 회색조 모듈 및 전체 프로젝트에 대한 코드를 다운로드할 수 있습니다.
아래에서 보고 있는 Boeing 747의 사진이 입력 이미지의 예입니다. 즉, 이 블로그 게시물에 포함된 실제 BMP 이미지가 아니므로 불가능합니다. 테스트벤치에서 읽을 BMP 이미지의 JPEG 표현입니다. 위 양식에 이메일 주소를 남겨주시면 원본 BMP 이미지를 요청할 수 있으며 받은편지함으로 바로 받아보실 수 있습니다.