PYNQ로 Jupyter를 하고 Polyphony로 고위 합성을 합니다.

PYNQ라는 판자에 있어요.


Digilent에서 판매하는 PYNQ 보드에서는 Jupter를 표준으로 사용할 수 있습니다.FPGA와 협업한 흥미로운 콘셉트의 제품이라 소개해드릴게요.
그리고 그 다음에polyphony라는 Python에서verilog를 생성하는 고위 합성 도구를 사용해 보세요.

PYNQ가 뭐예요?


PYNQ의 상세한 내용을 보고 싶습니다여기..Zynq라는 ARM+FPGA의 SoC를 실은 판입니다.이 판자를 모으고 있는 나는 빠르게 구매했다.
Pynq의 P는 선봉 P다.단추도 분홍색으로 할게요.

HDMI OUT/HDMI IN이 있는데 재미있지 않나요?그럼 한번 써볼래요?

전원 연결 + 네트워크 사용 가능


보통 이런 판자는 조작 매뉴얼을 보고 다양한 물건을 연결해야 한다. 예를 들어 IoT 같은 것은 한밤중에 소리를 지르면서 이동해야 하지만 이 판자는 낮부터 쉽게 사용할 수 있다.전원 연결 네트워크를 켜면 브라우저로 Windowshttp://pynq:9090를 치면 간단하게 연결할 수 있다.
뒤에는 삼바와 NetBIOS가 움직이는 것 같은데 Windows를 위해 이름을 해결한다.

샘플을 사용한 얼굴 인식(USB 카메라에서)


USB 카메라를 연결하면 OpenCV의 얼굴을 쉽게 식별할 수 있습니다.FPGA는 어디에 있습니까?이런 느낌이지만 어쨌든 장비나 준비 없이도 사용할 수 있다는 게 특징이다.USB 카메라도 없으면 파일에서 읽을 수도 있다.
HDMI 출력 카메라가 있으면 입력할 수도 있습니다.HDMI 입력(위)에 FPGA가 사용됩니다.
미묘한 결과지만 이미 지쳤으니 용서해 주세요.어쨌든 할 수 있어.

Polyphony 설치 및 실행


Polyphony라는 고급 합성 도구를 설치합니다.pip3 install로 하면 될 것 같아요.고위 합성 뭐?새 소스 코드 Python입니다.
list11.py
from polyphony import testbench


def sum(l1:list):
    def sub_sum(l2:list):
        def sub_sub_sum(l2:list):
            s = 0
            for l in l2:
                s += l
            return s
        return sub_sub_sum(l2)
    return sub_sum(l1)

def list11(x):
    data1 = [x, 1, 2]
    data2 = [x, 1, 2, 3, 4, 5]
    s1 = sum(data1)
    s2 = sum(data2)
    return s1 + s2 + x

@testbench
def test():
    assert 18 == list11(0)
    assert 21 == list11(1)
    assert 24 == list11(2)


test()
아무래도 좀 교활한 것 같지만 점퍼가 subprocess에서 실행한다.

그리고 polyphony.out.나타나다

완성된verilog 코드입니다!!


모두 싣고 싶지만, 911행의 사랑을 베고 있기 때문이다.
polyphony_out.v
module sum_sub_sum_sub_sub_sum
  (
    input wire signed [31:0] l21_q,
    input wire signed [12:0] l21_len,
    input wire CLK,
    input wire RST,
    input wire sub_sub_sum_READY,
    input wire sub_sub_sum_ACCEPT,
    output reg signed [31:0] sub_sub_sum_OUT0,
    output reg l21_req,
    output reg signed [31:0] l21_d,
    output reg signed [12:0] l21_addr,
    output reg l21_we,
    output reg sub_sub_sum_VALID  );

 ザックっと中略

  begin
    if (in_addr[ADDR_WIDTH-1] == 1'b1) begin
      address = RAM_LENGTH + in_addr;
    end else begin
      address = in_addr;
    end
  end
  endfunction // address
  wire [ADDR_WIDTH-1:0] a;
  assign a = address(ADDR);
  assign Q = mem[read_addr];
  assign LEN = RAM_LENGTH;
  always @ (posedge CLK) begin
    if (WE)
      mem[ADDR] <= D;
    read_addr <= a;
  end
endmodule

그 다음엔 어떻게 하지?


아마 iverilog를 설치하면 시뮬레이션을 할 수 있을 거예요.삼바도 있으니까 잘하면 비바도와 협업해서 합성할 수 있을 것 같아요.그 정도는 아니야.
절반을 쓴 것처럼 보이지만 그게 끝이야.

좋은 웹페이지 즐겨찾기