ラベル コンピュータ開発 の投稿を表示しています。 すべての投稿を表示
ラベル コンピュータ開発 の投稿を表示しています。 すべての投稿を表示

2015年5月3日日曜日

[コンピュータ開発][コンピュータシステムの理論と実践]OCamlでHack assemblerを実装

「コンピュータシステムの理論と実装」
第6章 アセンブラ まで進んだ。

第一段階のシンボルフリーなHackアセンブラをOCamlで実装した。
https://github.com/takeisa/ocaml-hack-assembler

  • 依存ライブラリはCoreとRe2。
  • コマンドラインの解析は、Coreのライブラリを使用。ここを参考に実装した。

実行例

デバッグ用出力がいろいろ出ているが、Add.asmをアセンブルして、Add.hackを出力している。

$ ./assembler Add.asm && echo "----" && cat Add.hack 
ignore :   1 43 [// This file is part of www.nand2tetris.org]
ignore :   2 51 [// and the book "The Elements of Computing Systems"]
ignore :   3 36 [// by Nisan and Schocken, MIT Press.]
ignore :   4 37 [// File name: projects/06/add/Add.asm]
ignore :   5  0 []
ignore :   6 22 [// Computes R0 = 2 + 3]
ignore :   7  0 []
command:   8  2 [@2]
command:   9  3 [D=A]
dest=2 comp=48 jump=0
command:  10  2 [@3]
command:  11  5 [D=D+A]
dest=2 comp=2 jump=0
command:  12  2 [@0]
command:  13  3 [M=D]
dest=1 comp=12 jump=0
----
0000000000000010
1110110000010000
0000000000000011
1110000010010000
0000000000000000
1110001100001000

その他

デバッグ用に、レコード型やバリアント型の値を文字列に変換して表示したかったので、以前、Twitterで教えていただいたmeta_convを使って、変換する関数を自動で生成させようとした。
とりあえず、以下の単純なコードを作成して、

==hello.ml==
open Meta_conv.Open
open Ocaml_conv

type hello =
  | Foo of string
  | Bar of int
with conv(ocaml)

ocamlfindでコンパイルすると、エラーとなった。

$ ocamlfind ocamlc -verbose -package meta_conv,ocaml_conv -syntax camlp4o -package meta_conv.syntax hello.ml 
findlib: [WARNING] Interface topdirs.cmi occurs in several directories: /home/satoshi/.opam/4.02.1/lib/ocaml, /home/satoshi/.opam/4.02.1/lib/ocaml/compiler-libs
Effective set of preprocessor predicates: preprocessor,syntax,camlp4o
Effective set of compiler predicates: pkg_meta_conv,pkg_compiler-libs,pkg_compiler-libs.common,pkg_ocaml_conv,pkg_camlp4,pkg_type_conv,pkg_meta_conv.syntax,syntax,autolink,byte
+ ocamlc.opt -verbose -I /home/satoshi/.opam/4.02.1/lib/ocaml/compiler-libs -I /home/satoshi/.opam/4.02.1/lib/ocaml_conv -I /home/satoshi/.opam/4.02.1/lib/ocaml/camlp4 -I /home/satoshi/.opam/4.02.1/lib/type_conv -I /home/satoshi/.opam/4.02.1/lib/meta_conv -pp "camlp4 '-I' '/home/satoshi/.opam/4.02.1/lib/ocaml/camlp4' '-I' '/home/satoshi/.opam/4.02.1/lib/type_conv' '-I' '/home/satoshi/.opam/4.02.1/lib/meta_conv' '-I' '/home/satoshi/.opam/4.02.1/lib/meta_conv' '-parser' 'o' '-parser' 'op' '-printer' 'p' 'pa_type_conv.cma' 'meta_conv.cmo' 'pa_meta_conv.cma' " hello.ml
+ camlp4 '-I' '/home/satoshi/.opam/4.02.1/lib/ocaml/camlp4' '-I' '/home/satoshi/.opam/4.02.1/lib/type_conv' '-I' '/home/satoshi/.opam/4.02.1/lib/meta_conv' '-I' '/home/satoshi/.opam/4.02.1/lib/meta_conv' '-parser' 'o' '-parser' 'op' '-printer' 'p' 'pa_type_conv.cma' 'meta_conv.cmo' 'pa_meta_conv.cma'  'hello.ml' > /tmp/ocamlpp86694c
File "hello.ml", line 1:
Error: Error while linking hello.cmo:
Reference to undefined global `Ocaml_conv'
ocamlc.opt returned with exit code 2 


Ocaml_convがうまく参照できないようだ。
きっとライブラリの指定の方法か、OCamlの開発環境に原因があるのだろう。
こちらは、そのうち調べてみよう。

2015年4月19日日曜日

[コンピュータ開発][コンピュータシステムの理論と実践] CPUの作成

「コンピュータシステムの理論と実装」を課題をこなしながら、読み進めている。
1章あたり1週間のペースで課題を消化して、やっとCPUの作成が完了した。

NANDゲートを使ったANDやOR等の基本論理ゲートの作成から始まり、ALU、レジスタ、RAM、カウンタを作成した後、これらの素子を組み合わせて、CPUが完成した。

回路設計は回路図を書かずに、HDLを使うという簡易さはあるものの、ハードウェアエミュレータを使って、動作確認する際は、回路上の論理値の表示がピコピコ更新されて、なかなか面白い。
図はハードウェアエミュレータでCPUのテストが完了したところ。
 過去に、いろいろな回路を設計してきたが、簡易的とはいえCPUは初めてで、設計過程はとても面白かった。
今まで作成したものは、
https://github.com/takeisa/nand2tetris-project
に公開した。

2015年4月5日日曜日

[コンピュータ開発][コンピュータシステムの理論と実践] ALUの作成

先日、O'Reillyから「コンピュータシステムの理論と実装」が発売された。
NANDという電子素子からスタートし、論理ゲート、加算器、CPUを設計します。そして、オペレーティングシステム、コンパイラ、バーチャルマシンなどを実装しコンピュータを完成させて、最後にその上でアプリケーション(テトリスなど)を動作させます。 
という内容で、まえがきには「腕まくりをし、コンピュータをゼロから作り上げたいと願う読者のための本」と書かれている。
実際にはハードウェアは作成せず、Javaで書かれたエミューレータ上で、コンピュータを作っていく。

自分でデザインしたCPUを動かしたいと思い、DE0を購入し、入門書を参考に、簡単な回路を作ったりしていたのだけど、この本を一通りこなしてから、DE0でのCPU作成にとりかかろうと思う。

各章毎にテーマがあり、動作するものを作成していく構成になっている。
第1章 NANDを使って基本的な論理回路の作成
第2章 ALUの作成 まで完了した。
HDL(Hardware Description Language)で回路か記述し、ハードウェアエミュレータで動作確認をしていく。
エミューレータによるテスト中は、入力データ、出力データ、回路内部のデータがピコピコ表示されて面白い。

はまった点

いくつか、はまった点があったので書いておく。

Hardware Emulator

Windows8.1 + Java8の環境

画面右上にあるViewでOuputとCompareを選択しても、表示されない。
この挙動を見て、Linuxで作業することにしたので、解決方法は不明。
Javaのバージョンを下げると動くのかもしれない。

Debian Wheezy + Awesome Windowの環境

Manager Awesomeが便利なので、常用しているが、HardwareEmulatro.shを実行すると、一面グレーのウィンドウが表示されるだけ。
Java6,7,8、いずれも同じ現象。
Window ManagerをXfce4に変更したら正しく表示された。

HDLの書き方

ALUで、出力が0の場合に nz=1 となるように、以下の定義を書いたが、hdlの読み込みでエラーとなった。
Mux16(a = out0, b = nout0, sel = no, out = out, out[15] = ng);

Or8Way(in[0..7] = out[0..7], out = or0);
Or8Way(in[0..7] = out[8..15], out = or1);
Or(a = or0, b = or1, out = nonzero);
Not(in = nonzero, out = zr);
エミュレータの下部にエラーメッセージが表示されるが、一行しか表示されず、エラーの行番号は分かるが、肝心なエラー原因は途中で切れて分からない。エミュレータのウィンドウを広げても、表示幅は固定のため、内容を確認できない。
検索したり、試行錯誤したりして、以下のように記述したら、正しく解釈できた。
Mux16(a = out0, b = nout0, sel = no, out = out, out[15] = ng, out[0..7] = out1l, out[8..15] = out1h);

Or8Way(in = out1l, out = or0);
Or8Way(in = out1h, out = or1);
Or(a = or0, b = or1, out = nonzero);
Not(in = nonzero, out = zr);

エミューレータのソースは公開されているので、手っ取り早く対応するには、エラーメッセージを標準出力に出力するようにすれば、便利かも。

 その他

ハードウェアエミュレータは素子の遅延時間は見ない 遅延時間は見ないので、非効率な回路を定義しても、論理的に合っていればテストOKとなる。 実際に回路を組むときは、この遅延時間を考慮することは非常に重要なのだけど、ここまで、記述はないようだ。

2015年3月26日木曜日

[FPGA][コンピュータ開発] DE0の関連書籍

DE0とパソコンは接続できたが、これから先、どうすれば良いのかさっぱり分からない。
本屋とAmazonを徘徊して、良さそうな本をいくつか購入した。

FPGA ボードで学ぶ組込みシステム開発入門 ~Altera編~ 

DE0を使う上での定番の書籍みたい。
開発ソフトQuartus2の使い方に始まり、Nios2やμClinux等、幅広く、いろいろな記事がある。

インターフェースZERO No.04 Hello Worldから始めるFPGA入門: 2大メーカXilinx,Alteraのお手軽ボードでチョコッと体験! 

表紙に、本書の内容を試せる定番FPGAボードとして、DE0-nanoとDE0が載っていたので購入。
Altera社のFPGAでLEDをチカチカさせるという記事があるので、まずはこれを試すのが良いかな。
HDLの説明や、基本的な例、オセロゲームを作るなど、チョコッと体験!というタイトルのわりには、いろいろ書いてある。

FPGA/PLD入門記事全集[2200ページ収録CD-ROM付き]: 月刊トランジスタ技術,Interface,Design Wave Magazine10年分(2001-2010)から集大成 (アーカイブスシリーズ) 

Design Wave Magazineで連載していた記事で、基礎から学ぶVerilog HDL & FPGA設計が面白そうだったので購入。この連載の「CPUを作ろう」「CPUの設計」「アセンブラの設計」「コンパイラの設計」のタイトルが興味を引いた。

2015年3月25日水曜日

[FPGA][コンピュータ開発]DE0購入

以前から、FPGAを使ってCPU製作してみたかったのだけど、とうとうDE0を買ってしまった。
最近、DE1-Soc や DE0-CV が販売されており、どれにしようか悩んだのだけど、書籍やWeb上での情報が豊富なDE0に決定。
digikeyで購入しようと思ったが、すぐにでも欲しくなってしまったので、物が置いてあった千石通商で購入。\17,850だった。円安が原因で、以前より価格が上がっているようだ。

DE0はWindows8.1 64bit版のマシンで使う。
Windows8.1で使えるか、心配だったが、大丈夫のようだ。

Alteraから Quartus2 Web Edition 13.1 をダウンロードして、
QuartusSetupWeb-13.1.0.162.exe
をインストール。
※DE0に載っているCyclone III 3C16 FPGA deviceに対応しているのは 13.1までのようだ。

全てデフォルトのままインストールした。
インストールするもののうち、ModelSim-Altera Editionだけ、チェックが付いていなかった。

DE0に電源を繋いで、USBとPCを接続する。
デバイスマネージャ を見ると、ほかのデバイスに USB Blasterがあるので、
手動で、C:\altera\13.1\quartus\drivers\usb-blaster を指定してドライバをインストールする。
インストールが完了すると、ユニバーサル シリアル バス コントローラー に
Altera USB-Blaster が表示される。

DE0の添付DVDにあった、Getting Started with Altera DE0 board.pdf に書いてあるように、電源を入れると、
  • All user LEDs (LED0~LED9) are flashing
  • All 7-segment displays(HEX0 and HEX3) are cycling through the numbers 0 to F
となっており、いまのところ問題は無い。