Add README.
This commit is contained in:
parent
daca7044db
commit
cb821b6cbf
|
@ -0,0 +1,72 @@
|
||||||
|
|
||||||
|
Signed multiplier in VHDL or Verilog
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
genmul.py is a Python script for generating a signed multiplier
|
||||||
|
in synthesizable VHDL or Verilog code.
|
||||||
|
|
||||||
|
The multiplier is implemented in terms of basic logic blocks: inverters,
|
||||||
|
booth encoders, half adders, full adders and carry propagation logic.
|
||||||
|
These basic blocks are provided as a small VHDL or Verilog library.
|
||||||
|
The top-level multiplier instantiates many of these basic blocks
|
||||||
|
and wires them together.
|
||||||
|
|
||||||
|
|
||||||
|
Algorithm
|
||||||
|
---------
|
||||||
|
|
||||||
|
Radix-4 Booth encoding is used to construct a signed multiplier and
|
||||||
|
to reduce the number of partial products. The partial products are
|
||||||
|
combined with a Dadda tree to form two binary words. These two words
|
||||||
|
are added to obtain the final result. The final adder uses a Brent-Kung
|
||||||
|
carry-lookahead tree.
|
||||||
|
|
||||||
|
The generated multiplier can be purely combinatorial or it can optionally
|
||||||
|
contain one or two pipeline stages. Pipeline stages are created by inserting
|
||||||
|
an array of flip-flops between the Dadda tree and the final adder and/or
|
||||||
|
in the final output of the multiplier.
|
||||||
|
|
||||||
|
Geoff Knagge gives a good introduction to Booth encoding on his website,
|
||||||
|
http://www.geoffknagge.com/fyp/booth.shtml.
|
||||||
|
|
||||||
|
The method for merging partial products is described in L. Dadda,
|
||||||
|
"Some schemes for parallel multipliers", Associazione Elettrotecnica et
|
||||||
|
Elettronica Italiana, 1965.
|
||||||
|
|
||||||
|
A carry-lookahead adder is described in R. P. Brent, H. T. Kung,
|
||||||
|
"A Regular Layout for Parallel Adders", IEEE Transactions on Computers, 1982.
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
To generate a signed 24x18-bit pipelined multiplier in VHDL:
|
||||||
|
genmul.py --lang=vhdl 24 18 1 > mymul.vhdl
|
||||||
|
|
||||||
|
To generate a signed 8x8-bit combinatorial multiplier in Verilog:
|
||||||
|
genmul.py --lang=verilog 8 8 0 > mymul.v
|
||||||
|
|
||||||
|
|
||||||
|
Applications
|
||||||
|
------------
|
||||||
|
|
||||||
|
None really.
|
||||||
|
This is a hobby project.
|
||||||
|
|
||||||
|
These multipliers have never been used in a production system.
|
||||||
|
In fact these multipliers have never even been tested in actual hardware.
|
||||||
|
|
||||||
|
Generated multipliers of several word lengths have been extensively
|
||||||
|
tested in simulation and appear to work correctly.
|
||||||
|
|
||||||
|
Generated multipliers are synthesizable with Xilinx ISE 14 and Vivado 2014.
|
||||||
|
Resource utilization and timing are reasonable. About 500 LUTs are used
|
||||||
|
for an 18x18-bit multiplier on Virtex-7. This is in the same ballpark as
|
||||||
|
the LUTs used by the Xilinx synthesizer when forced to synthesize a built-in multiplication operator without DSPs.
|
||||||
|
|
||||||
|
However, modern FPGAs contain hardwired DSP blocks which provide multipliers
|
||||||
|
that are faster and more resource-efficient than the digital circuits
|
||||||
|
generated by genmul.py. Nobody in their right mind would use genmul.py
|
||||||
|
for practical FPGA-based multipliers.
|
||||||
|
|
||||||
|
--
|
Loading…
Reference in New Issue