トピックからの小さな余談...
まず、好奇心から、この記事の執筆時点でのHabrovsky統計を見てみましょう。 キーワードjava、c ++、python、verilog、vhdlを使用して検索しています。
java:1581トピック。
C ++:598トピック;
python:995トピック
そして
Verilog:6トピック
VHDL:5つのトピック(ちなみに、これらはVerilogが言及されているのと同じ記事です)。
ハブラトピックの作家の利益には明らかに不均衡があります。 わが国で最も一般的なのは、まだ「クリーン」なプログラミングのようです。 超小型回路を作成するためのプログラミング言語は、私たちとはまったく関係ありません。
特にHabrに関する今日の記事「回路の独立研究。 基本的な概念。 パート1」(ここではhabrahabr.ru/blogs/arbeit/91922 )。 正直なところ、人々が回路を勉強すると同時に、回路の現代の記述言語に言及しないとは思いません...
なぜそうですか? 2つの仮定ができます。 広大な国のハードウェア開発者は一般的にHabrを読まない(これは疑わしい)か、残念ながら私たちのマイクロエレクトロニクスは永遠に死んでしまった。
もちろん、あなたはうめき声をあげることができます:「死んだので、死んだ」...または、あなたは何かをしようとすることができます。
実際、現在、CPLDおよびFPGAのマイクロ回路を使用して、マイクロ回路の開発を実際に「ひざまずき」で実行できます。 プロジェクトが「成功」した場合、後でeAsicに、または(投資家がいる場合は)実際のASICに切り替えることもできます...
また、工場を持つ必要さえありません-誰もがARMファブレスの例を知っています。 成功したプロセッサ設計は特許を取得しており、サードパーティ企業によって自社製品に既に複製されています。
開始する必要があるのは、ニーズと手頃な価格に応じて開発者キット(Developer Kit)を選択することだけです。 幸いなことに、わが国で開発委員会を取得することは問題ではありません。 たとえば、ウェブサイトwww.altera.ruのETF会社は、アルテラ、テラシック、LDM-Systemsなどの複数のメーカーから実験用のボードを購入することを提案しています。 もちろん、リストには7000ドルのモンスターがいますが、150ドルの安価なカードもあります。 これが高価な場合、手始めに、火星探査機のような非常にシンプルなボードを推奨できます( http://www.marsohod.org-ところで、ロシアのオープンソース開発)-これは約1000ルーブルです。
初期調査用のソフトウェア開発環境は完全に無料です。たとえば、アルテラQuartusII Web Editionなどです。
さて、まだトピックに戻ります。
グラフィックエディターでスキームが描かれた時代は過ぎ去りました。 実際のプログラミング言語が電子回路の論理を記述する時が来ました。
Verilog言語は非常にエレガントで、余分な記述を必要とせず、Cにやや似ています。
小さな例を示し、最も重要なこととして、コードと結果として生じるネットリストスキームの関連付けを示したいと思います。 それは私にとって非常に重要なようです。 現代のプログラマは、仮想メモリとプロセッサの能力によって非常に「破損」しています。 超小型回路のプログラミングを行う場合、「チップの内部」で実際にどのようになるかを理解することが重要です。 プログラム内の追加コードはそれぞれ、プロジェクト内の追加トリガーとロジック要素でラップされます。 最終的には、これらすべてが速度、結晶サイズ、消費電力に影響します。
ここでは、言語の構文については説明しません。Verilogに興味があり、自分で本を見つけてくれる人です。 ここの人々は読み書きができ、さまざまな言語で訓練されています。 連想的な認識を期待しています。 注意すべき唯一のことは、組み合わせロジックとは何か、レジスタと同期プロセスとは何かを明確に理解する必要があるということです。
組み合わせロジックは、入力データ、信号の単なる論理関数です。 入力信号の1つが変更されると、関数全体が直ちに変更(再カウント)されます。 実際の状況では、もちろん応答は少し遅れています。
さて、たとえば、32ビットPCIバスのパリティ信号を計算する機能。 32のすべての入力AD / ADデータライン[31:0]および4つのCBE信号[3:0]からXORを計算する必要があります。 回路を描画する場合は、35個の2入力XOR論理要素を描画し、ワイヤで接続するだけです。
Verilogでは、パリティビットを計算するための小さなモジュールを作成できます。
次のようになります。
モジュールpci_parity(
入力ワイヤ[31:0]広告、
入力線[3:0] cbe、
出力regパリティ
);
常に@ *
始める
パリティ= ad [0] ^ ad [1] ^ ad [2] ^ ad [3] ^
広告[4] ^広告[5] ^広告[6] ^広告[7] ^
広告[8] ^広告[9] ^広告[10] ^広告[11] ^
広告[12] ^広告[13] ^広告[14] ^広告[15] ^
広告[16] ^広告[17] ^広告[18] ^広告[19] ^
広告[20] ^広告[21] ^広告[22] ^広告[23] ^
広告[24] ^広告[25] ^広告[26] ^広告[27] ^
広告[28] ^広告[29] ^広告[30] ^広告[31] ^
cbe [0] ^ cbe [1] ^ cbe [2] ^ cbe [3];
終わり
終了モジュール
このコードでは、 常に@ *の組み合わせに特別な注意を払う必要があります-これは、入力信号が変化したときに出力信号が常に「再カウント」されることを意味します。
さらに簡潔に、同じことを次のように書くことができます。
モジュールpci_parity(
入力ワイヤ[31:0]広告、
入力線[3:0] cbe、
出力線パリティ
);
パリティを割り当てる=(^ ad)^(^ cbe);
終了モジュール
ここでは、単項演算子「^」が縮約として使用されます。つまり、ベクトルad [31:0]のすべてのビット間のXORだけです。
チップでコンパイルした後に得られたものを見る方法は? アルテラQuartusIIを使用しています。 コンパイル後、RTLViewerプログラム(これはQuartusII環境の一部です)を実行し、コンパイラーによる最適化後に結果の「回路」を確認できます。
どちらのpci_parityコード例でも、結果は同じです。
まったく異なるものは、同期回路とトリガーです。 トリガーは、セルを格納するメモリ要素です。 クロック信号のエッジ(通常はエッジが使用されます)には、トリガーデータの入力値が格納されます。 トリガーには、有効化および無効化のための追加の入力がある場合があります。
Verilogで簡単なカウンターを作成します。
モジュールmy_counter
(
入力ワイヤclk、
出力reg [3:0]カウンター
);
常に@(ポーズgek)
始める
カウンター<=カウンター+ 1;
終わり
終了モジュール
常に行@(posedge clk)に注意してください-この行は、プロセスが同期的であり、シグナルフロントclkに関連付けられていることを示しています。 QuartusIIを使用して再度コンパイルし、RTLViewerで取得した結果を確認します。
実際には、結果として生じる回路は、加算器の組み合わせ機能と、クロック信号によってカウンターの値を保存するトリガーで構成されていることがわかります。
モジュールを次のように少し変更しましょう。
モジュールmy_counter
(
入力ワイヤのリセット、
入力ワイヤclk、
出力reg [3:0]カウンター
);
常に@(posedge clkまたはposedge reset)
始める
if(リセット)
カウンター<= 0;
他に
カウンター<=カウンター+ 1;
終わり
終了モジュール
モジュールに非同期リセット入力を追加し、「常に@」ルールを変更しました。
繰り返しますが、結果のRTLをコンパイルして監視します。
約束したとおり、リセット入力はトリガーの非同期リセットです。
実験を続けます。 たとえば、10進数のカウンターを作成しましょう。
モジュールmy_counter
(
入力ワイヤのリセット、
入力ワイヤclk、
出力reg [3:0]カウンター
);
常に@(posedge clkまたはposedge reset)
始める
if(リセット)
カウンター<= 0;
他に
始める
if(カウンター== 9)
カウンター<= 0;
他に
カウンター<=カウンター+ 1;
終わり
終わり
終了モジュール
プログラムモジュールの2番目のifは、マルチプレクサを制御して、レジスタにゼロまたは次のカウンタ値をロードします。
コンパイル後の結果を確認します。
実際、マルチプレクサに「変わった」 場合 。
まあ、このようなもの。
Verilogは簡単に記述でき、モデル化も簡単です。 最新の設計ツールは、回路の研究を本当に手頃な価格にします。 幅広い開発ボードが存在するため、ハードウェアでプロジェクトを簡単に試すことができます。