PYNQ에서 놀기 : 4. BRAM 사용 (2)
이것은 무엇인가
PYNQ-Z1을 사용하여 놀아보세요.
이번은, 아래와 같이 할 수 있게 되는 것을 목표로 합니다.
관련 기사:
4-1. 프로젝트 만들기
PYNQ 또는 Vivado 설정이 아직 없는 경우
참고 절차 1-2. 개발 준비 참조
절차 1-3. 프로젝트 만들기을 참조하여 새 프로젝트를 만듭니다.
절차 1-4-1. ZYNQ의 IP 배포을 참조하여 Block Design 만들기
4-2. BRAM에 데이터를 계속 보내는 모듈 만들기
2-2-1 단계. Verilog HDL 파일을 추가합니다. 참고로 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 배포
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로 설정
4-3-3. IP 라우팅
이런 느낌이 들었습니다.
4-4. 후 마무리
4-4-1. HDL Wrapper 생성
단계 1-5. HDL Wrapper 생성와 유사한 단계입니다.
4-4-2. 생성하기
단계 1-7. 생성하기와 유사한 단계입니다.
이런 구현이 되었습니다.
4-5. PYNQ로 실행하기
4-5-1. 파일 업로드
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]
# 値が左 (アドレス小) から右に (アドレス大) 順番に増えていきます
Reference
이 문제에 관하여(PYNQ에서 놀기 : 4. BRAM 사용 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nishimuraatsushi/items/ffb001501e91434629ae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)