初めてでも使えるVHDL文法ガイド ―― 文法ガイド編

小林 優

7. アーキテクチャ

● アーキテクチャ本体

architecture < アーキテクチャ名 > of < エンティティ名 > is
  [ < ブロック宣言アイテム > ]
begin
  [ < 同時処理文 > ]
end { < アーキテクチャ名 > } ;

 《 記述例
architecture RTL of dec2to4 is
begin
  process ( d ) begin
    case d is
      when " 00 " = > q < = " 0001 " ;
      when " 01 " = > q < = " 0010 " ;
      when " 10 " = > q < = " 0100 " ;
      when " 11 " = > q < = " 1000 " ;
      when others = > q < = " XXXX " ;
    end case
  end process;
end RTL ;

● ブロック宣言アイテム

< サブプログラム宣言 >
< サブプログラム本体 >
< タイプ宣言 >
< サブタイプ宣言 >
< 定数宣言 >
< 信号宣言 >
< 変数宣言 >
< ファイル宣言 >
< コンポーネント宣言 >

 

8. 文

● 同時処理文

< プロシージャ呼び出し >

< 同時処理信号代入文 >
< コンポーネント呼び出し >
 

● process文

{ < ラベル名 > : }
  process  { ( < センシティビティ・リスト > ) }
[ < プロセス宣言アイテム > ]
  begin
[ < 順次処理文 > ]
  end process  { < ラベル名 > } ;

 《 記述例
process ( ck , res ) begin
  if res = ' 1 ' then
    Q < = ' 0 ' ;
  elsif ck'event and ck = ' 1  '  then
    Q < = D ;
  end if ;
end process ;

● センシティビティ・リスト

< 信号名 > , < 信号名 >  , …

● プロセス宣言アイテム

< サブプログラム宣言 >
< サブプログラム本体 >
< タイプ宣言 >
< サブタイプ宣 >
< 定数宣言 >
< 変数宣言 >
< ファイル宣言 >

● プロシージャ呼び出し

< プロシージャ名 >  { ( < 結合リスト > ) } ;

 《 記述例
write_reg ( CMD_REG , " 00000001 " ) ;

 

● 同時処理代入文

{ < ラベル名 > : } < ターゲット > < =  { guarded }  { transport }
[ < 波形 > when < 条件式 > else ] < 波形 > ;
{ < ラベル名 > : } with < 式 > select < ターゲット > < = { guarded }  { transport }
[ < 波形 > when < 選択 > , ] < 波形 > when < 選択 > ;

● コンポーネント呼び出し

< インスタンス名 > :
< コンポーネント名 >
{ generic map (< 結合リスト > ) }
{ port map ( < 結合リスト > ) } ;

 《 記述例
U1 : counter port map ( CK = > clk1 , RES = > sysres , Q = > blkcnt ) ;

● generate文

< ラベル名 > :
< ジェネレーション方式 > generate
[ < 同時処理文 > ]
end generate { < 名まえ > } ;

● ジェネレーション方式

for < 名まえ > in < 離散レンジ >
if < 条件式 >

● 順次処理文

< 信号代入文 >
< 変数代入文 >
< プロシージャ呼び出し >
 

● wait文

wait { on < センシティビティ・リスト > }  { until < 条件式 > }  { for < 式 > } ;

 《 記述例
- クロック・エッジからの相対遅延
  wait until CLK'event and CLK = ' 1 ' ;
  wait for 10 ns ; DATA < = din ;
  wait for 10 ns ; WEB < = ' 0 ' ;
  wait for 25 ns ; WEB < = ' 1 ' ;
wait until CLK ' event and CLK = ' 1 ' ;

● assert文

assert < 条件式 >
{ report < 式 > }
{ severity < 式 > } ;

記述例
assert data = expected
  report  " Data mismatch! "
  severity ERROR ;

● 信号代入文

< ターゲット > < = { transport } < 波形 > ;

記述例
WEB < = ' 1 ' after 25 ns ;

● ターゲット

< 名まえ > | < 集合体 >

● 波形

< 波形要素 > , < 波形要素 > , …

記述例
- 絶対遅延
   WEB < = ' 1 ' after 25 ns ,
' 0 ' after 50 ns ,
' 1 ' after 60 ns ;

 

● 波形要素

< 式 > { after < 式 > }
null { after < 式 > }

● 変数代入文

< ターゲット > : = < 式 > ;

● if文

if  < 条件式 >  then
  < 順次処理文 >
{ elsif  < 条件式 >  then
  < 順次処理文 > }
{ else
  < 順次処理文 > }
end if ;

 《 記述例
if din ( 3 ) = ' 1 '  then
  dout < = " 11 " ;
elsif din ( 2 ) = ' 1 '  then
  dout < = " 10 " ;
elsif din ( 1 ) = ' 1 '  then
  dout < = " 01 " ;
else
  dout < = " 00 " ;
end if ;

● case文

case < 式 > is
[when < 選択 > | < 選択 > | … = > < 順次処理文 > ]
end case ;

 《 記述例
case din is
    when  " 00 "  = > dout < = " 0001 " ;
    when  " 01 " = > dout < = " 0010 " ;
    when  " 10 " = > dout < = " 0100 " ;
    when  "11 " = > dout < = " 1000 " ;
    when others = > dout < = "XXXX" ;
end case

● 選択

< 単純式 > | < 離散レンジ > | < 名まえ > | others

● loop文

{ < ラベル名 > : }
  { < 繰り返し方法 > } loop
      [ < 順次処理文 > ]
end loop  { < ラベル名 > } ; 
 

記述例
for I in 0 to 255 loop
        - 1クロックごとにdin入力を変化
    wait for 100 ns ; din < = mem
end loop ;

 

● 繰り返し方法

while < 条件式 >
for  < 名まえ > in < 離散レンジ >

● next文

next  { < ラベル名 > } { when  <  条件式 > } ; 

● exit文

exit  { < ラベル名 > }  { when < 条件式 > } ;

記述例
- BUSYが0になるのを待つ
loop
        exit when BUSY = ' 0 ' ;
        wait for 100 ns ;
end loop ;

● return文

return { < 式 > } ;

● null文

null ;

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日