Intel® Quartus® Prime Pro Edition用户指南: 设计建议

ID 683082
日期 9/28/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

1.3.1. 推断乘法器

要推断乘法器功能,综合工具会检测乘法器逻辑并在Intel FPGA IP core中进行实现,或者将逻辑直接映射到device atom。

对于包含DSP模块的器件, Intel® Quartus® Prime综合能够根据器件使用情况,在DSP模块(而不是逻辑)中实现功能。 Intel® Quartus® Prime fitter也能够在DSP模块中布局输入和输出寄存器(即执行寄存器封装),以提高性能和区域利用率。

以下Verilog HDL和VHDL代码示例显示综合工具可以将有符号和无符号乘法器推断为IP core或DSP block atom。每个示例均适合一个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有符号乘法器(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无符号乘法器(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有符号乘法器

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;