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

VHDL TEXTIO 라이브러리로 텍스트 파일에서 FPGA 블록 RAM 초기화하기

블록 RAM을 미리 정의된 값으로 채우는 가장 효율적인 방법은 ASCII 파일에서 이진 또는 16진 리터럴 읽기. 이 기법은 ROM 생성에도 쓰이는데, FPGA ROM은 단순히 읽기만 하는 RAM이기 때문.

아래 예제들에 다음 상수들과 RAM 타입이 VHDL 파일 선언부에 선언되어 있다고 가정:

constant ram_depth : natural := 256; constant ram_width : natural := 32; type ram_type is array (0 to ram_depth - 1) of std_logic_vector(ram_width - 1 downto 0);

이 기사는 VHDL TEXTIO 라이브러리 시리즈 일부. 자극 파일 읽기로 테스트벤치 구동 | TEXTIO로 BMP 비트맵 이미지 읽기

TEXTIO로 줄과 데이터 읽기

표준 std 라이브러리에 있는 TEXTIO 패키지가 파일 I/O 필요 서브프로그램 제공. 자동으로 사용 가능하므로 임포트만 하면 됨:

use std.textio.all;

RAM 데이터는 각 줄이 한 메모리 워드 나타내는 ASCII 파일에 저장. READLINE 프로시저가 한 줄을 LINE 객체에 읽음. 프로토타입:

procedure READLINE (file F: TEXT; L: inout LINE); type LINE is access STRING; -- 동적 할당 문자열 포인터

VHDL-2008은 LINE 객체에서 8진수, 16진수, 2진 값 추출용 OREAD, HREAD, BREAD 도입. 간결히 위해 16진수와 2진 읽기 집중. 관련 선언:

procedure HREAD (L : inout LINE; VALUE : out STD_ULOGIC_VECTOR; GOOD : out BOOLEAN); procedure HREAD (L : inout LINE; VALUE : out STD_ULOGIC_VECTOR); alias BREAD is READ [LINE, STD_ULOGIC_VECTOR, BOOLEAN]; alias BREAD is READ [LINE, STD_ULOGIC_VECTOR];

레거시 VHDL 버전(2008 이전)은 표준 READ 프로시저 사용해야 하며 16진수 직접 지원 안 함. 이 경우 커스텀 변환 루틴 필요.

16진수 데이터 로드

16진 표기법 편리: 16진수 두 자리가 바이트 하나에 직접 매핑. 샘플 ram_content_hex.txt 파일에 256줄, 각 줄 00000001부터 00000100까지 8자 16진 문자열 보유:

1
2
…
255
256
00000001
00000002
…
000000FF
00000100

다음 순수 함수(impure function)가 파일 읽고 완전 초기화된 ram_type 배열 반환. VHDL-2008 이상에서 작동:

impure function init_ram_hex return ram_type is file text_file : text open read_mode is "ram_content_hex.txt"; variable text_line : line; variable ram_content : ram_type; begin for i in 0 to ram_depth - 1 loop readline(text_file, text_line); hread(text_line, ram_content(i)); end loop; return ram_content; end function;

함수 정의 후 RAM 시그널을 초기 내용으로 인스턴스화:

signal ram_hex : ram_type := init_ram_hex;

레거시 VHDL: HREAD 수동 구현

HREAD 사용 불가 시(예: VHDL-93, VHDL-2002), 초기화 함수에 수동 변환 루틴 내장 가능. 다음 예제 시연:

impure function init_ram_hex return ram_type is file text_file : text open read_mode is "ram_content_hex.txt"; variable text_line : line; variable ram_content : ram_type; variable c : character; variable offset : integer; variable hex_val : std_logic_vector(3 downto 0); begin for i in 0 to ram_depth - 1 loop readline(text_file, text_line); offset := 0; while offset < ram_content(i)'high loop read(text_line, c); case c is when '0' => hex_val := "0000"; when '1' => hex_val := "0001"; when '2' => hex_val := "0010"; when '3' => hex_val := "0011"; when '4' => hex_val := "0100"; when '5' => hex_val := "0101"; when '6' => hex_val := "0110"; when '7' => hex_val := "0111"; when '8' => hex_val := "1000"; when '9' => hex_val := "1001"; when 'A' | 'a' => hex_val := "1010"; when 'B' | 'b' => hex_val := "1011"; when 'C' | 'c' => hex_val := "1100"; when 'D' | 'd' => hex_val := "1101"; when 'E' | 'e' => hex_val := "1110"; when 'F' | 'f' => hex_val := "1111"; when others => hex_val := "XXXX"; assert false report "Found non-hex character '" & c & "'"; end case; ram_content(i)(ram_content(i)'high - offset downto ram_content(i)'high - offset - 3) := hex_val; offset := offset + 4; end loop; end loop; return ram_content; end function;

전용 HREAD 프로시저 정의 가능하지만 대부분 합성 도구(예: Xilinx Vivado)는 LINE 인자 받는 프로시저 지원 안 함. 다음 에러가 이 한계 보여줌:

Vivado에서:
[Synth 8-27] Procedure argument of type ‘line’ is not supported [init_ram_tb.vhd:15]

2진 데이터 읽기

RAM 폭이 8 배수 아닐 때 2진 리터럴 선호 가능. 샘플 ram_content_bin.txt 파일에 256줄, 각 줄 32비트 2진 문자열:

1
2
…
255
256
00000000000000000000000000000001
00000000000000000000000000000010
…
00000000000000000000000011111111
00000000000000000000000100000000

VHDL-2008에서 BREAD 프로시저로 2진 값 직접 읽기:

impure function init_ram_bin return ram_type is file text_file : text open read_mode is "ram_content_bin.txt"; variable text_line : line; variable ram_content : ram_type; begin for i in 0 to ram_depth - 1 loop readline(text_file, text_line); bread(text_line, ram_content(i)); end loop; return ram_content; end function;

RAM 인스턴스화:

signal ram_bin : ram_type := init_ram_bin;

레거시 VHDL: READ로 2진 읽기

VHDL-2002 또는 VHDL-93에선 READ 프로시저 사용 필수. bit 벡터 반환하므로 결과를 To_StdLogicVector로 std_logic_vector 변환:

impure function init_ram_bin return ram_type is file text_file : text open read_mode is "ram_content_bin.txt"; variable text_line : line; variable ram_content : ram_type; variable bv : bit_vector(ram_content(0)'range); begin for i in 0 to ram_depth - 1 loop readline(text_file, text_line); read(text_line, bv); ram_content(i) := To_StdLogicVector(bv); end loop; return ram_content; end function;

현대 TEXTIO 기능 백포트

레거시 코드 수정 원치 않으면 서드파티 std_logic_1164_additions 패키지 임포트 가능. 이 라이브러리가 HREAD와 BREAD 프로시저를 구형 VHDL 버전으로 백포트, 추가 의존성 비용으로.

더 자세한 예제와 추가 읽을거리는 이 시리즈 동반 기사들 참조.

VHDL

  1. 알루미늄 부식 방지: 오래 지속되는 내구성을 위한 전문가 전략
  2. 금속 원소 vs 비금속 원소: 핵심 차이점 설명
  3. 첫 AWS CloudFormation 템플릿 구축 – 실용 가이드
  4. 클라우드 컴퓨팅 vs 전통적 컴퓨팅: 실용적 비교
  5. C 언어 주석 마스터하기: 명확하고 효과적인 주석 작성법
  6. Java BufferedReader로 파일 읽기: 실전 가이드와 예제
  7. 파이썬으로 평균 계산하기: 실전 가이드
  8. 마이크로미터 완벽 가이드: 종류, 구조, 읽는 법 및 정밀 측정 노하우
  9. OPC UA 클라이언트로 PLC 함수 블록 호출하기: 실용 가이드
  10. CNC 도면 해독 마스터하기: 현대 머시니스트 필수 기술