ロジックIC(OR、NOT、AND)でJKフリップフロップをつくる
ロジックIC(OR、NOT、AND)を用いて、JKフリップフロップを作ったときの記録。
用いたロジックIC
いずれも秋月電子で購入。
ピンアサイン
OR
NOT
AND
回路
(本題の前に)SRフリップフロップ
JKフリップフロップ
クロック(CLK)なし
真理値表は下記となる。
ではあるが、記事「5. フリップフロップ」にあるように(以下、引用、イタリック部分)
とのこと。Arduinoを用いて、次のようなソースコードを用いて確認。
#define INPUT_1 3
#define INPUT_2 4
void setup() {
Serial.begin(9600);
pinMode(INPUT_1, OUTPUT);
pinMode(INPUT_2, OUTPUT);
digitalWrite(INPUT_1, LOW);
digitalWrite(INPUT_2, HIGH);
}
void loop() {
if (Serial.available() > 0) {
String data = Serial.readStringUntil('\n');
int val = data.toInt();
digitalWrite(INPUT_1, ((val & 0x01)? HIGH: LOW));
digitalWrite(INPUT_2, ((val & 0x02)? HIGH: LOW));
}
シリアルから入力した数値が、下記表となるように配線を実施。(なお、エラー入力は考慮していない。
入力値 | J (INPUT_1) | K (INPUT_2) |
---|---|---|
0 | 0 | 0 |
1 | 1 | 0 |
2 | 0 | 1 |
3 | 1 | 1 |
”3”を入力したとき(J=1,K=1)の状況が下記写真であり(右は”Q#”に相当)、両者が点灯し、不安定な状況となっている。
クロック(CLK)あり
次にクロックありの状況を擬似的に実現。
真理値表は下記となる。
クロックあり時(上記表では立ち上がり時)のみ、出力されるもの。Arduinoと接続した状況は下記のとおり。
ここではクロックの代わりとして、シリアル入力があったときに、”CLK=1”の状況を作り出した。ソースコードは下記のとおり。
#define INPUT_1 3
#define INPUT_2 4
#define CLOCK 10
void setup() {
Serial.begin(9600);
pinMode(INPUT_1, OUTPUT);
pinMode(INPUT_2, OUTPUT);
digitalWrite(INPUT_1, LOW);
digitalWrite(INPUT_2, HIGH);
pinMode(CLOCK, OUTPUT);
digitalWrite(CLOCK, LOW);
}
void loop() {
if (Serial.available() > 0) {
String data = Serial.readStringUntil('\n');
int val = data.toInt();
digitalWrite(INPUT_1, ((val & 0x01)? HIGH: LOW));
digitalWrite(INPUT_2, ((val & 0x02)? HIGH: LOW));
digitalWrite(CLOCK, HIGH);
delay(10);
digitalWrite(CLOCK, LOW);
}
”3”を入力したとき(J=1,K=1)の成功時の状況が下記となり、LEDの点灯が交互に行われている(QとQ#とが反転している)。
ただし、下記のように、左のLEDが点灯後すぐに消灯してしまう(右のLEDは点灯のまま)状況が発生していた。
プログラムを修正すれば、改善する可能性はあるだろう。
ToDo
ハードウェアに限りなく近いFPGAを利用すれば、状況が改善するのでは、、と素人的には考えるので、近いうちに試してみる。