乗算演算は、数学における重要な基本的な算術演算です。乗算および累積演算(MAC)は、FFT、DFT、畳み込み計算などのデジタル信号処理、さらにはマイクロコンピュータのALUでも広く使用されています。目的のコンピューティングユニット。DSPアプリケーションでは、MACの設計は汎用プロセッサよりも重視されます。MACの論理的な実装は、通常、デジタル回路設計のクリティカルパスの主な要因です。設計の品質がPPAを決定します。この記事では、ソフトウェアの観点からMACとは何か、そしてそれがどのように機能するかを説明します。
設計原理
MACのトップレベル実装のブロック図は次のとおりです。Operand_1とoperand_2は32ビットの入力オペランドです。MAC操作の結果は64ビットの結果ピンを介して出力されます。内部64ビット加算器は出力を使用します。 2番目の加算オペランドは内部で加算されます。2番目のオペランドのソースは通常、前のサイクルの結果結果であり、結果出力とキャリー信号キャリーが取得されます。
VHDLで実装されたMACユニットロジック:
1 LIBRARY ieee;
2 USE ieee.std_logic_1164.ALL;
3 USE ieee.numeric_std.ALL;
4
5 ENTITY mac IS
6 GENERIC (n : INTEGER := 4); --define X and Y size
7 PORT (
8 ck : IN STD_LOGIC;
9 rst : IN STD_LOGIC;
10 X : IN SIGNED (n-1 DOWNTO 0); --n
11 Y : IN SIGNED (n-1 DOWNTO 0); --n
12 A : OUT SIGNED ((2+2*n)-1 DOWNTO 0) --2+2n (include two leading bits for overflow)
13 );
14 END mac;
15
16 ARCHITECTURE hdl OF mac IS
17 SIGNAL acc : SIGNED ((2+2*n)-1 DOWNTO 0) := (OTHERS => '0'); --2+2n
18
19 BEGIN
20
21 PROCESS (ck)
22 BEGIN
23 IF rising_edge(ck) THEN
24 IF rst ='0' THEN --reset accumulator at low
25 acc <= (OTHERS => '0');
26 ELSE
27 acc <= acc + shift_left(X * Y, 1);
28 END IF;
29 END IF;
30 END PROCESS;
31
32 A <= acc;
33 END hdl;
このコードに対応する回路ロジックを下図に示します。accは出力として使用されますが、フィードバックループを介して加算器に供給され、次の累積計算のオペランドの1つとして使用されるため、アキュムレータと呼ばれます。 -MAC。
VedicMultiplier回路の実装
デジタル回路の設計には、再帰と同型の深い考えがあります。問題が異なるレベルで同じ構造を持っている場合、複雑な問題を層ごとに再帰的に分解して、問題を解決できる最小の構造を見つけ、次に最小の構造を見つけることができます。問題をレベルで解き、それを基礎として使用し、分解の逆プロセスに従って高レベルの問題を徐々に解決し、最終的に問題全体の解決策を取得します。同様に、構造は次のことができます。最も単純な乗数から構築されます。
ヴェーダアルゴリズムを使用した乗数の原理は次のとおりです。
対応するデジタル回路の実装を次の図に示します。
ベースの 乗数は、のverdic乗数を達成することができます
ベースの 乗数は、のverdic乗数を達成することができます
ベースの 乗数は、のverdic乗数を達成することができます
ベースの 乗数は、のverdic乗数を達成することができます
この時点で、乗数の構造が完成し、加算器を以下に構築する必要があります。
多くの加算器があります。次のブロック図は、フォワードビット加算器を使用した完全なMACユニットの実装を示しています。
アキュムレータの一般的なアプリケーションは行列乗算です。乗数、加算器、およびアキュムレータの機能を説明するために、例としてドット乗算を取り上げます。
計算されたベクトルと内積、結果は結果を示します
プログラムの意味:
u64 adder(u64 m, u64 n)
{
return m + n;
}
u64 multiplier(u32 m, u32 n)
{
return m*n;
}
u64 macs(u32 operand_1, u32 operand_2)
{
accumulator = 0;
result = 0;
temp1 = multiplier(operand_1, operand_2);
carrier, accumulator = adder(temp1, accumulator);
result = accumulator;
return result, carrier;
}
void dotproduct(u32*a, u32*b)
{
for(i = 0; i < n; i ++)
{
result = macs(a[i], b[i]);
}
}
一部のDSPチップでよく見られるスペックメトリック(すべてのクロックサイクル8 MAC操作16番目のMAC操作など)は、本質的に、DSPMACのいくつかのそのようなユニットのマイクロアーキテクチャ実装を表します。
MIPSプロセッサMAC命令の実現:
MIPSには、madd、maddu、msub、msubuを含む4つの積和命令と積和命令があります。
その中で
マッドrs、rt。
コマンド機能は次のとおりです。
汎用レジスタの値にアドレスrsを乗算し、汎用レジスタの値にアドレスrtを符号付き数値として乗算します。演算の結果は{HI、LO}に加算され、加算の結果は{HI、 LO}、ここで{HI、LO}は、HI、LOレジスタが連結されて64桁の数値を形成することを意味します。
maddu rs、rt。
maddとの唯一の違いは、rsとrtの値が符号なしの数値として扱われることです。
msub rs、rt
汎用レジスタの値にアドレスrsを乗算し、汎用レジスタの値にアドレスrtを符号付き数値として乗算し、{HI、LO}を使用して乗算の結果を減算し、減算の結果を{HI、LOに保存します。 }。
msubu rs、rt
msub rs、rtとの唯一の違いは、レジスタの値が符号なしの数値であることです。