デジタルロジックの設定ビット数を取得する


9

演習として、私はシンプルなデジタルロジックでのコンウェイのライフゲームの実装を設計しようとしています。9変数の関数を最小化することですべてを実行できますが、それでもまだかなり大きいと思います。アルゴリズムのコア要素の1つは、8つのネイバーのうちいくつが「生きている」かを決定することです。

8つの入力がある場合、設定されている数を決定する最も簡単な方法は何ですか?特に、2を設定したときに高い出力、3を設定したときに高い出力が必要です。

私の主なアイデアは、PISOシフトレジスタ、カウンター、3:8デコーダーで構成されていますが、それらすべてを駆動するマイクロコントローラーがかなり必要です。関数の複雑さのようには思えません。256x2 ROMも同様に機能するかもしれませんが、私の検索ではそのような部分は見つかりませんでした。

私は10 IOのpicでこれを簡単に実行できることを知っていますが、可能な限り最小限の方法で実装したいと考えています。

回答:


13

Fast Bit Countingに関するさまざまなアルゴリズムがわかります。最後の2つ:Nifty Parallel CountとMIT HAKMEM Countは、簡単にゲートに変換できます。動作の詳細については、このページを参照してください

ゲートハードウェアを使用してこれを行うことができます。4つの1ビット加算器を使用して、ビットのペアを加算します。これにより、4つの3ビット数値が得られます。2つの3ビット加算器を使用して、これらをペアで追加します。これにより、1つの4ビット加算器を使用して2つの4ビット数値を加算できます。これにより、5ビットの値が残りますが、トップビットは無視できます。次に、2つの4ビットコンパレータを使用して、値2および3をテストします。

部品点数を最小限に抑えるために、アナログではどうでしょうか

上部に1つの抵抗を備えた分圧器を作成し、8つの入力を並列に8つの抵抗によって下部に接続します。次に、2つのコンパレータセットを使用して、2ビットまたは3ビットが生成する電圧レベルを検出します。それはたった6つの部分です:

ビット数検出器

8抵抗ネットワークは、0v(0ビットセットの場合)〜5v(8ビットセットの場合)の電圧を生成します。2ビットは0.5vを生成します。3ビットは1.56vを生成します。

  • 0または1ビットの場合、出力は00になります。
  • 2ビットまたは3ビットの場合、出力は01になります。
  • 4ビット以上の場合、出力は11になります。

追加:

素晴らしい提案をしてくれたDavidCaryに感謝します。たくさんの計算を行った結果、機能する抵抗器のセットを見つけたと思いますが、最初に私の計算を注意深くチェックする必要があります。ここでは、オープンドレイン出力のコンパレータを使用していますが、出力を1つにすることができたと思います。低は次のラウンドで死んでいることを意味し、高は次のラウンドで生きていることを意味します。

コンウェイのライフサーキットゲーム2

この回路のコンポーネントは、他の回路よりも2つ多いだけです。これらはすべてE8シリーズの抵抗なので、手に入れることができるはずです。また、R6は4.7kなどの高い値である必要があります。


4
あなたの答えが「マイクロコントローラを使用する」ではないという理由だけで+1 。これがデフォルトのモードのようです。
コナーウルフ

@FakeName:最初の参照はソフトウェアソリューションです。もちろん、それらをマイクロコントローラーに実装する必要はありません。スーパーコンピューターを使用することもできます:)
Federico Russo

@FedericoRusso-ハードウェアに実装する方法についての洞察を与えるソフトウェアソリューションへの参照を提供しました。
Rocketmagnet 2012年

3
おそらく:中央セルの現在の状態から20キロオームの9番目の「加算抵抗」をRocketmagnetの回路のオペアンプ「+」加算ポイントに追加します。つまり、中央セルに1の重みと8つの隣接セルを割り当てます。重み2。次に、分圧器を調整して、 "birth"(3つのライブネイバーを持つ中央デッドセル、合計= 6)および "stay alive"(2つまたは3つのライブネイバーを持つ中央デッドセル、合計= 5または7) 「01」の出力を提供します。他のすべての場合(中央のセルが死ぬか死んだままの場合)は、「00」または「11」の出力を提供します。次に、XORゲートが中央セルの次の状態を示します。
davidcary 2012年

1
私がいくつかの実験を行って見つけたいくつかのこと:抵抗は完全に正しくありません。より良い組み合わせをいくつか見つけましたが、まだ最適化を試みています。また、これらのグリッドを作成すると、summimg抵抗器を介して電流が逆流し、物事が台無しになります。インターリンクのダイオードはこれを防ぐ1つの方法です。
captncraig

6

μ

ルックアップテーブルも1つのパーツであり、マイクロコントローラーより高速です。パラレルEEPROMは忘れてください。高価です。バイト幅のパラレルフラッシュを使用します。これは512 kByteで、必要な容量の2000倍ですが、最も安価なソリューション(1ドル)です。そして、同じ価格でさらに6つの1ビット関数を追加できます。

CPLDを使用することもできます。関数をVHDLまたはVerilogで1つの長いSOP(Sum Of Products)ステートメントとして記述し、シンセサイザにロジックを作成させます。

シフトレジスタは、あなたが結果を待つことができればOKです。これが最も遅い解決策です。

最後に、論理ゲートを使用してそれを行うことができますが、すべての基本を使いたい場合は、SOPを最小限の形式に減らすために多くの時間を費やします。Rocketmagnetは加算器を使用して正しいアイデアを持っていますが、彼の数は間違っています:1ビットの半加算器は3ではなく2ビットを出力します。ビットの結果。4ビットの結果を取得するには、3ビットの半加算器を使用します。1ビットの全加算器を使用すると、2ビットの加算器が1つだけ必要になります。


1

ハイブリッド並列順次回路は、純粋並列回路よりもはるかにコンパクトになる傾向があります。たとえば、3 x 3ボックスが3つ未満のライブセルまたは4つを超える場合は中央のセルをオンにし、ちょうど3つのライブセルがある場合はそれをライブにするようにルールを調整する場合(これらの下での動作新しいルールは元のルールと一致します)、2ステップのシーケンスを実行することでロジックを簡略化できます。

tempVal [x、y] = orig [x-1、y] + orig [x、y] + orig [x + 1、y] '3つの1ビット数値の2ビット合計
orig [x、y] = LiveDeadFunc(orig [x、y]、tempval [x、y-1] + tempVal [x、y] + tempVal [x、y + 1])

配列にtempVal[x,y]はセルごとに2ビットがあります。後者の演算では、3つの数値を合計して0〜9の値を生成します(ただし、4を超える値はすべて同等です)。これを使用して、次世代のシングルビットライブ/デッドステータスを計算できます。

ところで、第2ステージで算術合計を実行して値を調べる代わりに、tempVal [x、y]をワンホット表現に変換し、3つの値をもたらす9つの値の組み合わせの1つを明示的にチェックします。セル、または4つを生成する12の1つ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.