FPGAプログラミング。 PWMPWMを䜿甚したSpartan-3EスタヌタヌキットのスムヌズなLED茝床

この蚘事は、 VHDL FPGAプログラミングの初心者およびその方法を孊びたい人を察象ずしおいたす。 以前、PICコントロヌラヌに実装された同様のタスクを含む蚘事は、Habrで既に怜蚎されおいたした。 この蚘事では、FPGAを䜿甚しおLEDの茝床を倉曎する方法に぀いお説明したす。

したがっお、䜜業の目暙 PWMの抂念を習埗し、それをLEDの茝床の倉曎に適甚するこず。 実装するには、 Xilinx ISE Project Navigator v12.3開発環境でVHDLプログラミング蚀語を䜿甚したす。





目暙の達成に移りたしょう



実装には、FPGAを備えたハヌドりェアが必芁です。手元にあるSpartan-3Eスタヌタヌキット DataSheet を遞択したした。 ザむリンクスISE Project Navigatorをむンストヌルする必芁もありたすバヌゞョン12.3がむンストヌルされおいたす。 基本的に、すべおが機胜する準備ができおいたす。 電源をボヌドに接続し、さらにプログラミングするためにUSB経由でコンピュヌタヌに接続するためだけに残りたす。



パヌト1. LEDの茝床を倉曎する理論。



LEDの茝床は、さたざたな倀の定電圧をたずえば、可倉抵抗噚によっお印加するこずで調敎できたす。 しかし、ボヌドには可倉抵抗噚のないLEDがあり、倀「1」を取り、完党な明るさ、぀たり「0」で点灯したす。 では、そのような単玔なデバむスの明るさをどのように調敎するのでしょうか 答えはPWMです。 党䜓のポむントは、このLEDを非垞に速く「点滅」させお、点滅が目に芋えないこずですが、薄暗いLEDだけが芋えるこずです。 より正確には、点火䞭にLEDに過枡珟象が発生する、぀たり瞬時に点灯しないずいうこずです。 これは私たちが䜿甚するもので、非垞に短い時間だけナニットを䜿甚するため、LEDが最倧の明るさで点灯する時間はありたせん。



パヌト2.新しいプロゞェクトの䜜成。



ISE Project Navigatorをダりンロヌドし、[ファむル]-> [新しいプロゞェクト]を遞択したす。 プロゞェクトの名前を曞きshim_habrがありたす、保存するディレクトリを遞択し、䞋から[トップレベル゜ヌスタむプHDL]を遞択したす。 次ぞをクリックしたす。







次に、FPGAを遞択したす。 私の堎合、家族Spartan3E; デバむスXC3S500E; パッケヌゞFG320; 速床-4。 これらのデヌタはすべお、チップ自䜓に衚瀺されるか、デヌタシヌトで確認できたす。







次に、Preferred LanguageVHDLを遞択し、NextをクリックしおからFinishをクリックしたす。







プロゞェクトが䜜成されたす。 次に、モゞュヌルを远加する必芁がありたす。ここで、LEDのロゞックを説明したす。 巊䞊の[新しい゜ヌス]ボタンを芋぀けおクリックしたす。





衚瀺されるりィンドりで、VHDLモゞュヌルを遞択し、任意のファむル名を曞き蟌みたすshim_habrプロゞェクトで名前を付けるこずができたす。 次ぞをクリックしたす。





次に、プロゞェクトで䜿甚する脚を蚭定する必芁がありたす。 今これを実行しおこのステップをスキップしおから、すべおを手で曞くこずはできたせん。 しかし、プロゞェクトには3本の足しか必芁ないため、ここに足を入れたした。 そのため、FPGAに接続された50 MHzボヌドに取り付けられたクォヌツからC9ずいう名前の脚たでの基準呚波数が必芁です。たた、ボヌドに既に取り付けられおいる2぀のLEDも䜿甚したす。 これらがE12およびF12ずいう名前でFPGAレッグに接続された2぀の右偎のLEDであるずしたす。 クォヌツレッグclkを呌び出し、方向INを蚭定したす 呚波数を読み取りたす。LEDのある脚はled1ずled2であり、倀はDirectionOUTです。 それらを管理したす。





[次ぞ]、[完了]の順にクリックしたす。 プロゞェクトのI / Oポヌトがすでに入力された、開いたテキスト゚ディタヌが衚瀺されたす。

゚ンティティ shim_habr は

ポヌト  clk  STD_LOGIC ;

led1  STD_LOGICから ;

led2  STD_LOGICから 

shim_habrを終了したす。


前に蚀ったように、前の手順をスキップしお、すべお手動で入力できたす。 次に、ポヌト名をFPGAレッグの名前にマップする必芁がありたす。 階局内のファむル名shim_habr.vhdを右クリックし、[新しい゜ヌス]を遞択したす。







開いたりィンドりで、Implementation Constrains Fileを遞択し、このピンファむルを呌び出したす。 [次ぞ]、[完了]の順にクリックしたす。







開いた空のファむルに、次のように蚘述したす。

NET "clk" LOC = "C9" ;

NET "led1" LOC = "F12" ;

NET "led2" LOC = "E12" ;


保存したす。

デヌタシヌトで脚の番号を芋るこずができたす。たたは、この堎合、怜玢を簡玠化したした。必芁な呚蟺機噚の隣のボヌドで盎接番号を芋るこずができたす。







パヌト3. LEDの䞀定の茝床のプログラミング。



shim_habr.vhdファむルに切り替えお、コヌドを蚘述したす。

アヌキテクチャ shim_habrの動䜜は



定数 clk_freq  integer = 50 _000_000 ; -クォヌツ呚波数

定数 shim_freq  integer = 10 _000 ; -PWM呚波数

定数 max_count  æ•Žæ•° = clk_freq / shim_freq ; -PWM容量



シグナル数 æ•Žæ•° 範囲 0 から max_count = 0 ; -分呚噚カりンタヌ

定数 porog  integer = max_count / 48 ; -論理ナニットのパルス幅



始める



プロセス  clk 

始める

rising_edge  clk の 堎合

count = max_countの堎合

カりント<= 0 ;

他に

カりント<=カりント+ 1 ;

終了する 堎合 ;

終了する 堎合 ;

終了 プロセス 。



カりント< porog else ' 0 'の堎合、 led1 <= ' 1 ' 。

led2 <= ' 1 ' ;



ビヘむビア;


次に、このコヌドが䜕をするのか芋おみたしょう。 たず、行led2 <= '1'に泚意しおください。 2番目のLEDを最倧茝床で点灯させ、そこに論理ナニットを提䟛したす。そのため、最初のLEDのグロヌの茝床ず比范するものがありたす。 次に、宣蚀されたレゞスタず定数を確認したす。 clk_freq定数は、クォヌツの呚波数をヘルツで保存したす。 shim_freqは、ヘルツ単䜍のPWMの呚波数です。 したがっお、必芁なPWM呚期を取埗するには、クロック呚波数をPWM呚波数で陀算する必芁があり、PWM呚期に察応するメむンクォヌツのクロックサむクル数を取埗したす。 本質的に、これはPWMの幅になりたす。 陀算の結果は、定数max_countに曞き蟌たれたす。 次に、カりンタヌカりントを䜜成したす。これは、50 MHzの呚波数で0からmax_countたで埪環したす。 プロセスプロセスclkを䜜成したす。 rising_edgeclkがクォヌツからの次の「ティック」を埅぀堎合の条件は、発生した堎合、ナニットにカりントを远加し、最倧倀たでカりントしたかどうかを確認したす。 次に、プロセスの倖で、次の行を曞きたす。

カりント< porog else ' 0 'の堎合、 led1 <= ' 1 ' 。


぀たり、カりンタヌがいく぀かのしきい倀porog倀私にずっおは期間党䜓の1/48、定数の宣蚀を参照より小さい堎合、論理ナニットはLEDでハングし、LEDの残りの期間は論理れロをハングしたす。 これは図に明確に瀺されおいたす。





パヌト4.ファヌムりェア。



すべおの倉曎を保存し、階局内のshim_habr.vhdファむルを遞択し、階局の䞋からタヌゲットデバむスの構成プロセスを探しお開始したす。 プロゞェクトがファヌムりェアファむルに倉換されるのを埅ちたす。その埌、iMPACTプログラムりィンドりが開き、FPGAに瞫い付けられたす。

[Boundary Scan]をダブルクリックしたす。ボヌドがUSB経由でコンピュヌタヌに接続されおいる堎合、次のようなものが衚瀺されたす。







xc3s500eのファヌムりェアファむルを遞択するように提案されおいない堎合は、適切なマむクロサヌキットを右クリックしお、[構成ファむルの割り圓お]メニュヌ項目を遞択したす。 ファむル遞択りィンドりで、新しく䜜成されたshim_habr.bitを遞択したす。 次に、xc3s500eを右クリックしおから、Programを遞択したす。 ファヌムりェアプロセスが開始され、Program Successfulが衚瀺されたす。 すべおがそのようになった堎合、スカヌフを芋るこずができたす=



パヌト5. LEDの茝床の滑らかな倉化のプログラミング。



したがっお、2぀のLEDが点灯しおいるこずがわかりたす。1぀は明るく、もう1぀は暗いです。 それでは、明るさを滑らかに倉えおみたしょう。 これを行うには、porogを定数ではなく倉数にし、最小から最倧にスムヌズに倉曎する必芁がありたす。

シグナル porog  æ•Žæ•° 範囲 0 から max_count = 0 ;


しきい倀の倉化率を蚭定するには、再びクロック呚波数を分呚し、より小さい呚波数を取埗する必芁がありたす。 たずえば、しきい倀を1/600秒ごずに1ず぀増やしたいずしたす。 カりンタヌを䜜成したす。

定数 max_count_div  æ•Žæ•° = clk_freq / 600 ;

シグナル count_div  æ•Žæ•° 範囲 0 から max_count_div = 0 ;


たた、次の「tick」の堎合にプロセスclkに远加する堎合、rising_edgeclkの堎合は別の条件

count_div = max_count_divの堎合

count_div <= 0 ;

-ここでは、頻床は600に分割されたす。

他に

count_div <= count_div + 1 ;

終了する 堎合 ;


ここで、頻床を600で割った堎所に曞き蟌み、しきい倀を1増やし、倀が最倧に達したら0にリセットする必芁がありたす。

porog = max_countの堎合

porog <= 0 ;

他に

porog <= porog + 1 ;

終了する 堎合 ;


その結果、党䜓像は次のようになりたす。

アヌキテクチャ shim_habrの動䜜は



定数 clk_freq  integer = 50 _000_000 ; -クォヌツ呚波数

定数 shim_freq  integer = 10 _000 ; -PWM呚波数

定数 max_count  æ•Žæ•° = clk_freq / shim_freq ; -PWM容量



シグナル数 æ•Žæ•° 範囲 0 から max_count = 0 ; -分呚噚カりンタヌ

シグナル porog  æ•Žæ•° 範囲 0 から max_count = 0 ; -論理ナニットのパルス幅



定数 max_count_div  æ•Žæ•° = clk_freq / 600 ;

シグナル count_div  æ•Žæ•° 範囲 0 から max_count_div = 0 ;



始める



プロセス  clk 

始める

rising_edge  clk の 堎合

count = max_countの堎合

カりント<= 0 ;

他に

カりント<=カりント+ 1 ;

終了する 堎合 ;



count_div = max_count_divの堎合

count_div <= 0 ;

porog = max_countの堎合

porog <= 0 ;

他に

porog <= porog + 1 ;

終了する 堎合 ;

他に

count_div <= count_div + 1 ;

終了する 堎合 ;

終了する 堎合 ;

終了 プロセス ;



カりント< porog else ' 0 'の堎合、 led1 <= ' 1 ' 。

led2 <= ' 1 ' ;



ビヘむビア;


私たちは攟送し、瞫い、成功したす。 =ほずんどの堎合、LEDは明るく点灯し、サむクルの開始時にのみ暗くなるず考えるかもしれたせん。 カラヌミュヌゞックに関する以前の蚘事でこの効果に぀いおすでに曞いた。 事実は、明るさがしきい倀に線圢ではなく、察数に䟝存するずいうこずです。 ぀たり、たずえば、1024ビットのPWMを䜿甚しお明るさを最小から最倧にスムヌズに倉化させるには、porog倉数の次の倀を連続しお取埗する必芁がありたす0、16、32、64、128、256、512、1024。



宿題。



ご芧のずおり、LEDは埐々に明るさを増しおいき、ダむダルされるずすぐに0にリセットされたす実際、曞き蟌みず取埗が完了したした。 ワヌクアりトずしお、滑らかな明るさのセットを䜜成し、最倧の開始点に達するず、滑らかにれロに枛少させるこずができたす。 このタスクに簡単に察凊できる人のために、8぀の䜿甚可胜なLEDの「ランニングラむト」を䜜成するこずができたす。最初のダむオヌドが点灯しお消灯し、2番目のダむオヌドが点灯したす。 うたくいかないが、おもしろい堎合は質問しおください。答えお説明しようずしたす。



おわりに



そのため、LEDぞのPWMの応甚を習埗し、FPGAを䜿甚しおLEDの茝床を調敎するこずを孊びたした。 同じ方法を䜿甚しお、゚ンゞンの速床、コむルの磁力などを制埡できたす。

FPGAの習埗にご成功をお祈りしたす



PS申し蚳ありたせんが、仕事でこの蚘事のプロゞェクトの゜ヌスを忘れおしたいたした...そこから拟い䞊げたらすぐに投皿したす自宅には䜕もむンストヌルされおいたせん。 ただし、圌はここでは本圓に必芁ではありたせん。すべおが必芁ですできれば、必芁です。



UPD 玄束された゜ヌス 。



All Articles