回路

8ビットコンピュータの作り方:18ステップ(写真あり)

不要嘲笑我們的性

不要嘲笑我們的性

目次:

Anonim

8ビットTTLコンピュータを構築するのは、大変で煩雑な作業のように思えます。あるいは、基本的なCPUのアーキテクチャを理解するために旅を始めたときには、少なくともそれは私には必要でした。それになると、あなたはそのプロセスのすべての背後にある基礎を学べば、CPUの動作はかなり簡単です。このプロジェクトは、自分のコンピュータを構築し、その過程で得られる素晴らしい知識を得ることに興味がある人を助けることを目的としています。試すことを恐れないでください、あなたは学ぶことしかできません。
このプロジェクトは、エレクトロニクスの基本を説明することから始めます。その後、バイナリ論理とブール論理の基本について説明します。最後に、Malvinoのテキストで説明されているように、(いくつかの変更を加えた)できるだけ単純なコンピューターのさまざまな部分の機能に移ります。 デジタルコンピュータエレクトロニクス 。つまり、このInstructableの最終製品は、独自の命令セットを使ってプログラムできるコンピュータになります。このプロジェクトは、コンピュータの設計面の多くをあなたに任せ、あなた自身のコンピュータを作るためのガイドとしても役立ちます。これは、このプロジェクトに取り組む方法がたくさんあるためです。もしあなたが既にブール論理とバイナリの働きをしっかり理解しているのであれば、プロジェクトの中身にスキップしても構いません。私はあなたがすべてこのようなビルドから楽しんでそして何かを得ることを願っています、私は確かにそうしたということを知っています。
このプロジェクトのためにあなたが必要となるでしょう:
1.)電源
2.)ブレッドボード+たくさんのワイヤー
3.)出力用LED
4)各種ロジックIC(後述)
5.)フリータイム
6.)失敗して失敗から学ぶ意欲
7.)たくさんの忍耐
オプション(ただし非常に便利):
1.)オシロスコープ
2.)デジタルマルチメータ
3.)EEPROMプログラマー
4.)ソニックドライバー
このようなプロジェクトに役立つリンク
デジタルコンピュータエレクトロニクス:
http://www.amazon.com/Digital-computer-electronics-Albert-Malvino/dp/007039861
TTLクックブック: http://www.amazon.com/TTL-Cookbook-Understanding-Transistor-Transistor-Integrated/dp/B0049UUV38

用品:

ステップ1:コンピュータとは

これは非常に単純化した質問のように思えるかもしれませんが、実際には多くの人が真の答えを知らないという質問に答える必要はありません。コンピュータは、機械的および理論的な形でトランジスタよりはるかに長く存在しています。コンピュータの実際の定義は、Alan Turingという名前の非常に賢い人によって考え出されました。彼はチューリング機械と呼ばれる機械について説明しました。あなたがこれを読んでいるコンピュータや携帯電話からスーパーコンピュータまで、私たちが今日使うすべてのコンピュータは、それらの最も単純化されたレベルでチューリングマシンとして分類することができます。
チューリングマシンとは何ですか?チューリングマシーンは4つの部分から成ります:テープ、ヘッド、テーブルと状態レジスタ。このような機械の動作を視覚化するには、まず、各方向に無限に広がるフィルムストリップを想像する必要があります。このフィルムストリップの各セルには、定義済みのシンボルセット(アルファベットなど)の1つのみを含めることができるとします。この例では、各セルには "0"または "1"のいずれかしか格納できないとします。これらのセルは無限の時間で書き換えることができますが、それらが再び変更されるまでそれらの情報を無期限に保持します。ヘッドとして知られるチューリングマシーンの部分はセルに記号を書くことができ、またフィルムストリップ上のその位置を与えられた整数(整数)のセルだけ増加または減少させることができる。次の部分は、「4セル右に移動」や「セルを1に設定」など、ヘッドが実行するための指定された一連の命令を保持するテーブルです。チューリングマシンの4番目と最後の部分はその状態レジスタで、その目的はマシンの現在の状態を保持することです。状態には、命令とテープ上の現在のデータが含まれます。
それがコンピュータの操作がとても簡単なことです。あなたのコンピュータが動作するとき、それは実際にチューリングマシンとして動作しています。それはあなたのコンピュータに保持されているデータを与えられた命令とアルゴリズムのセットによって処理します。このInstructableで説明されているコンピュータは、非常に単純化されたコンピュータのモデルですが、それでも、実行して実行する一連の命令でプログラムできるものとして動作します。
便利なリンク
チューリングマシンに関するウィキペディア:
http://en.wikipedia.org/wiki/Turing_machine

ステップ2:エレクトロニクス入門

8ビットコンピュータを構築する前に、電気とアナログ回路の基本的な特性を把握しておくことは非常に便利です。あなたが構築するコンピュータ上の部品にはアナログコンポーネントが必要になります。電気工学の分野でのクラッシュコースを提供するために、最小限のコストで利用可能な多くの電子自習用ガイドがあります。私は個人的に見つけました 電子自己教育ガイド アナログ電子の世界に取り組むための素晴らしい本になるためにハリーキベットとアールボイセンによって。
電子自己教育ガイド :http://www.amazon.com/Electronics-Self-Teaching-Guide-Teaching-Guides/dp/0470289619/
共通コンポーネント
抵抗器 - 電流を制限します。単位はΩです。
コンデンサ - 電荷を保存します。極性または非極性のどちらでもかまいません(極性とは、正しく機能するように配置する必要があることを意味します)。ファラッドで測定されます。
ダイオード - 一方向にのみ電流を流すことができ、間違った方向に置くと特定の電圧で故障します。
トランジスタ - メディエータとして機能する3番目のピンによって制御される電流ゲート。トランジスタには多くの種類がありますが、ここでは2種類のNPNとPNPがあるBJT(バイポーラ接合トランジスタ)について説明します。

電流、電圧、抵抗は回路内で密接に関係しています。 3者間の関係はオームの法則で表すことができます:V = IR。言い換えれば、電圧はアンペアの電流にオームの抵抗を掛けたものです。オームの法則は電子工学の最も重要な公式の一つであり、それはあなたの頭の上から知っておく価値があります。
オームの法則を適用するには、回路の抵抗を知る必要があります。抵抗の値を見つけるには、そのカラーコードを使う必要があります。抵抗カラーコードは可視スペクトルに基づいており、さまざまな方法で記憶できます。それを暗記したくない人のために、あなたがあなたの抵抗器のために正しい値を見つけるのを助けるために存在するたくさんのツールがあります。回路の総抵抗を計算するには、直列と並列の2つの異なる抵抗構成に対して2つの式が必要です。直列では一方の抵抗器が他方の抵抗器に追従し、一方並列ではそれらは互いに並んで作用する。シリーズで式は非常に簡単です:
直列の抵抗器:R(合計)= R(1)+ R(2)+。 。 。 + R(N)
つまり、抵抗値を合計するだけでいいということです。
並列の抵抗器:R(合計)= 1 / {1 / R(1)+ 1 / R(2)+。 。 。 + 1 / R(N)}
カラーコードから抵抗を見つけるための良いツール:http://www.csgnetwork.com/resistcolcalc.html
2人の人が1つのプロジェクトで作業しているように、抵抗器が一緒に機能していると考えると、抵抗器の式を並列に理解するのが簡単です。あなたが二人で操作する割合が与えられていて、あなたが一緒に仕事をした場合に彼らのプロジェクトがどのくらい早く完成するかを見つけなければならないという言葉の問題に対して同じ式が使われます。
与えられた抵抗値で与えられた部品にどれだけの電流が供給されているかを調べるには、単に抵抗と電圧の値をオームの法則に代入してIについて解くだけです。例えば:
光が回路内にあり、2つの1K(1000オーム)抵抗器が並列に配置されています。 9ボルトの電源で、どれくらいの電流が光に供給されますか?
1.)R(合計)を計算します。
R(合計)= 1 /(1/1000 + 1 / 1000)= 1 /(2/1000)= 1000 / 2 = 500オーム
2)オームの法則を使用して電流を計算します。
9 = I * 500
I = 9/500 = 0.018 A = 18 mA(ミリアンペア)
回路内に抵抗を配置して電圧を調整することもできます。これは分圧器と呼ばれ、直列の2つの抵抗器を含みます。 2つの抵抗の電圧出力はそれらの接続点にあります。より良いアイデアについては、私が添付した写真を見てください。この配置では、電圧出力の式は次のとおりです。
V(out)= V(source)* R(2)/ {R(1)+ R(2)}
コンデンサはあなたのコンピュータの時計の構造に役立ちます。クロックは単に一定の速度でオン/オフする回路です。抵抗器と同じように、コンデンサには、直列構成と並列構成の両方の合計値を求めるための2つの式があります。
シリーズ:C(合計)= 1 / {1 / C(1)+ 1 / C(2)+。 。 。 + 1 / C(N)}
平行:C(合計)= C(1)+ C(2)+。 。 。 + C(N)

コンデンサが充電される速度は、コンデンサの静電容量だけでなく、コンデンサの前(放電している場合は後)の回路の抵抗によっても異なります。コンデンサの充電は時定数で測定されます。コンデンサを完全に充電または放電するには5つの時定数が必要です。秒単位でコンデンサの時定数を求める式は、次のとおりです。
T(定数)=抵抗*静電容量
ダイオードは操作が簡単で、TTLコンピュータを構築するときに役立ちます。それらは電流が一方向にのみ流れることを可能にする。それらが正しい方向に置かれているとき、それらは順バイアスと呼ばれるものです。それらが逆にされると、それらはある電圧で破壊されます。ダイオードが電流に逆らって動作しているときは逆バイアスされます。
トランジスタは、電流によって作動するバルブのように作動します。 BJTには、コレクタ、エミッタ、ベースの3つのピンがあります。簡単にするために、このステップでは、電流がコレクタからエミッタへ流れるNPNトランジスタについて説明する。ベースに印加される電流は、コレクタからエミッタへ流れる電流量を制御します。トランジスタは、信号を増幅する能力があるため、多くのアプリケーションに最適です。これは、トランジスタのベースに印加される電流が、制御される電流よりもかなり小さい可能性があるためです。この電流の増加は、トランジスタの電流増加、またはベータと呼ばれます。 betaの式は次のとおりです。
ベータ=現在(コレクタ)/現在(ベース)
トランジスタが完全にオンになると、それは飽和状態にあると言われます。ブールトランジスタは、飽和状態またはオフ状態にあり、その間には存在しないトランジスタです。これは、主にデジタル電子機器で扱うことになるトランジスタのタイプです。トランジスタは、コンピュータが機能するのに必要な論理ゲートを形成します。これらについては後述する。
便利なリンク
http://en.wikipedia.org/wiki/Resistor
http://en.wikipedia.org/wiki/Capacitor
http://en.wikipedia.org/wiki/Diode
http://en.wikipedia.org/wiki/Transistor

ステップ3:2進数

今日私達は数10に基づいている世界的なナンバリングシステムに慣れています。つまり、10という値に相当する数字システムに数字がないということです。つまり、この数字システムは10進法です。
私たちのナンバーシステムを走行距離計と考えてください。走行距離計は、最下位桁から最上位桁までをカウントしてから、次のローターを順番に1つ進めます。例えば:
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
1 0 < - 次の桁に進む
2進数は基数2で、2つの数字しかなく、2には数字がないことを意味します。2進数は0と1、または「off」と「on」の数字のみを持ちます。バイナリでカウントするには、オドメーターテクニックを適用するだけです。
0001b - 1
0010b - 2
0011b - 3
0100b - 4
0101b - 5
0110b - 6
0111b - 7
1000b - 8
など。 。
それを10進法にする私たちの数体系のもう一つの要因があります。数字を大きくすると、数字の重みは10のべき乗で増えます。例えば、1 = 10 ^ 0、10 = 10 ^ 1、100 = 10 ^ 2などです。 。 。 2進法では、もちろん物は2を底としているので、それぞれの連続した数字は2のべき乗です。 1b = 1 = 2 ^ 0、10b = 2 = 2 ^ 1、100b = 4 = 2 ^ 2など。 。 。
10進数を2進数に変換するには、ダブルダブルとして知られている単純なトリックがあります。これにより、プロセスがはるかに簡単になります。
13を2進数に変換したいとすると、13を2で割って残りを書き留めることから始めます。それから真上にあなたは余り(この場合6)なしで結果の数を書き留め、それを2で割って前のものの上の余りを書き留めます。 1または0に達するまでこのプロセスを続けます。最後に、結果を取得するために上から下に読みます。
1/2 = 0 R1 <上から下に読みます。結果は1101または2 ^ 0 + 0 + 2 ^ 2 + 2 ^ 3 = 1 + 0 + 4 + 8 = 13です。これはバイナリワードと呼ばれます。
3/2 = 1 R1 <
6/2 = 3 R0 <
13/2 = 6R1 <
16進数はバイナリで非常によく使われます。 16進数は16進数で、0から9の数字とaからfの数字を含みます。 1ニブルまたは4ビットのデータを記述するために1つの16進数が使用されます。ビットは、1の1または0の2進数です。次のビットが次のニブルに入る前に、ニブルは0から15(0000から1111)までカウントできます。 2ニブルは一緒に1バイトまたは8ビットです。最初の数字は2 ^ 0なので、最後の数字は2 ^ 7です。したがって、1バイトは0から255の範囲のどこでもかまいません。バイト00101110(10進数で46)を16進数で表現するには、まず2つのニブルを0010と1110に分けます。最初のニブルの値は2、そして2番目のニブルは2です。 1つはE(または10進数で14)の値を持ちます。したがって、16進数のバイト00101110は2Eになります。
便利なリンク
http://en.wikipedia.org/wiki/Binary_numeral_system
http://en.wikipedia.org/wiki/Hexadecimal

ステップ4:ロジックゲート

コンピュータは、特定の機能を実行するように配置された何千もの論理ゲートで構成されています。論理ゲートはデジタル電子機器のコンポーネントで、その出力は入力の状態に依存します。ほとんどの論理ゲートには2つの入力と1つの出力があります。あなたはデジタル電子機器の意思決定者として論理ゲートを考えることができます。デジタルエレクトロニクスで使用される6つの主な論理ゲートは次のとおりです。
ANDゲート:入力がハイの場合、出力はすべてハイになります。
ORゲート:いずれかの入力がハイの場合、出力はハイです。
NOTゲート:入力は1つだけです。入力がローのとき、出力はハイです。
NANDゲート:すべての入力がハイでない限り、出力はハイです。
NORゲート:どの入力もハイでないとき、出力はハイです。
XORゲート:奇数個の入力がハイのとき、出力はハイです。

トライステートバッファ:第3の論理信号によって制御されるバッファ。
ここで重要なのは、ハイの "1"信号とローの "0"信号の違いです。ハイ信号は、正電圧への接続でも、フローティング入力でもかまいません。浮動入力は、どの出力にも接続されていない入力です。浮動入力の例としては、まったく接続されていない入力、またはアクティブにされていないスリーステートバッファの出力に接続されている入力があります。入力がグランドになると、ロー信号が存在します。
論理ゲートを相互に供給して、考えられるほとんどすべての機能を生成することができます。例えば、電力が回路に供給されている間に2つのNORゲートを互いに供給して1ビットのデータをRS_NORラッチに記憶することができる。

ステップ5:バイナリカウント(プログラムカウンタ)

コンピュータにとって最も重要な部分の1つはそのプログラムカウンタです。プログラムカウンタは、実行されるべき命令の現在のアドレスをコンピュータに提供する。ただし、プログラムカウンタが機能するためには、バイナリでカウントする必要があります。これを行うには、JKフリップフロップが使用されます。フリップフロップは、(論理ゲートステップで説明したRS_NORラッチのように)1ビットを格納する論理ゲートの配列です。 JKフリップフロップは、そのクロックパルス入力がハイになってから再びローになると状態が変わります(J入力とK入力もハイにする必要があります)。言い換えれば、JKフリップフロップがクロックパルスの立ち下がりエッジを取得するときはいつでも、その状態は「0」から「1」へ、または「1」から「0」へのいずれかに変化する。
あるJKフリップフロップの出力を別のフリップフロップの出力に接続してそれらをカスケード接続すると、結果はオドメーターのように機能するバイナリカウンターになります。これは、シーケンス内の最初のJKフリップフロップがハイになり、次にローになると、シーケンス内の次のフリップフロップがトリガされるためです。 JKフリップフロップを連続して追加するたびに、クロックの周波数(1秒間に何回オン/オフするか)が半分になります。それが、JKフリップフロップが2分周回路とも呼ばれる理由です。 4つのJKフリップフロップの結果のパターンは0000、0001、0010、0011、0100などになります。 。 。
ただし、このInstructableに記載されているできるだけ単純なコンピュータでは、コンピュータを動作可能にするために必要な機能がいくつかあります。コンピュータがプログラムを再起動できるようにするには、すべての出力をクリアまたはゼロに設定する機能が必要です。プログラムカウンタはまた、コンピュータが特定の命令にジャンプすることを可能にするJMPオペコードのためのバイナリワードをロードする能力を必要とする。この目的を達成するために論理ゲートが使用されます。幸い私たちにとってバイナリカウンタはあなたが必要とするすべての機能を備えた便利なチップに入っています。

ステップ6:レジスタ

登録者:

レジスタはコンピュータの最も重要な部分になる可能性があります。レジスタは、コンピュータの動作中に一時的に値を格納します。このInstructableで説明されている8ビットコンピュータは、そのALUに接続されている2つのレジスタ、現在の命令を格納するためのレジスタ、およびコンピュータの出力用のレジスタを持っています。

チップに応じて、レジスタには2本または3本の制御ピンがあります。使用するレジスタには、出力イネーブルと入力イネーブルの2つの制御ピンがあります(両方ともローのときにアクティブ)。出力イネーブルピンがグランドに接続されていると、現在格納されているバイナリワードが出力ピンに送信されます。入力ピンがグランドに接続されると、入力ピンに存在するバイナリワードがレジスタにロードされます。

コンピュータでレジスタを使用する例としては、ALU(算術演算を実行する算術論理装置)のアキュムレータがあります。アキュムレータは、ALUの出力を保存するコンピュータのスクラッチパッドのようなものです。アキュムレータもALUの最初の入力です。 Bレジスタは2番目の入力です。加算演算では、最初の値がアキュムレータにロードされます。その後、最初の値に加算される2番目の値がBレジスタにロードされます。アキュムレータとBレジスタの出力はオープンに融合され、常にALUに供給されています。加算の最後のステップは、操作の出力をアキュムレータに転送することです。

レジスタはすべてバスと呼ばれる共有データラインで動作します。バスは、あらゆるCPUのアーキテクチャと同数のワイヤのグループです。これは、バス幅がCPUアーキテクチャーを定義する尺度であることを考慮すると、実際にカートよりも先に進んでいます。デジタル1は正の電圧を意味し、0は接地を意味するので、バスに選択的に接続および切断する能力を与えずにすべてのレジスタに同じバスを共有させることは不可能です。幸いなことに、1と0の間には現在の代入とは矛盾する3番目の状態があり、これはこれに最適です。トライステートバッファに入ります。ワイヤのグループを選択的にバスに接続できるようにするチップです。これらのトライステートバッファのいくつかを使用して、通信を必要とするコンピュータ全体のすべてのレジスタとチップにバスと同じワイヤを共有させることができます。私のコンピュータの場合、ブレッドボードの一番下のピンにまたがるのは、8線幅のブレッドボードスロットです。バスを使っていろいろ試してみてください。バスでは、情報がすべて揃っているため、バスに問題があると、誤ったデータが流れて波になってしまうことがあります。

ステップ7:ALU

コンピュータのALU(算術論理装置)は、数学的演算を実行する部分です。 SAPコンピュータでは、加算と減算という2つの機能があれば十分です。 2進数での加算と減算は、10進数での加算と減算と非常によく似ています。例えば、
1 < - キャリー1 1 < - キャリービット
05 0101
+05 +0101
10 1010
バイナリを追加するには、全加算器と呼ばれるものが必要です。全加算器は、キャリーインとキャリーアウトを使用して、1ビットのバイナリを別のバイナリに効果的に加算します。全加算器のキャリーインは、加算プロセスの3番目の入力のようなものです。それらは複数の全加算器を一緒にチェーンするために使用されます。全加算器のキャリーアウトは、加算プロセス中に一対のものがあるときに起こる。全加算器のキャリーアウトはキャリーインに供給され、2進数の複数ビットを加算する。全加算器を構成するには、2つのXORゲート、2つのANDゲート、および1つのORゲートが必要です。
2進数を減算するには、数値を負の数値に変換し、それを減算する数値に加算する必要があります。これをするために私達はいわゆる2の賛辞を使います。 2進数の2の補数をとるには、各ビットを反転し(0から1に、1から0に1つずつ)、1を加算します。
5 = 0101, -5 = 1010+1 = 1011
未使用 - > 1 1
10 1010
+(-5) +1011
5 0101
ビットの反転を制御するために、通常1つの低い入力を持つXORゲートを使用します。 1つの通常低い入力では、出力は他の入力と同じです。制御入力をハイに設定すると、もう一方の入力が反転します。この反転を全加算器のキャリーインに送られるビットと組み合わせると、減算演算が結果として得られます。

ステップ8:メモリとRAMのプログラム

実行する命令は、コンピュータのプログラムメモリに保存されています。また、コンピューターの操作中に値を格納できるRAMとしても機能します。プログラムメモリは、メモリ、メモリアドレスレジスタ(MAR)、およびマルチプレクサの3つの主要部分で構成されています。メモリは16バイトの記憶容量を持つチップです。それがどのバイトを読み書きすべきかをそれに伝える4ビットアドレスがメモリに供給されます。 MARは、メモリから読み書きされるバイトの現在のアドレスを格納します。コンピュータがプログラミング状態にない限り、常にメモリチップに供給されています。マルチプレクサを使用すると、2つの入力から選択して指定の入力を出力できます。私のコンピュータで使用されているマルチプレクサは、2つの4ビット入力(MARと手動入力)から選択することを可能にします。コンピュータがプログラミング状態になると、手動アドレスがメモリに入力され、ユーザが定義したアドレスのバイト数をコンピュータのメモリにプログラムすることができます。

ステップ9:命令レジスタ

コンピュータの命令レジスタは、現在の命令とその命令が作用することになるアドレスとを記憶する。それは非常に重要な目的を持つ非常に単純な構成要素です。コンピュータの動作中に、メモリ内の所与のアドレスの内容が命令レジスタに転送される。私のコンピュータでは、左端のfoutビットは実行されるOPコードまたは現在の命令です。右側の4ビット、または最下位の4ビットは、操作に使用するアドレスをコンピューターに指示します。最初の4ビットは常にOPコードを制御マトリックスに送り込み、制御マトリックスは与えられた命令に対して何をすべきかをコンピューターに指示します。アドレスをMARまたはプログラムカウンタに転送できるように、右端の4ビットがコンピュータにフィードバックされます。

ステップ10:出力レジスタ

コンピュータがバスの出力を単にオペレータに供給するだけの場合、この表示はほとんど意味がありません。これが、出力用の値を格納することを目的とした出力レジスタがある理由です。あなたのコンピュータのための出力は生の二進数を表示する単純なLEDであるか、あるいは7セグメントディスプレイ上の実際の数を読むディスプレイを持つことができます。それはすべてあなたがあなたのコンピュータにどのくらいの仕事を入れたいかによって異なります。私のコンピューターでは、Arduinoと組み合わせて私のコンピューターの出力にIV-9ロシアのNumitronチューブを使用して、2進数から10進数に変換しています。

ステップ11:時計

正しく機能するためには、コンピュータ内のすべての部分が完全に同期している必要があります。これを行うためには、あなたのコンピュータは一定の速度で点滅する出力を持つクロックまたは回路を必要とします。これを行う最も簡単な方法は555タイマーを使用することです。 555タイマーは、今日の趣味者にも非常に人気があるコンピュータの出現の時代に発明された、非常に人気のあるタイマーです。 555回路を構築するためには、その動作方法を知る必要があります。
あなたのコンピュータの時計は、最初は比較的遅いはずです。 1Hz、または1秒あたり1サイクルは良い出発値です。これにより、コンピュータの動作を確認したり、エラーがないかを確認したりできます。 555チップは、動作に2つの抵抗と1つのコンデンサを必要とします。 2つの抵抗によって、ハイとローのパルスの長さと全体の周波数が決まります。コンデンサは両方のパルス長を変えます。 555タイマーの経験がない場合は、試してみることをお勧めします。
便利なリンク
http://en.wikipedia.org/wiki/555_timer_IC

ステップ12:アーキテクチャ

これがすべてが集まるステップです。あなたのコンピュータのアーキテクチャを設計する時が来ました。アーキテクチャは、コンピュータのレジスタとさまざまなコンポーネントがどのように構成されているかです。デザインの側面は完全にあなた次第ですが、目標(あなたがあなたのコンピュータに何をさせたいか)とモデルから出発するのを助けるのを助けますが。あなたが私の後にあなたのコンピュータを設計したいのであれば、それは全く問題ありません。で見つけたSAP-1のアーキテクチャを修正しました デジタルコンピュータエレクトロニクス 私の8ビットコンピュータ用です。
常に覚えておくべき設計上の1つの側面は、データがコンピュータのさまざまなコンポーネント間でどのように転送されるかです。最も一般的な方法は、コンピュータ上のすべてのデータに共通の「バス」を使用することです。レジスタ、ALU、プログラムカウンタおよびRAMの入力および出力はすべてコンピュータのバスに接続されている。ワイヤは、最下位ビット(1)から最上位ビット(128)まで順番に並べられている。
バスに接続されているすべての出力は、非アクティブの間は完全に切断する必要があります。そうしないと、互いに結合して誤った出力になります。これを行うために、我々はアキュムレータ、ALUおよびコンピュータのプログラミングのための実際の入力のようなデフォルトで出力する特定の要素の出力を制御するためにトライステートバッファを使用します。

ステップ13:管理マトリックス

コンピュータの制御行列は、個々の部分に入力値と出力値を受け取るタイミングを指示します。コンピュータの各操作には複数の状態があります。これらの状態は、リングカウンタと呼ばれる種類のカウンタによってトリガーされます。リングカウンタは一度に1ビットだけハイを持ち、その出力を連続的に循環します。例えば、リングカウンタが4つの出力を有する場合、それは最初にその最初の出力をアクティブにする。次のクロックパルスで、2番目の出力をハイ(そして最初のロー)に設定します。次のクロックパルスは、ビット1を1つ上に進めます。これらの段階はT状態と呼ばれます。このInstructableのコンピュータは1つのコマンドの操作に6 Tステートを使用しています。最初の3つのTステートは、現在の命令がフェッチされて命令レジスタに配置される、いわゆるフェッチサイクルです。プログラムカウンタも1つインクリメントされます。 3つのT状態の2番目のセットは、どのOPコードが命令レジスタから制御マトリックスに入力されるかによって異なります。 T状態は次のとおりです。
T1:プログラムカウンタの内容をメモリアドレスレジスタに転送する。 (アドレス状態)
T
2:プログラムカウンタが1つインクリメントされます。 (インクリメント状態)
T3:プログラムメモリ内のアドレス指定されたバイトが命令レジスタに転送される。 (メモリ状態)
T4:どのコマンドが実行されているかによって異なります。
T5:どのコマンドが実行されているかによって異なります。
T6:どのコマンドが実行されているかによって異なります。
制御行列を作成するには、2つの方法があります。ディスクリートロジックを使用する方法とROMを使用する方法です。 ROM方式が最も簡単で効率的です。ディスクリートロジックを使用するには、OPコード入力に基づいてコンピュータの正しい制御ワードを出力する大規模なロジック回路図を設計する必要があります。 ROMは読み取り専用メモリを表します。ビルドで使用するために検討できるROMにはいくつかの種類があります。私のコンピュータでは、私はもともとEEPROM(電子的に消去可能なプログラマブルROM)を使用していましたが、その後EEPROMチップの書き込みに失敗した後、NVRAM(不揮発性ランダムアクセスメモリ)に移行しました。 NVRAMは、ランダムアクセスメモリ用であり、固定記憶域用ではないため、お勧めしません。私の考えでは、EEPROMが最も効率的な解決策です。
制御マトリックスは3つのROMチップを有し、各ROMチップは8ビット記憶装置の少なくとも32個のアドレス(ならびにタイミングおよび計数要素)を有する。コントロールマトリックスから送信されるバイナリワードはコントロールROMと呼ばれ、コンピューターのすべてのコンポーネントのすべてのコントロールビットを含みます。あなたは、制御ビットを体系化して、それらの順序を知っていることを確実にしたいです。何の操作もしないためには、コンピュータのすべての部分を非アクティブにするコントロールワードが必要です(もちろん時計を除く)。このInstructableに記載されているコンピュータの制御ワードは16ビット長で、2つの制御ROMチップに格納されています。制御ROMチップの最初の3アドレスはフェッチサイクルのための制御ワードを保持する。チップ上の残りのアドレスは、各OPコードに対して3つずつのペアで制御ワードを保持します。第3のROMチップは、各OPコードに対する制御ワードシーケンスの開始のための記憶場所を保持し、OPコード自体によってアドレス指定される。たとえば、私のコンピュータでは、コントロールにOPコード0110を指定すると、JMPコマンドの開始アドレスであるバイナリ21が出力されます。 OP ROMとコントロールROMの間には0〜2(最初の3つのTステート)からカウントする8ビットのカウンタがあり、3番目のTステートでOP ROMが出力するアドレスをロードし、その位置からT1までカウントします。 stateは再びカウンタをクリアします。制御マトリックス用のリングおよび2進カウンタはクロックパルスの反転によって制御されるので、上昇するクロックパルスがコンピュータの要素に送られるときに制御ワードが存在する。順番に全体のプロセスは次のとおりです。
1)T1状態がカウンタを0にクリアし、0に記憶されている制御ワードが送出される。
2.)クロックがハイになり、アドレス状態が発生します
3.)クロックがローになり、次にコントロールカウンタがインクリメントし、コントロールワード1が送出されます。
4.)クロックがハイになり、インクリメントサイクルが発生します
5.)クロックがローになり、コントロールカウンタが2に増加し、コントロールワード2が送信されます。
6)クロックがハイになり、メモリ状態が発生し、OPコードが命令レジスタに到着する。T3もアクティブであり、これは次のロークロックパルスでOP制御アドレスがロードされることを意味する。
7.)クロックがローになり、与えられたOPコードの3つの制御ワードのうちの最初のワードのアドレスをカウンタにロードします。
8.)T4、T5およびT6はOPコードを実行します
9)T1がカウンタをリセットし、HLT OPが受信されるまでプロセスは継続する。 HLTコマンドはクロックを停止します。

ステップ14:マイクロプログラミング

今、あなたがあなたのコンピュータに可能にして欲しいどんなコマンドを決定する部分です。私は自分のコンピューターに必要な基本的なプログラミング機能を提供する6つの独自の操作を与えました。あなたがあなたのコンピュータにプログラムするコマンドはアセンブリ言語と呼ばれるものです。アセンブリは最も初期のプログラミング言語の1つであり、今日でもコンピュータで使用できます。この言語のコマンドには、アキュムレータのロード、変数の追加、移動、出力、および格納が含まれます。この8ビットコンピュータでは、各コマンドに独自の4ビットOPコードがあります。私のコンピューター用に選んだコマンドは次のとおりです。
NOP:何もしません。 (0000)
LDA:このアドレスの値をアキュムレータにロードします。 (0001)
追加:指定されたアドレスの値をアキュムレータの値に加算します。 (0010)
SUB:アキュムレータの値から指定されたアドレスの値を引きます。 (0011)
STO:アキュムレータの内容を指定されたアドレスに格納します。 (0100)
OUT:オペレータが見えるようにアキュムレータの内容を出力レジスタに格納します。 (0101)
JMP:指定されたアドレスのメモリ内の特定の命令にジャンプします。 (0110)
HLT:コンピュータの動作を停止します。 (0111)
各OPに対してどの制御ワードを送信する必要があるかを判断するには、各Tステート中にどのビットをアクティブにする必要があるかを知る必要があります。私のコンピュータでは、次のようにビットを整理しました(下線はアクティブローのビットを表します)。
CE CO MI MI II II OI BI EO SU AI AO RI HLT X
CE - カウントイネーブル(プログラムカウンタのクロック入力を有効にします)
CO - クロックアウトイネーブル
J - ジャンプ有効
MI - MAR入力
RO - プログラムメモリアウト
II - 命令レジスタ
IO - 命令レジスタアウト
OI - 出力レジスタ
BI - Bに登録
EO - ALU出力イネーブル
SU - 減算
AI - アキュムレータ
AO - アキュムレータ出力イネーブル
RI - プログラムメモリ
HLT - 停止
X - 使用されていません
与えられた命令の各T状態に対してどのビットがアクティブになるべきか、またそれらが制御ROMにあるべきアドレスは次のとおりです。
フェッチ:
0:CO、MI - プログラムカウンタはMARに出力
1:CE - 次のクロックパルスでカウンタが有効になる
2:RO、II - アドレス指定されたバイトがRAMから命令レジスタに出力される
NOP:
3:X
4:X
5:×
LDA:
6:IO、MI - 命令レジスタ内のアドレスがMAR(下位4ビット)に転送されます
7:RO、AI - アドレス指定されたバイトはメモリからアキュムレータに出力されます
8:×
追加:
9:IO、MI - 命令レジスタのアドレスがMAR(最下位4ビット)に転送されます
10:RO、BI - アドレス指定されたバイトはメモリからアキュムレータに出力されます
11:EO、AI - アキュムレータとBレジスタの合計がアキュムレータにロードされます
サブ:
12:IO、MI - 命令レジスタ内のアドレスがMAR(最下位4ビット)に転送されます
13:RO、BI - アドレス指定されたバイトはメモリからアキュムレータに出力されます
14:AI、SU、EO - アキュムレータとBレジスタの差がアキュムレータにロードされます
STO:
15:IO、MI - 命令レジスタ内のアドレスがMARに転送されます(最下位4ビット)
16:AO、RO、RI - アキュムレータはアドレス指定された位置でプログラムメモリに出力します(ROとRIは、使用したチップへの書き込みに対してアクティブにする必要があります)
17:X
でる:
18:OI、AO - アキュムレータが出力レジスタに出力
19時:X
20:×
JMP:
21:J、IO - 命令レジスタはプログラムカウンタの最下位4ビットをロードする
22:×
23:×
HLT:
24:HLT - 停止信号がクロックに送信されます
25:×
26:X
OP ROMの各メモリ位置に3の倍数が含まれています。これはもちろん各サイクルが3つの実行状態をとるためです。したがって、OP ROMのアドレス指定されたデータは次のようになります。
0 - 3
1 - 6
2 - 9
3 - 12
4 - 15
5 - 18
6 - 21
7 - 24
チップの選択をプログラムするには、さまざまな選択肢があります。あなたはEEPROMとEPROMのプログラマーを買うことができるが、彼らは通常かなりの金額の費用がかかる。私は自分のROM用にブレッドボードプログラマーを作りました。それはワイヤーを動かし、押しボタンで書き込みと読み出しのイネーブルピンを制御することによって動作します。後でプロセスを単純化し、特にNVRAM用にArduinoプログラマーを設計しました。このプロジェクトに使用するほぼすべてのパラレルメモリチップをプログラムするように簡単に修正できるので、コードを添付します。

ステップ15:部品を購入する

8ビットコンピュータを構築することの素晴らしいところは、正しい場所から購入すれば、ほとんどの部品の価格が1ドル以下になるということです。私は部品の90%をJameco Electronicsから購入しましたが、それらのサービスには完全に満足しています。私が他のどこからでも本当に買った唯一の部品はブレッドボードとブレッドボードワイヤー(そしてNumitronチューブ)です。これらはAmazonのようなサイトではかなり安く見つけることができます。注文している部品が正しいことを確認してください。あなたが買うすべての部分はあなたが買っているアイテムの機能と制限の全てを説明するオンラインで利用可能なデータシートを持つべきです。あなたがあなたのコンピュータの構築に多くのデータシートを使用することになるのでこれらを整理しておくことを忘れないでください。あなたのコンピュータであなたを助けるために、私が私のために使った部品をリストします:
4ビットカウンター
74161 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74161&langId=-1&storeId=10001&productId=49664&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
4ビットレジスタ(8ビットレジスタごとに2つ使用します)
74LS173 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74LS173&langId=-1&storeId=10001&productId=46922&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrill
2-1マルチプレクサ:
74LS157 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_46771_-1
16×8 RAM(出力は反転する必要があります):
74189 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74189&langId=-1&storeId=10001&productId=49883&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
全加算器:
74LS283 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74LS283&langId=-1&storeId=10001&productId=47423&search_type=all&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
トライステートバッファ
74S244 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_910750_-1

XORゲイツ:
74LS86 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_295751_-1
ANDゲイツ:
74LS08 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_295401_-1
NORゲート:
74LS02 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_283741_-1
インバータ:
74LS04 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_283792_-1
リングカウンター:
CD4029 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=4029&langId=-1&storeId=10001&productId=12925&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
JKフリップフロップ:
74LS10 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_295427_-1

ステップ16:建設

実際のコンピュータにはブレッドボードを使用することを選択しましたが、他にもたくさんの方法(ワイヤラップなど)があり、それを使用することもできます。物事をもっと簡単にするために、私は私のコンピュータの実際の回路図のブロック図を含めました。私は部品番号やピン番号を含めませんでした。私はこれが物事をよりシンプルにし、創造性に開かせると信じています。 4ビットプログラムカウンタ出力、MAR入力、および命令レジスタ出力はすべて、コンピュータのバスの下位4ビットに接続されています。
示されている2番目の図は、コンピューターの操作側の制御ロジックです。コントロールは、トグルがコンピュータへの入力になるように設計されています。それらをデバウンスするために、RS_NORラッチがトグルスイッチの前に配置されます。トグルスイッチには汚れた接続があることが多く、オンからオフにバウンスして必要以上のパルスを発生させることがあります。トグルの出力にフリップフロップを追加すると、余分なパルスがなくなります。手動時計オプションを使用するとき、これは非常に役に立ちます。あなたはスイッチをひっくり返して、8クロックパルスを開始したくないでしょう。読み取り/書き込みボタンは、アクティブな入力バイトをアドレス指定されたメモリに書き込みます。 RAMへのデフォルト制御ワード入力を2つの低いROビットとRIビットに変更して、書き込みサイクルを開始します。ラン/プログラムスイッチは、どの入力がメモリアドレスマルチプレクサ上でアクティブであるかを変更する。 555の後のJKフリップフロップは、コンピュータの実行時に、クロックパルスの途中で開始されないことを意味します。 HLT信号が低いと、クロックが手動クロックまたは555を通過するのを止める。最後に、ラン/クリアスイッチは、レジスタおよびカウンタ上のものなど、コンピュータ上のすべてのクリアピンに接続される。

ステップ17:プログラミング

コンピュータが完成したので、命令を実行するようにプログラムすることができます。これを行うには、まずラン/プログラムトグルスイッチをプログラム位置に切り替えて、コンピュータをプログラム設定にする必要があります。その後、0から15までのアドレスを選択し、プログラムに必要なデータを挿入します。例えば、5から始めてすべての出力に4を加えると、プログラムは次のようになります。
住所 - データ:
0000 - 00010111 LDA 7:メモリアドレス7に格納されている値をアキュムレータにロードします(5)
0001 - 00101000追加8:メモリー・アドレス8に保管されている加算値(4)
0010 - 01010000 OUT:アキュムレータを出力
0011 - 01100001 JMP 1:命令1にジャンプ
0100 - X
0101 - X
0110 - X
0111 - 00000101 5
1000 - 00000100 4
1001 - X
1010 - X
1011 - X
1100 - X
1101 - X
1110 - X
1111 - X

ステップ18:さらに進む

私はあなたがこのInstructableを楽しんだことを願っています、そして何よりも、あなたがそれから何かを得たことを願っています。あなたはこの大変な仕事のすべてを、あなたが電子工学、コンピューターとプログラミングのより良い理解を与えるであろう信じられないほど価値のある学習経験と考えることができます。最後に、あなたはまたあなたのハードワークのすべてのために示すために非常にクールな何かを持つでしょう。
最初の8ビットコンピュータを構築した後は、さらに進んで機能を追加できます。このコンピュータで使用されているALUは操作が非常に単純化されており、本当のALUは今日ビットシフトや論理比較のような無数の機能を持っています。先に進むべきもう1つの重要な側面は、条件付き分岐です。条件付き分岐とは、命令がALUによって設定されたフラグの現在の状態に依存することを意味します。これらのフラグはアキュムレータの内容が負になるかゼロになると変化します。これはあなたのコンピュータのアプリケーションのためのはるかに広大な可能性を見込んでいます。
あなたがこのプロジェクトについて何か質問があればこのInstructableか私のウェブサイトhttp://8-bitspaghetti.comにコメントしてください。このプロジェクトで頑張ってください。

3人がこのプロジェクトを作りました!

  • JamesP383が成功しました!

  • xdolaがやった!

  • Realhetがやった!

あなたはこのプロジェクトを作りましたか?私たちと共有しましょう!

おすすめ

  • 古いノートパソコンからビンテージルックメディアPC

  • Digi-Comp IIレプリカ

  • モノのインターネットクラス

  • レインボーコンテストの色

  • 教室科学コンテスト

  • Fandomコンテスト

173件の議論

0

アトミックフェリー

1年前

あなたはあなたがマザーボードのためのデジタル図を作ることができると思いますか?私はこれまで一度もブレッドボードを使ったことがありませんが、古いコンピュータには非常に興味があります。

0

ファーシンハムザ

1年前

私が今まで見たことがある美しい指示可能なもののうちの1つ…。あなたの忍耐に感謝します… :)

0

bob491

1年前

これは非常によく書かれた詳細な説明書で、とてもクールです。ありがとうございました。

0

champ12345

1年前

少し複雑に見えます

0

mkpeker

1年前

いいビルド。あなたは基本を理解するために私の最も簡単な4ビットのttl cpu(MP-4)をチェックしたいかもしれません:

http://www.instructables.com/id/Simplest-4-Bit-TTL-CPU/

0

mkpeker

2年前

いいプロジェクトはあなたが私のものをチェックアウトしたいかもしれません。

やっと私のモニタータイプのOS(インラインアセンブラと逆アセンブラ付き)は準備ができました
このv1.0bをセットアップしてみてください
必要な情報はすべて私のEfexページにあります。

http://mkpeker.wixsite.com/efex

私はソフトウェアを改善することができるよりも私にあなたのコメントを送ってください
ありがとうございました

0

TheMrCode

2年前

あなたがワイヤーの代わりにLEDを使ってそれを作ったならばどうでしょうか。信号がどこに向かっているのかわかります

0

ジョージW 134

2年前

ifステートメントをどのようにプログラムしますか?

2件の返信 0

JuliaS87ジョージW 134

返信2年前

新しいオペコードは必要ありません。必要なのは、1と0としてtrueとfalseを表す値です。その値をアキュムレータにロードし、1を引きます。次に、条件付きジャンプを実行します。値が1(true)の場合、減算によってオーバーフローが発生し、条件付きジャンプが実行されます。値が0(false)の場合、オーバーフローは発生せず、したがってジャンプも発生しません。

0

calebj20ジョージW 134

返信2年前

ALUからの前の合計を格納するレジスタ(アキュムレータ)があるので、結果が負の数、正の数、またはゼロの数を与えるかどうかをチェックでき、それからその状態をチェックして条件が満たされない場合はジャンプする新しいオペコードを追加できます。本当です。
例えば

4 - 10 = -6 - > -6は負なので、Nビットを1に設定した分岐コマンドはジャンプします。

assembly:BRN RAこれは、Aに格納されている場所に否定的に分岐します。

オペコードが1000:10001000であると仮定したバイナリ

これがオペコードのビット内訳です。

BR:1000

N:1 0

Z:1 0

P:1 0

0: 0 | 0

また、より汎用的にしたい場合は、Bにバス値を設定する機能を追加してみると、最後のビット「0」をAまたはBにそれぞれ0または1にすることができます。

0

T0BY

2年前

Crikey、忍耐力があります。

0

スーパーノバ41

2年前

質問があります。リストのすべての部分は2を除いてそこにあります。
トライステートバッファとJKフリップフロップ
トライステートバッファと同じモデルの異なるWebサイトがありました
しかし
JKフリップフロップの代替品はありませんでした。
あなたがリストしたものと同じモデルですか、それとも別のモデルを使用できますか?そしてもしそうならどれ
モデルを使うべきですか?

0

スーパーノバ41

2年前

こんにちは!私はこれが古い投稿であることを知っています、しかしあなたは私にTri State BuffersとJK Flip Flopsのための更新されたリンクを与えてもらえますか?製品を調べてみましたが、どのモデルを使うべきかわかりません。前もって感謝します!

0

BartH19

2年前

私はLEDやLCDスクリーンでさえタイプすることができる簡単なCPUを作ることに興味があります。これは私のためのプロジェクトですか、それとももっと良い方向に向かってください。

私はこれで完全な初心者です。私はある種の木製コンピューターを作ろうとしている大工です!

5件の返信 0

フィンW3BartH19

返信2年前

CPUを構築する代わりに、木製のケースを使ってコンピュータを構築するだけです。コンピュータにはかなりの費用がかかりますが、実際には300ドル以下にすることができます。このサイトを使用してみてください。pcpartpicker.com

0

BartH19フィンW3

返信2年前

これをありがとう。私は十分に薄い部分があることを願っています。私はそれが言葉の計算機のようになりたいのです。私はリンクをチェックアウトします:D

0

KyleF45BartH19

返信2年前

あなたがそれをしたいのは電卓として振る舞うことだけであれば、あなたはラズベリーパイを調べたいと思うかもしれません。それははるかに小さくて安くなるでしょう、Piのは電話のサイズのようなものです。

0

KyleF45KyleF45

返信2年前

考えてみると、Piはフルデスクトップコンピュータでできることはほとんど何でもできますが、それははるかに小さいものです。おそらくあなたがそれに使用できるソフトウェアのいくつかの種類があります。

0

BartH19KyleF45

返信2年前

お返事ありがとうございます。D

私の最初のコメントの直後に、私は実際にこの男を見つけました:http://www.etsy.com/shop/writeotron?ref = unav_lis …

私たちは一緒に新しいものに取り組むつもりです。それはパイです!

0

バラティス

2年前

それは素晴らしく、私自身のものを作るように励ましてくれます

私は「私はそれをしました」と押します。私はちょっとそれを造るために進行中です。その素晴らしいデジタルエレクトロニクス