VHDLwhiz UART 테스트 인터페이스 생성기
제품 정보
명세서:
- 제품 이름: VHDL 레지스터 UART 테스트 인터페이스 생성기
- 버전: 1.0.4
- 날짜: 18년 2024월 XNUMX일
- 저자: 조나스 줄리안 젠슨
- 제품 URL: 제품 링크
- 연락처 이메일: jonas@vhdlwhiz.com
설명
이 제품을 사용하면 UART를 사용하여 FPGA 레지스터 값을 읽고 쓰기 위한 사용자 정의 인터페이스를 생성할 수 있습니다. 생성된 VHDL 모듈과 Python 스크립트는 FPGA 설계에서 다양한 유형의 레지스터와 상호 작용할 수 있는 기능을 제공합니다.
요구 사항
- 파이썬 3 인터프리터
- pyserial 패키지
규약
이 제품은 4개의 제어 문자를 사용하는 데이터 프레이밍 프로토콜을 사용합니다.
- 이름: 읽기 요청, 값: 0x0A – UART를 통해 모든 레지스터를 다시 보내기 위한 쓰기 시퀀스를 시작하기 위한 호스트에서 FPGA로의 명령
- 이름: 쓰기 시작, 값: 0x0B – 양방향 쓰기 시퀀스의 시작을 표시합니다.
- 이름: 쓰기 끝, 값: 0x0C – 양방향 쓰기 시퀀스의 끝을 표시합니다.
- 이름: 탈출하다, 값: 0x0D – 제어 단어 이스케이프에 사용되는 이스케이프 문자
제품 사용 지침
스크립트 실행
제품을 사용하려면 Python 3과 Pyserial 패키지가 설치되어 있는지 확인하세요. Python 3 인터프리터를 통해 스크립트를 실행하세요.
사용자 정의 인터페이스 생성
gen_uart_regs.py 스크립트를 사용하여 FPGA 레지스터 값을 읽고 쓰기 위한 사용자 정의 인터페이스를 생성합니다. 출력을 생성할 때 입력 및 출력 레지스터와 유형의 구성을 지정할 수 있습니다. files.
레지스터와의 상호 작용
생성된 VHDL 모듈과 Python 스크립트를 사용하여 FPGA 설계에서 원하는 수의 레지스터를 읽거나 쓸 수 있습니다. 액세스 가능한 레지스터는 std_logic, std_logic_vector, signed 또는 unsigned와 같은 유형을 가질 수 있습니다.
특허
- MIT 라이선스에는 소스 코드의 저작권 요구 사항과 사용 조건이 포함됩니다. LICENSE.txt를 참조하세요. file 우편번호에 file 자세한 내용은.
변경 로그
- 이러한 변경 사항은 프로젝트를 참조합니다. files, 그리고 이 문서는 그에 따라 업데이트됩니다.
버전 | 비고 |
1.0.0 | 최초 릴리스 |
1.0.1 | Python 모듈로 uart_regs.py로 가져올 때 누락된 «self» 참조 버그가 수정되었습니다. write failed printout을 예외로 변경했습니다.
가져온 모듈로 실행할 때 콘솔에 인쇄하지 마세요. |
1.0.2 | 출력 모드 등록이 없을 때 발생하는 Vivado [Synth 8-248] 오류를 수정했습니다. |
1.0.3 | Vivado Linter 경고 수정: 레지스터가 활성화되어 있습니다.
동기식 리셋 |
1.0.4 | 마지막 바이트가 이스케이프 문자인 잘못된 단어를 수신할 때 코너 케이스를 수정합니다. IDLE로 돌아갈 때 recv_data_prev_is_escape를 지우지 않았기 때문에 다음 단어도 손실됩니다.
gen_uart_regs.py 스크립트는 이제 고유한 등록 이름만 허용합니다. |
설명
- 이 문서에서는 다음 내용을 설명합니다. files 및 폴더:
- gen_uart_regs.py
- 생성된/uart_regs.vhd
- 생성된/uart_regs.py
- 생성된/instantiation_template.vho
- rtl/uart_regs_backend.vhd
- rtl/uart_rx.vhd
- rtl/uart_tx.vhd
- 데모/lattice_icestick/
- 데모/xilinx_arty_a7_35/
- 데모/xilinx_arty_s7_50/
- gen_uart_regs.py 스크립트 및 지원 VHDL file이 프로젝트에서는 UART를 사용하여 다양한 유형과 너비의 FPGA 레지스터 값을 읽고 쓰기 위한 사용자 정의 인터페이스를 생성할 수 있습니다.
- 생성된 VHDL 모듈과 Python 스크립트를 사용하여 설계에 있는 여러 레지스터에서 읽거나 쓸 수 있습니다. UART 액세스 가능 레지스터에는 std_logic, std_logic_Vector, signed 또는 unsigned 유형이 있을 수 있습니다.
- 출력을 생성할 때 입력 및 출력 레지스터와 유형의 정확한 구성을 결정할 수 있습니다. filegen_uart_regs.py 스크립트를 사용합니다.
- Python 스크립트는 ChatGPT 인공 지능 도구의 도움으로 부분적으로 생성되었으며 VHDL 코드는 손으로 제작되었습니다.
요구 사항
- 이 프로젝트의 스크립트는 Python 3 인터프리터를 통해 실행되어야 하며 Pyserial 패키지가 설치되어 있어야 합니다.
- 다음 명령을 사용하여 Pip를 통해 pyserial을 설치할 수 있습니다: pip install pyserial
규약
- VHDL files 및 Python 스크립트는 4개의 제어를 사용하는 데이터 프레이밍 프로토콜을 사용합니다.
이름 | 값 | 논평 |
읽어주세요 | 0x0A | 호스트에서 FPGA로 쓰기를 시작하기 위한 명령
모든 레지스터를 UART를 통해 다시 보내는 순서 |
START_WRITE | 0x0B | 쓰기 시퀀스의 시작을 표시합니다.
방향 |
END_WRITE | 0x0C | 어느 방향으로든 쓰기 시퀀스의 끝을 표시합니다. |
탈출하다 | 0x0D | START_WRITE 및 END_WRITE 마커 사이에 데이터로 나타날 때 ESCAPE 문자 자체를 포함하여 제어 단어를 이스케이프하는 데 사용되는 이스케이프 문자입니다. |
FPGA로 전송된 모든 이스케이프 처리되지 않은 READ_REQ 바이트는 UART 액세스 가능한 모든 레지스터(입력 및 출력)를 UART를 통해 호스트로 다시 전송하라는 명령입니다. 이 명령은 일반적으로 uart_regs.py 스크립트에 의해서만 실행됩니다.
이 명령을 수신하면 FPGA는 모든 레지스터의 내용을 호스트로 다시 전송하여 응답합니다. 먼저 입력 신호, 그 다음 출력 신호입니다. 해당 길이의 합이 8비트의 배수가 되지 않으면 마지막 바이트의 하위 비트가 XNUMX으로 채워집니다.
쓰기 시퀀스는 항상 START_WRITE 바이트로 시작하여 END_WRITE 바이트로 끝납니다. 그 사이의 모든 바이트는 데이터 바이트로 간주됩니다. 데이터 바이트가 제어 문자와 같은 값을 갖는 경우 데이터 바이트를 이스케이프해야 합니다. 즉, 데이터 바이트 앞에 추가 ESCAPE 문자를 보내 실제로 데이터임을 나타냅니다.
이스케이프되지 않은 START_WRITE가 바이트 스트림의 어느 위치에든 도착하면 쓰기 시퀀스의 시작으로 간주됩니다. uart_regs_backend 모듈은 이 정보를 사용하여 통신이 동기화되지 않은 경우 재동기화합니다.
gen_uart_regs.py
- 이는 인터페이스를 생성하기 위해 시작해야 하는 스크립트입니다. 다음은 python gen_uart_regs.py -h를 실행하여 얻을 수 있는 도움말 메뉴의 스크린샷입니다.
- 사용자 정의 인터페이스를 생성하려면 원하는 UART 제어 가능 레지스터 각각을 인수로 나열하여 스크립트를 실행해야 합니다. 사용 가능한 유형은 std_logic, std_logic_Vector, unsigned 및 signed입니다.
- 기본 모드(방향)는 in이고 레지스터의 길이가 1이 아닌 한 기본 유형은 std_logic_Vector입니다. 그러면 기본적으로 std_logic이 됩니다.
- 따라서 std_logic 입력 신호를 생성하려는 경우 다음 인수 중 하나를 사용할 수 있습니다.
- my_sl=1
- my_sl=1:in
- my_sl=1:in:std_logic
- 위의 모든 변형은 스크립트에서 UART 액세스 가능 신호를 생성하게 됩니다.
- 다양한 방향, 길이, 유형의 여러 레지스터를 포함하는 인터페이스를 생성하기 위해 인수를 사용하여 스크립트를 실행해 보겠습니다.
생성됨 files
- gen_uart_regs.py 스크립트를 성공적으로 실행하면 세 가지 이름으로 생성된 출력 폴더가 생성됩니다. file아래에 나열되어 있습니다. 이미 존재하는 경우 덮어쓰게 됩니다.
- 생성된/uart_regs.vhd
- 생성된/uart_regs.py
- 생성된/instantiation_template.vho
- uart_regs.vhd
- 이는 스크립트에 의해 생성된 사용자 정의 인터페이스 모듈입니다. UART를 사용하여 제어하려는 레지스터에 액세스할 수 있도록 디자인에서 이를 인스턴스화해야 합니다.
- "- UART 액세스 가능 레지스터" 섹션 위의 모든 내용은 모든 uart_regs 모듈에서 동일하지만 해당 줄 아래의 포트 신호 구성은 생성기 스크립트에 제공된 인수에 따라 다릅니다.
- 아래 목록은 generate 명령 ex로 인해 발생하는 uart_regs 모듈의 엔터티를 보여줍니다.ampgen_uart_regs.py 섹션에 표시된 파일
- uart_rx에서 처리되므로 uart_rx 신호를 동기화할 필요가 없습니다. 기준 치수.
- 모듈이 읽기 요청을 받으면 현재 클록 사이클 내의 모든 입력 및 출력 신호 값을 캡처합니다. 그런 다음 즉각적인 스냅샷이 UART를 통해 호스트로 전송됩니다.
- 쓰기가 발생하면 모든 출력 레지스터는 동일한 클록 주기 내에서 새 값으로 업데이트됩니다. 출력 신호 값을 개별적으로 변경할 수는 없습니다.
- 그러나 uart_regs.py 스크립트를 사용하면 사용자는 먼저 모든 레지스터의 현재 값을 다시 읽어 선택한 출력만 업데이트할 수 있습니다. 그런 다음 업데이트된 값을 포함하여 모든 값을 다시 씁니다.
- uart_regs.py
- 생성된/uart_regs.py file uart_regs VHDL 모듈과 함께 생성되며 헤더에 사용자 정의 레지스터 정보가 포함되어 있습니다. file. 이 스크립트를 사용하면 사용자 정의 레지스터를 쉽게 읽거나 쓸 수 있습니다.
도움말 메뉴
- 도움말 메뉴를 인쇄하려면 python uart_regs.py -h를 입력하세요.
UART 포트 설정
- 스크립트에는 -c 스위치를 사용하여 UART 포트를 설정하는 옵션이 있습니다. 이것은 Windows와 Linux에서 작동합니다. 도움말 메뉴에 나열된 사용 가능한 포트 중 하나로 설정하세요. 기본 포트를 설정하려면 uart_regs.py 스크립트에서 UART_PORT 변수를 편집할 수도 있습니다.
레지스터 나열
- 레지스터 매핑에 대한 정보는 gen_uart_regs.py 스크립트에 의해 uart_regs.py 스크립트의 헤더에 배치됩니다. 아래에서 볼 수 있듯이 -l 스위치로 사용 가능한 레지스터를 나열할 수 있습니다. 이것은 로컬 명령이며 대상 FPGA와 상호 작용하지 않습니다.
레지스터에 쓰기
- -w 스위치를 사용하여 모든 출력 모드 레지스터에 쓸 수 있습니다. 아래와 같이 레지스터 이름 뒤에 "="와 XNUMX진수, XNUMX진수 또는 XNUMX진수 값으로 제공된 값을 제공합니다.
- VHDL 구현에서는 스크립트가 모든 출력 레지스터를 동시에 써야 한다는 점에 유의하세요. 따라서 전체 출력 레지스터 세트를 지정하지 않으면 스크립트는 먼저 대상 FPGA에서 읽기를 수행한 다음 누락된 레지스터에 해당 값을 사용합니다. 결과적으로 지정된 레지스터만 변경됩니다.
- 쓰기를 수행하면 지정된 모든 레지스터가 UART를 통해 수신되자마자 동일한 클록 주기 동안 변경됩니다.
레지스터 읽기
- 아래와 같이 -r 스위치를 사용하여 모든 레지스터 값을 읽습니다. 노란색으로 표시된 값은 이전 쓰기 ex에서 변경한 값입니다.ample
- 모든 읽기에는 모든 입력 및 출력 레지스터의 즉각적인 스냅샷이 표시됩니다. 그들은 모두 samp동일한 클럭 사이클 동안 주도됨
디버깅
통신 프로토콜을 디버그해야 하는 경우 다른 스위치와 함께 -d 스위치를 사용하십시오. 그런 다음 스크립트는 보내고 받은 모든 바이트를 인쇄하고 tag 아래와 같이 제어 문자인 경우 해당 문자를 사용합니다.
다른 Python 스크립트에서 인터페이스 사용
- uart_regs.py 스크립트에는 다른 사용자 정의 Python 스크립트에서 통신 인터페이스로 쉽게 사용할 수 있는 UartRegs 클래스가 포함되어 있습니다. 아래와 같이 클래스를 가져와서 객체를 생성하고 메서드를 사용하기만 하면 됩니다.
- 메서드와 설명, 반환 값 유형은 Python 코드의 독스트링을 참조하세요.
instantiation_template.vho
- 인스턴스화 템플릿은 사용자의 편의를 위해 uart_regs 모듈과 함께 생성됩니다. 코딩 시간을 절약하려면 모듈 인스턴스화 및 신호 선언을 디자인에 복사할 수 있습니다.
정적 RTL files
- 다음을 포함해야 합니다. fileuart_regs 모듈과 동일한 라이브러리로 컴파일되도록 VHDL 프로젝트에 추가합니다.
- rtl/uart_regs_backend.vhd
- rtl/uart_rx.vhd
- rtl/uart_tx.vhd
- uart_regs_backend 모듈은 레지스터 데이터를 기록하고 기록하는 유한 상태 기계를 구현합니다. uart_rx 및 uart_tx 모듈을 사용하여 호스트와의 UART 통신을 처리합니다.
데모 프로젝트
- Zip에는 세 가지 데모 프로젝트가 포함되어 있습니다. file. 이를 통해 여러 보드의 주변 장치는 물론 몇 가지 더 큰 내부 레지스터를 제어할 수 있습니다.
- 데모 폴더에는 사전 생성된 uart_regs.vhd 및 uart_regs.py가 포함됩니다. file이러한 디자인을 위해 특별히 제작되었습니다.
래티스 아이스스틱
- 데모/icecube2_icestick 폴더에는 Lattice iCEstick FPGA 보드에 대한 레지스터 액세스 데모 구현이 포함되어 있습니다.
- 구현 프로세스를 실행하려면 데모/lattice_icestick/icecube2_proj/uart_regs_sbt.project를 엽니다. file Lattice iCEcube2 디자인 소프트웨어에서.
- iCEcube2 GUI에서 프로젝트를 로드한 후 도구→모두 실행을 클릭하여 프로그래밍 비트맵을 생성합니다. file.
- Lattice Diamond Programmer Standalone 도구를 사용하여 생성된 비트맵으로 FPGA를 구성할 수 있습니다. file. Diamond Programmer가 열리면 환영 대화 상자에서 기존 프로그래머 프로젝트 열기를 클릭합니다.
- 선택 프로젝트 file Zip: 데모/lattice_icestick/diamond_programmer_project.xcf에서 찾은 후 확인을 클릭하세요.
- 프로젝트가 로드된 후 File 위에 표시된 이름 열입니다. 찾아보기를 통해 비트맵 선택 file iCEcube2에서 생성한 것
- 데모/격자_아이스스틱/아이스큐브2_프로제/uart_regs_임플림트/sbt/출력/비트맵/top_icestick_bitmap.bin
- 마지막으로 iCEstick 보드를 컴퓨터의 USB 포트에 연결한 상태에서 설계→프로그램을 선택하여 SPI 플래시를 프로그래밍하고 FPGA를 구성합니다.
- 이제 uart_regs.py 섹션에 설명된 대로 demo/lattice_icestick/uart_regs.py 스크립트를 사용하여 레지스터를 읽고 쓸 수 있습니다.
자일링스 Digilent Arty A7-35T
- Demo/arty_a7_35 폴더에서 Artix-7 35T Arty FPGA 평가 키트에 대한 데모 구현을 찾을 수 있습니다.
- Vivado를 열고 추출된 파일로 이동하세요. fileGUI 인터페이스 하단에 있는 Tcl 콘솔을 사용합니다. 데모 프로젝트 폴더에 들어가려면 다음 명령을 입력하세요.
- CD /데모/아트_a7_35/비바도_프로제/
- create_vivado_proj.tcl Tcl 스크립트를 실행하여 Vivado 프로젝트를 재생성합니다:
- 소스 ./create_vivado_proj.tcl
- 사이드바에서 비트스트림 생성을 클릭하여 모든 구현 단계를 실행하고 프로그래밍 비트스트림을 생성합니다. file.
- 마지막으로 Open Hardware Manager를 클릭하고 GUI를 통해 FPGA를 프로그래밍합니다.
- 이제 uart_regs.py 섹션에 설명된 대로 데모/arty_a7_35/uart_regs.py 스크립트를 사용하여 레지스터 읽기 및 쓰기를 진행할 수 있습니다.
자일링스 Digilent Arty S7-50
- Demo/arty_s7_7 폴더에서 Arty S7: Spartan-50 FPGA 개발 보드에 대한 데모 구현을 찾을 수 있습니다.
- Vivado를 열고 추출된 파일로 이동하세요. fileGUI 인터페이스 하단에 있는 Tcl 콘솔을 사용합니다. 데모 프로젝트 폴더에 들어가려면 다음 명령을 입력하세요.
- CD /데모/아티_S7_50/비바도_프로제/
- create_vivado_proj.tcl Tcl 스크립트를 실행하여 Vivado 프로젝트를 재생성합니다:
- 소스 ./create_vivado_proj.tcl
- 사이드바에서 비트스트림 생성을 클릭하여 모든 구현 단계를 실행하고 프로그래밍 비트스트림을 생성합니다. file.
- 마지막으로 Open Hardware Manager를 클릭하고 GUI를 통해 FPGA를 프로그래밍합니다.
- 이제 uart_regs.py 섹션에 설명된 대로 데모/arty_s7_50/uart_regs.py 스크립트를 사용하여 레지스터 읽기 및 쓰기를 진행할 수 있습니다.
구현
- 구체적인 구현 요구 사항은 없습니다.
제약 조건
- UART 인터페이스는 느리고 비동기 인터페이스로 처리되므로 이 설계에는 특정 타이밍 제약이 필요하지 않습니다.
- uart_regs 모듈에 대한 uart_rx 입력은 uart_rx 모듈 내에서 동기화됩니다. 따라서 최상위 모듈에서 동기화할 필요가 없습니다.
알려진 문제
- FPGA 아키텍처가 기본 레지스터 값을 지원하는지 여부에 따라 모듈을 사용하기 전에 재설정해야 할 수도 있습니다.
더 많은 정보
- 저작권 VHDLwhiz.com
자주 묻는 질문
질문: UART 테스트 인터페이스 생성기의 목적은 무엇인가요?
대답: UART 테스트 인터페이스 생성기는 UART 통신을 사용하여 FPGA 레지스터 값과 상호작용하는 사용자 정의 인터페이스를 생성할 수 있게 해줍니다.
질문: Pyserial 패키지를 어떻게 설치하나요?
A: 다음 명령을 사용하여 Pip를 통해 Pyserial을 설치할 수 있습니다: pip install pyserial
문서 / 리소스
![]() |
VHDLwhiz UART 테스트 인터페이스 생성기 [PDF 파일] 사용자 매뉴얼 UART 테스트 인터페이스 생성기, 테스트 인터페이스 생성기, 인터페이스 생성기, 생성기 |