AR# 8657

EXEMPLAR:パイプライン化された乗算器のインプリメント方法(VHDL/Verilog)

説明

キーワード:multiply, pipelined, spectrum, leonardo, 乗算器, パイプラン化された,

重要度 :標準

概要:
組み合わせロジックをパイプライン化すると、ロジックのレジスタが階層化し、その結果、スピードが速くなります。パイプライン化したフリップフロップは、デザイン内の組み合わせロジックをインプリメントする際に使用されたロジック セル内の未使用のフリップフロップを使用するので、FPGA上でのエリアを最小限に抑えます。

パイプライン化された乗算器の機能を反映させるには、Leonardo Spectrum で入力の RTL ソース コード記述にコンストラクトが必要です。このコンストラクトでは、「M」 レベルのレジスタが乗算器の出力で推測されるように命令を出します。「M」 には 2 以上の整数が入ります。

この整数の最小値を n とし、n は、乗算器/被乗数の幅である対数 (2 を底とする) 以上の整数の値です。Leonardo Spectrum では、推測されたレジスタの最初の x レベルを乗算器に移動することで、自動的に乗算器をパイプラン化します。

つまり、
x = m-1, for 2 <=m <=n
or
x = n-1, for m >n

Leonardo Spectrum 1999.1i 以降では、パイプライン化された乗算器はデフォルトでオンになっています。この機能は、次のように変数 pipeline_mult を false に設定することでオフにできます。

set pipeline_mult false

この機能についての詳細は、Leonardo Spectrum の ユーザアプリケーション ノートを参照してださい。 Help -> View User Manual -> User Manual -> ApplicationNotes -> Pipelined Multiplier.

次は 16 ビットのオペランド入力のついた Unsigned に設定されている乗算器の RTL コード記述です。Leonardo Spectrum では 4 つのレベルのレジスタが乗算器の出力に記述され、4 段階でパイプライン化された乗算器が生成されます。

ソリューション

1

-- VHDL example
library ieee ;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;

entity pipelined_multiplier is

-- generic size is the width of multiplier/multiplicand;
-- generic level is the intended number of stages of the
-- pipelined multiplier;
-- generic level is typically the smallest integer greater
-- than or equal to base 2 logarithm of size, as returned by
-- function log, which you define.
generic (size : integer := 16; level : integer := log(size));

port (
a : in std_logic_vector (size-1 downto 0) ;
b : in std_logic_vector (size-1 downto 0) ;
clk : in std_logic;
pdt : out std_logic_vector (2*size-1 downto 0));
end pipelined_multiplier ;

architecture exemplar of pipelined_multiplier is
type levels_of_registers is array (level-1 downto 0) of
unsigned (2*size-1 downto 0);
signal a_int, b_int : unsigned (size-1 downto 0);
signal pdt_int : levels_of_registers;

begin
pdt <= std_logic_vector (pdt_int (level-1));

process(clk)
begin
if clk'event and clk = '1' then
-- multiplier operand inputs are registered
a_int <= unsigned (a);
b_int <= unsigned (b);
-- 'level' levels of registers to be inferred at the
-- output of the multiplier
pdt_int(0) <= a_int * b_int;
for i in 1 to level-1 loop
pdt_int (i) <= pdt_int (i-1);
end loop;
end if;
end process;
end exemplar ;

2

//Verilog の例:

module pipelined_multiplier ( a, b, clk, pdt);
/* * parameter 'size' is the width of multiplier/multiplicand;.Application Notes 10-5 * parameter 'level' is the intended number of stages of the * pipelined multiplier; * which is typically the smallest integer greater than or equal * to base 2 logarithm of 'size' */ parameter size = 16, level = 4; input [size-1 : 0] a; input [size-1 : 0] b; input clk; output [2*size-1 : 0] pdt; reg [size-1 : 0] a_int, b_int; reg [2*size-1 : 0] pdt_int [level-1 : 0]; integer i;

assign pdt = pdt_int [level-1];

always @ (posedge clk)
begin
// registering input of the multiplier
a_int <= a;
b_int <= b;
// 'level' levels of registers to be inferred at the output
// of the multiplier
pdt_int[0] <= a_int * b_int;
for(i =1;i <level;i =i +1)
pdt_int [i] <= pdt_int [i-1];
end // always @ (posedge clk)
endmodule // pipelined_multiplier
AR# 8657
日付 04/24/2007
ステータス アーカイブ
種類 一般