2010年02月08日

SystemVerilog対応はいつ?

XilinxのXSTがSystemVerilogに対応するのは一体いつなのだろうか?
今年4月リリース予定のISE12.1でサポートする見られていたのだが、どうやら見送られたらしい。
不景気で開発要員をリストラしたのか?
残念だ...もう期待しません。
(次世代のVHDLにでも期待するか)



投稿時刻(12:47)│コメント(0)Xilinxツール 

2010年02月04日

Virtex−6のトレーニングコース追加

Xilinxで「Virtex−6 ファミリデザイン」と題したトレーニングコースが追加されている。(Sparten−6も追加されている!)
無料キャンペーンでお得感を出しているが、Virtex−5の無料キャンペーンが今でも続いているので今回もずっと無料なのだろう。
って事で、早速申し込んでみた...が何の応答も無い。
そのうちメールでも送られてくるのかな?
それと、申し込んでから気づいたけど、1日間って書いてあるのに日程は2日間あったりリンクをクリックしてもコースの詳細情報が無かったりと不備が多い。
本当に申し込まれたのか不安になってきたぞXilinx!

2010/2/8 - 2/5昼頃に参加チケットメールが送られてきた!誰かトレーニングに参加する人います?



投稿時刻(20:00)│コメント(2)イベント 

2009年12月10日

マルチコアでルータの高速化

ISE11系はほとんど使っていないので今まで知らなかったが、ISE11.4のリリース情報を調べていると[Enable Multi-Threading]と言うオプションがあった。
これはマルチコアCPUで分散処理をさせてルータを高速化するオプションで、個人的には、昔から待ちに待っていた機能だ。
という事で、早速試して見た。

テストはCore2Duo 3GHz/ISE11.4/WindowsXP 32Bit/Virtex5LX50T(80%程度の使用率)でオプションOFF時とON時でどのくらいルータ時間が短縮されるかを計測する方法で行った。

結果は、
オプションOFF:38分
オプションON:36分

...と残念ながらほとんど変わらなかった。

処理中にタスクマネージャからCPU使用率を見ていたがMAPの中の一部処理だけ分散処理している様でPARは分散処理されているようには見えなかった。
まぁXilinxが大々的にアピールしていない事で既に怪しいと思ったが、今後の改良を願いたい。



投稿時刻(20:43)│コメント(2)Xilinxツール 

ISE11.4

ISE11.4がリリースされています。
リリースノートを見る限り、そんなに変わってはいない様ですが、とりあえずアップデートして見ます。

ちなみに、ISE12は2010年4月頃だと聞いたことがあります。
これで、やっとSystemVerilogが使える?



投稿時刻(10:02)│コメント(0)Xilinxツール 

2009年12月09日

ModelSimでビットマップのリードライト(完成)

以前、「ModelSimでビットマップのリードライト」で紹介したモジュールがやっと完成した。
これを使えば簡単にビットマップをテストベクタとして利用できるので画像処理なんかには便利だと思う。
また、FLI等は使わずVHDLの記述だけで実現しているので修正も出来るし応用も出来る。
という事で、他の人にも使って貰えればと思うのでソースコードを公開します。

ダウンロード

動作環境
OS:Windows系
シミュレータ:ModelSim(XEでも大丈夫だと思う)

使用方法
上記環境で、ModelSimにPathが通っていれば、解凍したファイルの「sim.bat」を実行すればサンプルが動きます。
このサンプルは、解凍したファイルの「read.bmp」を読み出しピクセルデータを反転して「write.bmp」に書き込むだけです。
後は適当にソースコードを見て下さい。

ドキュメントが少ないので申し訳ないが要望があれば整備します。



投稿時刻(20:54)│コメント(9)ModelSim 

2009年04月08日

ISE11.1

ここ最近こんな話題ばかりだが、ISE11.1が4月末発表らしい。
ついにXSTがSystemVerilog対応か!と思われたが正式対応は見送られたようだ。
またも期待を裏切られてしまった...まっ対応しても習得できてないから使えないような物だけど、実際問題、論理合成出来ないと勉強する気にならないしねぇ〜

あと、ISE11移行はノードロックがかかるような話もある。
まぁ自分の所はちゃんと人数分買ってるから関係無いけど、コピーして使ってるユーザはそれが出来なくなるって事になるかも?



投稿時刻(22:14)│コメント(0)Xilinxツール 

2009年04月07日

次期ハードコアプロセッサ?

マイコミジャーナルにXilinxのインタビューが掲載されていた。
この話の中で、Virtex6にPowerPCが搭載されないって事と何らかのCPUを検討している事が書かれているが、次期SpartanでARMがハードコアプロセッサで搭載されるって話を聞いたことがある。Tralla氏が「ノーコメント」としているのはコレの事だろうか?



投稿時刻(10:21)│コメント(0)Xilinxデバイス 

2009年01月29日

Xilinx新デバイス

Virtex−6とSpartan−6が2月発表?

噂のMGT入りSpartanには期待!
PCIeのGen2はVirtexは当然としてSpartanはどうなのかな?
HD−SDIは出来るのかな?
DDR3は?、IOの最大転送レートは?、新機能ブロックは?...
期待がふくらむばかりだ!

それからISEも新しくなれば念願のSystemVerilog対応も!



投稿時刻(14:47)│コメント(0)Xilinxデバイス 

2008年11月14日

DesignWaveMAGAZINE休刊

とても貴重な情報源だったので残念でしかたがありません。

何らかの形で復活する事を期待しています。



投稿時刻(17:29)│コメント(0)書評 

2008年02月19日

Virtex5FXT

Virtex5FXTが4月発表らしい。
PPC440がハードマクロで入っているので、これの開発環境としてEDKもリリースされるのかな?
Virtex5はVirtex4の教訓からESで、ある程度評価してから発表するとの事なので実際に使える日も近そうだ。



投稿時刻(17:30)│コメント(0)Xilinxデバイス 

2008年02月18日

ISE10.1

このアンサーによると、ISE10.1が2008年3月にリリース予定らしい。
まぁいつものようにSPなしだとバグだらけで使い物にならないと思うが、SVには期待している。
さぁ、予定通りに3月SVサポートのISE10がリリースされるか?



投稿時刻(09:48)│コメント(0)Xilinxツール 

2008年01月08日

XSTでSystemVerilogサポート

Xilinxのアンサー#15390に、こんな記述がある。

SystemVerilog is not yet supported by XST, but coverage of this new language standard is scheduled for initial support in 2008.

あぁリリースが待ち遠しい!
おっと、これに備えて勉強勉強!



投稿時刻(10:42)│コメント(0)Xilinxツール 

2007年11月07日

xfy Blog Editor

xfy Blog Editorは、Blogをオフラインで書くことが出来る。
画像の添付なども簡単にできるらしいし、テンプレートを設定すればBlogのイメージを確認しながら編集できる。
ソースコードなんかも今までのように表示されれば最高なのだが、どうだろう?
今回の投稿で初めて使うので、ちょっとおためし。


entity COUNT is
   port
   (
       CLK     : in    std_logic;
       COUNT   : out   std_logic_vector(7 downto 0) := (others => '0')
   );
end COUNT;



おぉ、うまく表示されてる!
これは使えそうだ!


投稿時刻(21:29)│コメント(0)雑記 

2007年10月10日

StarterKitsをUSBダウンロードケーブルで使う

XilinxからCoolRunner-II Starter Kitが半額の$24.97になると言うメールが来た。
全然興味が無かったが、ふと「この基板からJTAGのピンをコネクタに出せばUSBダウンロードケーブルになるのでは?」と思った。
USBダウンロードケーブルは25000円位するのでもし使えるなら相当お買い得だと思う。

誰かこの件に関して情報を持っている方いますか?
後でSpartan3Eスタータキットでは試してみる事にする。

2007/10/10 - 残念ながらCoolRunner-II Starter KitはUSBダウンロードケーブルとしては使用できそうになかった。でも、SpartanのStarter Kit系はUSBケーブルとして認識したので使えそうだ!



投稿時刻(10:03)│コメント(0)雑記 

2007年10月09日

DFI準拠「DDR2 SDRAM PHYデザイン」

今日、Xilinxから「高速メモリインターフェイスソリューションと設計手法」のウェブセミナの案内が来た。
早速受講しようと思いアクセスしてみたが一向に再生されない...?仕方がないので家で見ることにしてとりあえずPDFをざっくり見てみた。
内容はいつものリアルセミナとほぼ変わらずと言ったところだ。
しかしこれを見て、TEDとDENALIがDFI準拠「DDR2PHYデザイン」を発表してデータも入手していた事を思い出した。
これは、DDR2PHY部分をブラックボックス(DFI仕様)にしてASICへの移植性を高めようとする物だ。
うちの会社でもたまにFPGAで評価してG/A等を作ったりする事があるので、このような共通仕様があるととても助かる。
でも逆に移植が無くFPGAが最終デザインの場合は自分でPHY部分も作った方が良いと思う。それは、後で問題があった場合にブラックボックスよりは調べやすいし、PHY部分は往々にしてビットエラーなどが起こりやすいからだ。
DFIのPHY回路をブラックボックスではなく理解できていれば別だが...



投稿時刻(20:53)│コメント(0)雑記 

2007年10月05日

新プロジェクト

最近、仕事が忙しくてBLOGの更新が滞っている。
と言うのも、進行中のプロジェクトがあるのに、新しいプロジェクトが立ち上がって、更にもう一つ案件があり、これも動き出しそうな雰囲気だ。
今後もBLOG更新のペースは上がらないと思うが、なるべく技術的な情報を投稿していきたいと思う。(来年夏頃には解放される予定...)



投稿時刻(21:32)│コメント(2)日記 

2007年10月02日

VHDL TIPS 「物理タイプの使い方」

物理タイプとは、時間や電圧、電流、距離などの物理的な物を表すために使用するデータタイプだ。
VHDLには元々「time」が物理タイプとして定義されており内容はスタンダードパッケージに書かれている。
この「time」を代表とする物理タイプはpsやnsなどの単位を指定できるのが大きな特徴で、新しい単位を持ったデータタイプを作成する事も出来る。

以下の例は距離の物理タイプを新たに定義して、その距離を遅延時間に変換する関数も用意した。(遅延時間は1ns=15cmで計算)


library modelsim_lib;
use modelsim_lib.util.all;

package distance_pkg is

    -- 距離タイプ
    type distance is range 0 to integer'high
        units
            munit;

            um      = 10 munit;
            mm      = 1000 um;
            cm      = 10 mm;
            m       = 100 cm;
            km      = 1000 m;

            mil     = 254 munit;
            inch    = 1000 mil;
            ft      = 12 inch;
            yd      = 3 ft;
            fm      = 6 ft;
            mi      = 5280 ft;
            lg      = 3 mi;
        end units;

    -- 距離から遅延時間を算出
    function distance2time( trace_len : distance ) return time;

end distance_pkg;

package body distance_pkg is

    -- 距離から遅延時間を算出
    function distance2time( trace_len : distance ) return time is
        variable    resolution      : real;
        variable    delay_time      : time;
    begin
        -- シミュレーションレゾリューションの取得
        resolution := get_resolution;

        -- メートル−時間変換
        --1ns=15cm(150000um)
        --1000000fs=150000um
        --1fs=0.15um(1.5munit)
        delay_time := to_time( real( distance'pos(trace_len))
                                 /(1.5 * resolution * 1000000000000000.0));

        return delay_time;
    end;

end distance_pkg;


このように最小単位からの係数を変えることで、ミリやインチなどを混在して記述出来る事も便利な点だ。
また、距離を遅延時間に変換する関数は、「time」がシミュレーションのレゾリューションによって最小単位が変わる特殊な物理タイプのため、まずレゾリューションを取得してから変換している。

この距離パッケージを使うと、以前紹介したVHDL TIPS 「双方向バスの遅延モデル」の遅延値を入力する部分を、距離を入力する様に簡単に置き換えることが出来るので、ケーブルのモデリングなどに使用するとおもしろいと思う。



投稿時刻(08:58)│コメント(0)VHDL 

2007年09月29日

PC故障!

家で使っているPCのOS(WinXP)が起動しなくなった。
Windowsの起動ロゴ直後にブルー画面で「C0000218」のエラーになる。
ネットでコレを調べたら、Windows最凶クラスのエラーらしい...
データだけでも復活させようと試せる事は山ほどやってみたがやっぱり無理だった。そして調べていくうちにエラーの原因はどうやらHDDにある事が分かった。
悪いことにこのHDDはオンボードのRAIDコントローラでRAID0(2台)を組んでいるのでHDDだけ他のPCに持って行ってデータを抜く事も出来ない。

仕方なく、領域解放&フォーマット、あぁ元の環境に戻すのにどれだけ時間がかかるのやら...



投稿時刻(22:27)│コメント(2)日記 

2007年09月28日

ChipScopeもどき?

今日、OPENCORESに「openVeriFLA」というロジアナ機能のIPが公開されているのを知った。
余り詳細を見てはいないが、想像ではChipScopeの様な物では無いかと思う。
でも、ChipScopeまでの機能があるとは思えないので、現状コレを試そうとは思わないがソースコード(残念ながらverilog)が公開されているのでChipScopeでは出来ない事が出てきた場合、コレをベースに作り込む事は出来ると思う。
また、ChipScopeを個人で購入する人は少ないと思うが、コレはGPLなので、お金がかからなくてすむ。

openVeriFLAのさらなる進化に期待したい。



投稿時刻(20:21)│コメント(0)雑記 

2007年09月26日

VHDL TIPS 「双方向バスの遅延モデル」

FPGAとメモリモデルを接続する場合等に「双方向バスでネットの遅延を挿入したい」と思った事が何度かある。
安直に「after文」でお互いを代入しても'X'になった以降はずっと'X'のままでうまくいかない。
ではどうすれば双方向バスに遅延を挿入する事が出来るのだろうか?
簡単な様で、これが結構難しい。色々と考えた末に、双方向バスの遅延モデルを作成できたので紹介する。

まずは、モデルの動作を確認した回路。
双方向の遅延モデルだが、テストで入力は使用しないので出力のみを入れた。
このPORTAとPORTBに対してテストベンチから波形を入力する。

linedelay_c

 



波形を入力するテストベンチはこれ。


library IEEE;
use IEEE.std_logic_1164.all;

entity TEST is
end TEST;

architecture BEHAVIOR of TEST is

    component LINEDELAY
        generic
        (
            linedelay       : time
        );
        port
        (
            PORTA           : inout std_logic;
            PORTB           : inout std_logic
        );
    end component;

    signal  PORTA   : std_logic;
    signal  PORTB   : std_logic;
    signal  PORTA_S : std_logic;
    signal  PORTB_S : std_logic;

begin

    C_LINEDELAY : LINEDELAY
    generic map
    (
        linedelay       => 10 ns
    )
    port map
    (
        PORTA           => PORTA_S,
        PORTB           => PORTB_S
    );

    process begin
        PORTA <= 'Z';
        PORTB <= 'Z';
        wait for 100 ns;
        PORTA <= '1';
        wait for 100 ns;
        PORTA <= '0';
        wait for 100 ns;
        PORTA <= 'Z';
        PORTB <= '1';
        wait for 100 ns;
        PORTB <= '0';
        wait for 100 ns;
        PORTB <= 'Z';
        wait for 100 ns;
        PORTA <= '1';
        PORTB <= '0';
        wait for 100 ns;
        PORTA <= '0';
        PORTB <= '1';
        wait for 100 ns;
        PORTA <= '1';
        wait for 100 ns;
        PORTA <= '0';
        PORTB <= '0';
        wait for 100 ns;
    end process;

    PORTA_S <= PORTA;
    PORTB_S <= PORTB;

end BEHAVIOR;


そして動作結果の波形はこんな感じ。

linedelay_w

 

PORTAから出力した値は、すぐにPORTA_Sに反映されるがPORTB_Sには遅延が入っている事が分かる。
逆にPORTBから出力した値は、すぐにPORTB_Sに反映されるがPORTA_Sには遅延が入っている。
また、同時にPORTA_SとPORTB_Sの値を変化させても遅延時間分のショートが'X'で再現されている。

次に肝心なモデルのソースがこれ。


library IEEE;
use IEEE.std_logic_1164.all;

entity LINEDELAY is
    generic
    (
        linedelay       : time
    );
    port
    (
        PORTA           : inout std_logic;
        PORTB           : inout std_logic
    );
end LINEDELAY;

architecture BEHAVIOR of LINEDELAY is

    signal  PORTA_X     : std_logic;
    signal  PORTB_X     : std_logic;

begin

    PROCESS
        VARIABLE last_time : time;
        VARIABLE transact : boolean;
    BEGIN
            WAIT ON PORTA'TRANSACTION, PORTB_X UNTIL (last_time /= NOW or PORTB_X'EVENT);

            if ( PORTA'TRANSACTION'EVENT ) then
                PORTA <= 'Z';
                transact := TRUE;
                last_time := NOW;
            else
                transact := FALSE;
            end if;

            WAIT FOR 0 ns;

            if ( transact = TRUE ) then
                PORTA_X <= transport PORTA after linedelay;
            end if;
            PORTA <= PORTB_X;

    END PROCESS;

    PROCESS
        VARIABLE last_time : time;
        VARIABLE transact : boolean;
    BEGIN
            WAIT ON PORTB'TRANSACTION, PORTA_X UNTIL (last_time /= NOW or PORTA_X'EVENT);

            if ( PORTB'TRANSACTION'EVENT ) then
                PORTB <= 'Z';
                last_time := NOW;
                transact := TRUE;
            else
                transact := FALSE;
            end if;

            WAIT FOR 0 ns;

            if ( transact = TRUE ) then
                PORTB_X <= transport PORTB after linedelay;
            end if;
            PORTB <= PORTA_X;

    END PROCESS;

end BEHAVIOR;


PORTA_XとPORTB_Xに、それぞれの双方向ポートの値をコピーし、それを遅延させて反対側のポートに代入している。
この双方向ポートの値をコピーする時、一度モデル側のドライバを'Z'にして本当の相手側ポートの値を取得する必要がある。
また、変な「WAIT文」、これは双方向ポートのトランザクションは時間単位あたり1度しか動作させたく無いのに対し反対側の双方向ポートをコピーした値のイベントは何回でも動作させるための条件だ。
双方向ポートのトランザクションを時間単位あたり1度しか動作させたくない理由は、自分でトランザクションを発生させているためこの条件が無いとループに陥ってしまうからである。
ただ、双方向ポートの一番最初のトランザクションで動作させているため、トランザクションが発生したデルタ時間の後のデルタ時間に値が変化するような信号ではうまく動作しない。
尚、以前紹介したVHDL TIPS 「アナログスイッチのモデリング」もそうだが、この手の手法はこの制限がつきまとってしまう。



投稿時刻(21:44)│コメント(3)VHDL 

2007年09月21日

VHDL TIPS 「属性"DRIVING_VALUE"の使用法」

VHDLでは出力ポートに割り当てた値を内部で参照する事は出来ない。
所が、VHDL93でコレを可能にするアトリビュート「DRIVING_VALUE」が追加された。

以下に使用例を紹介する。


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

entity COUNT is
    port
    (
        CLK     : in    std_logic;
        COUNT   : out   std_logic_vector(7 downto 0) := (others => '0')
    );
end COUNT;

architecture rtl of COUNT is

begin

    process ( CLK ) begin
        if ( CLK'event and CLK = '1' ) then
            COUNT <= COUNT'DRIVING_VALUE + '1';        -- 内部参照
        end if;
    end process;

end rtl;


これは単純な8ビットのカウンタで、クロックを入力するとカウントアップするだけの回路だ。通常は内部にカウント信号を定義してその信号をカウントアップし、出力ポートに割り当てるような記述になると思うが「DRIVING_VALUE」を使用すると出力ポートの値を直接参照してカウントアップし、そのまま出力ポートに代入する事が出来る。

便利と言えば便利だが、自分は出力ポートに出ている信号は内部参照されていないことを前提にソースコードを追いかけるので、出来るだけ使用しないようにしている。
また、使用しない決定的な理由として、XSTではサポートしていないと言う事がある。

それでも、シミュレーションモデル等で出力ポートを直接チェックしたい時には便利に使えるかもしれない。



投稿時刻(21:34)│コメント(0)VHDL 

2007年09月20日

ISE9.2のインストール

急遽、ISE9.2を使う必要が出てきた。
インストールしたいのだがXPおよびVISTAが入った適当なPCが見つからない。
仕方が無いのでサポート外のWindows2000にインストールしてみた。

DVDを挿入し、インストーラでOSチェックが入っていないことを祈りながらセットアップを開始.....どうやらチェックしていないようだ。
次に、「ダウンロードケーブルのドライバ」これは気持ちが悪いのでインストールのチェックを外した。
コピーを開始し問題なく終了。
次に、サービスパック、IPアップデート、Chipscopeを入れて無事最新の状態に....と思いきや「エラーメッセージ」が!
何だこのメッセージ...Webアップデートでネットワークが切断されたと出ている。IEでは問題ないのでネットワークがおかしいとは思えない。
なぜだ...
色々調べたらHDDの残り容量が少ないようだ。空き容量を増やし再チャレンジしたら無事完了した。

それにしてもISE9.2フルインストールで7Gbyte近く消費している。
ん!「.backup」フォルダこれが約1.5Gbyteこれって消して良いのかな?フォルダの中を見てみると消しても良さそうなので全部削除!
それでも、約5.5Gbyte...

ちなみに最新の状態でISE9.1は約4.5Gbyte、ISE8.2は約3.8Gbyteなのでバージョンアップ毎に1Gbyteずつ増えている計算になる。
EDK8.2は約800Mbyte、EDK9.1は約900Mbyte...なんか、かわいく思えてくる。



投稿時刻(21:01)│コメント(4)Xilinxツール 

2007年09月18日

夏休み終了

無事、夏休みを終了して今日から仕事に復活した。
でも、山のようなメールの処理と休みぼけが重なってまともに仕事できません。

そうそう、今日たった3日休んだだけなのに情報社会から一人取り残された気分になった。
これって高校生が携帯電話取り上げられた時と同じような感覚なのかな?
そうだとすると、ちょっとノイローゼ気味!?



投稿時刻(21:06)│コメント(0)日記 

2007年09月11日

1週間くらい更新できないかも...

遅い夏休みです!

家族サービスする予定。
でも、ずっと雨だ...台風よりましだけど。



投稿時刻(21:01)│コメント(0)日記 

VHDL TIPS 「shared variableの使用法」

VHDL93から「共有変数」が使用可能になりVHDL2002で使用方法が変更になった。
XSTはVHDL93をサポートしており限定的ではあるが、共有変数を使用できるみたいなのでVHDL93とVHDL2002両方の使い方を紹介する。
(ただし今回、紹介する例はXSTで合成出来ない。合成するためには同じアーキテクチャ内から共有変数にアクセスする必要がある。)

まず、VHDL93の例


package shared_pkg is
    shared variable SH_INT      : integer;
end shared_pkg;

 

library IEEE;
use IEEE.std_logic_1164.all;

library work;
use work.shared_pkg.all;

entity a is
    port
    (
        CLK             : in    std_logic;
        DATA           : out   integer
    );
end a;

architecture a of a is
    component b
        port
        (
            CLK             : in    std_logic
        );
    end component;
begin
    u_b : b port map( CLK );
    process ( CLK ) begin
        if ( CLK'event and CLK = '1' ) then
            DATA <= SH_INT;
        end if;
    end process;
end a;

 

library IEEE;
use IEEE.std_logic_1164.all;

library work;
use work.shared_pkg.all;

entity b is
    port
    (
        CLK             : in    std_logic
    );
end b;

architecture b of b is
begin
    process ( CLK ) begin
        if ( CLK'event and CLK = '1' ) then
            SH_INT := SH_INT + 1;
        end if;
    end process;
end b;


この例では、2つのアーキテクチャからパッケージで宣言した共有変数にアクセスしている。

次に、VHDL2002の例
package shared_pkg is     -- プロテクトデータタイプ
    type SH_TEST is protected
        -- 書き込み関数
        procedure write ( data : in integer );
        -- 読み出し関数
        impure function read return integer;
    end protected SH_TEST;

    -- 共有変数をプロテクトタイプで宣言
    shared variable SH_INT      : SH_TEST;

end shared_pkg;

package body shared_pkg is

    type SH_TEST is protected body
        -- 実データ
        variable buf : integer := 0;
        -- 書き込み関数
        procedure write ( data : in integer ) is
        begin
            buf := data;
        end;
        -- 読み出し関数
        impure function read return integer is
        begin
            return buf;
        end;
    end protected body SH_TEST;

end shared_pkg;

 

library IEEE;
use IEEE.std_logic_1164.all;

library work;
use work.shared_pkg.all;

entity a is
    port
    (
        CLK             : in    std_logic;
        DATA            : out   integer
    );
end a;

architecture a of a is
    component b
        port
        (
            CLK             : in    std_logic
        );
    end component;
begin
    process ( CLK ) begin
        if ( CLK'event and CLK = '1' ) then
            DATA <= SH_INT.read;
        end if;
    end process;
    u_b : b port map( CLK );
end a;

 

library IEEE;
use IEEE.std_logic_1164.all;

library work;
use work.shared_pkg.all;

entity b is
    port
    (
        CLK             : in    std_logic
    );
end b;

architecture b of b is
begin
    process ( CLK ) begin
        if ( CLK'event and CLK = '1' ) then
            SH_INT.write( SH_INT.read + 1 );
        end if;
    end process;
end b;


VHDL2002では単純にアクセスするのでは無く、プロテクトタイプを宣言しデータにアクセスするための関数を定義してその関数を通してデータにアクセスする。
丁度、C++のクラスでプライベートのデータにパブリックのメソッドからアクセスするようなイメージだ。

今回、共有変数の使用例を紹介したがXSTでは同じアーキテクチャ内からでしかアクセス出来ない等の制限があり余り利用価値がない。
もし別のアーキテクチャからアクセス出来ればデバッグ時に信号を引き出す手段として有効利用できたと思う。私はコレがやりたかったのでとても残念に思う。

尚、今回の例は変数の使い方としては良くない例で、同じ時間に違うプロセスからリードライトしているのでシミュレータによってはタイミングが変わるかもしれない。あくまでも共有変数の動作を確認する目的で作成している。

2010/2/19:今更ながら少し修正、VHDL93版の"DATA <= SH_INT;"でイベントが発生しないのでCLKイベントにしました。


投稿時刻(20:52)│コメント(4)VHDL 

2007年09月10日

配置と配線の指定

XilinxのFPGAで配置と配線を指定し再インプリメントしてもそれを固定する方法を紹介する。

全体の流れは、
・配置配線を指定したい回路を適当にインプリする
・FPGAエディタで配置配線を編集する
・配置配線の指定を行うUCFファイルを出力する
このような感じになる。

画像を織り交ぜて解説すれば分かりやすいのだが、大変なのでテキストのみでご勘弁を。
それでは、詳細のオペレーションを紹介する。

その一(配置)
’枌崘枩指定したい回路を作成し使用するFPGAにインプリする。
■藤丕韮船┘妊タでそのデザインを開く。
ここで、UCF等で配置固定していなければ当然適当に配置されている。
で枌峪慊蠅靴燭ぃ丕稗里よびSLICEで適当に配置されてしまったSITEと配置指定先のSITEを選択してSWAPボタンを押す。
イ海譴韮咤稗圍鼎入れ替わるので、これを繰り返し目的の配置を完了する。

その二(配線)
仝従適当に配線されていて配線指定したいネットを選択しUNROUTEボタンを押す。これでラッツネットになる。
▲薀奪張優奪箸離疋薀ぅ个らレシーバまで配線したい順番に選択して行き最後に
ROUTEボタンを押す。これで選択した順番に配線される。
ここで注意点:
・スイッチボックスは選択しても配線出来ないので配線に使用するネットを直接選択して行く。
・レシーバが複数あっても順番に指定すればOK、配線指定しなくても良いレシーバは選択に含めず配線指定のネットを配線してからドライバ、レシーバを選択してAUTOROUTEボタンで配線する事もできる。
・配線リソースが表示されていなければ選択も出来ないのでツールバーのレイヤーで配線が表示されるようにしておく。
これで配線が出来るので、これを繰り返し目的の配線を完了する。

その三(制約生成)
.瓮縫紂爾Tools→Directed Routing Constraintsを選択してダイアログを出す。
▲瀬ぅ▲蹈阿離螢好箸ら配置配線指定を行いたいネットを選ぶ。
出力するUCF Fileを指定する。
Placement Constraint TypeでUse Absolute Location Constraintを選択する。
Applyを押す。
Δ海譴如配置配線を固定するUCFが生成されたので再インプリすればFPGAエディタで編集した回路が再現出来る。

これは単純な例だが、これの応用で色々出来ると思う。

2007/09/11 - Directed Routing制約には対応デバイスに制限がある。
使用不可:Virtex/VirtexE/Virtex2ProX/Spartan2/SpartanE/PLD
使用可能:Virtex2/Virtex2Pro/Virtex4/Virtex5/Spartan3



投稿時刻(21:43)│コメント(0)Xilinxツール 

2007年09月07日

秀丸エディタV7.00リリース

秀丸エディタのV7.00がリリースされた。
今回の注目は補完機能だが、今まで補完マクロを使っていたのでそれほど魅力を感じなかった。しかし、少し試してみるとやはりネイティブの方が使いやすい。
それでも、補完マクロの良いところもある。キーワードと雛形を登録すれば補完で一致した時、雛形を生成出来る。
例えば、「proc」と入力して補完すると「process () begin」「end process;」まで補完出来る。
なので、ネイティブ補完と補完マクロは両方同時に使って使い分けるのが良さそうだ。
またV6.00から入っていたがアウトラインと折りたたみ機能も有効に使えそうだ。

アウトラインや折りたたみ、補完辞書などをVHDL用に設定たら、こんな感じになる。

hide7




テキストエディタが便利になりすぎると、言語のキーワードスペルを覚えられなかったり、忘れたりしそうだ。私は未だに「architecture」は怪しい...



投稿時刻(21:00)│コメント(0)雑記 

2007年09月06日

台風

会社は東京、家は千葉、今日は台風!昨日は子供の誕生日!
ブログ書いてる時間がとれません...

投稿時刻(18:47)│コメント(0)日記 

2007年09月04日

VHDLでFPGAのバージョン管理

皆さんはFPGAのバージョン管理はどうしていますか?
「たまにエラー出るけどこれいつのバージョンか分からない!」
「バージョンレジスタを付けたけど更新するの忘れた!」
なんて事ありませんか?
私はよくあります...

そこで!論理合成するたびに自動的にインクリメントしてくれる信号を作ってみました。これは合成時に値が決定するので回路のリソースは消費しませんし、自動なので更新を忘れることもありません。

使い方は、FPGAのトップから本パッケージの関数を呼び出すだけです。
以下に使用例を紹介します。


-- バージョン取得パッケージの参考例
library IEEE;
use IEEE.std_logic_1164.all;

-- FPGAのトップファイルにこのパッケージを宣言する。
library work;
use work.ver_get.all;

entity top is
    generic
    (
        -- シミュレーションを行う場合は、
        -- テストベンチから「SIM_MODE」を1にして呼び出す。
        -- 合成の時はディフォルトの0が自動的に割り当たる。
        SIM_MODE            : integer := 0
    );
    port
    (
        VER_OUT         : out   std_logic_vector(31 downto 0)
    );
end top;

architecture top of top is

    -- この呼び出しで論理合成する毎にインクリメントされた値を返す。
    constant    VERSION : std_logic_vector(31 downto 0)
                                := get_version( SIM_MODE, "ver.txt" );

begin

    VER_OUT <= VERSION;

end top;


動作の仕組みは、論理合成時に指定されたバージョンファイルからバージョンデータを読み出しインクリメントしたバージョンデータを書き込むだけです。
詳しくはパッケージファイルにコメントを書いていますのでそれを見てください。

パッケージはココ
参考ファイルはココ
バージョンファイルの参考例はココ
からダウンロードできます。

「もっと良い方法しってるよ!」って人は是非教えてください。

投稿時刻(20:14)│コメント(6)VHDL 

熱対策の参考資料

いつも楽しみにしているCQ出版社「組み込みネット」の技術解説で熱対策が紹介されていた。
ここ数年FPGAの熱対策に泣かされることが多かったが、同じ問題を抱えている人が多いようだ。
前にも書いたがFPGAの代理店などがファンメーカと組んで「熱対策ソリューション」ってな感じで売り出せば結構ニーズあると思うけど...ほしいの私だけ?

そうそう、忘れていたが数年前「まず貼る一番」という製品が沖電気から発売された。これは熱を遠赤外線に変換して放熱するらしい。
久しぶりに調べてみたら特性が良くなったらしい。試したことが無いので効果のほどはわからないがWebを読む限りある程度使えそうだ。
またジェルテックにも色々な熱対策製品が発売されている。



投稿時刻(02:19)│コメント(0)雑記 
最新コメント
ブログ内検索
カテゴリ別表示
月別表示
問い合わせ・連絡先
ta_bo__@livedoor.com

本サイトは以下のアクセス解析を使用しております。
基礎化粧品