1.4.1.1. 同期メモリーブロックの使用
1.4.1.2. サポートされないリセットおよびコントロール条件の回避
1.4.1.3. Read-During-Write動作の確認
1.4.1.4. RAMの推論と実装の制御
1.4.1.5. シングルクロック同期RAM (古いデータでのRead-During-Write動作)
1.4.1.6. シングルクロック同期RAM (新しいデータでのRead-During-Write動作)
1.4.1.7. シンプル・デュアルポート、デュアルクロック同期RAM
1.4.1.8. トゥルー・デュアルポート同期RAM
1.4.1.9. 混合幅デュアルポートRAM
1.4.1.10. バイト・イネーブル信号を備えるRAM
1.4.1.11. 電源投入時の初期のメモリーコンテンツの指定
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;