1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

エレキ素人が何か考える(その9):JKフリップフロップ

Posted at

ロジックIC(OR、NOT、AND)でJKフリップフロップをつくる

ロジックIC(OR、NOT、AND)を用いて、JKフリップフロップを作ったときの記録。

用いたロジックIC

いずれも秋月電子で購入。

ピンアサイン

OR

image.png

NOT

image.png

AND

image.png
なぜか、ORやNOTと向きが一部異なる。

回路

(本題の前に)SRフリップフロップ

image.png

JKフリップフロップ

クロック(CLK)なし

image.png
真理値表は下記となる。
image.png
ではあるが、記事「5. フリップフロップ」にあるように(以下、引用、イタリック部分)

JK-FF, T-FF は出力を反転させる入力が存在するが、反転動作については次の点が 問題となる。例としてJK-FFで(1, 1)を入力した場合、それまでの出力が反転するが、 回路がフィードバックを含めて一周動作した後に、入力の(1, 1)が継続していると、 二周目の動作に入って再び反転してしまう。 本来は1回反転したらそこで値が固定されて欲しいが、この反転が連続して起こる現象は、 入力の(1, 1)が継続している間ずっと続く。この現象を 発振 、 レーシング と呼ぶ。

とのこと。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)あり

次にクロックありの状況を擬似的に実現。
image.png
真理値表は下記となる。

クロックあり時(上記表では立ち上がり時)のみ、出力されるもの。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#とが反転している)。
S1.gif

ただし、下記のように、左のLEDが点灯後すぐに消灯してしまう(右のLEDは点灯のまま)状況が発生していた。
F3.gif
プログラムを修正すれば、改善する可能性はあるだろう。

ToDo

ハードウェアに限りなく近いFPGAを利用すれば、状況が改善するのでは、、と素人的には考えるので、近いうちに試してみる。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?