マむクロコントロヌラヌプログラマヌ向けのVerilog蚀語を遞ぶ理由

画像

䜕回か私はこの蚘事を曞き始め、それを投げたした。 圌がそれを投げたのは、私にはその話題が幟分物議を醞しおいるようだからです。 私が発明した自転車は、䞀郚の人にずっおずんでもない、ずんでもないように芋え、䞀般的には完党に正しいずは限りたせん。 しかし...

䞀般に、電子デバむスの開発の分野には、いわばわずかに重なり合った䞖界がいく぀かあるように思えたす。 たずえば、マむクロコントロヌラに基づいたデバむスの開発があり、䞊行しお、FPGAに基づいたデバむスの開発がありたす。 これらの超小型回路の動䜜原理は根本的に異なり、原理ず開発方法、䜿甚されるプログラミングおよびデバッグ蚀語はたったく同じです。 もちろん、元玠ベヌスの遞択はタスクに倧きく䟝存したす。 ただし、これらの䞖界、マむクロコントロヌラヌの䞖界、およびFPGAの䞖界がほずんど重耇しないこずは既に明らかです。 テクノロゞヌの接点に䜕かあるのでしょうか

䞀般的に、私自身はFPGAを奜み、FPGAブログにも参加しおいたすが、最近、圓瀟はSTM32マむクロコントロヌラヌに基づいたデバむスの開発を始めたした。 実際、私たちが出䌚った䞻な問題は完党に技術的なものではなく、組織的なものでした。

事実、デバむスの開発に関する契玄が締結されおいるにもかかわらず、デバむスの技術仕様が倚少調敎されおいるにもかかわらず、顧客が毎週新しいアむデア、芁件、考え、垌望を思い぀いたこずがありたす。 もちろん、私たちは圌らを地獄に送るこずはできたしたが、私たちは我慢しお、プロゞェクトを実行するこずに決めたした。

䞻な組織䞊の問題-コントロヌラヌ制埡アルゎリズムを倉曎するための芁求が倚くあり、それらはしばしば非垞に矛盟しおいたした。 さらに、顧客自身がそれがどのように機胜するかが分からず、どのようにすべおをチェックするかも理解しおいたせんでした。 そう蚀う方が正確です。 ナニットに特定のコントロヌラヌを持ちたいマネヌゞャヌがいたす。 コントロヌラヌずナニットに必芁な特定の機胜、マネヌゞャヌ自身は正確に知らず、芁件はデバむスの操䜜性をチェックするこずになっおいる1人の゚ンゞニアが策定しなければなりたせんでした。 電子デバむスの経隓がないため、゚ンゞニアにはコントロヌラの操䜜性を確認する独自の方法がありたせん。

以䞋に䟋を瀺したす。 スタンバむモヌドでは、コントロヌラヌが単に[スタヌト]ボタンが抌されるのを埅぀堎合、コントロヌラヌは1日に1回、10秒間液䜓をポンピングするポンプをオンにする必芁がありたす。 これは、ポンプ腺の腐食に察する䞀皮の保護です。 私が尋ねるずき; 「この機胜をどのようにチェックしたすか」-圌らは「ノヌりェむ」ず答えたす。 個人的に、私はショックを受けおいたす。 もちろん、「゚ラヌなしで」プログラムを䜜成しようずしたすが、受信偎は䜕らかの圢で責任を共有し、テストを実斜する必芁があるず思いたす。

次に、問題の技術面に進みたす。

䜕らかの皮類のマむクロコントロヌラヌ゜フトりェアテストが必芁であるず刀断したした。

通垞、゜フトりェアの䞖界では、単䜓テストずいう抂念がありたす。 そしお原則ずしお、この手法はマむクロコントロヌラヌプログラムにある皋床適しおいたす。 珟圚、マむクロコントロヌラヌ甚のプログラムは通垞のC蚀語で曞かれおいるこずが倚いため、単䜓テスト党般に問題はないはずです。 しかし...すべおがマむクロコントロヌラヌの単䜓テストで簡単にチェックできるわけではありたせん。

タむマヌ、DMAチャネル、シリアルポヌト、割り蟌みなど、内郚ハヌドりェアデバむスのプログラミングに関連するすべおのもの-これには問題がありたす。 ここで、デバッグのために、オシロスコヌプを䜿甚しお、入力ず出力で受信されるマむクロコントロヌラヌの信号を確認したす。 䞀般に、割り蟌み凊理にかかる時間を枬定するこずは䞍芁なタスクではありたせん。 そしお、そうです。

単䜓テストにはもう1぀埮劙な違いがありたす。 ゜フトりェアの埓来の単䜓テストはデヌタ指向であるように思えたす。 ぀たり、通垞、単䜓テストプログラムは、チェック察象の関数の入力にさたざたな予想デヌタを配信し、凊理された出力デヌタが芁件を満たしおいるかどうかをチェックしたす。 それだけです

入力信号プロセッサずしお機胜する電子デバむスの堎合、「時間の流れ」の抂念は基本的に重芁です。 ぀たり、通垞、芁件は次のずおりです。緊急事態が発生し、アラヌムセンサヌAがトリガヌされた堎合、アクチュ゚ヌタヌB 、 CをN1秒間隔で順番にオフにし、 N2秒以内でN3秒以内にDデバむスをオフにしたす。

゜フトりェア制埡アルゎリズムをテストするには、時間の経過を考慮しお䜕らかの信号シミュレヌタヌを䜿甚するのが良いこずは明らかです。 そしお、そのようなツヌルは、FPGAシステム開発者にずっおの歊噚です。

FPGAベヌスの電子デバむスの開発者は通垞、VerilogたたはVHDLハヌドりェア蚘述蚀語を䜿甚したす。 同時に、FPGAのコヌドに加えお、いわゆるテストベンチが䜜成されたす。これは、通垞のCプログラマの単䜓テストのようなものです。

Verilog HDLを䜿甚しおいたす。
テストベンチプログラムはプログラマヌ自身が䜜成し、同時にFPGAチップで考えられるすべおの入力効果をシミュレヌトしようずしたす。 出力信号はテストベンチ自䜓で分析され、予想されるものに埓っおチェックされたす。
同時に、Verilogシミュレヌタヌ自䜓がシステム内の時間の経過を監芖したす。

FPGAプログラマヌが行うこずの簡単で完党に抜象的な䟋を考えおみたしょう。
たずえば、非同期リセットsample.vを䜿甚した単玔なバむナリカりンタヌを蚘述するモゞュヌルは次のずおりです。

module sample( input wire reset, input wire clk, output reg [3:0]cnt ); always @(posedge clk or posedge reset) if(reset) cnt <= 0; else cnt <= cnt + 1; endmodule 


このようなコヌドは、Verilog HDL蚀語を知らないプログラマヌでも理解できるず思いたす。 resetずclkの 2぀の入力がありたす。 たた、出力4ビット信号[30] cntがありたす。 垞にクロック信号の゚ッゞで、カりンタの倀が増加したす。 そしお垞に、ナニットがリセット時に衚瀺されるず、カりンタヌはれロにリセットされたす。

このモゞュヌルは合成されおいたす。぀たり、コンパむルしおFPGAに瞫い蟌む予定です。

珟圚、たずえば、プログラマヌは自分のモゞュヌルの機胜をテストしたいず考えおいたす。 圌は、テスト回路であるVerilogで、マむクロ回路testbench.vの入力信号をシミュレヌトするプログラムを䜜成したす。

 `timescale 1ms / 1 ms module testbench(); reg tb_rst, tb_clk; wire [3:0]value; always #5 tb_clk = ~tb_clk; initial begin $dumpfile("waves.vcd"); $dumpvars(0,testbench); $display("starting testbench!!!!"); tb_rst = 1; tb_clk = 0; #10; tb_rst = 0; #73; tb_rst = 1; #11; tb_rst = 0; #134; tb_rst = 1; #57; tb_rst = 0; #200; $display("finished OK!"); $finish; end sample my_sample_inst( .reset(tb_rst), .clk(tb_clk), .cnt( value ) ); wire fail; assign fail = (tb_rst & value!=0 ); endmodule 


このモゞュヌルは合成されず、コンパむルしおFPGAに瞫い付けるこずはできたせんが、プロゞェクトをシミュレヌトするために必芁です。 行に泚意しおください

 sample my_sample_inst( .reset(tb_rst), .clk(tb_clk), .cnt( value ) ); 


これは、テストベンチに挿入されたサンプルモゞュヌルのテストむンスタンスです。 次のようになりたす。

画像

プロゞェクトの効率性の基準がある可胜性は非垞に高いです。 リセット信号の間、カりンタ出力信号は垞にれロである必芁がありたす。 ぀たり、テストベンチで゚ラヌ信号を特定できたす。

 wire fail; assign fail = (tb_rst & value!=0 ); 


この信号は、プログラムで監芖するこずも、出力タむムチャヌトで目で芋るこずもできたす。

私はよくシンプルな無料のVerilogHDL IcarusVerilogシミュレヌタヌを䜿甚したす。 むンストヌルず操䜜が簡単です。 シミュレヌタヌをコンパむルしお実行したす。

画像

私のテストベンチはプログラムの行に感謝したす$ dumpfile "waves.vcd"; および$ dumpvars0、テストベンチ; wave.vcdタむミングチャヌトファむルを䜜成したす。 たた、これらのタむミングチャヌトは、別の優れた無料のGtkWaveツヌルで衚瀺できたす。

画像

したがっお、FPGAプログラマヌができる最も単玔な方法は、テストベンチをテスト枈みモゞュヌルに曞き蟌み、結果のタむムダむアグラムのファむルを生成し、FPGAから正しい応答が返されるかどうかを調べるこずです。

次に、同様のテスト技術をマむクロコントロヌラヌに適甚する方法を説明したす。

Verilogテストベンチに再床泚意を払うず、$ディスプレむ..などのシステム機胜がいく぀かありたす。

だからここに。 Verilog HDLシミュレヌタヌでは、必芁なシステム関数をC蚀語で自分で远加できるこずがわかりたした。 そしお、C蚀語の堎所があるず、テストベンチのVerilogコヌドがマむクロコントロヌラヌのSyshコヌドず察話できる堎所が衚瀺されたす。

䞀般に、C蚀語ぞのVerilogシミュレヌタむンタヌフェむスは、Verilog手続き型むンタヌフェむスVPIず呌ばれたす。 あなたは圌に぀いお長い間話すこずができたす、これは倧きな別のトピックです。 詳现に぀いおは、たずえばこちらをご芧ください 。

これがどのように䜿甚されるかを暡匏的に説明したいだけです。
マむクロコントロヌラのプロゞェクトは、倚くのファむルで構成できたす。 私たちのタスクは、特定のマむクロコントロヌラヌのハヌドりェア機胜から制埡アルゎリズム自䜓を分離するこずです。

マむクロコントロヌラヌのプロゞェクトがファむルで構成されおいるず仮定したす。

 Main.c Dma.c Serial.c Interrupts.c 
. Algorithm.c 


マむクロコントロヌラヌ入力ラむンからの割り蟌みハンドラヌは、Interrupts.cファむルに蚘述されおいたす。 これらは次のようなものです。

 void EXTI9_5_IRQHandler(void) { Int val; disableGlobalInterrupts(); EXTI_ClearITPendingBit(EXTI_Line6); val = GPIO_ReadInputDataBit(MY_PORT, MY_SIGNAL); Algo_set_value( val ); enableGlobalInterrupts(); } 


マむクロコントロヌラヌの入力ラむン䞊の信号が倉化するず、割り蟌みが発生し、ラむン䞊の倀を読み取り、この倀がAlgo_set_val関数によっお凊理アルゎリズムに送信されたす。 制埡アルゎリズム党䜓は、Algorithm.cファむルに蚘述されおいたす。

Algorithm.cファむルは、マむクロコントロヌラヌのプロゞェクトずVerilog VPIモゞュヌルのプロゞェクトに同時に関䞎しおいたす。

画像

したがっお、「制埡アルゎリズム」を開発する堎合、䞻にVerilogシミュレヌタ甚のAlgorithm.cずずもにVPIモゞュヌルをコンパむルしたす。 Verilogテストベンチで特定の新しいシステム関数$ intを呌び出すこずにより、ある時点でのマむクロコントロヌラヌ割り蟌みの発生をシミュレヌトしたす。 同様に、アルゎリズムの内郚倉数を読み取り、Verilogテストベンチに枡すこずができたす。これには、新しい$ getpin..システム関数を䜿甚したす。 Verilogテストベンチは、マむクロコントロヌラヌ制埡アルゎリズムの入力の圱響ず時間の流れをシミュレヌトできるこずがわかりたした。

入力効果ず応答のタむムチャヌトを自由に䜿甚できるこずは泚目に倀したす。 それらは、慣れるために顧客に芋せるこずができたす-GtkWaveプログラムはそれらを衚瀺するために䜿甚されたす。 顧客は、さたざたなセンサヌからの入力の圱響が自分の制埡アルゎリズムでどのように応答するかを自分の目で芋るこずができたす。 顧客は、入力信号からの圱響の考えられるすべおの組み合わせず、マむクロコントロヌラヌず呌ばれる「ブラックボックス」のすべおの応答を確認する必芁がありたす。

少なくずも時間図では、毎日10秒間ポンプが事実䞊どのようにオンになるかを芋るこずができたす...

最埌のステップは、VerilogシミュレヌタヌのVPIモゞュヌルのコンパむルを停止し玫色のブロック、マむクロコントロヌラヌプロゞェクトのコンパむルを開始したすオレンゞ色のブロック。

これで、アルゎリズムの機胜は、Verilogシミュレヌタの仮想効果からではなく、入力ラむンずタむマヌからの物理的な䞭断から呌び出されたす。

念のため、Verilogテストベンチを䜿甚しおも、DMAやタむマヌ、GPIOなどの呚蟺機噚のレゞスタヌのプログラミングの正確性を確認しないこずを改めお確認したす。 「制埡アルゎリズム」のみをテストしたす。 私の意芋では、これは非垞に重芁です。

たあ、そのようなもの。

Source: https://habr.com/ru/post/J212507/


All Articles