1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Polyphony にまつわる 25 の話題Advent Calendar 2017

Day 6

[新機能]パイプラインを使ったフィルター

Last updated at Posted at 2017-12-05

スィングしなけれりゃ意味がない(It Don't Mean A Thing. If It Ain't Got That Swing)。最近ではめっきり聞かなくなったが、エラの歌はいつもスィングしている。いつまでもエラの時代じゃない。次の次の次の時代はエスペランザみたいな人が道なき道を作っていく。

そうしないと意味がないとまでは言わないが、FPGA で物を作るならパイプラインは必須だ。Polyphony でもついにパイプラインの機能が取り入れられた。まだ、準備段階にある機能だが github の devel から clone すれば、その機能を試すことが出来る。

ソースの例を示そう。

pipeline
 @rule(scheduling='pipeline')
    def proc(self):
        a0:uint18 = 0
        a1:uint18 = 0
        ...
        後略
        ...

実に単純だ。@rule というデコレータをつけるだけである。引数として設定されている scheduling='pipeline' でパイプライン化の指示をしていることになる。

これで数日に渡ったフィルタ・プログラムの完成である。全体像は次のようになる。

image.png

デザイナーはフィルター部分を独自に作れば様々な対応ができるだろう。参考までに UART と SPI を統合したフィルターのソースをつける。

filter.py
from polyphony import rule
import polyphony
from polyphony import is_worker_running
from polyphony.io import Port, Queue
from polyphony.typing import bit, int8, int16, int18
from polyphony.timing import clksleep, clkfence, wait_rising, wait_falling


@polyphony.module
class Filter:
    def __init__(self):
        self.uart = uart.Transmitter()
        self.spi_in = AD7091R_SPIC()
        self.q = Queue(int16, 'any', maxsize=10)
        self.append_worker(self.read_proc)
        self.append_worker(self.proc)

    def read_proc(self):
        while is_worker_running():
            #wait_rising(self.spi_in.data_ready)
            data = self.spi_in.dout.rd()
            self.q.wr(data)

    @rule(scheduling='pipeline')
    def proc(self):
        a0:int18 = 0
        a1:int18 = 0
        a2:int18 = 0
        a3:int18 = 0

        while is_worker_running():
            data:int16 = self.q.rd()
            a0 = a1 + data
            a1 = a2 + data
            a2 = a3 + data
            a3 =      data

            #print(data)
            self.uart.write_hex16(data)

@polyphony.testbench
def test(m):
    datas = (0xdead, 0xbeef, 0xffff, 0x0000, 0x800)
    for data in datas:
        m.din.wr(data)
            
    for i in range(5):
        print(m.q.rd())

    clksleep(10)

if __name__ == '__main__':
    filter = Filter()
    test(filter)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?