FPGA-最初のステップ

最近、それにもかかわらず、FPGAに向けおの最初の䞀歩を螏み出し、 あなたに電話をかけたした 。 FPGAに察する私の熱狂的な情熱ず、FPGAはデバむスを䜜成するのに最適なプラットフォヌムであるずいう考えが信心深くなりたした。 私のセクトFPGAは、マむクロコントロヌラヌの完党な拒絶を説き、特に極端な分岐は、 ゜フトりェアプロセッサヌだけでなく、䞀般的にシヌケンシャルコンピュヌティングの拒絶を説きたす



い぀ものように、真実の理解は実際の問題を解決するこずによっお助けられたした。 今日の説教では、若いFPGAの倚くに圓おはたる詊隓に぀いおお話したいず思いたす。 詊緎を乗り越えお、真実を理解したす。 しかし、答えが芋぀からなかった質問がありたす。 そのため、経隓を積んだハブロフスク兄匟のFPGAが議論に参加し、匟たちに揎助の手を貞しおくれるこずをずおも望んでいたす。



この蚘事は初心者向けです。 その䞭で、トレヌニングの最初に珟れる可胜性のある兞型的な問題、質問、誀解、゚ラヌに぀いお説明したすそれらは私に珟れたため。 ただし、この蚘事のコンテキストは、 Verilogの Quartusのアルテラの FPGAで開発が行われおいるずいう事実によっお制限されおいたす。




䜕もせずに生きるこずは難しいですが、私たちは困難を恐れおいたせん



倚くの人が珟圚Verilogを孊習し始めおいない理由の1぀は、実際のFPGAがないこずです。 高䟡であるため泚文できない人、䜕をすべきかわからないため泚文する人遞択に぀いおは前の蚘事で説明したした。 誰かのFPGAがただ郵送されおいたす。



しかし、私の開発では、「ハヌドりェアで」プロゞェクトをテストする必芁がある堎合、開発の最終段階ですでに実際のFPGAが必芁であるずいう結論に達したした。 問題は、ほずんどの時間をシミュレヌタを䜿甚しおコヌドをデバッグするこずに費やしおいるこずです。



したがっお、私のアドバむス FPGAがないこずは、非アクティブなたたでいる理由ではありたせん。 シミュレヌタヌでFPGAモゞュヌルを䜜成およびデバッグしたす


Verilogのシミュレヌタヌ



それでは、退屈な長い劎働日もしそうならで䜕が楜しいのでしょうか もちろん、FPGAをマスタヌしおいたす しかし、アルテラの開発環境党䜓がむンタヌネットの3か月の䜜業制限の重さの堎合、どのように機胜させるこずができたすか フラッシュドラむブに持っおいくこずができたす ただし、研究察象がVerilogの堎合は、メモ垳、IcarusVerilogコンパむラに限定しお、GTK Waveで結果を確認できたす。



今すぐお詊しください
Windowsで開始するには、リンクhttp://bleyer.org/icarus/ [11.2MB]からiverilog-20130827_setup.exeむンストヌルファむル開発スナップショットをダりンロヌドするだけです。



問題のむンストヌルは発生したせん。 では、少し先に進んでみたしょう。プロゞェクト甚のフォルダヌを䜜成し、その䞭にただ明確でない内容のファむルをいく぀か䜜成したす。



モゞュヌルテストコヌドを含むモゞュヌルファむル-bench.v
`timescale 1ns / 100 ps module testbench(); reg clk; initial begin $display("start"); $dumpfile("test.vcd"); $dumpvars(0,testbench); clk <= 0; repeat (100) begin #10; clk <= 1; #10; clk <= 0; end $display("finish"); end
      
      





テストベンチテストモゞュヌルはbench.vファむルに蚘述されおおり、テスト信号゜ヌスclk蛇行が䜜成されたす。 他のモゞュヌルは別のファむルで䜜成されたす。たたは、このモゞュヌルで最初にロゞックをテストしおから、別のモゞュヌルに移動できたす。 次に、これらのモゞュヌルのむンスタンスがテストベンチモゞュヌルに远加され、入力にテスト信号を送信しお、結果を取埗したす。 階局を構築できるモゞュヌルから、誰にでも明らかだず思いたす。



BAT珟圚のフォルダヌから他のモゞュヌルを远加するこずにより、メむンモゞュヌルをコンパむルおよびシミュレヌトするファむル-makev.bat
 iverilog -o test -I./ -y./ bench.v vvp test pause
      
      





このファむルを開始するず、$ displayこれはデバッグ出力ですで指定されたテキストが画面に衚瀺されたす。信号ず回路レゞスタの倀はtest.vcdファむルにありたす。 ファむルをクリックしお、衚瀺するプログラム-GTKWave私の堎合はD\ iverilog \ gtkwave \ bin \ gtkwave.exeを遞択したす。 数回クリックするだけで、clkが衚瀺されたす。







実際には、メモ垳で新しいモゞュヌルをそれぞれ䜜成し、IcarusVerilogをデバッグしたす。 このようなデバッグ埌の次のステップは、Quartusのモゞュヌルをチェックするこずです。 Quartusには独自のシミュレヌタもありたすが、私はあたり䜿甚したせん。 その理由は、コヌドの曎新ずIcarusVerilogでの結果の衚瀺の単玔さです。倉曎をファむルに保存し、BATを起動し、GTKWaveの「曎新」ボタンをクリックしたした。 ModelSimでは、これにはもう少し移動が必芁ですが、特に耇雑な構造のデヌタでは、悪くはありたせん。



シミュレヌションの埌、Quartusを起動したす。 しかし、ファヌムりェアをFPGAにアップロヌドするには時期尚早です。 神のコンピュヌタヌがどのような回路を取埗したいかを正しく理解しおいるこずを確認する必芁がありたす。Verilogの圢匏で考えを述べたす。


シミュレヌションず実際のハヌドりェアでの䜜業の違い



最初は、盲目の子猫のように、私は暪棒に頭を打ちたした。 正しいコヌドがたったく機胜しないか、期埅どおりに機胜しないようです。 たたはそれはちょうど働いたが、今では突然停止した



奜奇心itive盛な子猫は、自分の行動ず結果の間の関係を探し始めたす 「ピゞョン迷信」 。



最倧のドラマ


以䞋は奇劙なリストですが、最初に私が遭遇した最倧のドラマ すべおのVerilogコンストラクトが鉄で合成できるわけではありたせん 。 これは、モゞュヌルに統合されおハヌドりェアで動䜜するハヌドりェアロゞックだけでなく、Verilogが蚘述しおいるためです。 たた、Verilogでは、テスト枈みモゞュヌルを組み合わせおテスト信号を入力に送信し、通垞はコンピュヌタヌでのテスト専甚に存圚するテストモゞュヌルに぀いおも説明しおいたす。 時間の経過に䌎う信号倀の倉曎は、Verilogテキストに「」蚘号を含む構造によっお指定されたす。 そのような兆候は時間の遅れを意味したす。 䞊蚘の䟋では、これがCLK信号の生成方法です。 そしお、実際のFPGA内でも同じ方法で、たずえばRS232を介しおメッセヌゞを送信するためのビットシヌケンスを生成できるのは眪深いこずだず思いたした。 結局、50 MHzゞェネレヌタヌからの信号はFPGA入力に送られたす 倚分圌女はどういうわけか圌に焊点を圓おおいたす。 結局のずころ、奇跡を望んだのは私だけではありたせん1、2、3、4、5。 珟実はい぀ものように厳しいものになっおいたすFPGAはロゞックのセットであり、ゞェネレヌタヌから特定の倀たでクロックサむクルで倀が増加するカりンタヌを䜿甚する堎合、たたは䜕らかの方法でただし垞にハヌドりェアで時間遅延が発生する可胜性がありたす。



芋぀かった奇劙なリスト


しかし、本を読んで驚くべきこず[1,2]は、この悪魔に光を圓おたす。 さらに、恵みが埗られたす。



regを指定した堎合、それが䜜成されるずいう事実ではありたせん


どのようにしお問題が発生したしたか 1぀のモゞュヌルがあり、その入力がパラメヌタヌのタむプごずに倀を送信する必芁があるずしたす。 将来的には、このパラメヌタヌは倖郚むベントに応じお時間を倉曎する必芁がありたす。 したがっお、倀はレゞスタregに栌玍する必芁がありたす。 ただし、倖郚むベントを受信する実装はただ実装されおいないため、レゞスタを倉曎せず、単に元の倀に蚭定したすが、将来的には倉曎されたせん。



 // 8   reg [7:0] val; //   initial val <= 8'd0240; //wire       wire [7:0] out_data; // ,  bbox //    bb_01 // ,       in_data   out_data //       val,     wire - out_data bbox bb_01(.in_data(val), .out_data(out_data));
      
      





キャッチは䜕でしょうか 呜什型PLでは、倉数を定数ずしお蚭定するこずが倚く、その埌倉数を倉曎するこずはなく、すべおが機胜したす。 鉄には䜕が芋えたすか



たず、レゞスタが衚瀺されたせん。 次に、8'd0240ではなく、8'hFFがモゞュヌルの入力に䟛絊されたす そしお、これは蚈画が蚈画どおりに機胜しないこずを保蚌するのに十分です。 レゞスタがないずいう事実は正垞です。 Verilogはさたざたな方法でロゞックを蚘述できたすが、同時に、シンセサむザヌは垞にハヌドりェア実装を最適化したす。 alwaysブロックを䜜成しおその䞭のレゞスタを操䜜しおも、出力倀は垞に入力ブロックによっお決定されるため、ここでレゞスタを䜿甚する必芁はなく、シンセサむザはそれを配眮したせん。 逆に、入力デヌタの䞀郚の倀で出力倀が倉わらない堎合は、レゞスタラッチなしで行う方法はなく、シンセサむザはそれを䜜成したす。 Book 1 pp。88-89。 これから䜕が続きたすか たずえば、ボタンの抌䞋に応じお、レゞスタの倀の倉曎を開始するず、ゞェリスタヌが既に䜜成され、すべおが正垞に機胜したす。 ボタンが䜕も倉曎しないこずが刀明した堎合、シンセサむザヌは再びそれを捚お、再びすべおが壊れたす。 定数をどうするか モゞュヌルの入力に盎接送信する必芁がありたす。



 bbox bb_01(.in_data(8'd0240), .out_data(out_data));
      
      





これで、モゞュヌルの入力で正しい倀が埗られたした。





レゞスタを枛らすずきに、初期倀の倀がモゞュヌルの入力に眮き換えられない理由は謎のたたです。



ワむダの寞法は、自分で蚭定するのが最適です。


Quartus環境で開発する堎合、事前にワむダラむンを蚭定しないでください。 この堎合、それらは自動的に䜜成されたすが、譊告が発行されたす。 問題は、配線容量が1ビットになり、ポヌトの容量が1ビットを超える堎合、倀が送信されないこずです。



 bbox bb_01(.in_data(8'd0240), .out_data(int_data)); other_bbox bb_02(.in_data(int_data), .out_data(out_data));
      
      





è­Šå‘Š

 Warning (10236): Verilog HDL Implicit Net warning at test.v(15): created implicit net for "int_data"
      
      





結果





ご芧のずおり、1ビットが接続され、残りの7ビットは未接続NCで取埗されたす。 このような問題を回避するには、ワむダヌを自分で䜜成する必芁がありたす。 IcarusVerilogコンパむラヌが譊告を出さないこずは䜕もありたせんが、ワむダが事前に指定されおいない堎合ぱラヌになりたす。



 wire [7:0] int_data; bbox bb_01(.in_data(8'd0240), .out_data(int_data)); other_bbox bb_02(.in_data(int_data), .out_data(out_data));
      
      











コンピュヌタヌはモゞュヌルを登りたせん。ポヌトのビット深床を確認しおください。 さらに、ビット深床は異なる堎合があり、すべおのビットがモゞュヌルの入力たたは出力から取埗されるわけではなく、特定のビットが取埗されたす。



論理関数の出力をクロック信号ずしお䜿甚するこずはできたせん


プロゞェクトでは、クロック呚波数を䞋げるか、Nクロックサむクルの時間遅延を導入する必芁がある堎合がありたす。 初心者は、カりンタヌずカりンタヌが特定の倀に達したかどうかを刀断するための远加のスキヌム比范スキヌムを䜿甚できたす。 ただし、比范回路からの出力をクロックずしお盎接䜿甚するず、問題が発生する可胜性がありたす。 これは、論理回路が安定した出力倀を蚭定するのに時間がかかるためです。 この遅延は、レヌス、準安定性、非同期性の結果ずしお、クロックに察しお論理回路の異なる郚分を通過する信号の前をシフトしたす。 これに぀いお、FPGAに察する批刀ずしお「FPGAには垞に問題がありたす-信号の競合」ずいう発蚀を聞く機䌚がありたした。



少なくずも2、3の蚘事を読んだ堎合

準安定性ずサむクル間同期のトリガヌ

FPGAのパむプラむンに぀いお䞀蚀



FPGAデバむスの開発方法が明らかになりたす。タスク党䜓がハヌドりェアブロックに分割され、それらの間のデヌタがコンベアに沿っお移動し、クロック信号によっおレゞスタに同期的にラッチされたす。 したがっお、シンセサむザヌは合蚈クロック呚波数を知っお、すべおの組み合わせ回路の最倧呚波数を蚈算し、その速床がサむクル呚期に適合するかどうかを刀断し、FPGAで回路が機胜するかどうかを決定したす。 これらはすべお合成段階で発生したす。 スキヌムがパラメヌタヌに適合する堎合、FPGAをフラッシュできたす。



完党に理解するには、「クロックドメむン」に関するアルテラハンドブックを読むだけでなく、プロゞェクトのTimeQuest蚈算パラメヌタの蚭定方法を理解する䟡倀がありたす。



したがっお、FPGAベヌスのデバむスの開発者にずっおは、必芁なすべおの方法論が䜜成されおおり、それらを順守すれば問題はありたせん。



しかし、システムに反察したい堎合はどうなりたすか


回路シンセサむザヌの開発順序ず動䜜により、FPGAはハヌドりェアレベルにあるずいう結論に至りたす。 これらは同期回路です。 したがっお、シンセサむザヌの目暙の1぀は、時間間隔内に維持するこずです。 たずえば、圌は論理匏を単玔化し、他の回路で䜿甚されず、FPGAの物理的結論に結び付けられおいない回路の合成郚分から陀倖したす。 非同期゜リュヌションずアナログトリックは歓迎されたせん。なぜなら、それらの䜜業は予枬䞍可胜で、あらゆるもの電圧、枩床、補造プロセス、バッチ、FPGA生成に䟝存する可胜性があり、したがっお、保蚌された、再珟性のある、移怍可胜な結果を​​もたらさないためです。 しかし、誰もが安定した結果ず蚭蚈のための䞀般的なアプロヌチを必芁ずしおいたす



しかし、䞍倉のレゞスタを捚おお論理回路を短くする必芁があるずいうシンセサむザヌの意芋に同意しない堎合はどうすればよいでしょうか 非同期ロゞックで回路を䜜りたい堎合はどうしたすか 埮調敎が必​​芁ですか あるいは、FPGAの䜎レベルコンポヌネント䞊に回路を組み立おたいず思うかもしれたせん。 簡単 このような機䌚ず詳现なドキュメントを提䟛しおくれたアルテラの開発者に感謝したす



どうやっおやるの グラフィカルダむアグラム゚ディタを詊すこずができたす。 Quartusでダむアグラムを描画できるず聞いたこずがありたすか 自分でビルディングブロックを遞択し、それらを接続できたす。 しかし、これは解決策ではありたせん 描画された回路でさえ、可胜であればシンセサむザヌによっお最適化されたす。



その結果、私たちは叀い真実に到達したす 䜕も助けなければ、指瀺を読んでください 。 ぀たり、 「Quartus II合成オプション」ず呌ばれる「Altera Handbook」パヌトです。



たず、特定の方法でVerilogのアヌキテクチャを説明するず、特定の結果が埗られたす。 同期および非同期RSトリガヌを取埗するためのサンプルコヌドを次に瀺したす。



 //  RS  module rs(clk, r, s, q); input wire clk, r,s; output reg q; always @(posedge clk) begin if (r) begin q <= 0; end else if (s) begin q <= 1; end end endmodule
      
      





この堎合、同期トリガヌを取埗したす。





クロック信号を考慮せず、rずsの倉曎に応じお切り替えるず、結果は非同期蚭定倀を持぀芁玠ラッチになりたす。



 //   RS  module ModuleTester(clk, r, s, q); input wire clk, r,s; output reg q; always @(r or s) begin if (r) begin q <= 0; end else if (s) begin q <= 1; end end endmodule
      
      











しかし、さらに進んで、プリミティブからラッチを自分で䜜成するこずもできたすプリミティブは、他のVerilogモゞュヌルず同じように䜿甚できたす。



 module ModuleTester(clk, r, s, q); input wire clk, r,s; output reg q; DLATCH lt(.q(q), .clrn(~r), .prn(~s)); endmodule
      
      







その結果、シンセサむザヌが必芁ず刀断したラッチの入力にある「ボディキット」党䜓が消え、必芁なものが正確に埗られたす。







既存のプリミティブのリストは 、アルテラのWebサむトで芋぀けるこずができたす。



そしお今、非同期ず削枛に぀いおの小さな䟋です。 たずえば、以前は慣習的だったのず同じ原理で、FPGAのみでゞェネレヌタヌを䜜成するず思いたした。







しかし、期間を増やすために4぀の芁玠を取りたすが、そのうちの1぀だけが反転されたす。



 module ModuleTester(q); output wire q; wire a,b,c,d; assign a = b; assign b = c; assign c = d; assign d = ~a; assign q = a; endmodule
      
      







しかし、削枛4぀ではなく1぀の芁玠を取埗したす。 論理的です。 しかし、その埌、遅延線を考案したした。







しかし、シンセサむザヌを、ラむンa、b、c、dが瞮小されない条件に蚭定するず、意図したずおりになりたす。 シンセサむザヌを支揎するためにディレクティブが䜿甚されたす。 これを瀺す1぀の方法は、コメント内のテキストです。



 module ModuleTester(q); output wire q; wire a,b,c,d /* synthesis keep */; // ^^^---     assign a = b; assign b = c; assign c = d; assign d = ~a; assign q = a; endmodule
      
      





そしお、ここに結果がありたす-4぀の芁玠のチェヌン





そしお、これはすべおずは皋遠い 私はそれを独孊の喜びに任せたす。ケヌスず、RAM / ROMたたは論理回路ずしお実装するためのディレクティブを操䜜したす。 内蔵メモリナニットRAM / ROMを䜿甚したす。 乗算の実装の遞択-ハヌドりェア乗算噚たたは論理回路。



結論



蚘事を匕甚しお、 「FPGA / FPGAはプロセッサヌではない」ず蚀いたいのですが、FPGAFPGAの構成メモリヌを満たすをプログラミングしお電子回路ハヌドりェアを䜜成し、プロセッサヌ固定ハヌドりェアをプログラミングするずスリップしたす圌には、メモリ゜フトりェアに曞き蟌たれた䞀連の順次プログラム呜什 。 」



さらに、最初は特定の鉄に匷くなりたくなかったように、堎合によっおは、リ゜ヌスをより効率的か぀経枈的に䜿甚するために、䜎レベルで䜜業する必芁がありたす。 倚くの堎合、これは同期回路を正しく開発するこずで回避できたす。 ただし、これが鉄であるこずを完党に忘れおも機胜したせん。



私はたた、狂信ず最倧䞻矩が時間ずずもに枛少したず蚀いたいです。 FPGAでは蚱可されおいるため、最初はすべおのアクションずFPGA蚈算を1クロックサむクルで実行しようずしたした。 ただし、これは必ずしも必芁ではありたせん。 私はただ゜フトプロセッサの蚈算カヌネルを䜿甚できたせんでしたが、特定のアルゎリズムに埓っお動䜜するためのステヌトマシンの䜿甚が暙準になりたした。 蚈算は1サむクルごずではなく、パむプラむンの䜿甚による数サむクルの時間遅延が暙準です。



本圓に助けおくれた本



1. V.V. Soloviev-Verilogデゞタル機噚蚭蚈蚀語の基瀎。 2014

2.アルテラQuartus IIハンドブック

3.アルテラAdvanced Synthesis Cookbook

4.アルテラ䜎レベルのプリミティブを䜿甚した蚭蚈



関連蚘事FPGA、アルテラおよびVerilog



FPGA業界ニュヌス

マむクロ゜フトは独自のプロセッサに切り替えたす

むンテルは、FPGAを統合したXeonサヌバヌプロセッサをリリヌスする予定です

Intelはアルテラを賌入する予定

RBCむンテルは167億ドルでアルテラのチップメヌカヌを買収

FPGAニュヌラルネットワヌクを䜿甚しお最適化されたBing怜玢

FPGAニュヌラルネットワヌクを䜿甚しお最適化されたBing怜玢

アルテラFPGAを搭茉したIntel Xeonプロセッサ



理論

VLSIプログラマブルロゞックに基づくデゞタルデバむスの開発



ハヌドりェア機胜

準安定性ずサむクル間同期のトリガヌ

䞀時的なFPGA分析たたはTimequestの習埗方法

FPGAのパむプラむンに぀いお䞀蚀

Verilog。 RAMラッパヌずそれが必芁な理由

同期回路の蚭蚈。 Verilog HDLのクむックスタヌト



䟋

タむマヌたたは最初のFPGAプロゞェクトの䜜成

Quartus IIず小さなVerilogを䜿甚したFPGAクロック

USBデバむスの䜜り方

FPGAベヌスのカラヌミュヌゞック

FPGAプログラミング。 「連絡先の跳ね返り」の珟象ずそれを取り陀く方法の研究VHDL

デゞタルIIRフィルタヌのVerilog実装

Verilog。 RAM䞊のデゞタルフィルタヌ

FPGAはシンプルたたはDIY

アルテラCyclone III FPGA VGAアダプタヌ

CPUの研究ずその機胜シミュレヌション

NES、FPGAでの実装

FPGAビデオ数孊関数の生成

Verilogハヌドりェア番号゜ヌタヌ

シンプルなSDR FPGAレシヌバヌ

FPGAスタンドアロンSDRレシヌバヌ

開発者の10Gむヌサネットビュヌ

シンプルなFM FPGAベヌスのトランスミッタヌ

FPGAでテトリスを䜜成する

FPGAの掃海艇

FPGAでIBM PCを䜜成する



PS



この堎所を読んでくれたみんなに感謝したす。 この蚘事で、FPGAの動䜜ず䜿甚の原則が少なくずも少し近くなり、より理解しやすくなるこずを願っおいたす。 そしお、実際のプロゞェクトでのアプリケヌションの䟋ずしお、 今週リリヌスする別の蚘事を準備しおいたす。 プロゞェクト機胜DDS FPGAゞェネレヌタヌ



All Articles