시스템 버스(Lattice ice40)에 연결

10617 단어 FPGAPython3Polyphony
문장을 쓸 때는 vim을 사용하고 있다. 30년 전은 마이페스(MIFES)와 ATOK였다. OS는 MS-DOS 3.1. 아직도 출판사에 원고를 올릴 때도 TeX이기도 한다. 거의 텍스트이므로 문장은 사용하게 한다. Lattice의 시스템 버스에 연결한다는 이야기는 인터페이스의 2018년 1월호에 썼다. 그 기사를 바탕으로 다시 구성할 것 같다.

타겟은 Lattice iCE40이다. iCE40은 내부에 시스템 버스라고 불리는 것을 가지고 있다. 매우 간단한 버스로 접근은 비교적 간단하다. 잡지의 기사에서는 전 소스 실려 있지 않다. 200행을 넘기 때문에 여기에서도 일부로 하자.

덧붙여 전문은 gist 에 디버그의 생생한 코멘트 아웃도 포함해 준다.

read_spi_data16
   def read_spi_data16(self):
        debug_v:uint3 = 0

        debug_v = 4
        #self.debug.wr(4)

        self.write_data(0x06, 0x18)
        self.write_data(0x0A, 0xC0)
        self.write_data(0x0D, 0xFF)

        while True:
            irq_status = self.read_data(0x06)
            irq_trdy = (irq_status >> 4) & 1
            if irq_trdy == 1 :
                self.write_data(0x06, 0x10)
                break
        self.write_data(0x0D, 0xFF)
        #self.debug.wr(5)

        debug_v = 1

        while True:
            irq_status = self.read_data(0x06)
            irq_rrdy = (irq_status >> 3) & 1
            debug_v = 7 ^ debug_v
        #    self.debug.wr(debug_v)
            if irq_rrdy == 1:
                self.write_data(0x06, 0x08)
                break
        data0 = self.read_data(0x0E) << 8
        debug_v = 2
        #self.debug.wr(2)

        while True:
            irq_status = self.read_data(0x06)
            irq_rrdy = (irq_status >> 3) & 1
            if irq_rrdy == 1:
                debug_v = 4 ^ debug_v
                #self.debug.wr(debug_v)
                self.write_data(0x06, 0x08)
                break
        data1 = self.read_data(0x0E)
        #self.debug.wr(1)

        self.write_data(0x0A, 0x80)
        return (data0 | data1)

메소드 read_spi_data16은 PmodALS에서 데이터를 읽는 프로그램입니다. write_data와 read_data가 실제로 시스템 버스와 통신하고 있습니다.

write_data
    def write_data(self, addr:uint8, data:uint8):
        self.rw(1)
        self.addr(addr)
        self.data_out(data)
        clkfence()
        self.stb(1)
        clkfence()
        wait_value(1, self.ack)
        clkfence()
        self.stb(0)

read_data
    def read_data(self, addr:uint8):
        data:uint8 = 0
        self.rw(0)
        self.addr(addr)
        clkfence()
        self.stb(1)
        clkfence()
        wait_value(1, self.ack)
        data = self.data_in.rd()
        clkfence()
        self.stb(0)
        return data

clkfence라는 특별한 함수가 순서성을 추월하지 않도록 제어하고 있다.



Polyphony는 미래에 조금 더이 옆을 편리하게 만들 것이라고 생각합니다. 단, 클럭이라는 생각과 컴파일러가 파이프라인을 생성한다는 발상은 현저하게 궁합이 나쁘다는 것을 알고 있다. 이 부분의 브레이크 스루가 있으면 다음 세대의 HLS에 다가갈지도 모른다.


개발 과정에서 Arty Z7을 디지애나 대신.

좋은 웹페이지 즐겨찾기