VHDLに思う

最近FPGAの設計をしています。何を作ろうとしているのかというと、I2C接続が可能なタイマーカウンターアレーを作ろうとしています。なんでこんなものが必要になるかというと、ラジコン用の部品は、サーボをはじめとして加速度計、ジャイロなどパルス幅でコミュニケーションをとるものが目白押しで、マイコン内臓の機能では対応しきれなくなったという現状があります。なお、このような話は色々なところで議論されており、僕自身は元祖"俺サーボ"で有名な宮田さん『FPGAによるPWM制御』を参考にしています。
しかし今回はその機能自身の話ではなく、FPGAを設計する際に利用している言語VHDLに対するちょっとした愚痴です。

以下、続きをどうぞ。

実はVHDL、はじめてまだ一週間ですが、だいたいコツを掴んできました。というかプログラミング言語にくらべて構文が単純ですので、書くだけでしたら誰でも簡単にできてしまうと思います(動作速度をあげたりラッチに気をつけたりとテクニック的にはプログラミング言語よりもかなり奥が深そうですが)。
そのVHDLの設計法の柱として階層設計というものがあります。読んで字のごとく、再利用可能な部品ごとに最小設計を行い、より上位階層でそれらを階層的に統合して、全体として高度な機能を実現する設計法です。例えば部品Parts_Baseをより上位の部品Parts_Subで利用したとします。その場合は以下のようなコードを記述します。

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

entity Parts_Base is
    port (
        clk : in std_logic;
        wires_inout : inout std_logic_vector (7 downto 0);
        .....
    );    
end Parts_Base;

architecture BEHAVIOR of Parts_Base is
begin
    process(clk) begin
        if(clk'event and clk = '1') then
            -- do some process
        end if;
    end process;
end BEHAVIOR;

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

entity Parts_Sub is
    port(
        clk : in std_logic;
        .....
    );    
end Parts_Sub;

architecture BEHAVIOR of Parts_Sub is
    component Parts_Base
        port (
            clk : in std_logic;
            wires_inout : inout std_logic_vector (7 downto 0);
            .....
        );
    end component;
    signal wire_inout_internal : std_logic_vector (7 downto 0);
begin
    U1: Parts_Base port map(clk, wire_inout_internal, .....);
end BEHAVIOR;

要は、component宣言でこういう内部部品があるということを教えてあげ、そのインスタンスを生成後、その部品への配線はこうだよということをport map命令で割りあてているのがポイントです。しかしプログラミング言語に慣れてしまっている僕からいわせると、U1インスタンスは既に配線を持っているわけで、コードの他の部分で

U1.wire_inout

のような指定ができないのが残念でなりません。そうすればここでいうwire_inout_internalのような信号線がコード上から削除できて効率的だと思うのですが、そうはいかないのでしょうか。
VHDLを直接書かず、回路図エディタで回路を組んでいく、あるいは他の言語(全く幻想で語っていますがSystemCとか使えばいいのでしょうか?)を使えば、このような非効率は回避できる可能性があるかもしれませんが、今のところネット上には多くのVHDLで書かれた資産があるので、VHDLを当面やめられそうにはありません。がんばって耐えていくつもりです(笑)。

VHDLを書かれる方でこのようなことを考えられたことがある他の方はおりますでしょうか。ちょっと気になっています。

November 29, 2006 20:48 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

初めまして、ソフト屋上がりのHDL屋です。
>U1.wire_inout
ですが、インスタンス間のポート接続は実デバイスのピン間を物理的な線でつなぐイメージです。
ソフトウェアで言うところのオブジェクトのプロパティとは全く異質なものです。
これは回路図でも他のハードウェア記述言語でも全く同じです。

テキストで書いているとソフトウェアを書いている感覚になりますが、あくまでも「物理構造」を文章で表現しているだけです。
ここを理解できるかどうかが、HDLのポイントですね。

Posted by: windy : November 29, 2006 10:57 PM

>windyさん
はじめまして、コメントありがとうございます。
U1.wire_inout <=> U2.wire_inout; みたいな記述ができたらなんとなくハッピーかなと思った次第です。仰るとおりワイヤは単なる線ではなく回路図の(名前付きの)ネットと考えれば非常に納得がいきますね。VHDL完熟までまだまだ先は長そうです(笑)

Posted by: fenrir : November 29, 2006 11:22 PM

確かにそんな書き方ができればずいぶん楽になりそうですね。
上位の階層ではモジュール間の接続だけになる事が多いのですが、大きなモジュール同士の接続になるとそのためだけに山のようなsignalが必要になります。
構造体のような仕組みもあるのですが、inとoutを一緒にできないのでいまいち使いづらいです。

個人的にVHDLの仕様で勘弁してほしいのはcomponent宣言です。
モジュールのI/Fを変更すると、必ず3箇所の変更が必要になります。
参考書では「モジュールの宣言部をコピペして…」なんて書かれていますがそれは違うのでは?という気がします。
実はcomponentが無くても良い方法があるのですが、教科書的には宜しくないようです。
僕はもうcomponent宣言は全く使わないで書いてしまっています。

Posted by: windy : November 30, 2006 12:42 AM

俺も宮田さんのを参考にして、RoboShellのサーボコントローラ部分を設計しました。
実装はプロ(まじなプロ)に任せてしまいましたが…。

がんばってください。

Posted by: 織田 : November 30, 2006 11:14 AM

すでに指摘されているように、ポート接続が配線であることにあるとき気がついて、そんなものだと思うようにしています。
それより、componentを使うときにいちいち引数まで再宣言させられることにうんざりします。
use component Parts_Base;
でいいと思うのですが。

Posted by: 酔漢 : November 30, 2006 12:24 PM

私も酔漢さんに同感です。なんでこんな何度もかかなきゃいけないのかよくわからんです。昔の都合を引きずっているんだとおもいますが、改正も入っているので直して欲しいと思います。VHDLは今の環境には不便を感じる面が多々ありますね・・・。

Posted by: まや : December 1, 2006 10:12 AM

>windyさん
はやく自分のコーディングスタイルを確立できるようになりたいです。そのうち現在作っているブツのコードを公開する予定ですが、素人感丸出しになりそうな予感です(笑)

>織田さん
応援ありがとうございます。Roboshellは標準化という点で非常に素晴らしい御計画だと思います。お互いに自分以外に使ってくださる方が増えると嬉しいですね。

>酔漢さん・まやさん
コメントありがとうございます。本当にVHDLの規格なんとかならないものですかね。かといってVHDLの資産がたくさんあるのでそれらを切って捨てるわけにも…、難しいです。

Posted by: fenrir : December 1, 2006 08:01 PM

コメントする