7セグメントLEDで24時間時計を作ってみた
こんにちは!今日はデジタル回路の話題で更新します!
今回は、以前紹介した7セグメントLEDの応用先として、時計を作ってみたので紹介します❕
↓7セグ周辺の回路を作った時の話
普段は回路のソースコードを貼ったりして色々中身の説明をしているのですが、番外編の続きですし実際に動くのを見てもらって、作ったものを感じてもらおうと思います❕
今回は初めての試みとして、動画を取ってみました。
はてなブログで動画を貼る手段として"youtube貼り付け"機能を使うのが一番手っ取り早そうだったので、アカウントを作って投稿してみました。
時刻調整機能を持たないので58秒→1分に桁上がりするところと、リセットして0秒に戻るところを撮りました。(伝わってたらうれしいケド…( ˆ꒳ˆ; ))
動くものに関しては、時おり動画にしていこうと思いますので、ご期待ください❕
コンピュータの検証完了!
こんにちは!今日はデジタル回路の話題で更新します!
今回は、前回に引き続き自作コンピュータの検証を行い、ついに動作するところまで確認できたので、その報告をします!
確か前回はプログラムカウンタが動かずメモリからCPUへ命令を読みだせないことを確認しました。色々ハードウェアまわりを確認してみましたが、おかしな所はなく、それならばとテストベンチをチェックしたところ、なんとリセットをかけっぱなしにしていました_(┐「ε:)_ズコー
テスト用のプログラムはここで紹介していないので、どこをどう変えたみたいな話は難しいですが要するに、ずっと初期化し続けていたというただのミスですね。これまでのテストでは明るみに出ていなかったのは、リセットの入力もテスト信号として手動で与えていたためです。
それでは、1~10まで足した結果を見てみましょう❕
確かに、1+2+・・・+10=55がメモリに返ってきていることがわかりますね。また、クロックが1になったときに計算されて55になっています。
これで、一通りコンピュータの実装ができたといっても良いでしょう(; ̄< ̄)>ふぃ〜
自分でCPU、メモリを設計し、テストベンチで入出力も確認できました。
…
しかし、コンピュータはここからが本番です!やはり、実物を世界に実装してこそで、シミュレータだけで満足してはいけません!
豪華な出力
を用意して、人の目に見える形にしなくては宝の持ち腐れです。なので、今後は動いている姿をここで見せられるかもしれません。
こちらのシリーズでも、消しゴムはんこに負けないくらい迫力のあるものをお届けできればと思っていますので、お楽しみに!
66日目 ~物言わぬコンピュータ~
こんにちは!今日もデジタル回路の話題で更新します。
今回は、前回に引き続きコンピュータ本体の検証を行っていきます。まずは、先日紹介した1~10まで累算するプログラムを機械語にしてメモリの中へ書き込んでいきます。
うん、メモリ(ROM32KB)は無事に動いていそうですね(′∇`)ホッ
では引き続き実行を...
またしてもプログラムカウンタが動いていません(pcって書いてる子です)。 それのせいか、Dレジスタとメモリの出力が不定になっていますね。ただ、一つ目の命令は読み出せているのか、Aレジスタには正しい値が入力されています。
結局クロックとカウンタが動かないと、どれだけ実装してもコンピュータは時止めにあってなにも返事しなくなってしまいますね。
あとひと踏ん張りなので、頑張ります!
65日目 ~テストプログラム~
こんにちは!今日はデジタル回路?の話題で更新します。
"?"となっているのは、今回は直接回路設計を行う話題ではないためです。
この記事ではコンピュータをテストするときに使用するテストプログラムについて考えていきたいと思います。
やはりテストなので、あまり複雑すぎずそれでいて機能を広く試せるようなプログラムを設定したいものです。そこで、今回は独りよがりにならずに、同じことをしている方のテストプログラムを参考にしてみることにしました。
github.com
この方のテストプログラムを見てみると、単純に1~10まで足した合計を求めているようです。
これなら確かに、レジスタやメモリへの保存、そして分岐命令の動作まで確認することができます。C言語では
int s; for(i=1; i <= 10; i++ ){ s += i; }
みたいなことをしている感じですね。これを検証しているコンピュータの言語に変換して、何らかの出力で確認すればよいわけですね。まぁ、最初なのでひとまずメモリの出力(ourM)をシミュレーション上で確認できるようにしてみます。
62日目 ~CPUの検証完❕~
こんにちは!今日はデジタル回路の話題で更新します。
今回は、これまで何回かの更新(関連記事はこの記事の最後に貼っています)で悩んできたCPUの検証を終わらせてしまいます!
というわけで、長かったテストベンチもこれで終わりです。
前回はプログラムカウンタの値がおかしくて、命令を読みだせなくなっている所で終わりました。
次のサイクルでカウンタの値が引き継げていないので、load関連の記述を見てみると...
PC pc0(outA, loadpc, true, reset, clk, pc);
ありました!カウンタのロード可否の入力(前から3つめ)がtrueとなっています。true信号(いわゆる、ブーリアン)を受け取るように想定していないので、動かなくて当然ですね(´・ω・`) コンパイラ君はここまでは気づいてくれないようです。ここは以下のようにtrue=>1`b1と書き換えます。
PC pc0(outA, loadpc, 1`b1, reset, clk, pc);
あとは、テストベンチでCPU全体をリセットするように設定してやると、
それぞれ出力と期待値を上下になるように設置しました。これで無事に動いていそうです。(テストベンチが90パターンしかなかったから目視で点検したのは内緒(* ̄  ̄))
ちなみに、これまでは期待値との比較はif文を用いていましたが、不定値の判定を上手くしてくれなかったので波形出力にしました。何か方法があれば教えていただけると幸いですm(_ _)m
そんなわけで、長かったコンピュータの実装まであと一息というところまで来ました!次回は、コンピュータとして組みあげ、テストプログラムを動かしてみます!
CPU関連の記事
今回の更新に伴い、書き換えました。
in-reality.hatenablog.com
in-reality.hatenablog.com
in-reality.hatenablog.com
57日目 ~CPUの検証その②~
こんにちは!今日はデジタル回路の話題で更新します。
今回は、前回に引き続き自作CPUの検証を行っていきます。以前の記事では、期待値と出力の比較結果がすべて一致しておらず、おかしいぞ...(・_・?)となっていた所でした。
出力と期待値を並べてみてみると、以下のようになりました。
これ、他の信号も同様になっていて、すべての信号を確認すると同時に時間の経過も表示してみました。
すると、なんと原因の一つは検証用に用意したテストベンチにあったことがわかりました。(これはひどいww) というわけで、気を取り直して回路中で時間が経過するように書き直して、
これでCPU内で止められていた時間が動き始めました。しかし、どうもpc(プログラムカウンタ)の様子がおかしいようです。次回はここから見ていきます。