LoginSignup
0
0

More than 3 years have passed since last update.

windowsでiverilog その56

Posted at

概要

windowsでiverilogやってみた。
polyphonyで浮動小数点やってみる。
sigmoid関数書いてみた。

計算手順

①符号、指数、仮数に分ける。
②指数部から、整数化の指数を求める。
③仮数に掛ける。(2進数のシフト)
④テーブルから引く。
⑤32bitで返す。

サンプルコード

import polyphony
from polyphony import testbench, module, is_worker_running
from polyphony.io import Port
from polyphony.typing import bit, bit32, bit23, bit24, bit25

@module
class sigmoid:
    def __init__(self):
        self.a = Port(bit32, 'in')
        self.b = Port(bit32, 'in')
        self.c = Port(bit32, 'out')
        self.t = [
            0x3d29ac09,
            0x3d4f341f,
            0x3d7c80d6,
            0x3d997663,
            0x3db9f86f,
            0x3de08c65,
            0x3e06fc01,
            0x3e217985,
            0x3e400a67,
            0x3e62dee1,
            0x3e84ffbc,
            0x3e9aa0af,
            0x3eb21ee3,
            0x3ecb2768,
            0x3ee54a10,
            0x3f000000,
            0x3f0d5af8,
            0x3f1a6c4c,
            0x3f26f08e,
            0x3f32afa8,
            0x3f3d8022,
            0x3f474848,
            0x3f4ffd66,
            0x3f57a19f,
            0x3f5e4100,
            0x3f63ee73,
            0x3f68c0f2,
            0x3f6cd134,
            0x3f7037f3,
            0x3f730cbe,
            0x3f75653f
        ]
        self.append_worker(self.worker)
    def float2b(self, a:bit32):
        a_sig:bit = (a >> 31) & 0x1
        a_exp:bit8 = (a >> 23) & 0xff
        a_fra:bit24 = a & 0x7fffff | 0x800000
        return (a_sig, a_exp, a_fra)
    def b2float(self, a_sig:bit32, a_exp:bit32, a_fra:bit32):
        return (a_sig << 31) | (a_exp << 23) | a_fra
    def worker(self):
        while is_worker_running():
            b0:bit32 = self.b.rd()
            (b_sig, b_exp, b_fra) = self.float2b(b0)
            b_exp = 127 - b_exp + 23
            b_exp = b_exp & 0xff
            frac:bit48 = b_fra
            frac = frac >> b_exp
            frac = frac & 0xffffff
            if (frac < 31):
                frac = self.t[frac]
            c0:bit32 = frac
            self.c(c0)

m = sigmoid()

@testbench
def test(m):
    m.b.wr(0x3f800000)
    print ("1.0")
    c = m.c.rd()
    print('{:08x}'.format(c))
    m.b.wr(0x40800000)
    print ("4.0")
    c = m.c.rd()
    print('{:08x}'.format(c))

test(m)





実行結果


1.0
3d4f341f
4.0
3db9f86f

以上。

0
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
0
0