アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在保持している4ビットの値に、スイッチが押されると、ある3ビットの値を足し合わせるような回路が作りたいのですが、どのように回路を作れば良いのか分かりません。

DFFと全加算器を用いて作ってみたのですが、加算器の一方の入力にDFFの出力を与えているため、加算結果がDFFに出力されたものがまたすぐに加算器の入力に入ってしまうためなのか、クロックのタイミングによって失敗してしまいます。

仕様としては、
①結果が15を超えるような計算が行われた場合、出力は15にする。15に値が加算される場合も同様。
②スイッチが押されていない間は現在保持している値を出力し続ける。
③リセットするようなスイッチがあり、押されると全ての桁が0になる。
を実現したいです。どうしたら良いでしょうか?初心者ゆえ上手く言葉にできていなかったらすみません。

質問者からの補足コメント

  • 回答ありがとうございます。
    あくまでもシミュレーション的なもので試しているのでチャタリングが原因ではなさそうです。
    課題は課題なのですが、この回路はその中に組み込まれるべき一部分で、ここ2、3週間悩んだ末に答えが出せずこうして質問させていただいています。事情を話してしまうならば、入学してからずっといわゆるオンライン授業で、頼れる友人や先生がいないのです。
    それでもやはりダメなものなのですかね……?その場合はこの質問はなかったことにしてまた自分で頭を悩ませます。すみません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/07/30 08:56
  • 回答ありがとうございます。
    3ビットの入力はスイッチを押すと3ビット分一気にそれぞれの加算器に入るようになっていて(フロップには入っていないです)、現在保持している4ビットの入力が直接加算器に入っています。
    加算器と3ビットの入力との間にフロップを入れるべきということでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/07/30 09:02

A 回答 (6件)

想像するにこんな感じの回路かなと思いますが...あくまでも模擬的な回路なんで、4ビットの信号を一つのゲートで処理してますが、そのあたりは脳内で4つのゲートに分離して考えてください。


あと、リセットの論理は同期リセットか非同期リセットか不明なので、入れてません。

論理検証をしていないので、この回路が論理的にあってるかどうかはわからないけど、動作は以下の通り。
swが0の時はDFFは値を保持する。oprが加算器への3ビットの入力で、加算器への4ビット入力はDFFからとっている。加算器の結果はsw=1であれば、その4ビットDFFに書き込まれる。加算器がオーバーフローしたとき(キャリー出力co=1)に、DFFには15が無条件に書き込まれる。一度15がDFFに書き込まれると、リセットするまでずっとその状態が続く。

input clk, rst, sw;
input [2:0] opr;

ADDER (.A(acc_q[3:0]), .B(opr[2:0]), .S(sum[3:0]), .C(co));
MUX (.S(co), .D1(4'b1111), .D0(sum[3:0]), .Z(mux_out1[3:0]));
MUX (.S(sw), .D1(mux_out1[3:0]), .D0(acc_q[3:0]), .Z(mux_out2[3:0]));
DFF (.clk(clk), .D(mux_out2[3:0]), .Q(acc_q[3:0]));
    • good
    • 0

> 加算器と3ビットの入力との間にフロップを入れるべきということでしょうか?



いや、そういうわけではないけど、3ビット入力と4ビット入力それぞれがクロックに同期している必要があるから、一方がフロップに入っていてもう一方がフロップに入っていなければダメなんじゃないの、と思っただけです。

「加算結果がDFFに出力されたものがまたすぐに加算器の入力に入ってしまうためなのか」というのがわからない。4bのDFFというのは、加算器の出力を受けていて、かつ加算器の一方の入力にもなっているということですか? そして、3bの入力はどこか別のところから来て、加算器のもう一方の入力に入る?
いわば、アキュミュレータのような感じ?

もしそうだとした場合、15に達するまでは正常に動作するんですか?
    • good
    • 0

>それでもやはりダメなものなのですかね……?


そういう事情なら即ダメとはいいません。

作りたい回路の入出力と機能を整理しましょう。

>現在保持している4ビットの値に、
保持された4bit の入力があるようにも読めますが、そうですか?
ここはちょっと無視して書いてみます。違ってたら指摘してください。

入力
1. 数値A 4bit
2. 数値B 3bit

出力
3. 数値X 4bit

押しボタンスイッチ
4.[実行](仮称)
5.[リセット]

仕様概要
1. 入力の数値A,Bが変化しても、数値Xは内部で保持してるので変化しない
2.[実行]を押した時に数値Xは更新され、保持される。
 この時の値は 数値A+B の値となる。
数値A+B が値15 以上の場合は、出力X は値15(全4bitが"1")になる
3.[リセット]を押すと出力Xは値0(全4bitが"0")になる

ところで
D-FF を使ったようですが、出力の変化はクロック入力の立ち上がりエッジに起こります。
「クロックがエッジタイプ」などと呼びます。これに対して
「クロックがレベルタイプ」なラッチ(保持器)というモノも存在します。
後者はクロック入力が"0"の間は出力を保持しますが、
"1"の間は「入力が出力に筒抜け」になります。
なのでクロックを"0"に戻す前に入力が変化すると、保持内容が化けます。
ループして戻ってくるのに多少の時間がかかるので、これとの時間差によっては
期待通りになったりならなかったり、ということが起こりえます。

D-FF のクロックのタイプは大丈夫ですか?
    • good
    • 0

4bitのデーターをFFに入れる時に4bitのORを取りクロゥクとして


使えば読込、ラッチは出来ます、それを加算して別のFFに入れる、そこまで
動作を確認して出来たら加算器の桁上げ信号でFFにセット入力が無ければ
1111を書き込むか考えることになります。
リセットが無ければ0000を書き込む方法を考えましょう、単純にFFの入力を
0000に落としてもいいし。(クロックは作る)
FFは入力と出力に2系統必要と思います。
なお論理は無視して話しています。
    • good
    • 0

どんな回路かわからないのでなんともいえないけど、「加算器の一方の入力にDFFの出力を与えているため」ということは、3ビットの入力はフロップに入らずに直接加算器に入ってるってこと?


もしそうなら入力のタイミングに気を付けないとクロックとの同期がうまくとれないので、タイミングによっては動作したり動作しなかったりするかもしれません。
この回答への補足あり
    • good
    • 0

>クロックのタイミングによって失敗


成功する時があるなら「全然わからない」わけではないですね。

タイミングによって、
じゃなくて
「押しボタンスイッチのチャタリングを除去してない」のでは?

そもそもなぜそんなものを作りたいんです?
順序良く勉強してて課題が、というのなら回答を丸々得ようという
質問はダメですよ
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!