Bitbucket is a code hosting site with unlimited public and private repositories. We're also free for small teams!

Close

MyHDL Fixed-Point Package

This package is a work in progress and has not reach a stable release point, use at your own risk.

This package adds fixed-point support to MyHDL. The package intent is to provide a flexible approach to modeling and converting fixed-point data types.

I provide a brief introduction to fixed-point in this blog post.

The fixed_point package provides two different fixed-point types, fixed and fixbv. The fixed type is a higher level type and useful for modeling only. The fixed object will automatically grow and align as needed. The fixed can be resized by simply creating a new fixed (see example below).

There are two methods for creating a fixed-point (fixed,fixbv) by specifing the minimum, maximum, and resolution properities or by defining the format. The fixed-point parameters are:

  • min : minimum value
  • max : the maximum value
  • res : minimum fractional step
  • format : The W format W(width, integer-width, fractional-width)

The min,max,res or the format is specified not both.

Examples of Usage

Example using the fixed type.

>>> x1 = fixed(0, min=-1, max=1, res=2**-3)
>>> x2 = fixed(0, min=-1, max=1, res=2**-3)
>>> x3 = x1 + x2
# resize x2 to W(4,0,3)
>>> x3 = fixed(x3, min=-1, max=1, res=2**-3, round_mode='fix')
# or x3 = fixed(x3, format=W(4,0,3), round_mode='fix')

The following is an illustration how to plot the quantization for a W(4,0,3) format:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>>
>>> from fixed_point import fixed
>>> from fixed_point import ROUND_MODES
>>>
>>>
>>> for rm in ROUND_MODES:
>>>     xf = np.arange(-1200,1200)/1000.
>>>     xq,xe = ([],[])
>>>     for ff in xf:
>>>         fx = float(fixed(ff, format=(4,0,3), round_mode=rm))
>>>         xq.append(fx)    # back to float for plotting, preserves value
>>>         xe.append(ff-fx) # also plot error

Example using the fixbv type.

>>> x = fixbv(0, min=-1, max=1, res=2**-15)
>>> print(x, hex(x), repr(x))
0.000000e+00 0x0 <0 (0.000000) W16.0>
>>> x = fixbv(2.5, min=-8, max=8, res=1/32.)
>>> print(x, hex(x), repr(x))
2.500000e+00 0x50 <80 (2.500000) W13.9>
>>> x = fixbv(0.0333, min=-1, max=1, res=0.0001)
>>> print( x, hex(x), repr(x))
3.332520e-02 0x222 <546 (0.033325) W15.0>

The /fixbv/ type does not automatically align or resize. The resize funcition is used ot resize and align fixed-point types. The resize function has not been implemented in the package yet (WIP).

Recent activity

Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.