インテル® Quartus® Primeプロ・エディションのユーザーガイド: デザイン上の推奨事項

ID 683082
日付 4/13/2020
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

1.3.1. 乗数の推測

乗数関数を推測するために、合成ツールは乗数ロジックを検出し、Intel FPGA IPコアにこれを実装します。またはデバイスアトムにロジックを直接マップします。

DSPブロックを備えたデバイスの場合、 インテル® Quartus® Prime合成では、デバイスの使用率に応じて、ロジックではなくDSPブロックに機能を実装できます。 インテル® Quartus® Primeフィッターは、DSPブロックに入力および出力レジスターを配置(つまり、レジスター・パッキングを実行)して、パフォーマンスと領域の使用率を向上させることもできます。

次のVerilog HDLおよびVHDLコード例は、合成ツールが符号付きおよび符号なし乗算器をIPコアまたはDSPブロックアトムとして推論できることを示しています。各例は1つのDSPブロック要素に収まります。さらに、レジスターの一覧ーのパッキングが発生すると、レジスターの追加のロジックセルは不要です。

Verilog HDL符号なし乗算器 

module unsigned_mult (out, a, b);
	output [15:0] out;
	input [7:0] a;
	input [7:0] b;
	assign out = a * b;
endmodule
注: Verilog HDLのsignedき宣言は、Verilog 2001 Standardの機能です。

Verilog HDL Signed Multiplier with Input and Output Registers (Pipelining = 2)

module signed_mult (out, clk, a, b);
   output [15:0] out;
   input clk;
   input signed [7:0] a;
   input signed [7:0] b;

   reg signed [7:0] a_reg;
   reg signed [7:0] b_reg;
   reg signed [15:0] out;
   wire signed [15:0] mult_out;

   assign mult_out = a_reg * b_reg;

   always @ (posedge clk)
   begin
      a_reg <= a;
      b_reg <= b;
      out <= mult_out;
   end
endmodule

VHDL Unsigned Multiplier with Input and Output Registers (Pipelining = 2)

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

ENTITY unsigned_mult IS
   PORT (
      a: IN UNSIGNED (7 DOWNTO 0);
      b: IN UNSIGNED (7 DOWNTO 0);
      clk: IN STD_LOGIC;
      aclr: IN STD_LOGIC;
      result: OUT UNSIGNED (15 DOWNTO 0)
   );
END unsigned_mult;

ARCHITECTURE rtl OF unsigned_mult IS
   SIGNAL a_reg, b_reg: UNSIGNED (7 DOWNTO 0);
BEGIN
   PROCESS (clk, aclr)
   BEGIN
      IF (aclr ='1') THEN
         a_reg <= (OTHERS => '0');
         b_reg <= (OTHERS => '0');
         result <= (OTHERS => '0');
      ELSIF (rising_edge(clk)) THEN
         a_reg <= a;
         b_reg <= b;
         result <= a_reg * b_reg;
      END IF;
   END PROCESS;
END rtl;

VHDL Signed Multiplier

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

ENTITY signed_mult IS
   PORT (
      a: IN SIGNED (7 DOWNTO 0);
      b: IN SIGNED (7 DOWNTO 0);
      result: OUT SIGNED (15 DOWNTO 0)
   );
END signed_mult;

ARCHITECTURE rtl OF signed_mult IS
BEGIN
   result <= a * b;
END rtl;