Effective Coding with VHDL: Principles and Best Practice (The MIT Press)

キーワードと括弧との間のスペース

Circuit Design with VHDL, third edition (The MIT Press)も以下のスタイルであった。 p.484 非公式訳: ()に前置するスペースについて気をつけるべきことは、キーワードは函数名ではないということです。ですから、函数名と()との間にはスペースを空けない…

assertion

Effective Coding with VHDL: Principles and Best Practice (The MIT Press), p.416 ルーチンの主たる目的がブール値を返すことである場合は、「何々は何々だ」(assertion)という形か、「何々ですか?」(question)という形か、いずれかでそのルーチンに名前…

functionとprocedureとの使い分けの目安

p.379, 第3段落, 非公式訳: 原則として、procedure、functionのどちらでも使える場面であればサブプログラムとしてfunctionを使うことをお勧めします。サブプログラムの目的が値を1つだけ計算することである場合は、たといクライアントコード(訳註: サブプロ…

std_ulogicとstd_logicと

Effective Coding with VHDL: Principles and Best Practice (The MIT Press), p.319, 第3段落目から (非公式訳) 複数ビットの信号、および複数ビットのポートを実装するときにstd_logic_vectorとstd_ulogic_vectorのどちらを選んだらよいのか、少し混乱があ…

orderingを指定せずにstd_logic_vectorを宣言したとき

p.269 std_logic_vectorのインデックス型はnaturalであるため、orderingを指定せずにstd_logic_vectorを宣言したときは左端のインデックスが0。 library ieee; use ieee.std_logic_1164.all; entity sute is port( left_most : out std_logic; right_most : …

並び順が互いに逆のベクタからベクタへ値を代入するとき

pp.267-268 ascendingであろうとdescendingであろうと、とにかく左端は左端へ、右端は右端へ配線される。要するにインデックスとは無関係に位置だけで決まる。 library ieee; use ieee.std_logic_1164.all; entity sute is port( source : in std_logic_vect…

コンパクトなDフリップフロップ

関連: コンパクトなDフリップフロップ - 参考: Effective Coding with VHDL: Principles and Best Practice (The MIT Press), p.262 library ieee; use ieee.std_logic_1164.all; entity d_flip_flop is port( aclr_n : in std_logic; clk : in std_logic; d…

if-else文における記述順の目安

pp.255-256 通常のケースを先に書く。逸脱ケースをあとに書く。 短くてシンプルなケースを先に書く。複雑なケースをあとに書く。 if trueを先に書く。if notをあとに書く。

エイリアス

Circuit Design with VHDL, third edition (The MIT Press), pp.238-239 Effective Coding with VHDL: Principles and Best Practice (The MIT Press), pp.168-171 -- これは単に別名をつけるだけ。 alias new_name is original_name; -- インデックスを指定…

名前のルール

p.165 英数字、下線しか使えない。 ケースセンシティブではない。 先頭にはアルファベットが来なければならない。 末尾に下線は許されない。下線が連続してはならない。

8.2.2 集合体 / 非公式訳

名詞 /アグリガトゥ/ 動詞 /アグリゲイトゥ/ pp.161-164 8.2.2 集合体 「集合体(aggregate)」とは、別々の値を1つの複合値にまとめるためのものです。複合値は、排列、レコードのいずれかを指します。複合値の必要な場所ではいつでも集合体が使えます。用途…

8.2.1 リテラル / 非公式訳

pp.159-161 8.2.1 リテラル 「リテラル」とはコードに直接記述された値のことです。(略) (略) 数値リテラルは、デフォルトでは10が基数であるとして解釈されますが、基数つきの数値リテラルを使えば別の基数で値が記述できます。たとえば10進数の51は、16#33…

Ports / 非公式訳

pp.116-117 各種ポート (略) VHDLでは、ポートの向き(in、out、inout、buffer)をポートのモードと言います。(略) ポートモードの選択はほとんどの場合簡単ですが、注意点がいくつかあります。各モードの用途を下に簡単に示します。 in: (略) out: (略) buffe…

couplingとcohesionと / 非公式訳

/コウヒージャン/ p.82 結合と凝集と 結合(coupling)と凝集(cohesion)との関係を論ずるためには、まずこの2つの用語の定義を明確にする必要があります。「結合」は、1個のモジュールを外部から見たときの尺度であり、システムを構成する他のモジュールとの結…

3.6.1 recognitionとrecallと / 非公式訳

/レカグニシャン/ pp.61-62 3.6.1 「見てそれと分かる」と「意識的に思い出す」と 「見て(聴いて、嘗めて、触って、嗅いで)それと分かる(recognition)」と「意識的に思い出す(recall)」はどちらも、記憶から情報を取り出すことですが、両者はメカニズムが異…

IPカタログを使ってカウンターを自動生成する / 下位VHDLをentityで直接実体化する

(テキストとは無関係) 前回はcomponent宣言してから実体化したが、今回はentity work.コンポーネント名という形で直接実体化する。このほうがはるかに簡単に思えるが、それぞれ長所・短所があるとの由。動作は前回と同じ。 library ieee; use ieee.std_logic…

IPカタログを使ってカウンターを自動生成する / 下位VHDLをcompnent宣言してから実体化する

(テキストとは無関係) 前回はテキストどおりにカウンターを一から記述したが、今度はIPカタログを使って自動生成した。モジュロ48 M、モジュロ10の2つのカウンターを生成して、あとは接続するだけでよい。非常にスッキリ書ける。自前のint_to_seven_seg()函…

genericでモジュールをパラメタライズする

pp.29-31 genericでパラメタライズしておけば、別のモジュールで実体化するときに、そのgenericに別に値を割り当てることができる。 下のコードはほぼテキストのままである。48 MHzクロックをモジュロ48 Mのカウンターでカウントし、それがオーバーフローす…

属性

pp.28-29 オブジェクトの持つさまざまな属性が読み出せる。ここでは排列要素の最大値を求める。 entity sute_vhdl is port( num_out: out natural range 0 to 15 ); end entity; architecture rtl of sute_vhdl is type nat8_vect_t is array(natural range …

pp.25-27 よく使われるのは、列挙型、整数型、排列型、レコード型。レコード型は構造体のことか? 排列型およびレコード型はコンポジットタイプと総称される。 ということなので、無意味な型を作って無意味なことをして確かめてみる。 entity sute_vhdl is p…

パッケージ

pp.23-24 パッケージは2つの部分から成る。 パッケージ宣言: プロトタイプ宣言のようなものか? 型、定数、サブプログラム宣言、コンポーネント宣言を記述する。 パッケージボディ: ここに実装する。 ということなので、意味のない単純なパッケージを作って…

函数とプロシージャとを作る

pp.21-22 ということなので、意味のない単純な函数とプロシージャとを作って試してみる。ここではどちらもアーキテクチャに記述した。 entity sute_vhdl is port( num_in: in natural range 0 to 7; num_in_thru : out natural range 0 to 7; num_out_plus_1…

サブプログラム / 函数とプロシージャと

pp.21-22 サブプログラムを宣言する主な場所は、パッケージ内、アーキテクチャ内、プロセス内である。サブプログラムには函数とプロシージャの2種類がある。 函数は値を返す。式の中でしか使えない。 プロシージャは、値は返さないがそのパラメーターは変更…

コントロールストラクチャー / ifとcaseとloopと

pp.18-19 if、case、loopの3つのシーケンシャルステートメントをコントロールストラクチャーと呼ぶ。 ifは他のプログラミング言語と同じ。else ifはelsif。 caseは下のとおり。式の結果が選択肢に一致したらそのステートメント群を実行する。式の結果として…

バリアブルとバリアブルアサインメントと

pp.17-18 これまで使ってきたシグナルは、プロセス同士でやりとりするための一種のデータオブジェクトであった。バリアブルのほうはもっと単純である。バリアブルはアサインされた途端に更新される。バリアブルは、プロセス内またはサブプログラム内でしか宣…

シーケンシャルステートメント

pp.16-17 シーケンシャルステートメントはプロセス内かサブプログラム内かいずれかにしか記述できない。またプロセス内部でシグナルに値をアサインしても、そのシグナルの値はすぐには更新されない。プロセス内部でシグナルの値を読み取っても、そのシグナル…

generateステートメント

p.15 複数のコンカレントステートメントから成るグループをコピーする。if-generate、for-generateという2つの形式がある。for-generateは、複数のコンポーネントから成る排列を実体化するのに使える。 こうすれば加算器が8個生成される。インデックスは普通…

コンポーネント実体化ステートメント

p.15 モジュールの内部に別のモジュールを実体化する。階層構造、モジュール構造にできる。 bcd_to_7segという名前のモジュールがすでにあるとして、それをslow_counterモジュールのアーキテクチャーの内部に実体化するときは、たとえば下のステートメントを…

アサインメントステートメント

p.14 3種類ある。 これがシンプルアサインメント(同じ式を毎回評価してその結果をアサインする): target <= value; これがコンディショナルアサインメント(条件が真であったらそのときの値をアサインする): target <= value_1 when condition_1 else value_2…

プロセスステートメント、センシティビティリスト

pp.12-14 何らかの条件に合致したときに実行するシーケンシャル領域はプロセスステートメントで定義する。プロセスの内部にはシーケンシャルステートメントしか使えない。ただしプロセス自体はコンカレントステートメントであるため、すべてのプロセスは並列…