The Elements of Computing Systems, second edition: Building a Modern Computer from First Principles

アセンブラを作る / Parserクラス完成

要領が分かったのでParserクラスのメソッドを全部作る。 class Parser: def __init__(self, file_path): self.file = open(file_path, "r") self.file.seek(0, 2) self.EOF_POS = self.file.tell() self.file.seek(0) self.current_inst = "" def __readline…

アセンブラを作る / instruction_type()

class Parser: def __init__(self, file_path): self.file = open(file_path, "r") self.file.seek(0, 2) self.EOF_POS = self.file.tell() self.file.seek(0) self.current_line = "" def has_more_lines(self): return self.file.tell() != self.EOF_POS d…

アセンブラを作る / advance() / 1行読み込んで余計な部分を削ぎ落とす

pp.109ff. class Parser: def __init__(self, file_path): self.file = open(file_path, "r") self.file.seek(0, 2) self.EOF_POS = self.file.tell() self.file.seek(0) self.current_line = "" def has_more_lines(self): return self.file.tell() != self…

アセンブラを作る / has_more_lines() / 読み込むべき行がまだ残っているかどうかを確かめる

pp.109ff. ここからは未知の領域である。 テキストどおりParserクラスを設けてそこに各メソッドを作り込む。メソッドごとの担当もテキストどおりに切り分ける。まず、読み込むべき行が残っているかどうかを確認できるようにする。 class Parser: def __init_…

本書で作るアセンブラについての提案 / 非公式訳

p.110 本書で作るアセンブラは「Parserモジュール」「Codeモジュール」「Hackアセンブラ」の3つで構成するソフトウェアアーキテクチャを基本とすることをお勧めします。Parserモジュールは、入力を構文解析して命令にし、命令を構文解析してフィールド(シン…

6.3.2 シンボルの処理 / 非公式訳 / two passアセンブラ

p.108 シンボルの処理 アセンブリプログラムはシンボルラベル(goto命令の行き先)が使用できます。シンボルラベルは、シンボル自体の定義される位置より前の位置であっても使用できます。この機能は、アセンブリコード作成者の作業を楽にしてくれる一方で、ア…

コンピューターアーキテクチャー / Lチカで動作確認をする

Chapter 5 バグはたくさん残っているであろうが一往動いているので現状で固めておく。nandのみというルールは途中でいい加減になったが、これで、CPUの創りかた (TD4)、動かしてわかるCPUの作り方10講、CPU1738と合わせて4種類作ったことになる。 Lチカで動…

コンピューターアーキテクチャー / Hackコンピューターを作る

Chapter 5 これでハードウェアは完成である。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity hack is port ( test_load_pc: out std_logic; -- 確認用に外に出す。 reset: in std_logic; clk: in std_logic; in_port: in st…

コンピューターアーキテクチャー / CPUを作る

Chapter 5 全部組み合わせてCPUを作る。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity cpu is port ( clk: in std_logic; instruction: in std_logic_vector(15 downto 0); in_m: in std_logic_vector(15 downto 0); reset…

コンピューターアーキテクチャー / 命令デコーダーを作る

Chapter 5 テキストにはほとんど解説がない。ジャンプ命令についてはSimplify[]函数で簡単化した。BooleanMinimize[]函数を使ってもよい。ルールをゆるめてnand以外も使う。 Simplify[ inst_msb && ( (And[!j2, !j1, j0] && (!zr && !ng)) || (And[!j2, j1, …

コンピューターアーキテクチャー / memoryを作りかえる

Chapter 5 テキストは下のようにメモリーマップしている。 0~16383番地: RAM 16384~24575番地: Screen 24576番地: Keyboard ここではひとまず下のように割り当てておく。 0~63番地: RAM + Screen 64番地: Keyboard library ieee; use ieee.std_logic_1164…

コンピューターアーキテクチャー / memoryを作る

Chapter 5 テキストは下のようにメモリーマップしている。 0~16383番地: RAM 16384~24575番地: Screen 24576番地: Keyboard ここではひとまず下のように割り当てておく。 0~7番地: RAM 8~15番地: Screen 16番地: Keyboard library ieee; use ieee.std_lo…

コンピューターアーキテクチャー / rom16を作る

Chapter 5 テキストは16ビット × 32768本のrom32kをブラックボックスとして提供しているが、こんなに大きなromを作っていたらLEがいくらあっても足りないので、ここではひとまず16ビット×16本のrom16をVHDLで作り込んでおく。最終的にはメモリーブロックに移…

スクリーン / 非公式訳

p.75 スクリーン: Hackコンピューターは、1行が512ピクセルで構成された全256行から成る白黒スクリーンに接続されます。スクリーンの内容はメモリーマップによって表現されます。このメモリーマップは、1ワード16ビットから成る8Kメモリーブロックに格納され…

Figure 4.3 Hackアセンブリコードの例 / 変数

p.69 // x = -1 // 変数xの値を-1にセットする。 @x // RAMのx番地を指定して、 M=-1 // x番地の値を-1にセットする。 // count = count - 1 @count // RAMのcount番地を指定して、 M=M-1 // count番地の値を1減らす。 // sum = sum + x @sum // RAMのsum番…

Figure 4.3 Hackアセンブリコードの例 / 分岐

p.69 // goto 29; 無条件分岐の手順。 @29 // ROM (プログラムメモリー)の29番地を指定して(RAMの29番地も指定されるが無視)、 0;JMP // その番地へジャンプ。 // if D>0 goto 63 ; 条件分岐の手順。 @63 // ROM (プログラムメモリー)の63番地を指定して(RAM…

Figure 4.3 Hackアセンブリコードの例 / メモリーアクセス

p.69 メモリーアクセスの例: // D = 17; データレジスタの値を17にセットする手順。 @17 // Aレジスタ(アドレスレジスタ。データレジスタとしても使える)の値を17にセットする。 D=A // Dレジスタの値をAレジスタの値(ここでは17)にセットする。 // RAM[100]…

メモリーアクセス / 非公式訳

Chapter 4, p.64 メモリーアクセス どのマシン語にも、選択したメモリーロケーションにアクセスして何らかの操作するための手段が備わっています。こうした目的には一般に「アドレスレジスタ」が用いられます。このアドレスレジスタを「A」と呼ぶことにしま…

メモリー / プログラムカウンターpcを作る

Chapter 3 プログラムカウンター用に16ビットカウンター(同期リセット、同期ロード、同期カウントイネーブル)を作る。素直にdffを連結してカウンターを作ったほうが楽だがテキストに従ってインクリメンタを使う。 これでChapter 3は終わり。 library ieee; u…

メモリー / ram64を作る

Chapter 3 今度は前回のram8を8個束ねる。これだけでLEを5,000個近く消費する。今使っているFPGAではもう限界である。テキストはこのram64を8個束ねてram512を作り、ram512を8個束ねてram4kを作り、ram4kを4個束ねてram16kを作る。 library ieee; use ieee.s…

メモリー / ram8を作る

Chapter 3 今度はram8を作る。前回の16ビットレジスタを8本束ねる。8本ある16ビットレジスタのうち、アドレスで指定したレジスタの値が非同期読み出しされる。loadが1のときは、アドレスで指定したレジスタへ同期書き込みされる。 inpを8パラで配線している…

メモリー / 16ビットレジスタを作る

p.53 前回の1ビットレジスタを16個束ねる。 library ieee; use ieee.std_logic_1164.all; entity register_16_bit is port ( clk, load: in std_logic; d: in std_logic_vector(15 downto 0); q: out std_logic_vector(15 downto 0) ); end entity; architec…

メモリー / 1ビットレジスタを作る

pp.52-53 前回のDFFに同期ロード機能(enable機能)を追加する。基本ゲートだけで組み上げるので結局process文は使わない。 loadが1のときは入力dがそのままdffのd端子へ供給される(すなわち出力が同期更新される。すなわち普通のdffとして働く)。loadが0のと…

メモリー / ポジティブエッジトリガー型Dフリップフロップを作る

p.49 肝心かなめの要素であるにもかかわらずテキストはDFFをNANDから作らずにprimitiveな部品としてブラックボックスのまま提供している。 nand回路だけを使う縛りはここでも適用する。中間シグナルを設けてただひたすら配線するだけだ。 参考: Fundamentals…

ALU / 全部組み合わせる

p.42 今度はALUを組み立てる。これでChapter 2 Boolean Arithmeticが終わり。 alu: library ieee; use ieee.std_logic_1164.all; entity alu is port ( x, y: in std_logic_vector(15 downto 0); zx, nx, zy, ny, f, no: in std_logic; outp: out std_logic_…

ALU / インクリメンタinc16

p.42 今度は何かを1増やす回路を作る。何か命令の実行中に次の命令をフェッチする手段として使うとの由。さまざまな実装が考えられるようだが、とりあえず下のように半加算器を連結する形にしておく。リプルは生じるが記述が容易だ。 inc16: library ieee; …

ALU / 16ビット加算器add16

p.42 今度は16ビット加算器を作る。これまで何度も作っているが再度一から作る。半加算器から作り上げる。nand2tetrisの縛りがあるためかなり面倒くさい。キャリー先読みではなく普通のリプルアダーにする。 half_adder: library ieee; use ieee.std_logic_1…

基本ゲートを作る / or8way、mux4way16、mux8way16、dmux4way、dmux8way

p.27 今度は下の回路を作る。15個の基本ゲートが全部出来た。これでChapter 1 Boolean Logicは終わり。 8ビット入力のreduction Orゲート 16ビット幅×4本のなかから1本を選んで出力する回路 16ビット幅×8本のなかから1本を選んで出力する回路 4ビットのなか…

基本ゲートを作る / not16、and16、or16、mux16

p.27 今度は多入力ゲートを作る。 not16 (16ビット入力、全ビットを否定して16ビット出力): library ieee; use ieee.std_logic_1164.all; entity not16 is port ( inp: in std_logic_vector(15 downto 0); outp: out std_logic_vector(15 downto 0) ); end e…

基本ゲートを作る / mux、dmux

p.27 同じ条件で今度はマルチプレクサとディマルチプレクサとを作る。 mux: library ieee; use ieee.std_logic_1164.all; -- a, bのどちらかを出力する。 entity mux is port ( a, b, sel: in std_logic; outp: out std_logic ); end entity; architecture b…