PYNQ에서 플레이 : 3. BRAM 사용 (1)

11477 단어 FPGAPYNQ-Z1PYNQ

이것은 무엇인가



PYNQ-Z1을 사용하여 놀아보세요.

이번은, 아래와 같이 할 수 있게 되는 것을 목표로 합니다.
  • BRAM을 사용해보기
  • (이 기사) AXI BRAM Controller를 사용하여 파이썬에서 읽고 쓰기
  • (다음 기사) 자작 IP를 연결하고 FPGA 내부에서 생성 된 데이터를 파이썬에서 읽어보십시오


  • 관련 기사:
  • PYNQ에서 놀기 : 1. LED를 깜박임
  • PYNQ에서 플레이하기 : 2. Verilog HDL 사용하기

  • 관련 링크


  • 공식 문서
  • UG473 : 7 시리즈 FPGA 메모리 리소스 사용자 가이드

  • PG58 : Block Memory Generator Product Guide
  • BRAM을 사용하는 데 사용되는 IP


  • PG 78 : AXI Block RAM Controller Product Guide
  • AXI에서 BRAM을 연결하고 사용하는 IP


  • 해설
  • ACRi : PYNQ를 사용하여 Python으로 FPGA를 쉽게 활용 (5)


  • BRAM 개요


  • BRAM은 FPGA 내부에 구현 된 메모리입니다
  • 7 시리즈의 경우 BRAM 하나로 18Kbit x2 또는 36Kbit x1로 사용할 수 있습니다
  • PYNQ-Z1에 탑재 된 XC7Z020-1CLG400C의 경우 140 개를 타고 있습니다 (DS190 참조)


  • 또한 출력 레지스터 없음 (1CLK)에서 꺼내는 경우 288MHz, 출력 레지스터 있음 (2CLK)에서 꺼내는 경우 382MHz에서 구동 가능합니다 (PG58 참조)


  • 실제 FPGA에서의 배치는 아래와 같은 분위기입니다



  • 3-1. 프로젝트 만들기



  • PYNQ 또는 Vivado 설정이 아직 없는 경우

  • 참고 절차 1-2. 개발 준비 참조


  • 절차 1-3. 프로젝트 만들기을 참조하여 새 프로젝트를 만듭니다.
  • 프로젝트 이름 : asobu03
  • Project location : ~/vivado/asobu
  • 했습니다.


  • 절차 1-4-1. ZYNQ의 IP 배포을 참조하여 Block Design 만들기
  • 이름이 design_1로 남아 있습니다
  • ZYNQ도 배치합니다


  • 3-2. BRAM 관련 IP 배포



    3-2-1. Block Memory Generator IP 배포



    IP를 검색하고 추가.



    Block Memory Generator가 추가되었습니다.



    이번에는 기본값으로 사용합니다.

    3-2-2. AXI BRAM Controller IP 배포



    IP를 검색하고 추가.



    배치되었습니다.



    기본적으로 PORT A, PORT B를 사용할 수 있습니다.
    PORT A 만 사용하도록 설정해보십시오. 다른 매개변수는 기본값으로 유지됩니다.





    3-2-3. 배선하기



    axi_bram_ctrl_0.BRAM_PORTA를 blk_mem_gen_0.BRAM_PORTA에 연결합니다.



    배선되었습니다.



    Run Connection Automation을 실행합니다.



    배선되었습니다.



    Run Block Automation을 실행합니다.



    결국 이렇게 되었습니다.



    BRAM 설정을 확인해 봅시다.



    8 BRAM을 사용하여 1 클럭으로 데이터를 검색 할 수 있습니다.

    3-3. 후마무리



    3-3-1. HDL Wrapper 생성



    단계 1-5. HDL Wrapper 생성와 유사한 단계입니다.

    3-3-2. 생성하기



    단계 1-7. 생성하기와 유사한 단계입니다.

    이런 구현이 되었습니다.



    3-4. PYNQ로 실행하기



    3-4-1. 파일 업로드



  • 절차 1-8-1. 파일 업로드을 참조하여 PYNQ에 업로드
  • 예를 들면 이런 명령이 됩니다
  • scp ~/vivado/asobu/asobu03/asobu03.runs/impl_1/design_1_wrapper.bit [email protected]:pynq/overlays/asobu03/asobu03.bit
    scp ~/vivado/asobu/asobu03/asobu03.srcs/sources_1/bd/design_1/hw_handoff/design_1.hwh [email protected]:pynq/overlays/asobu03/asobu03.hwh
    

    3-4-2. jupyter에서 실행



  • 참고 1-8-2단계. jupyter에서 실행 참조



  • asobu03.ipynb
    import pynq
    fpga = pynq.Overlay('asobu03.bit')
    
    bram = pynq.MMIO(fpga.ip_dict['axi_bram_ctrl_0']['phys_addr'], length=8*1024)
    
    # 読み込んでみます。
    bram.read(0)
    # >> 0
    # 初期値は 0 が入っていました。
    
    # 別の値を入れてみます。
    bram.write(0, 100)
    bram.read(0)
    # >> 100
    
    # 別のアドレスに値を入れます。
    # read, write は 4 byte 単位でアクセスします。
    # アドレス (offset) は、byte 単位で入れます。
    [bram.write(i*4, i) for i in range(100)]
    
    # 読み出してみましょう。
    d = [bram.read(i*4) for i in range(100)]
    
    d[20:30]
    # >> [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
    # 取り出せました。
    

    좋은 웹페이지 즐겨찾기