FC2カウンター FPGAの部屋 2010年12月22日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

VHDLによる乗算記述方法によるインプリメントの差異(Ver.12.3のXST)

ISE12.3のXSTを使って、VHDLによる乗算記述方法によるインプリメントの差異について調べてみた。使用デバイスはSpartan-6(xc6slx45t-3fgg484) (”VHDLによる乗算について(ISE12.3のXSTを使用)”と”Type Qualification とType Conversion”を参照)
まずは、”VHDLによる乗算について(ISE12.3のXSTを使用)”の(2010/12/21:追加)の掛け算のVHDLをXSTでインプリメントしてみた。(XSTの-use_dsp48オプションはAuto)

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;

entity mult_test is
    port (
        clk : in std_logic;
        reset : in std_logic;
        ina : in std_logic_vector(7 downto 0);
        mult_out : out std_logic_vector(17 downto 0)
    );
end mult_test;

architecture RTL of mult_test is
signal mult : std_logic_vector(17 downto 0);
signal temp : std_logic_vector(8 downto 0);
begin
    temp <= "111110000";
    process(clk)
    begin
        if clk'event and clk='1' then
            if reset='1' then
                mult <= (others => '0');
            else
                mult <= unsigned(ina) * signed(temp);
            end if;
        end if;
    end process;
    mult_out <= mult;
end RTL;


インプリメントすると、DPA41A1がインスタンスされている (FPGA Editor)。
mult_8_101222.png

次に、下のVHDLソースでインプリメントしてみた。

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;

entity mult_test is
    port (
        clk : in std_logic;
        reset : in std_logic;
        ina : in std_logic_vector(7 downto 0);
        mult_out : out std_logic_vector(17 downto 0)
    );
end mult_test;

architecture RTL of mult_test is
signal mult : std_logic_vector(17 downto 0);
begin
    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                mult <= (others => '0');
            else
                mult <= unsigned(ina) * signed'("111110000");
            end if;
        end if;
    end process;
    mult_out <= mult;
end RTL;



SLICEXとOLOGIC2でインスタンスされていて、DPS48A1は使用されていない。
mult_9_101222.png

同じ設定で、XSTの -use_dsp48をAutomaxに設定して、インプリメントしてみた。結果は、SLICEXとOLOGIC2でインスタンスされた。
XSTの -use_dsp48をYESに設定してみた。結果はDSP48A1を使用した。
このVHDLコードだと、XSTの -use_dsp48がYESの時だけ、DSP48A1を使用する。でも、XSTの -use_dsp48がYESだと、DPS48A1を使い切るとエラーになってしまう。

mult <= unsigned(ina) * signed'("111110000");



mult <= unsigned(ina) * signed(std_logic_vector'("111110000"));


に変更しても、同様の結果になった。

  1. 2010年12月22日 15:34 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:8

ISE12.4が出ています

ISE12.4が出てます
Xilinxからのメールによると、AMBA 4 AXI4 tool and IPのサポートが充実しているようです。やはり、AXI4サポート、Xilinxは本気なんでしょうか?
  1. 2010年12月22日 12:16 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:1

Type Qualification とType Conversion

VHDLのType Qualification とType Conversionについての覚書。(参考書籍、The Designer's Guide to VHDL, 2nd Editon, 48ページ)(リンクは3rd Editonです)

Type Qualification は、例えば
type STATE1 (idle, state1, state2);
type STATE2 (state2, idle, state1);
と宣言したときにSTATE1'(idle)、STATE2'(idle) と書ける。どっちの列挙宣言のidleかを指定できる。
std_logic_vector'("111110000")と書いたときは、string型がオーバーロードしていても、"111110000"がstd_logic_vector型であることを指定できる。

Type Conversionは、型を変換することができる。real(456), integer(32.57)
std_logic_vectorで宣言したsignalは、std_logic_signedライブラリをuseするか、std_logic_unsignedライブラリをuseするかでどちらの演算子を使うか指定できるようだ。でも足し算、引き算はどちらでも2進数の値は変わらない(2の補数表示)。ただ、比較演算子では、signedにはマイナスの数があるので、動作が変わることになる。掛け算では、符号拡張が行われる(signed)か、行われないか(unsigned)の違いがある。
signed(temp1), unsigned(temp2)

#間違っていたらコメントください。よろしくお願いします。
  1. 2010年12月22日 12:13 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0