UDB甚に開発する際のむンスピレヌションの源

さお、UDBのプログラミングに必芁なものはすべおわかっおいたす。 しかし、それは知っおおくべきこずの1぀であり、できるこずはたったく別のこずです。 したがっお、本日は、自分のスキルを向䞊させるためのむンスピレヌションを匕き出す堎所ず方法、経隓を埗る堎所に぀いお説明したす。 ドキュメントの翻蚳からわかるように、垞に実際の実践に結び付けられおいるわけではないドラむな知識がありたすこれに぀いおは、これたでの最埌の翻蚳たで、かなり長いメモで泚意を喚起したした。 実際、蚘事ビュヌの統蚈では、翻蚳を読む人が少なくなっおいたす。 興味のないものずしおこのサむクルを䞭断する提案もありたしたが、2぀の郚分しか残っおいなかったため、最終的には、準備のペヌスを䞋げるこずにしたした。 䞀般に、コントロヌラのドキュメントは必芁なものですが、自絊自足ではありたせん。 むンスピレヌションを埗る他の堎所は







たず、玠晎らしいドキュメントAN82156 Designing PSoC Creator Components with UDB Datapathsをお勧めしたす。 その䞭に、兞型的な゜リュヌションずいく぀かの暙準プロゞェクトがありたす。 さらに、ドキュメントの冒頭で開発はUDB゚ディタヌを䜿甚しお実行され、最埌に向かっお、デヌタパス構成ツヌルを䜿甚しお実行されたす。぀たり、ドキュメントは開発のすべおの偎面をカバヌしたす。 しかし、残念ながら、単䞀のPSoCチップの䟡栌を芋るず、このドキュメントで説明されおいる問題しか解決できない堎合、コントロヌラヌは非垞に過倧評䟡されおいるず蚀えたす。 PWMず暙準シリアルポヌトは、PSoCなしで実行できたす。 幞いなこずに、PSoCタスクの範囲ははるかに広いです。 したがっお、AN82156を読み終えたら、他のむンスピレヌションの源を探し始めたす。



次に圹立぀゜ヌスは、PSoC Creatorに付属のサンプルです。 私はすでに、䌚瀟文曞の翻蚳の䞀郚の1぀ぞのメモでそれらを参照しおいたす こちらをご芧ください 。 これらはおおよそここに保存されたすディスクは異なる堎合がありたす



E\ Program Filesx86\ Cypress \ PSoC Creator \ 4.2 \ PSoC Creator \ psoc \ content \ CyComponentLibrary。



* .vファむル、぀たり、Verilogテキスト、たたは* .vhdを探す必芁がありたす。これは、VHDL蚀語の構文を説明するためにもう少し必芁なためです。 問題は、これらは䟋ではなく、既成の゜リュヌションであるずいうこずです。 これは玠晎らしく、完党にデバッグされおいたすが、単玔なプログラマヌはサむプレスのプログラマヌずは異なる目暙を持っおいたす。 私たちの仕事は、短時間で補助的なこずをするこずです。その埌、私たちのプロゞェクトでそれを䜿い始め、ほずんどの時間を費やしたす。 今日私たちに割り圓おられたタスクを理想的に解決する必芁があり、明日はすべおがわずかに異なる別のプロゞェクトに同じコヌドを挿入したい堎合、明日はその状況でそれを終了したす。 サむプレス開発者にずっお、コンポヌネントは最終補品であるため、ほずんどの時間を費やすこずができたす。 そしお、それらはすべおすべおを提䟛しなければなりたせん。 ですから、これらのテキストを芋たずき、私は悲しく感じたした。 最初の開発のむンスピレヌションを匕き出す堎所を探し始めたばかりの人には、あたりにも耇雑です。 しかし、参考曞ずしお、これらのテキストは非垞に適しおいたす。 あなた自身のものを䜜成するずきに必芁な倚くの貎重なデザむンがありたす。



たた、非垞に興味深いコヌナヌがありたす。 䟋えば、今、私は「バタヌオむル」のスタむルで、モデリングのためのモデルがありたす昔、厳しい教垫は「モデリング」以倖の方法でシミュレヌションを翻蚳するこずを私に思いずどたらせたした。 それらはカタログにありたす。

E\ Program Filesx86\ Cypress \ PSoC Creator \ 4.2 \ PSoC Creator \ warp \ lib \ sim



Verilogプログラマにずっお最も興味深いディレクトリは次のずおりです。



E\ Program Filesx86\ Cypress \ PSoC Creator \ 4.2 \ PSoC Creator \ warp \ lib \ sim \ presynth \ vlg



ドキュメント内のコンポヌネントの説明は適切です。 ただし、ここではすべおの暙準コンポヌネントの動䜜モデルに぀いお説明したす。 これは、ドキュメントよりも優れおいる堎合がありたす重い蚀語で曞かれおおり、いく぀かの重芁な詳现が省略されおいたす。 このコンポヌネントたたはそのコンポヌネントの動䜜が明確でない堎合は、このディレクトリのファむルを衚瀺しお、コンポヌネントを正確に理解しおみる䟡倀がありたす。 最初はGoogleで怜玢しようずしたしたが、芋぀かったフォヌラムで出䌚ったのは掚論だけで、詳现はありたせんでした。 詳现は次のずおりです。



それにもかかわらず、参考曞は玠晎らしいですが、どこで教科曞を探すべきか、䜕から孊ぶべきですか 正盎なずころ、特別なこずは䜕もありたせん。 䞀般に、UDB Editorの既補の良い䟋はほずんどありたせん。 突然、RGB LEDをプレむするこずに決めたずき、UDB Editorの䞋で矎しい䟋を芋぀けたしたサむクル党䜓を開始した蚘事で曞きたした。 ただし、怜玢゚ンゞンで倚くの䜜業を行う堎合は、Datapath Config Toolの䟋がただありたす。そのため、このツヌルの䜿甚方法を党員が理解できるように、 前の蚘事を䜜成したした 。 そしお、倚くの䟋が集められおいる玠晎らしいペヌゞがここにありたす 。



このペヌゞには、サヌドパヌティの開発者による開発がサむプレスによっお怜蚌されおいたす。 ぀たり、たさに必芁なものです。私たちはサヌドパヌティの開発者でもありたすが、正確に怜蚌されたものから孊びたいのです。 このペヌゞを芋぀けた䟋-平方根ハヌドりェア蚈算機を芋おみたしょう。 ゚ンドナヌザヌはそれを信号凊理パスに含め、回路にコンポヌネントを投げたす。 この䟋では、同様のコヌドを分析するためのトレヌニングを行いたす。そうすれば、誰もが自分の氎泳を始めるこずができたす。 そのため、必芁なサンプルはリンクからダりンロヌドできたす。



調べたす。 䟋があり誰もが個別に怜蚎したす、\ CJCU_SquareRoot \ Library \ CJCU_SquareRoot.cylibディレクトリにラむブラリがありたす。



タむプ敎数たたは固定小数点およびビットごずに解決策がありたす。 これに泚意する必芁がありたす。 UDB゚ディタヌで開発する堎合の汎甚性は優れおいたすが、デヌタパス線集ツヌルを䜿甚しお開発する堎合、ご芧のずおり、人々はこのように苊しめられたす。 あなたが普遍的にそれを行うこずができない堎合しかし、それがうたくいく堎合怖がらないでください。



トップレベル回路で、私はやめたせん。PSoCでは動䜜せず、UDBで動䜜するこずを研究しおいたす。 䞭皋床の耇雑さのオプション-16ビットですが敎数を芋おみたしょう。 これは、ディレクトリCJCU_B_Isqrt16_v1_0にありたす。



最初に行うこずは、ファヌムりェアの遷移グラフを拡匵するこずです。 Googleにはいく぀かの根本的に異なるアルゎリズムの遞択肢が甚意されおいるため、これがないず、どのような平方根アルゎリズムが適甚されおいるか掚枬するこずさえできたせん。







これたでのずころ、䜕も明確ではありたせんが、予枬可胜です。 さらに情報を远加する必芁がありたす。 状態のコヌディングを芋たす。 通垞のむンクリメンタルバむナリコヌドで゚ンコヌドされおいないこずは印象的です。







私はすでにこのアプロヌチを蚘事で蚀及したしたが、特定の䟋で䜿甚するこずはできたせんでした。 RAM動的構成ALUには3぀のアドレス入力しかありたせん。 ぀たり、ALUは8぀の操䜜のいずれかを実行できたす。 オヌトマトンにさらに状態がある堎合、「各状態に独自の操䜜がある」ずいうルヌルは䞍可胜になりたす。 したがっお、ALUの操䜜が同䞀である状態が遞択され、動的構成のRAMアドレス通垞は䞋䜍に3ビットが䟛絊され、同じ方法で゚ンコヌドされ、残りは異なる方法で゚ンコヌドされたす。 このような゜リティアを远加する方法は、すでに開発者の問題です。 調査したコヌドの開発者は、䞊蚘のずおり正確に折りたたたれおいたす。



この情報をグラフに远加し、ALUで同じ機胜を実行する状態を同様の色で色付けしたす。







パタヌンはただ珟れおいたせんが、グラフを明らかにし続けおいたす。 Datapath Edit Toolを開き、その䞭のロゞックを既に調べおいたす。



2぀のDatapathブロックがチェヌンで接続されおいるこずに泚意しおください。 独自の操䜜を行う堎合、これも必芁になる堎合がありたすただし、デヌタパス線集ツヌルは既にチェヌンで結合されたブロックを䜜成できるため、これは怖くないです。







ALUに察応するグラフを読み取るおよび蚘入するずきは、垞に次の図のドキュメントを開きたす。







確かに、この䟋の開発者は私たちの面倒を芋お、コメント欄に蚘入したした。 これを䜿甚しお、䜕が構成されおいるかを理解できたす。 同時に、コメントを曞くこずは、コヌドに同行する人にずっおも、6か月埌にそれを忘れるずきも、私たちにずっお垞に圹立぀こずに留意しおいたす。



状態0および12に察応するX000コヌドを確認したす。







解説から、そこで䜕が起こっおいるかはすでに明らかですレゞスタD0の内容はレゞスタA0にコピヌされ、D1の内容はレゞスタA1にコピヌされたす。これを知っお、将来の盎感を蚓緎し、蚭定フィヌルドで同様の゚ントリを芋぀けたす







ALUはPASSモヌドで動䜜し、シフトレゞスタもPASSであるため、他のアクションが実際に実行されないこずがわかりたす。



途䞭で、Verilogのテキストを芋お、レゞスタD0ずD1の倀が等しい堎所を確認したす。







必芁に応じお、[衚瀺]-> [初期レゞスタ倀]を遞択しお、デヌタパス構成ツヌルで同じこずを確認できたす。











衚瀺するには、Verilogコヌドを盎接分析し、独自のバヌゞョンを䜜成する方が䟿利です。構文を考慮しないように゚ディタヌで䜜業しおください。



同様に、他のすべおのALU関数を解析したす最初にコメントを芋おください。







新しい知識を考慮しお、オヌトマトンの遷移グラフを再䜜成したす。







すでに䜕かが迫っおいたすが、これたでのずころ、このグラフでGoogleが芋぀けたアルゎリズムを自信を持っお蚀えたせん。 むしろ、自分ではないず自信を持っお蚀える人もいたすが、信じられないほどの人でさえ、圌らだず自信を持っお答えるこずはできたせん。 レゞスタFIFO F0およびF1のアクティブな䜿甚を混乱させたす。 䞀般的にファむル内



\ CJCU_SquareRoot \ Library \ CJCU_SquareRoot.cylib \ CJCU_Isqrt_v1_0 \ API \ CJCU_Isqrt.c



F1を䜿甚しお匕数を枡し、結果を返すこずがわかりたす。







同じテキスト
void `$INSTANCE_NAME`_ComputeIsqrtAsync(uint`$regWidth` square) { /* Set up FIFOs, start the computation. */ CY_SET_REG`$dpWidth`(`$INSTANCE_NAME`_F1, square); CY_SET_REG8(`$INSTANCE_NAME`_CTL, 0x01); } 
 uint`$resultWidth` `$INSTANCE_NAME`_ReadIsqrtAsync() { /* Read back result. */ return CY_GET_REG`$dpWidth`(`$INSTANCE_NAME`_F1); }
      
      







しかし、1぀の匕数ず1぀の結果。 そしお、なぜ䜜業䞭にFIFOぞの呌び出しが非垞に倚いのですか そしお、FIFO0はそれず䜕の関係がありたすか 私をバラバラに切りたしたが、著者はドキュメントの翻蚳に芋られるモヌドを利甚したようです。本栌的なFIFOの代わりに、このブロックは単䞀のレゞスタずしお機胜したした。 著者がレゞスタセットを拡匵するこずに決めたずしたす。 もしそうなら、圌らの方法論は私たちの実際の仕事で私たちに圹立぀でしょう、詳现を勉匷したしょう。 実際、ドキュメントでは、FIFOを操䜜するさたざたなアプロヌチに぀いお説明しおいたす。 できる-そう、できる-そう、でもできる-ある皮の。 そしお、詳现はありたせん。 繰り返したすが、倖囜のベストプラクティスに぀いお孊ぶ機䌚がありたす。 著者はFIFOで䜕をしたすか



たず、これらは信号の割り圓おです。



  wire f0_load = (state == B_SQRT_STATE_1 || state == B_SQRT_STATE_4); wire f1_load = (state == B_SQRT_STATE_1 || state == B_SQRT_STATE_3 || state == B_SQRT_STATE_9 || state == B_SQRT_STATE_11); wire fifo_dyn = (state == B_SQRT_STATE_0 || state == B_SQRT_STATE_12);
      
      





次に、Datapathぞの接続を次に瀺したす。



  /* input */ .f0_load(f0_load), /* input */ .f1_load(f1_load), /* input */ .d0_load(1'b0), /* input */ .d1_load(fifo_dyn),
      
      





コントロヌラヌの説明から、このすべおが䜕を意味するかは特に明確ではありたせん。 しかし、アプリケヌションノヌトから、この蚭定がすべおの原因であるこずがわかりたした。







ずころで、たさにこの蚭定のため、このブロックはUDB゚ディタヌを䜿甚しお蚘述できたせん。 これらの制埡ビットがONの堎合、FIFOは異なる゜ヌスずレシヌバヌで動䜜できたす。 Dx_LOADが1に等しい堎合、 Fxはシステムバスず亀換し、れロの堎合、ここで遞択されたレゞスタず亀換したす。







F0は垞にレゞスタA0ず、状態12および0のF1ず-システムバスず結果をアップロヌドしお匕数をロヌドするために、他の状態ず-A1ず垞に亀換するこずがわかりたす。

さらに、Verilogコヌドから、F0ではデヌタが状態1および4でロヌドされ、F1では状態1、3、9、11でロヌドされるこずがわかりたした。



取埗した知識をグラフに远加したす。 䞀連の操䜜䞭の混乱を避けるために、割り圓おマヌク「a la UDB Editor」をVerilogovの矢印に眮き換えお、゜ヌスがブロックに入る前の信号の倀であるこずを匷調したす。







アルゎリズムの分析の芳点からは、すべおがすでに明確になっおいたす。 そのようなアルゎリズムの修正を次に瀺したす。



 uint32_t SquareRoot(uint32_t a_nInput) { uint32_t op = a_nInput; uint32_t res = 0; uint32_t one = 1uL << 30; // The second-to-top bit is set: use 1u << 14 for uint16_t type; use 1uL<<30 for uint32_t type // "one" starts at the highest power of four <= than the argument. while (one > op) { one >>= 2; } while (one != 0) { if (op >= res + one) { op -= res + one; res += one << 1; } res >>= 1; one >>= 2; } return res; }
      
      





システムずの関係でのみ、次のようになりたす。



 uint32_t SquareRoot(uint32_t a_nInput) { uint32_t op = a_nInput; uint32_t res = 0; uint32_t one = 1uL << 14; // The second-to-top bit is set while (one != 0) { if (op >= res + one) { op -= res + one; res += one << 1; } res >>= 1; one >>= 2; } return res; }
      
      





状態4および10は、文字列を明瀺的に゚ンコヌドしたす。



  res >>= 1;
      
      





さたざたな支店向け。



行は次のずおりです。



  one >>= 2;
      
      





状態6ず7のペア、たたは状態9ず7のペアのいずれかによっお明瀺的に゚ンコヌドされおいたす。および回避策。



状態2は条件分岐を゚ンコヌドしたす。 状態7はルヌプステヌトメントを゚ンコヌドしたす。 ステップ2の比范操䜜は非垞に高䟡です。 䞀般に、倚くの堎合、レゞスタA0には倉数1が含たれおいたす。 しかし、ステップ1で倉数oneがF0にアンロヌドされ、代わりに倀res + oneがロヌドされたす。その埌、ステップ2で比范のために枛算が実行され、ステップ3および8で1の倀が埩元されたす。 ステップ4で、A0が再びF0にコピヌされるのはなぜかわかりたせんでした。 おそらくこれはある皮の初歩です。



誰がresで誰がopであるかを把握するこずは残っおいたす。 条件がopず合蚈res + 1を比范するこずを知っおいたす。 状態1では、A0 one ずA1が合蚈されたす。 A1はresです。 状態11では、A1もresであり、関数の出力に䟛絊されるF1に入るのは圌です。 状態1のF1は明らかにopです。 倉数のズボンの色の区別を導入するこずを提案したす。 resを赀、 opを緑、そしお1぀を茶色ずしお瀺したすたったく察照的ではありたせんが、他の色はさらに察照的ではありたせん。







実際、党䜓の真実が明らかにされおいたす。 比范ず蚈算のためにA1が䞀時的にF1で䞀時的にどのように倉化するか、比范実際にはビットCを生成ず匏ぞの参加の䞡方に同じ差がどのように䜿甚されるかを確認したす。 Cアルゎリズムの空のスペヌスバむパスがオヌトマトンの遷移グラフの長いブランチによっお゚ンコヌドされる理由さえわかりたすこのブランチでは、レゞスタはメむンコヌドブランチで発生する亀換ず同じように亀換されたす。 すべおが芋えたす。



私を苊しめるこずのない唯䞀の質問は、著者がどのようにFIFOをシングルバむトモヌドに切り替えたのですか ドキュメントには、このために補助制埡レゞスタのCLRビットをナニットに䞊げる必芁があるず曞かれおいたすが、APIに同様の゚ントリがあるこずはわかりたせん。 おそらく誰かがこれを理解し、コメントを曞くでしょう。



さお、そしお独自の䜕かを開発する-取埗したスキルを䜿甚しお、逆の順序で。



おわりに



UDBに基づいお「ファヌムりェア」を開発するスキルを開発するには、ドキュメントを読むだけでなく、他の人のデザむンからむンスピレヌションを匕き出すこずも圹立ちたす。 PSoC Creatorに付属するコヌドはリファレンスずしお圹立ち、コンパむラヌが提䟛するビヘむビアヌモデルは、ドキュメントの意味をよりよく理解するのに圹立ちたす。 この蚘事では、サヌドパヌティのメヌカヌのサンプルセットぞのリンクも提䟛し、そのようなサンプルの1぀を解析するプロセスを瀺しおいたす。



これに぀いおは、UDBでの䜜業に関する著䜜暩の蚘事のサむクルは完了したず芋なすこずができたす。 圌が誰かが実際に圹立぀知識を埗るのを手䌝っおくれたら嬉しいです。 ただドキュメントの翻蚳がいく぀かありたすが、統蚈ではほずんど誰も読んでいないこずが瀺されおいたす。 トピックを簡単に説明するために、それらはきれいに蚈画されおいたす。



All Articles