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

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.3.1. 乗算器の推論

乗算器の機能を推論する際に、合成ツールは乗算器ロジックを検出し、これをインテル 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規格の機能です。

Verilog HDL入力および出力レジスターを備える符号付き乗算器 (パイプライン = 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入力および出力レジスターを備える符号なし乗算器 (パイプライン = 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符号付き乗算器

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;