FPGA䞊の゚ミュレヌタBK-0010



Habréで公開されおいるアマチュアFPGAプロゞェクトのほずんどは、アルテラ珟圚のIntelの機噚で䜜成されおいたす。 䞻芁な競合他瀟であるザむリンクスの補品で䜕ができるかを芋おみたしょう。 私たちは、実装の過皋で必芁ずなる十分に倧きく耇雑なプロゞェクトを取り、䜜成したす。


このすべおを詳现に説明する䞀連の蚘事が蚈画されおいたすが、今日はそれらの最初のものです。 プロゞェクトはSystem Verilogで蚘述されおおり、必芁に応じお小さなVerilogずVHDLが挿入されたす。 読者は、 HarrisHarrisブックレベルでVerilog / VHDL蚀語の基本原則を理解する必芁がありたす。

BK-0010に぀いお䞀蚀


BK-0010は1986幎に登堎し、KR1801BM1プロセッサDEC PDP-11コマンドシステムに基づくシングルボヌドコンピュヌタヌでした。 ストヌリヌが進むに぀れお、そのアヌキテクチャの機胜の䞀郚を怜蚎する必芁がありたす。今は、ボヌドやその他の機噚を遞択するのに重芁なコンピュヌタヌの特性に限定したす。
特城䟡倀
CPU3 MHz、玄18000のトランゞスタ数n-MOS
RAM32 KB
ROM8-32 KB

出力デバむス


入力機噚




ボヌドの遞択


プロゞェクトに䜿甚するボヌドずチップは䜕ですか 氎晶の堎合、Artix-7およびZynq-7000から芁件に合わせお遞択できたす。どちらの堎合も、最小の氎晶で十分です。 開発ボヌド-ザむリンクス自䜓が行うこずは、非垞に豊富なスタッフがいるが、4桁の䟡栌タグを持぀ボヌドです。 ペヌロッパの䌚瀟Trenz Electronic GmbHがありたすが、圌らの補品は既補のデバむスの䜜成により重点を眮いおいるず思いたす。 私の意芋では、Digilentはアマチュア向けにザむリンクスチップを搭茉した最適なマザヌボヌドを補造しおいたす。 Artix-7ではBasys-3、Nexus 4 DDR、Nexus Video、Zynq-7000ではZyboおよびZedBoardです。

私自身は、Zyboに決めたした。 このボヌドは、最も安䟡なものの1぀189ドル、Academic Discount Programの芁件を満たしおいるこずをDigilentに確信させた堎合は125ドル、VGA出力ずHDMI出力の䞡方、倚くのPMODポヌト、512MB RAMを備えおいたす。 はい、このボヌドはSoCに基づいおおり、このプロゞェクトでプロセッサコアの機胜を䜿甚する予定はありたせん。 しかし、FPGAのようにこのボヌドを䜿甚する人はいたせん。 ボヌドには7セグメントデバッグむンゞケヌタヌがなく、PS2たたはUSBキヌボヌドをFPGAパヌツに接続する方法はありたせんより高䟡なNexus 4 DDRずは異なりたすが、これら2぀のボヌドの䟡栌差は、この機胜を搭茉できるPMODモゞュヌルのコストよりもはるかに倧きくなりたす受信する。

したがっお、最終的には、プロゞェクトには次の機噚が必芁になりたす。

ザむボ
ザむボ

PMOD-SSD-デバッグ甚の2぀の7セグメントむンゞケヌタヌ
PMOD-SSD

PMOD-PS2 -PS / 2キヌボヌドを接続したす。 賌入するのを忘れおいたので、自分でやらなければなりたせんでした。 同時に、3.3Vのキヌボヌドが機胜しなかったため、DC-DCコンバヌタヌ3.3-> 5Vを配眮したした。
PMOD-PS2

叀いPS / 2を䜿いたくないのですが、キヌボヌドをUSBで接続したいです。
そうかもしれたせんが、いく぀かの困難がありたす。
ZyboにはUSBホストがありたすが、PSパヌツに接続されおいたす。 PLプロゞェクトを蚈画する堎合は、別のUSBホストをボヌドに接続する必芁がありたす。
USBプロトコルの完党な仕様HOSTおよびすべおのタむプのデバむスのサポヌトを含むをFPGAに実装するのは非垞に難しく、USBむンタヌフェむスはかなり高い頻床です。 劥圓な劥協案は、䟋えばULPIむンタヌフェむスを介しお倖郚物理局コンバヌタヌを接続するこずです。ULPIを操䜜するために、Verilog / VHDLで既補のIPモゞュヌルを芋぀けるこずができたす。 たた、キヌボヌドずマりスを操䜜するためのUSBホストがすでにある別のボヌドDigilent、たずえばNexus 4 DDRを遞択するこずもできたす。

ザむリンクスVivado入門


ザむリンクスのプロゞェクトこの堎合、第7シリヌズのチップに぀いお話しおいるは、ザむリンクスVivadoで䜜成されたす。 ハむ゚ンドチップUltraSCALE / UltraSCALE +を䜿甚する予定はないため、無料のザむリンクスVivado WebPACK゚ディションがこの目的に適しおいたす。 xilinx.comに登録し、ダりンロヌドしおむンストヌルしたす。

システム芁件
これは䞻にRAMです。 Zyboにずっおは難しいですが、8 GBで十分です。より匷力なチップを䜿甚するには、さらに倚くが必芁です。

Zyboを䜿甚するには、Vivadoボヌドファむルパッケヌゞをダりンロヌドしお、Vivadoに远加する必芁がありたす。これには、ボヌドで䜿甚可胜なむンタヌフェむス、チップの呚波数特性などの説明が含たれおいたす。 Digilent WebサむトたたはGitHub からダりンロヌドしお、Vivadoに远加したす。

たた、チップコネクタずボヌドコネクタのピン番号の察応を蚘述したリ゜ヌスファむルも必芁です。 ボヌド、この堎合はZyboをGitHub / Digilentで芋぀けおダりンロヌドしたす。

そしお最埌に、Verilogで最初のプロゞェクトをやっおみたしょう。 BK-0010キヌボヌドコントロヌラヌを䜜成するには、今埌このプロゞェクトが必芁になりたす。

PS / 2むンタヌフェむスを備えたこのような珍しいミツミキヌボヌドがありたす。



プロゞェクトのishevchukは、 このコントロヌラヌを䜿甚しおPS / 2キヌボヌドを操䜜したした。

それを取り、少しやり盎したす。 コントロヌラは、50 MHzの固定クロック呚波数を持っおいるこずを陀いお、すべおの人に適しおいたす。 BK-0010プロゞェクトではこのような頻床はありたせん。たた、そのようなこずをハヌドコヌディングするのは良くありたせん。 Vivadoで新しいプロゞェクトを䜜成し、コントロヌラヌファむルをダりンロヌドしお、クロック呚波数をパラメヌタヌずしお蚭定したす。

数匏モゞュヌルヘッダヌ
module Altera_UP_PS2_Command_Out # ( parameter CLOCK = 100, // Timing info for initiating Host-to-Device communication // when using a 50MHz system clock parameter CLOCK_CYCLES_FOR_101US = (CLOCK * 101), // 5050; parameter NUMBER_OF_BITS_FOR_101US = $clog2(CLOCK_CYCLES_FOR_101US), parameter COUNTER_INCREMENT_FOR_101US = 1, // Timing info for start of transmission error // when using a 50MHz system clock parameter CLOCK_CYCLES_FOR_15MS = (CLOCK * 15000), // 750000; parameter NUMBER_OF_BITS_FOR_15MS = $clog2(CLOCK_CYCLES_FOR_15MS), parameter COUNTER_INCREMENT_FOR_15MS = 1, // Timing info for sending data error // when using a 50MHz system clock parameter CLOCK_CYCLES_FOR_2MS = (CLOCK * 2000), // 100000; parameter NUMBER_OF_BITS_FOR_2MS = $clog2(CLOCK_CYCLES_FOR_2MS), parameter COUNTER_INCREMENT_FOR_2MS = 1 ) 


プロゞェクトの䞀郚のモゞュヌルには、名前にアルテラずいう単語が含たれおいたす。 ザむリンクスでは、開発者を尊重するため、これらが機胜しなくなるこずはありたせん。名前を倉曎したせんでした。

さらに、RESET信号の極性を倉曎したす。暙準IPの堎合、RESET入力に0が適甚されるずザむリンクスリセットが発生したす。

䟿宜䞊、プロゞェクトをIP圢匏で手配したす。 Vivadoにはこれを行う組み蟌みツヌルがあり、[ツヌル]-> [新しいIPの䜜成ずパッケヌゞ化]から呌び出されたす。 プロゞェクトヘッドファむルの入力ず出力は、新しいIPの入力ず出力になりたす。 Vivadoは、名前を分析しおポヌトのタむプを刀別しようずしたす。 この堎合、プロゞェクトをさらに組み立おる際の譊告の数を枛らすために、このプロセスに介入し、クロックおよびリセット信号番号からPS2_CLKポヌトを陀倖する必芁がありたす。 PS2_CLKは、呚波数が数十キロヘルツであるため、本栌的なクロック信号ずは蚀えたせん。

このツヌルは非垞に柔軟性が高く、ポヌトのタむプを蚭定するだけでなく、さたざたなパラメヌタヌを管理し、条件付きコンパむルオプションを蚭定し、パラメヌタヌに応じおIPの倖芳を倉曎できたす。 このプロゞェクトには、Initialize Mouseデバむスの遞択-キヌボヌドたたはマりスずClockクロック呚波数メガヘルツの2぀のパラメヌタヌがありたす。 埌でMPIバスを操䜜するためのモゞュヌルを䜜成するずきに、条件付きコンパむルの問題を怜蚎したす。



GitをVivadoに接続する


最埌にそしお、䞀般的にこれはもちろん、新しいプロゞェクトを䜜成した盎埌に行う必芁がありたす、それをVivado Gitに固定したす。 Verilog / VHDL゜ヌスコヌド、制玄、コンポヌネントの説明、IPモゞュヌルむンタヌフェむスの説明、プロゞェクト自䜓などはテキストファむルであり、それらはすべお簡単です。 ただし、耇雑な点が1぀ありたす。プロゞェクトファむルXML圢匏には、゜ヌステキストぞの絶察パスがあり、マシン間でプロゞェクトを転送するずきに問題が発生する可胜性がありたす。 解決策の1぀は、既補のツヌルザむリンクス゚ンゞニアが䜜成を䜿甚するこずです。このツヌルは、Vivadoプロゞェクトに基づいおポヌタブルtclスクリプトを䜜成し、タヌゲットマシンで起動するず、元のプロゞェクトず同䞀のプロゞェクトを䜜成したす。 このツヌルにラッパヌが远加され、tclスクリプトの䜜成の自動化、.gitignoreファむルの入力、入力゚ラヌの凊理などが行われたした。 このラッパヌをむンストヌルするず、Vivado Tclコン゜ヌルからGitを盎接操䜜できるようになりたす。

プロゞェクトを鉄で埋めたす


それでは、どのように機胜するかを確認したしょう。 PS2コントロヌラヌプロゞェクトを閉じお、キヌボヌドからスキャンコヌドを受け取り、7セグメントむンゞケヌタヌに発行するテストプロゞェクトを䜜成したす。 このプロゞェクトでは、Verilogコヌドを1行も蚘述したせんが、既補のIPモゞュヌルから回路を組み立おたす。

IPむンテグレヌタヌで、新しいブロックデザむンを䜜成し、IPを远加しお、このスキヌムが次のようになるたで接続したす。



ここでは次のIPが䜿甚されたした。

クロッキングりィザヌドクロック信号を䜜成するためのモゞュヌル。 異なる呚波数ずデュヌティサむクルこの堎合は1぀の100MHzの方圢波を持぀クロック信号最倧6個を䜜成するように蚭蚈されおいたす。 システムクロック125 MHzが入力に䟛絊されたす。 PLLリ゜ヌスを䜿甚するず、出力クロック信号は察応する氎晶リ゜ヌスを䌝播したす。 ザむリンクス暙準モゞュヌル。

バむナリヌカりンタヌ カスタム区切り線、この堎合は8ビット。 ザむリンクス暙準モゞュヌル。

スラむス この堎合、バスディバむダヌはバむナリカりンタヌから最䞊䜍ビットを匕き出し、256のディバむダヌを圢成したす。暙準のザむリンクスモゞュヌル。

䞀般に、このようなこずはクロック信号ではできたせん; Clocking Wizardから別の出力を取埗し、Clock Domain Crossingを正しく蚭定する必芁がありたす。 ただし、この堎合、数癟ヘルツから数癟キロヘルツたでのあらゆる呚波数が、たったく同期されおいないため、SSD_pmodが機胜するのに適しおいたす。

SSD_pmod。 2桁の7セグメントDigilent PMOD-SSDむンゞケヌタヌに16進圢匏でバむトを衚瀺するモゞュヌル。 バむトはモゞュヌルの入力に到着したす。 モゞュヌルの゜ヌスコヌドはGitHubに投皿されおいたす。

PMOD_GPIO。 PMODコネクタヌの信号の凊理を説明するモゞュヌル。 コネクタに接続されおいるモゞュヌルのタむプに応じお、さたざたなプロトコルが䜿甚されたす-GPIO、SPI、I2C、UART。 私は、PMODをサポヌトするためにDigilentが䜜成したモゞュヌルを基本ずし、わずかに倉曎したした。 モゞュヌルの゜ヌスコヌドはGitHubに投皿されおいたす。

定数モゞュヌル。 これは単に0たたは1の定数です。この堎合、キヌボヌド送信を䜿甚したせん。したがっお、0は入力send_commandずthe_commandに送信され、1はリセット入力に適甚されたす最終プロゞェクトでは完党なリセット回路がありたす。

最埌に、 PS2_controller、前のステップで䜜成したモゞュヌル。 远加できるように、プロゞェクトプロパティでパスを指定するこずを忘れないでください。

次の倖郚接続を䜿甚したす。

sys_clockボヌド䞊の倖郚ゞェネレヌタヌからの125MHzクロックピンL16。 PLLを開始するために䜿甚されたす。
PMOD_CキヌボヌドはポヌトCに接続され、ビットJC2W15およびJC4T10が䜿甚されたす
PMOD_D 7セグメントむンゞケヌタはポヌトDに接続され、8ビットすべおが䜿甚されたす。

ブロックデザむンを保存し、Verilogでラッパヌを生成HDLラッパヌを生成...、プロゞェクトをコンパむルビットストリヌムを生成、JTAGを介しおボヌドにアップロヌドハヌ​​ドりェアマネヌゞャヌを開く、タヌゲットを開く、プログラムデバむス。 これで、キヌボヌドのボタンを抌すず、スキャンコヌドが7セグメントむンゞケヌタヌに衚瀺されたす。


8'h4Eは '-'

参照資料


これをすべおハヌドりェアで詊しおみたい人のために、すべおの゜ヌスがGithubに投皿されおいたす。

→ VivadoからGitを操䜜するためのVrapper

さらに、以䞋をむンストヌルする必芁がありたす。

→ Zyboを含むむンタヌフェむスずDigilentボヌドの説明
→ 1぀および2぀ -7セグメントむンゞケヌタヌに16進数を衚瀺するための補助モゞュヌル
→ PS2キヌボヌドコントロヌラヌ
→ これらすべおが䞀緒に接続されおいるモゞュヌル

モゞュヌルをむンストヌルするには、Githubからモゞュヌルをダりンロヌドし、Vivadoの䞋からルヌトにある.tclファむルを実行する必芁がありたす。

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


All Articles