build-sequential-circuit
À propos
Cette compétence construit des circuits numériques séquentiels (avec état) incluant des verrous, des bascules, des compteurs et des machines à états finis. Elle couvre des composants tels que les bascules D/JK, les compteurs binaires/BCD/à anneau, et les conceptions de machines de Mealy/Moore avec analyse temporelle. Utilisez-la lorsque vous avez besoin de circuits qui mémorisent les entrées passées, comptent des événements ou mettent en œuvre des séquences de contrôle dépendantes de l'état.
Installation rapide
Claude Code
Recommandénpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/build-sequential-circuitCopiez et collez cette commande dans Claude Code pour installer cette compétence
Documentation
順序回路の構築
必要なメモリと状態タイプを特定し、状態図と遷移表を構成し、選択したフリップフロップタイプの励起方程式を導出し、フリップフロップと組み合わせ論理を使用してゲートレベルで回路を実装し、タイミング図分析と状態シーケンスシミュレーションによって正確性を検証することで、順序論理回路を設計する。
使用タイミング
- 回路がクロックサイクルにわたって過去の入力を記憶するか内部状態を維持する必要がある時
- カウンタ(バイナリ、BCD、リング、ジョンソン)、シフトレジスタ、シーケンス検出器を設計する時
- 状態図または正規表現から有限状態機械(MealyまたはMoore)を実装する時
- 組み合わせデータパスにクロック付きストレージ要素(レジスタ、パイプラインステージ)を追加する時
- simulate-cpu-architectureスキル用のステートフルコンポーネント(レジスタファイル、プログラムカウンタ、制御FSM)を準備する時
入力
- 必須: 動作仕様 -- 状態図、状態表、タイミング図、検出する正規表現、または望ましい順序動作の言語記述のいずれか
- 必須: クロック特性 -- エッジトリガ(立ち上がり/立ち下がり)またはレベル感応; 単一クロックまたはマルチフェーズ
- 任意: フリップフロップタイプの好み(D、JK、T、またはSR)
- 任意: リセットタイプ -- 同期、非同期、またはなし
- 任意: 最大状態数またはビット幅制約
- 任意: タイミング制約(セットアップ時間、ホールド時間、最大クロック周波数)
手順
ステップ1: メモリと状態要件の特定
回路が記憶する必要があるものと必要な異なる状態の数を判定する:
- 状態列挙: 回路が取る必要があるすべての異なる状態をリストする。シーケンス検出器の場合、各状態はターゲットシーケンスの進行を表す。カウンタの場合、各状態はカウント値。
- 状態符号化: 状態のバイナリ符号化を選択する。
- バイナリ符号化: N状態にceil(log2(N))個のフリップフロップを使用。フリップフロップ数を最小化。
- ワンホット符号化: 状態ごとに1つのN個のフリップフロップを使用。より多くのフリップフロップのコストで次状態ロジックを簡素化。
- グレーコード符号化: 隣接する状態が正確に1ビットだけ異なる。遷移中の過渡的グリッチを最小化。
- 入出力分類: 主入力(外部信号)、主出力、内部状態変数(フリップフロップ出力)を特定する。Mealy機械では出力は状態と入力の両方に依存する。Moore機械では出力は状態のみに依存する。
- フリップフロップタイプ選択: 設計のニーズに基づいて選択する。
- Dフリップフロップ: 最もシンプル -- 次状態はD入力に等しい。最良のデフォルト選択。
- JKフリップフロップ: 最も柔軟 -- J=K=1でトグル。カウンタに適する。
- Tフリップフロップ: トグルタイプ -- T=1で状態を変更。バイナリカウンタに自然。
- SRラッチ/フリップフロップ: セット-リセット -- S=R=1条件を避ける。新しい設計ではほとんど好まれない。
## State Requirements
- **Number of states**: [N]
- **State encoding**: [binary / one-hot / Gray]
- **Flip-flops needed**: [count and type]
- **Machine type**: [Mealy / Moore]
- **Inputs**: [list with descriptions]
- **Outputs**: [list with descriptions]
- **Reset behavior**: [synchronous / asynchronous / none]
期待結果: 符号化が選択され、フリップフロップタイプが選択され、機械がMealyまたはMooreに分類された完全な状態インベントリ。
失敗時: 仕様から状態数が不明確な場合、回路のメモリ深度までのすべての可能な入力シーケンスを追跡して状態を列挙する。数が実用的な限界を超える場合(手動設計で16状態以上)、相互作用するより小さなFSMへの分解を検討する。
ステップ2: 状態図と遷移表の構成
回路の動作を状態図と等価な表形式として形式化する:
- 状態図: 有向グラフを描く:
- 各ノードは状態で、状態名と(Moore機械の場合)出力値でラベル付け
- 各辺は遷移で、入力条件と(Mealy機械の場合)出力値でラベル付け
- すべての状態はすべての可能な入力組み合わせに対して出力辺を持つ必要がある -- 暗黙の「滞在」遷移はない
- 遷移表: 図を現在状態、入力、次状態、出力のカラムを持つ表に変換する
- 到達可能性チェック: 初期/リセット状態から開始して、すべての状態がある入力シーケンスを通じて到達可能であることを確認する。到達不能な状態は設計エラーを示すか、ドントケアとして扱うべき
- 状態最小化(任意): 等価状態をチェックする -- すべての入力に対して同じ出力を生成し、等価な次状態に遷移する2つの状態は等価。等価状態をマージしてフリップフロップ数を削減する
## State Transition Table
| Present State | Input | Next State | Output |
|--------------|-------|------------|--------|
| S0 | 0 | S0 | 0 |
| S0 | 1 | S1 | 0 |
| S1 | 0 | S0 | 0 |
| S1 | 1 | S2 | 0 |
| ... | ... | ... | ... |
- **Unreachable states**: [list, or "none"]
- **Equivalent state pairs**: [list, or "none"]
期待結果: すべての現在状態/入力組み合わせをカバーする完全な状態遷移表で、初期状態からすべての状態が到達可能。
失敗時: 遷移表に欠落エントリがある場合、仕様が不完全。要件に戻って曖昧さを解決する。到達不能状態がある場合、それに到達する遷移を追加するか、削除して状態符号化を縮小する。
ステップ3: 励起方程式の導出
遷移表からフリップフロップ入力方程式(励起方程式)を計算する:
- 状態の符号化: 遷移表の状態名をバイナリ符号化に置換する。各ビット位置が1つのフリップフロップに対応する
- フリップフロップごとの真理値表の構築: 各フリップフロップについて、現在状態ビットと入力を入力カラム、必要なフリップフロップ入力を出力カラムとする真理値表を作成する
- Dフリップフロップ: D = 次状態ビット(最もシンプルなケース)
- JKフリップフロップ: 励起表を使用: 0->0にはJ=0,K=X; 0->1にはJ=1,K=X; 1->0にはJ=X,K=1; 1->1にはJ=X,K=0が必要
- Tフリップフロップ: T = 現在状態 XOR 次状態(ビットが変更される必要がある時T=1)
- 各方程式の最小化: evaluate-boolean-expression(カルノー図または代数簡略化)を各フリップフロップ入力関数に適用する。到達不能状態からのドントケア条件とJK励起表のXエントリが式を大幅に削減できる
- 出力方程式の導出: Moore機械の場合、各出力を現在状態ビットのみの関数として表現する。Mealy機械の場合、各出力を現在状態ビットと入力の関数として表現する
## Excitation Equations
- **Flip-flop type**: [D / JK / T]
- **State encoding**: [binary assignment table]
| Flip-Flop | Excitation Equation |
|-----------|------------------------------|
| Q1 | D1 = [minimized expression] |
| Q0 | D0 = [minimized expression] |
## Output Equations
| Output | Equation |
|--------|------------------------------|
| Y | [minimized expression] |
期待結果: 各フリップフロップの最小化された励起方程式と各主出力の出力方程式で、すべてのドントケアが活用されている。
失敗時: 励起方程式が過度に複雑に見える場合、状態符号化を再考する。異なる符号化(例: バイナリからワンホットへの切り替え、または状態コードの再割り当て)が組み合わせロジックを劇的に簡素化できる。少なくとも2つの符号化を試みてリテラル数を比較する。
ステップ4: ゲートレベルでの実装
フリップフロップと組み合わせ論理ゲートから完全な回路を構築する:
- フリップフロップの配置: 状態ビットごとに1つのフリップフロップをインスタンス化する。すべてのクロック入力をシステムクロックに接続する。指定された場合リセット入力を接続する(非同期リセットはフリップフロップのCLR/PREピンに直接; 同期リセットは励起ロジックの一部)
- 励起ロジックの構築: design-logic-circuitスキルを使用して各励起方程式を組み合わせ回路として実装する。このロジックへの入力は現在状態フリップフロップ出力(Q、Q')と主入力
- 出力ロジックの構築: 各出力方程式を組み合わせロジックとして実装する。Moore機械の場合、このロジックは状態ビットのみを取る。Mealy機械の場合、状態ビットと主入力を取る
- 回路の接続: 励起ロジック出力をフリップフロップのD/JK/T入力に配線する。出力ロジックを主出力に配線する
- 初期化の追加: 回路が電源投入時に既知の初期状態に到達することを保証する。これは通常、すべてのフリップフロップを0(または符号化された初期状態)に強制する非同期リセットを意味する
## Circuit Implementation
- **Flip-flops**: [count] x [type], [edge type]-triggered
- **Combinational gates for excitation**: [count and types]
- **Combinational gates for output**: [count and types]
- **Total gate count**: [flip-flops + combinational gates]
- **Reset mechanism**: [asynchronous CLR / synchronous mux / none]
期待結果: フリップフロップ、励起ロジック、出力ロジック、クロック配分、リセットメカニズムを含む完全なゲートレベルネットリストで、すべての信号が正確に1つのドライバーを持つ。
失敗時: 実装にフリップフロップ外のフィードバックがある場合、組み合わせループが導入されている。同期順序回路のすべてのフィードバックはフリップフロップを通過しなければならない。問題のパスを追跡してレジスタを通じてルートを変更する。
ステップ5: タイミング図と状態シーケンスシミュレーションによる検証
複数のクロックサイクルにわたって回路が正しく動作することを確認する:
- テストシーケンスの選択: すべての状態遷移を少なくとも1回行使する入力シーケンスを選択する。シーケンス検出器の場合、ターゲットシーケンス、部分一致、重複一致、非一致ランを含める
- タイミング図の作成: 各クロックサイクルについて記録する:
- クロックエッジ(立ち上がり/立ち下がり)
- 主入力値(アクティブクロックエッジでサンプリング)
- 現在状態(クロックエッジ前のフリップフロップ出力)
- 次状態(クロックエッジ後のフリップフロップ出力)
- 出力値(出力ロジックが安定した後に有効)
- 状態シーケンスの追跡: 状態のシーケンスがステップ2の状態図と一致することを確認する。すべての遷移は図のエッジに従うべき
- タイミング制約のチェック: 以下を確認する:
- セットアップ時間: 入力がアクティブクロックエッジの少なくともt_setup前に安定している
- ホールド時間: 入力がアクティブクロックエッジの少なくともt_hold後に安定したままである
- クロック-出力遅延: 出力がクロック周期から下流ロジックのセットアップ時間を引いた時間内に安定する
- リセット検証: リセットを適用すると、現在の状態に関係なく回路が初期状態に駆動されることを確認する
## Timing Verification
| Cycle | Clock | Input | Present State | Next State | Output |
|-------|-------|-------|---------------|------------|--------|
| 0 | rst | - | - | S0 | 0 |
| 1 | rise | 1 | S0 | S1 | 0 |
| 2 | rise | 1 | S1 | S2 | 0 |
| ... | ... | ... | ... | ... | ... |
- **All transitions match state diagram**: [Yes / No]
- **Setup/hold violations**: [None / list]
- **Reset verified**: [Yes / No]
期待結果: タイミング図のすべてのサイクルが状態遷移表と一致し、すべてのサイクルで出力が正しく、タイミング違反がない。
失敗時: 状態遷移が間違っている場合、その特定の現在状態と入力組み合わせの励起ロジックを追跡する。出力が間違っているが遷移は正しい場合、エラーは出力ロジックにある。回路が意図しない状態に入る場合、不完全なリセットまたは未使用状態コードからの欠落遷移を確認する。
バリデーション
- すべての状態が列挙され初期状態から到達可能
- 状態符号化が割り当て表とともに文書化されている
- 遷移表がすべての現在状態/入力組み合わせをカバーしている
- 励起方程式がドントケアを活用して最小化されている
- 出力方程式がMealyまたはMooreセマンティクスを正しく実装している
- すべてのフリップフロップにクロック、リセット、励起入力が接続されている
- フリップフロップ外に組み合わせフィードバックループが存在しない
- タイミング図がすべての状態遷移を少なくとも1回カバーしている
- リセットが回路を文書化された初期状態に駆動する
- セットアップおよびホールド時間制約が満たされている
よくある落とし穴
- 不完全な状態遷移: すべての状態のすべての入力に対して何が起こるかを指定し忘れる。欠落した遷移は回路を未定義または意図しない状態に入らせることが多い。すべての入力組み合わせの動作を常に定義する
- 未使用の状態コード: N個のフリップフロップでは2^N個の可能なコードがあるが、有効な状態はそれより少ない場合がある。回路が偶然に未使用コードに入ると(ノイズや電源投入により)、ロックアップする可能性がある。常に未使用コードからリセット状態への遷移を追加するか、到達不能であることを証明する
- MealyとMoore出力の混同: Mealy機械では、出力は入力が変更されると即座に変化する(入力から出力への組み合わせパス)。Moore機械では、出力はクロックエッジでのみ変化する。1つの設計で2つのモデルを混合するとタイミングハザードにつながる
- 同期回路への非同期入力: クロックに同期していない外部信号はセットアップ/ホールド時間に違反し、メタスタビリティを引き起こす可能性がある。非同期入力を状態ロジックで使用する前に、常に2段フリップフロップシンクロナイザを通す
- SRラッチのS=R=1ハザード: セットとリセットの両方を同時にハイにすると、SRラッチが未定義の状態になる。SR要素を使用する場合、この組み合わせが決して発生しないことを保証するロジックを追加するか、DまたはJKフリップフロップに切り替える
- マルチフリップフロップ設計でのクロックスキュー: クロックが異なるフリップフロップに異なるタイミングで到着する場合、1つのフリップフロップが別のフリップフロップから古いデータをサンプリングする可能性がある。入門設計ではゼロスキューを仮定する; 実際のハードウェアではクロックツリーシンセシスを使用する
関連スキル
design-logic-circuit-- 組み合わせ励起および出力ロジックブロックを設計するsimulate-cpu-architecture-- CPUデータパスで順序ブロック(レジスタ、カウンタ、制御FSM)を使用するmodel-markov-chain-- 有限状態機械は離散時間マルコフ連鎖の形式的フレームワークを共有する
Dépôt GitHub
Compétences associées
content-collections
MétaCette compétence propose une configuration éprouvée en production pour Content Collections, un outil axé sur TypeScript qui transforme des fichiers Markdown/MDX en collections de données typées de manière sûre avec une validation Zod. Utilisez-la lors de la création de blogs, de sites de documentation ou d'applications Vite + React riches en contenu pour garantir la sécurité de typage et la validation automatique du contenu. Elle couvre tout, de la configuration du plugin Vite et de la compilation MDX à l'optimisation des déploiements et la validation des schémas.
polymarket
MétaCette compétence permet aux développeurs de créer des applications avec la plateforme de marchés prédictifs Polymarket, incluant l'intégration d'API pour le trading et les données de marché. Elle fournit également une diffusion de données en temps réel via WebSocket pour surveiller les transactions en direct et l'activité du marché. Utilisez-la pour mettre en œuvre des stratégies de trading ou pour créer des outils traitant les mises à jour de marché en direct.
creating-opencode-plugins
MétaCette compétence aide les développeurs à créer des plugins OpenCode qui s'interconnectent avec plus de 25 types d'événements tels que les commandes, les fichiers et les opérations LSP. Elle fournit la structure du plugin, les spécifications de l'API événementielle et les modèles d'implémentation pour les modules JavaScript/TypeScript. Utilisez-la lorsque vous avez besoin d'intercepter, de surveiller ou d'étendre le cycle de vie de l'assistant IA OpenCode avec une logique personnalisée pilotée par les événements.
sglang
MétaSGLang est un framework de service LLM haute performance spécialisé dans la génération rapide et structurée pour les workflows JSON, regex et agentiques grâce à son cache de préfixe RadixAttention. Il offre une inférence nettement plus rapide, particulièrement pour les tâches avec des préfixes répétés, ce qui le rend idéal pour les sorties complexes et structurées ainsi que les conversations multi-tours. Choisissez SGLang plutôt que des alternatives comme vLLM lorsque vous avez besoin d'un décodage contraint ou que vous construisez des applications avec un partage étendu de préfixes.
