Successfully reported this slideshow.
Your SlideShare is downloading. ×

初めてのCPUを作ってみた

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 49 Ad

More Related Content

Slideshows for you (20)

Viewers also liked (11)

Advertisement

Similar to 初めてのCPUを作ってみた (20)

Advertisement

Recently uploaded (20)

初めてのCPUを作ってみた

  1. 1. 初めての CPUをつくってみた 筑波大学情報科学類 えりっくさーとる
  2. 2. 自分について •  @siritori   •  CPUとか(リアルに)よくわからない •  おもいっきりソフトウェアの人間です •  好き:しりとりと自然言語処理とおっぱい 筑波大学情報科学類 えりっくさーとる
  3. 3. カーネル/VMのネタのために CPU作るか(適当)
  4. 4. 作ったもの •  Whitespaceを実行するCPU
  5. 5. 作ったもの •  Whitespaceを実行するCPU
  6. 6. 作ったもの •  Whitespaceを実行するCPU •  落ち着け、別に大したことではない •  メモリ上にWhitespaceコードを置いて それを実行するようなやつ •  Verilogで書いてみた
  7. 7. 前提知識 Verilog •  ハードウェア記述言語(HDL)の一種 •  もともとシミュレーション用の言語 •  入出力のピンと、回路ブロックの挙動とその 接続状態を書く •  なんか授業で(超ざっくり)習ったぽよ
  8. 8. 前提知識 Whitespace •  みんな大好きEsolang •  半角スペースとタブ文字と改行だけで表現 •  そもそもコードが目に見えない
  9. 9. 前提知識 Whitespace [SP][SP][TAB][TAB][SP][LF] [SP][SP][TAB][SP][LF] [TAB][SP][SP][SP] こういうの
  10. 10. 前提知識 Whitespace PUSH [SP][SP][TAB][TAB][SP][LF] PUSH [SP][SP][TAB][SP][LF] ADD [TAB][SP][SP][SP]
  11. 11. 前提知識 Whitespace [SP][SP][TAB][TAB][SP][LF] [SP][SP][TAB][SP][LF] リテラルは2進数で表現。 [TAB][SP][SP][SP] [TAB]を1、[SP]を0として表現 [LF]が終わりを意味する
  12. 12. 前提知識 Whitespace もしかして:タダのアセンブリ?
  13. 13. 前提知識 Whitespace もしかして:タダのアセンブリ?
  14. 14. 前提知識 Whitespace push add label load dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  15. 15. 前提知識 スタック操作 Whitespace push add label load dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  16. 16. 前提知識 算術操作 Whitespace push add label load dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  17. 17. 前提知識 ジャンプ操作 Whitespace push add label load dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  18. 18. 前提知識 ヒープ(メモリ) 操作 Whitespace push add label load dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  19. 19. 前提知識 Whitespace push add label load 入出力操作 dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  20. 20. 前提知識 Whitespace もしかして:タダのアセンブリ? ...ってことは、 実行できるCPU作れるのでは? という話に当然なる
  21. 21. 前提知識 Whitespace もしかして:タダのアセンブリ? ...ってことは、 実行できるCPU作れるのでは? という話に当然なる(断定)
  22. 22. 前提知識 完
  23. 23. おもむろに書き始める
  24. 24. ブロック図 フロー コントローラ ヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  25. 25. ブロック図 フロー コントローラ ヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  26. 26. ヒープ •  ぶっちゃけただのメモリ •  かんたーん CS CLK [31:0]q LOAD [31:0]addr [31:0]d
  27. 27. ブロック図 フロー コントローラ ヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  28. 28. スタック •  [3:0]modeで操作を指定 •  算術命令もいれちゃった(* ∀ 人) •  top1がスタックトップ、top2は2番目 CS RST CLK [31:0]top1 [3:0]mode [31:0]top2 [31:0]addr [31:0]d
  29. 29. ブロック図 フロー コントローラ ヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  30. 30. プログラムメモリ&フェッチ
  31. 31. プログラムメモリ&フェッチ あれ?Whitespaceって 命令が固定長じゃなくね?
  32. 32. プログラムメモリ&フェッチ うわー あかんやつやこれ
  33. 33. プログラムメモリ&フェッチ •  読み始めるアドレスを入れると •  オペコードとオペランドと次のアドレス がでてくるようなメモリ •  オペコードが1クロックで1発フェッチが できないので、終わったらDONEフラグ を立てるようにしてみた
  34. 34. プログラムメモリ&フェッチ こんな感じに遷移することにする CMD OP END FETCH FETCH
  35. 35. プログラムメモリ&フェッチ •  addrから読み始めるアドレスを入力 •  cmdにオペコード,opにオペランド CS [31:0]next RST [5:0]cmd CLK [31:0]op [31:0]addr DONE
  36. 36. ブロック図 フロー コントローラ ヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  37. 37. だーかーらーCPUのしくみ知らんって 言ってるじゃん(´;ω;`)
  38. 38. フローコントローラと ステートマシン こんな感じに遷移することにする(既視感 FETCH EXEC1 EXEC2
  39. 39. フローコントローラと ステートマシン •  フェッチが終わるまで待ってー •  命令にあわせてヒープやスタックを起こし て仕事させてー •  場合によっては書き込む •  を繰り返す
  40. 40. フローコントローラと ステートマシン •  inputとoutputピンがやたら多いので 図は省略
  41. 41. ブロック図 フロー コントローラ ヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  42. 42. デモ 0x001 push 6 0x006 push 4 0x00C add 0x010 call 0x0100 0x100 push 2 0x105 mul 0x109 slide 2 0x10F ret
  43. 43. デモ これらを   0x001 push 6 ハンドアセンブル   0x006 push 4 する(震え声 0x00C add 0x010 call 0x0100 0x100 push 2 0x105 mul 0x109 slide 2 0x10F ret
  44. 44. まとめ •  普段の勉強法とは違う方法でやってみた •  なんだかんだでCPUできた •  Whitespaceが動くアーキテクチャは 作れる
  45. 45. ところで
  46. 46. 前提知識 Whitespace push add label load 入出力操作 dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit
  47. 47. 前提知識 Whitespace push add label load 入出力操作 dup sub call store もしかして:タダのアセンブリ? copy mul jump getc swap sub jeq getn pop div jneg putc slide mod ret putn exit I/Oは?
  48. 48. 終わってねーよ
  49. 49. ご清聴 ありがとう ございました

×