目次

VHDLデコーダ記述作成(AWK)

 VHDLを利用して、CPLD/FPGA内部にデジタル回路の
 中で、デコーダを記述します。

 デコーダは、M入力N出力の単純なテーブル変換
 を扱う回路なので、エディタでVHDLコードを入力
 するのは、非効率です。スクリプト利用で、作業
 時間を短くすべきでしょう。



 例で利用したのは、74シリーズの139で
 次の真理値表を実現する回路。
 (左が入力、右が出力)



 これをAWKでVHDLコードに変換します。
 テキストファイルに、必要なデータを
 書き込んでおきます。

 フィールドの並べ替えと文字列を付加する
 ように、スクリプトを作成します。

BEGIN {
  printf("iDEC <= ");
}
{
  printf("\"%s\" when ( %s = \"%s\" ) else \n",$2,$3,$1);
}
END {
  printf("(others => '1');\n");
}

 I/Oリダイレクトでテキストファイルに
 入れておきます。



 テキストファイルが出来てしまえば、エディタで
 見やすいように清書や信号名の付替えをします。

iDEC <= "1110" when ( iCNT = "000" ) else 
        "1101" when ( iCNT = "001" ) else 
        "1011" when ( iCNT = "010" ) else 
        "0111" when ( iCNT = "011" ) else 
        "1111" ;

 他に使った実例を、ひとつ紹介します。

 東西と南北に配置された、信号機の動作を
 エミュレートするため、ステートマシンの
 出力で、点灯ランプを変える場合の対応は
 次のようになります。

0000 001001 iDin
0001 001001 iDin
0011 100001 iDin
0111 010001 iDin
1111 001001 iDin
1110 001100 iDin
1100 001010 iDin
1000 001001 iDin

 これでデコード出力を扱うと、以下となります。



 I/Oリダイレクトでテキストファイルに格納し
 エディタで少し修正しておきます。

iDEC <= "001001" when ( iDin = "0000" ) else 
        "001001" when ( iDin = "0001" ) else 
        "100001" when ( iDin = "0011" ) else 
        "010001" when ( iDin = "0111" ) else 
        "001001" when ( iDin = "1111" ) else 
        "001100" when ( iDin = "1110" ) else 
        "001010" when ( iDin = "1100" ) else 
        "001001" when ( iDin = "1000" ) else 
        "001001" ;

 スクリプトを一度定義しておけば、入力情報を
 変えて、いろいろな場面に対応できます。

 Copy and Pasteによる変更よりも、時間が短く
 すむので、設計に集中できます。


目次

inserted by FC2 system