asu_paraの日常

日々感じたことをまとめて投稿するときに使います

2023年度のSecHack365に採択されスタートした

ぼやぼやしていたら夜中にこんな通知が...

 

 

感想:ほー、まじすか...

 

思索駆動コースというところに参加します。コース概要?

 

 

どんな仕掛けがあるんでしょうね?笑

ちなみに倍率が高かったらしいです。ほんまか?

 

慣れないツールになれるところから今はやっています。

 

 

自己紹介見てると、フルスクラッチ自作OSだとか自作CPUだとかみんなすげーなーという感じ。40人しかいない中に自分が入っているのが不思議ですが、それはそれで精一杯やっていこうと思います。

 

思索駆動の会話は楽しそうです。僕は今のところ遠くから眺めているだけですが、出所をひそかに待っています。自分の自己紹介に言及してくれる人もいて嬉しい。

 

さて作るものですが、開発で使っているツールの欠点を補うツールを作成しようと考えています。これからまたちょいちょいブログ出していくと思います。

 

これからどうなっていくのかなあ...

2023年の目標

てんわやんやで2022も終わろうとしていますので来年の抱負を思いつく限り書いていこうともいます。

 

1. 技術発信

tech blogのくせにそれをサボっていてはよくないですね。来年は今年よりは比較的時間もありそうなのでできるといいなと思います。手始めにその月に読んだ技術記事のまとめを公開していくことを検討しています。これで最低1つは記事の生成が担保されますね。

 

2. Go

それっぽく書けるようになる。2023年はよりサーバーサイド専門よりになると思います。設計やインフラの経験も++していこう。

 

3. 脆弱性報告

見つけたら報告する。より高度なものができるとなおいいね。

 

4. 深層学習の研究

卒論は早めに終わらせる。あと1年で去るので定期的に研究室に通ってコミュニケーションをとる。国際会議に行きたい。

 

5. 進路の意思決定

ちゃんと見学に行って受けるかどうか決める。受験する場合は数学をやり直す、研究計画書を練る。

 

6. 旅行

もう学生少ないぞ。やり残した旅はやっておこう

 

7. 技術イベント

いけそうなイベントは突っ込んでいこう。特に技術系学生同士の交流は貴重です。

 

8. ひとりアドベントカレンダー

あっためてきたネタがありますのでやります。年始から準備をちょいちょいやる。

 

9. 中国語

孔子学院の講座を受験してさらに研究室で喋りまくる

 

今のところ思いつくのはこれくらいですが今後追加されるかもしれません。それでは2023年もよろしくお願いします。

 

 

 

キーボードの紹介 (一人暮らし Advent Calendar 2022)

さて、一人暮らしアドカレ19日目です。私の番が回ってきました。

adventar.org

 

何を書こうか迷いましたが、最近キーボードを買って人生良くなったのでそれについて書こうと思いました。ガジェットアドカレがあればと思い探しましたが見つからなかったですね。また、このアドカレもフォロワーさんが書いていたのを発見してのものなのでこの記事はそれを見つけることができなかったら生まれなかったかもしれません。感謝

 

さて、キーボードのこだわりはありますか?自分も昔はなかったのですが、コンピュータと向き合う時間が長くなるにつれてデスク周りにあるすべてのものが格別で快適なものでありたいという願望が芽生えてきてからより好みが出てきたかもしれません。

 

何事もですがキーボードも沼れば非常に奥が深いもので「軸」「形」「ブランド」「キーキャップ」などいろいろなパラメタとかフェチがあります。私自身も好みはありますが、それぞれ違うところもいいなとも思ったり。しかし、自作キーボードをしたり、独自の配列を組んだり、左右が分離したキーボードを使っているわけではないので、あくまで初心者向けに書くものと思ってくださればと思います。使ったことがあるものや所持しているものについてかくつもりです。

 

前書きが長くなったのでそろそろ本題に入りましょう。まずは所持しているものについて3つ紹介します。

 

1.AIR75 WIRELESS MECHANICAL KEYBOARD

https://cdn.discordapp.com/attachments/836542655277301804/1054126621566718044/IMG_4301.jpg

写真の二枚は届いた時の箱ですね。最近買ったのでうれしくてはこの写真も撮影していました。

https://cdn.discordapp.com/attachments/836542655277301804/1054126574208831538/IMG_4300.jpg

そして見た目はこんなかんじ

。。。。かわいいーーーーーーーーーー 

https://cdn.discordapp.com/attachments/836542655277301804/1054113856458330112/IMG_4389.jpg

 

このkeyboard半年くらい前からめっちゃほしくてついに手に入れたって感じです。最近、Amazonのセールがあったと思うのですがその時に5000円くらい安くなっていたので買いました。5000円安くなるキーボード!?!!!!って思われたかもしれませんがそうです。原価は20000円くらいと思います。人に言ったら正気じゃないみたいな顔されましたけど、前述のようにコンピュータに向き合う時間が長い自分にはちょうどいいです。むしろ安いくらいかもしれないです。長く大切に使っていきたいと思います。

 

Amazon | NuPhy Air75メカニカルキーボード 薄型ワイヤレスキーボード Bluetooth 5.0、2.4Gレシーバー および有線接続に対応 Windows/Mac OS対応 ホットスワップ 技適認証取得済み (青軸) | nuphy | パソコン用キーボード 通販

 

このkeyboardをいつ知ったのかですが「 How to build a Gmail-like UI with React Native [at a Zen temple Koshoji]」という動画で出会いました。音や映像がやたら作りこまれている動画です。クリエーターとしての完成度とクリエイティブの高さがすごいです。京都の寺でプログラミングをするという斬新な世界観に響くAirシリーズのキーボードの音がよくて絶対買うぞーって思いました。ビジュアルもかわいいですしね。

 

機能性にも優れていてワイヤレスと有線モード両方対応しているのは言うまでもないことですが、WinモードとMacモードに分かれているのは面白いところだと思いました。基本的にはMacに合わせて使うのが使いやすいです。

 

最後に音がどんな感じかの動画を置いておきます。

drive.google.com

 

2. HyperX Alloy Origins HX-KB6RDX-JP

https://cdn.discordapp.com/attachments/836542655277301804/1054115393704304680/IMG_4394.jpg

 

こいつのUS配列です。なぜか日本語配列のものしかリンク見つからんかった。なぜ

www.amazon.co.jp

 

これは完全にゲーム用のキーボードっすね。正直、仕事したりするときは裏の虹がうざい。しかも、このkeyboardは黒軸なので重いっすね。ゲームとかの趣味で使うにはいいと思います。自分自身これを1年くらい使っていましたがゲーム以外での生産性下がってますね。しかし、その事実に気が付くまで1年くらいかかりました。(あほなのか)

もらいものですし、特にこれ以上述べることもないので動画をおいて終わりにします。

drive.google.com

 

3.KEYCRAFTS 87(現在非売品)

https://cdn.discordapp.com/attachments/836542655277301804/1054113807703740426/IMG_4388.jpg

むかしは「謎の海外ブランド」なんて言われたこともあったブランドのキーボードです。日本に上陸したのは2014年ですがもうは販売停止している幻のキーボードです。Backspaceの打ち心地が最高な赤軸のキーボードです。プログラムを買いたり、レポートタイピングに最適なキーボードだと感じていて、デスクトップで利用しています。

 

www.scythe-sub.sakura.ne.jp

 

自分はUS配列のキーボードが好きですね。前のやつもUS配列ですが、ながくUSを使っているからか、USじゃないとしっくりこなくなりました。今でも、学校のキーボードを使ったり、MACの純正のMagicキーボードを使うときは日本語配列なのでたまに使いにくいと感じるときがあります。

 

最高のキーボードなので音を聞いてもらいましょう!

drive.google.com

 

まとめ

自分のキーボードを見つけて生活をよくしていきましょう。これに終わりはありませんね!

自分が触れてきた技術とか

まあ、色々やってみたわけです。中途半端野郎じゃないかと思うかもだけどそんなにマイナーでもないと思うんだ。今日はざっくりと触れてきたこととかについて書こうと思う。全部じゃないよ。

 

17歳くらいの時にrubyに触れたのが最初だったと思う。その時は訳もわからず写経してたし楽しいとかはわかんなかった。でも情報系に進むきっかけになったからこれはでかい経験だったんだよな。

 

数年してまた技術やる波が戻ってきた。最初はRSA暗号pythonで実装するっていうのをやったと思う。スクリプト言語の良さを知って入力すればでてくるので計算とか扱うにはいいね!って思った。それでスクリプトをかく何かみたいなやつに魅力を覚えた。

 

最初はだからcryptoでCTF入門したんだけどだんだん難しい問題が解けなくなってきて嫌になった時にpwnの存在を先輩のおかげで知った。ゲームみたいで楽しいですよ的な言葉に惹かれてやったけど最初は知識がなくて「なんだこれ。よくわからないな」という感覚になってた。これも途中でやめるのかなっておもてたけど学校でコンピュータアーキテクチャとかをかなりちゃんとやったのもあって「知識を持っとくだけじゃ意味ないし活かしたいな」みたいなことを思ったのが実は1番のモチベ。やっていくうちになんとなくコツがわかってきてkusanokさんの本とか読んで典型的な攻略方法が洗練されているジャンルだなくらいは思えるようになった。revはよくわかんないんだけど分野的には近いからpwn同様、ビギナーズ数問くらいは解けるかもしれないし解けないかもしれないって感じ。初心者本数冊は完走してます。

 

ここでseccamp2021を受講したんだけどここで大きく方針が変わってきた。「Exploit系のことができればいいやー」って思ってDトラックとかCトラックとかを受講したんだけどなかなかリアルワールドの解析ってしんどいんだなみたいな感覚を持った。Ghidraとかその他ツール群を本格的に使いこなせたらめちゃくちゃ楽しいのかなーって指をくわえてたのを覚えてる。今ではCTFで簡易的な利用はするくらいには使えますけど当時初心者だったもんで...。(昔、5年前くらいのCTF本や参考解説ではIDAを使うのが主流だったと思うけど今はGhidraだよなあ) Dトラックでやった機械学習系もそれそのものに対する内容よりかは機械学習を実際に使って何かする(例:XSSの摘発とか) の方が面白いだろうっていう結論になった。

 

ここでわかったこととしては「自分は脅威解析は遊びでCTFの問題を解くくらいには好きかもだけど仕事にするのは違うな」ということでした。終了後、俺って何になろうかみたいなことを考えていたら秋にmini campというのがあってそこで「コンテナ」の内容のことをやったんですよね。

 

これすごいよくてこれでwebサービスの基盤とかに興味を持てた。資料めちゃくちゃ充実してたし今でも読んでます。実際、このレイヤはちょい低めだしrevとかの分野にも通じるところがある。

 

これで、webアプリケーションのことに興味持って自分で色々やり始めた。ぶっちゃけ、初手コンテナからwebに興味持つのってかなり珍しいと思う。

 

まあ、とりあえずもの作ってみましょうかってなって大昔にやってたhtmlとかcssをテンプレートにガシガシ書きながら感覚を戻す?をやったりフロントの機能をjsで書き、バックエンドを最初はFirebaseに丸投げしてたんだけど、過程で徐々にフレームワークの力を借りるべくVueを触ってみたり、バックエンドも一部の機能を切り離していきたいと考えてphpを少し学んでやって移植してみたりしました。今はバックエンド書くならgo言語を主流にしていこうとしています。会社のプロダクトがgoなんでね...。goをやっていき!

 

これで次はwebセキュリティーまわりが気になり始めました。web(CTF)に関する過去資料がネットにたくさんあるのでいろいろ読んでいっているわけですがいかんせん、攻撃の種類も情報量も多いなあwebはという感じ。CTFの問題もその場でできるかみたいなところが大きいです。これと決まったやりかたがあるのは少なくwebが本格的にできる人は相当な問題数をこなしてるなというのが所感ですが多分当たってます。(他の分野もたくさんといたもん勝ちだけどwebは特にそうだろうという話) CTFにおけるwebに関しては解釈をするのに必要な基本的な知識とよく出題される問題形式の簡単な解法くらいは一通り学習しているつもりです。

 

しかし、最近のwebサービスというのはモダンな技術、アーキテクチャが使われているため、CTFで出題されるような問題はほとんど対処済みで少し違うことや対策をリアルワールドでは求められます。代表的な例としてはクラウドとかですかね。

 

実際の開発現場ではどのようになっているかが気になったため、モダンな技術で爆速開発してる会社にjoinしてプロダクトを見させてもらって勉強をしています。まだ、右も左もわかんない感じですけどアプリケーションがたっているAWSやコンテナ周りのこと、プロダクトで使われているgoに対する理解やアーキテクチャドメインの理解など1つ1つ積み上げてやる。これでホワイトボックスの視点からバグや脆弱性、修正した方がいい項目に対してissue立てたり、小規模な機能の開発にjoinしたりできるようになっていくのが現在の目標です。

 

長くなった。

 

紆余曲折マンかもだけどたくさん触れないと自分がやりたいことなんてわかんないと思う。まあ、自分がたくさん触れるきっかけになったのは大学でかなり幅広く知識を入れさせてもらったのもあるな。一般的な学生は知識入れておしまいかもだけど自分は興味出たらちょっとでもいいからいじってみたい人なので、たくさんトリガーになった。今はセキュきゃん受講して1年立ったけど、あそこでやってたことと全く違うことやってるよ。でも寄り道悪くないけどあまり中途半端になりすぎるのもよくないしその辺のバランスって難しいね。

 

 

思い出せる限りこんなことやった

 脆弱性報告, xss

 FPGAで加算機/減算機作った

 学習でうんとかかんとか

 スクレイピングでうんとかかんとか

 ++++++;

   色々 すぐには思い出せん

 

 

終わり

COVID-19に感染しましたのでアドバイスとか

東京に長期間滞在し、やられました。ついに俺の打席が回ってきました。あるあるのシチュエーションだと思います。

 

8/15-8/20 人間であふれかえる千代田区とかにいました。感染もらった場所の予測としては、会食を毎日やっていたのが説としては濃厚かな?そこかも知れないしそうじゃないかもしれない。時差別での移動などは心掛けていた。東京に行ったが特に知り合いとエンカするとかはなかった。

 

なのでかかるときはかかります。どんなに注意していてもかかります。というか生きてたらいつかかかると思います。なので日ごろからの対策に加えてかかったときに耐えれる体力を作っておくことが必要です。勿論、ワクチンを打ったり事前にできそうなことは全部やっておくといいでしょう。

 

症状

8/20は38.8度くらいの熱で1日倒。夕方に何とか手に入れた解熱剤で熱が下がったので助かりました。このへんまでで苦しい症状の山場は越えた感じかな。8/22くらいから咳がでるようになった。完全に治ったと思ったら8/26くらいに味覚と嗅覚を失いました。28日に味覚が復活。まだ、完全に嗅覚が復活していない。(そろそろ耳鼻科に行ってみようかな

 

学んだ教訓

[特に重要] とにかく熱が出たら解熱剤をすぐにのめ。体温が高いまま放置しておくことは自殺行為です。この状態の時に手元に解熱剤がなかったのがかなり不安でした。頭痛をとおりこして頭が割れそうな感覚があったのでこのままおかしくなるかと思った。特にこの病気は長期間高熱が続くと脳がやられる感覚があるのでしっかり熱を下げることで正常な思考を取り戻せるようにしてください。

 

ゼリーなどはとてもいい。初期のとき、とくに飯を食べることができないのでゼリー系が大活躍します。

 

医療機関がすぐに見つかったらlucky。ある程度自分で薬とかストックしておいたほうがよさそう。とにかく解熱剤だ。

 

所属している学校や保健所への連絡を忘れない。

 

まとめ

療養で10日間という貴重な時間が潰れます。感染対策はしっかりしていきましょう。

医療機関はあてになりません。自然治癒できる体力が一番大事かもしれない。

10日間、すべてを全停止することによって見えてくる世界があります。俺はよく日々を生きていた...あなたもよく人生をがんばっています。

駆け出しエンジニアと繋がりたい✨笑

2022/8/15から東京の会社に入社します。

 

ざっくりいうと事業会社でセキュリティーをします。でも事業会社=プロダクト作ってる会社なんでセキュリティーばっかりってこともないです。開発も見習いします。モダンな技術を使っていて勢いもあっていい環境そうだなって思ってます。そして自分の興味範囲のことができそうでよかった... 

 

どんなことするかは明確に明示はできないですがWebとかインフラまわりに近いかな?しかし、アプリケーションを動かしてるコンテナとかは実際低いレイヤですしそういう部分に対策を仕掛けていくとなると低いレイヤにも知見が必要です。検出とかちょっとしたツールを使っていく事もたくさんあるはずです。Webから低レイヤまでの技術屋さんって横断した幅広い領域の知識が求められますもんね。そういう時代。

 

学部3年も折り返しの夏休みで残り少ない?学生時代、自分の好きな/やりたい技術とか趣味もやっていきたいと思うわけですが、こういう形で実際に現場で色々やれるのはとても貴重と思うのでちゃんと軸足を置いて、感謝してやっていきたいです。CTFもっとやりたい。高度資格とかも必要に応じてやりたいしなあ。

 

ということで東京にもいるとおもいます。

 

また進展があったらブログに書いていきたい。技術のアウトプット量少ないの自覚してるのでその方法も考えていかないとね。それでは。

1桁加減算カリキュレータの作成 

何かしらのシステムを作ってそれを早く動かしたい!!という野望を持った時、どういう発想があるだろうって気になっていた時がありました。私はシステムの基盤そのものを早くしたいと思いますね。もちろんデータ構造やそれに伴って勉強しなければならないアルゴリズムの観点というのは非常に重要です。それはソフトウェアとしての対策。めちゃくちゃ重要です。ではハードウェアからのアプローチってなんだろうと思って作ったものがこれです。脆弱性についてもより低いところではソフトウェアレベルでもハードウェアレベルでも対策をしないといけない(*1)のでそのアプローチの視点を増やすためにこういったことを勉強の一環で開発していました。 

------------------------------------------------------------------------------------------------

実機で実際に動いたのを確認済みです。最後に最終結果として写真貼っておきます。 

 

作成の手順 (Github)より 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator  

 

全体としてどういうシステムを作りたいのかについて共有します。 

 

 

SEG_1_OUTとSEG_SEL_1はSEG_A~SEG_Dを、SEG_2_OUTとSEG_SEL_2はSEG_E~SEG_Hをそれぞれ制御できるように配置する。LEDの割り当て配置と表示の例(3) 

 

  • さらに7セグの表示器と制御論についてもう少し補足 

7セグメントLEDはダイナミック方式で制御される。出力データをセレクタで切り替えて表示する。出力データはSEG_1_OUT、セレクタ信号はSEG_SEL_1OK 

 

 

上のハード設計を踏まえて 

SEG_SEL_1 = 1110 (E) -> SEG_1_OUTはSEG_Aで表示 

SEG_SEL_1 = 1101 (D) -> SEG_1_OUTはSEG_Bで表示 

SEG_SEL_1 = 1011 (B) -> SEG_1_OUTはSEG_Cで表示 

SEG_SEL_1 = 0111 (7) -> SEG_1_OUTはSEG_Dで表示 

SEG_SEL_2 = 1110 (E) -> SEG_2_OUTはSEG_Eで表示 

SEG_SEL_2 = 1101 (D) ->SEG_2_OUTはSEG_Fで表示 

SEG_SEL_2 = 1011 (B) ->SEG_2_OUTはSEG_Gで表示 

SEG_SEL_2 = 0111 (7) ->SEG_2_OUTはSEG_Hで表示 

の、ような表示を高速切り替えできるようにし全てのLEDに対して割り当てを行う。 

 

  1. Halfadder

1ビット(A,B) の加算を行い,和(Y) と上位への桁上げ信号キャリー(CO) を出力する回路を書いてやる極めてシンプルな加算回路のコンポーネント 

 

Github 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/halfadder.v  

なぜかわからないけどCoqとして読まれている。実機上では正しく動作が確認できたので問題なし。証拠写真 

 

 

テストベンチ::Github 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_halfadder.v  

transcript上での動作確認が取れた 

 

雑に感じたこととしては1step == 1psに相当すると予想。そして$finishというタスクが実行されプログラムが終了。$monitorでは書式と変数を指定しておりこれはC++の出力ストリームと非常に似ていると感じた。しかしこの1行によって何度も文字が出力されていることから、$monitorは変数の変化を検出するたびに実行でうまく動かしているのではないかということだ。 

 

  1. 2. Fulladder

bitの被加数A, 加数B, 下位桁からのキャリーCINの加算を行い,和(SUM) と上位への桁上げ信号キャリー(COUT) を出力。フルアダーは2個のハーフアダーと,1個のORゲートで構成。⏬構成図と対応表 

 

みたままの割り当てをしてやれば良い Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/full-adder.v  

 

テスト 

テストベンチ::Github 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_fulladder.v  

transcript 桁上げ対応がちゃんとできていることがわかる。 

ただしい挙動を得ることができた 

 

ソースコードについて A,B,SUM は4ビット指定している。それを出力するコードをモジュール内に書いた。テストベンチについてテスト入出力の信号を4ビット幅でとって タイムステップを50でとることによってタイムステップごとに a, b の値を変化させてシュミレーションすることによってテストを行うことができた。 

 

 

  1. 3. four (4) bit ripple carry adder

3個のフルアダー(FA1FA3) と1個のハーフアダー(HA0) を図のように接続すると4ビット2進加算器(ripple4adder)ができる。これはいわゆる構造記述の一環で今までに書いてきたものを部品としてみることによって部品として扱うことができるのでそれらを定義通りに組み合わせるにはどうすれば良いのかを考える。 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/ripple4adder.v  

 

テストについてもここで提示する。Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_ripple4adder.v  

 

テスト結果 

加算結果が16を超えない範囲では出力SUMが正しい数値を表示していることが分かる。これらの組み合わせではcarry0を出力していた。6+14, 13+9など合計が16を超えるとcarry信号が1となりsumに何かしらの信号が確認できるのでO K 

 

 

  1. BCD adder & BCD hosei6 module

これには前提としてBCD符号についての理解が必要。10-16にはA-Fが割り当てられることになるがS0110 = 610 を加えて補正するとこれが1の桁になる)つまり下記の表のように補正する必要性がある。 

 

では全体としてどのような概略図になるのだろうか。以下である。 

 

dummyはハーフアダーの桁上げ信号と接続されていることから桁あふれを表す信号線。3ビットの出力を設けてやりさらにdummyを設けることによって補正結果の調整に使うことを想定している。ここでは前に書いたhalf adderとfull adderを接続することによって計算している。 

 

大きくテーマに分けると「桁上げ検出」「6補正」を先ほど作ったモジュールに噛み合わせれば作成できそうな目算がたった。では順番に処理の過程を見ていくことにする。 

 

「桁上げ検出」 

and演算とor演算をしているところが桁上げ検出である。それがcarry detect。加算されて出てきた結果を入力側に渡してk1とk2のand演算k3とk4のand演算を割り当てる。そして一番重要なのがdetect= (an1 || an2) || k5の部分だがそこでは論理条件を考えることによって桁上げの検出をしている。 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/carrydetect.v  

 

「6補正」 

16進数で表現されてしまうため補正を行う必要があってこの補正方法として表現数の差である6を加算結果にもう一度加算することで強制的に桁をあふれさせ0~9の表現のみを使用できる仕組みをうまく利用することによって桁の処理をする。2進数の加算をして得た結果と桁上げ判定後の結果を入力信号として受け渡すことでつなげている。 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/hosei6.v  

 

ここまでできたら次はそれら3つのコンポーネントを繋いで本格的にシステムを組み上げていく作業。新しいモジュールを立ててそこに書き込むことで接続した。 

 

それがBCDTOP 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/BCDTOP.v  

無事、f0-f4ワイヤ線を結合することができました。 

 

それではテストプログラムを書いて挙動の確認をしてみる。 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_BCDTOP.v  

 

結果的にこうなりました。 



補正検出回路では4bitの加算で桁あふれが発生した場合と結果のbitから10以上であることを検出した場合に信号が1になっている。つまり桁上げとして正しくないところに1を出すことができているのでその他正常に動作しているものと合わせ、うまく動作できた。 

 

  1. 5. six (6) bit add-subtract circuit

したの図の部分を主に作成する。4までで全体制御は書くことができたのでここからは実際に入力された信号に対する過減算装置を記述する。以下の手順で作成して実機に反映させるまでのステップを踏んだ。 

 

 

(1) 減算モジュールの設計 

4bitの入力A,Bの減算結果を6bitのSUB_DATAへ出力する回路を設計する。減算は入力Bの2の補数を生成しその数とAを足し合わせることによって実現する。 

イメージ図はこんな感じ 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/sub.v  

 

 

(2) 加算モジュールの設計 

4bit加算器を実装するFPGAの仕様に合わせて改良したものを使用する。 

イメージ図はこんな感じ 



Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/add.v  

 

 

(3) 1桁加減算トップモジュールの設計 

設計した計算モジュールとあらかじめ用意されたコントロールモジュールを組み合わせてトップモジュールを設計する。 

イメージ図はこんな感じ 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/calc_one_top.v  

 

LEDへの出力の受け渡しと配線->controllerで制御部分の実装。インスタンス部分では.CLK(CLK)などの部分が続くがこれはテンキーへの制御受け渡しをしている部分で非常に核となる重要な実装箇所 

 

(4) トップモジュールのテストベンチの設計 

モジュールの動作確認するためのテストベンチを設計する。検証する計算は1+2, 5-9, 9+8, 6-6でやった。 

3で作ったものに対するテストベンチを作成する。以下の様な実装をした。 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_calc_one.v  

 

クロック信号、リセット信号、Key dataの呼び出しをすることにSEG_1_OUTはSEG_Cで表示、SEG_SEL_1 = 0111 (7) のときSEG_1_OUTはSEG_Dで表示する必要があるのでこれに従った実装をすることである。出力はLED に渡してやる。次にトップのモジュールを呼び出す。これは動作指定したものをテストで呼び出す作用を測っている。次にalways文でシグナル生成をしてタイムステップを踏む。ここでのポイントは7セグメントLEDはダイナミック方式での制御であるため出力データをセレクタで切り替えて出力しないといけない点である。つまり例を示すとSEG_SEL_1 = 1110 (E) のときSEG_1_OUTはSEG_Aで表示、SEG_SEL_1 = 1101 (D) のときSEG_1_OUTはSEG_Bで表示、SEG_SEL_1 = 1011 (B) のときといった感じである。その際のテンキーの受け渡しのルールはFPGAの仕様に基ついて以下のルールを守って行う。 

 

テンキーの割り当てについて 

  1. キーデータ,ボタンデータは押していない状態では"1"が出力されている。押すと"0"が出力される。キー,ボタンについては”0” が有効データ 
  1. リセットボタンを押すとRST_X信号が"0" になる。離すと"1" になる。
  2. テンキーデータは,14ビットの信号PSW[13:0] にセットされる。
  3. あるキーを押したとき,対応するPSW [X]の値が"0" になる

 

(5) シミュレーションで波形が正しいことを確認したらQuartus を起動しVerilogコンパイル、ピンのアサインを行ってFPGAにプログラムを書き込む。実機での動作確認 

 

その結果 

完成しました。 

 

コラム      (追加の実装          -もっと高速でより速いFPGA実装への探求- ) 

先ほど示したsubの改良論理回路設計に伴う変更コードを作成した。改良点としては最下位bitの加算にFulladderを用いているところである。これによってセレクタ信号が1の時に「A_DATA + B_DATA + 1」のような演算ができることによって少し機能性の上がった回路設計になったのではないか?とおもう。ソースコード、およびテストのソースコードについて載せておく 

 

ソースコード 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/andandsub.v  

テストのソースコード 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_andandsub.v