PYNQ에서 놀기 : 4. BRAM 사용 (2)

13028 단어 FPGAPYNQ-Z1PYNQ

이것은 무엇인가



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

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


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

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



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

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


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


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


  • 4-2. BRAM에 데이터를 계속 보내는 모듈 만들기



  • 2-2-1 단계. Verilog HDL 파일을 추가합니다. 참고로 verilog HDL 파일을 추가합니다.
  • 파일 이름이 bram_interface.v입니다.

  • 2-2-2 단계. Verilog HDL 파일 편집 참조로 파일 편집

  • bram_interface.v
    module bram_interface
      (
        input wire CLK,
        output wire bram_clk,
        output wire [31:0] bram_addr,
        output wire [31:0] bram_data,
        output wire [3:0] bram_we,
        output wire bram_en,
        output wire bram_rst
      );
    
      reg [31:0] count;
    
      assign bram_clk = CLK;
      // BRAM を駆動するクロックを指定します。
      //   今回はこのモジュールと同期させて動かすので、
      //   モジュールに入力されたクロックをそのまま assign しています。
    
      assign bram_addr = {count[27:24], 2'b00};
      // count のうち、27-24 bit 目をアドレスに使います。
      //   24 bit 目がカウントアップするのは 0.17 秒に 1 度です。
      //   27-24 bit が 0000 --> 1111 まで変化するのに、2.7 秒かかります。
      //   bram_addr は 4 byte 単位で指定しますので、アドレス末尾に 00 の 2 bit を追加します。
      //   bram_addr 000000 から 111100 まで、16個のアドレスを 2.7 秒かけて網羅する事になります。
    
      assign bram_data = count[31:28];
      // count のうち、28 bit 目以降をデータとします。
      //   アドレスを一周したら、1つ大きな数字になります。
    
      // 以下は、BRAM の制御用の入力です。
      // 今回は、常時、データを書き続けるので、書き込み有効状態を定数で指定します。
      assign bram_we = 4'hF;
      assign bram_en = 1'b1;
      assign bram_rst = 1'b0;
    
      // カウンタを実装します
      always @(posedge CLK)
        begin
          count <= count + 1;   // 100 MHz CLK をカウントします
        end
    endmodule
    

    4-3. IP 배치 및 배선



    4-3-1. IP 배포


  • IP Integrator에서 IP를 배포합니다.

  • 2-3-1. 자체 제작 모듈 배치에 따라 bram_interface.v를 배치합니다.

  • 3-2-1. Block Memory Generator IP 배포에 따라 Block Memory Generator IP를 배포합니다.

  • 3-2-2. AXI BRAM Controller IP 배포에 AXI BRAM Controller를 배치하고 Number of BRAM Intnerfaces를 1로 설정합니다.




  • 이런 느낌이 들었습니다.

    4-3-2. Block Memory Generator를 Dual Port로 설정


  • 이번에는 BRAM을 PL (FPGA 내부) 및 PS (CPU, python)에서 사용하므로 Block Memory Generator를 Dual Port로 설정해야합니다.





  • 4-3-3. IP 라우팅


  • 다음 배선을 수행합니다.
  • blk_mem_gen_0.BRAM_PORTA를 axi_bram_ctrl_0.BRAM_PORTA로
  • blk_mem_gen_0.BRAM_PORTB를 bram_interface_0
  • blk_mem_gen_0.clkb - bram_innterface_0.bram_clk
  • blk_mem_gen_0.addrb - bram_innterface_0.bram_addr
  • blk_mem_gen_0.dinb - bram_innterface_0.bram_data
  • blk_mem_gen_0.web - bram_innterface_0.bram_we
  • blk_mem_gen_0.enb - bram_innterface_0.bram_en
  • blk_mem_gen_0.rstb - bram_innterface_0.bram_rst




  • Run Connection Automation(확인란 모두 선택)과 Run Block Automation을 실행합니다.



  • 이런 느낌이 들었습니다.

    4-4. 후 마무리



    4-4-1. HDL Wrapper 생성



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

    4-4-2. 생성하기



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

    이런 구현이 되었습니다.



    4-5. PYNQ로 실행하기



    4-5-1. 파일 업로드



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

    4-5-2. jupyter에서 실행



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



  • asobu04.ipynb
    import pynq
    fpga = pynq.Overlay('asobu04.bit')
    
    bram = pynq.MMIO(fpga.ip_dict['axi_bram_ctrl_0']['phys_addr'], length=8*1024)
    
    # 読み込んでみます。
    [bram.read(i*4) for i in range(16)]
    # >> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1]
    # 値が左 (アドレス小) から右に (アドレス大) 順番に増えていきます
    

    좋은 웹페이지 즐겨찾기