読者です 読者をやめる 読者になる 読者になる

非公開日記

日記です。自分が興味あることを挫折しながら書いていきます。

CPU開発日記[その3]

今回の内容

前回まででサンプルコードを FPGAボードに書き込むという事を経験しました。
しかしそうはいっても『独自CPU開発で学ぶコンピューターのしくみ』(以下参考書)に記載されていることをなぞっただけでしたので、今回は参考書に記載のない事項を試してみてより理解を深めたいと思います。

独自CPU開発で学ぶコンピュータのしくみ

独自CPU開発で学ぶコンピュータのしくみ

 

 

具体的な目標 

前回書き込んだ回路では入力と出力は下記画像のようになっていました。

f:id:QZ2501:20170114001742j:plain

ボード上にLEDは LED0から LED9 まで用意されていますが、 LED0からLED4 までしか使っていません。入力についても同様に SW0からSW9 までありますが、使用されているのは SW0からSW7 までです。

今回はこの入出力をいじります。つまり、使っていないLEDやSWを使うようにverilog のコード等をを変え、その変更に合わせてFPGAの書き込みまで行うようにします。

 

実際にやってみよう

とりあえず、出力を LED5からLED9 までを利用するように変更を行ってみましょう。

仮説を立てる

そのためにまず必要なのは『何が、あるいは何処が、LED5からLED9 ではなく、LED0からLED4 を使う事を決定づけたか』を把握することです。

前回のエントリで行ったことといえば、①プロジェクトの作成->②FPGAのピンとverilogのポートとの対応付け->③制約の追加->④書き込み、でした。
見るからに一番怪しいのはFPGAのピンとverilogのポートとの対応付けでしょう。
というわけでまずはverilog のコードにヒントがないか確認してみましょう。

まずadder_4bit.sv です。

module adder_4bit(
input wire iCLOCK,
input wire inRESET_SYNC,
input wire [3:0] iDATA_A,
input wire [3:0] iDATA_B,
output wire [3:0] oDATA,
output wire oC
);

と冒頭でモジュールが定義(宣言?ここの用語は後日調べて適宜修正します)されています。
output wire [3:0] oDATA という形で 4bit の出力についての言及がありますが、これだけでは LED5-9 でなく、LED0-4 が使用される理由にはならないように思われます。
その他にも特にLED0-4 を使うように指示している箇所もなさそうです。

次にtop_adder_4bit.sv を覗いてみます。
こちらも冒頭でモジュールが定義されています。ここでは

output wire [9:0] LEDR

と記述されており、10bit(0から9) の出力が記述されています。これはちょっと怪しいですね。

さらにファイルの後半以降に

wire [4:0] out_data;

adder_4bit ADDER(
.iCLOCK(CLOCK_50),
.inRESET_SYNC(b_key_buff1[0]),
.iDATA_A(b_sw_buff1[7:4]),
.iDATA_B(b_sw_buff1[3:0]),
.oDATA(out_data[3:0]),
.oC(out_data[4])
);

assign LEDR = {5'h0, out_data};

と書かれています。
out_data という名の 5 bit(0から4) のwire が adder_4bit モジュールの oDATA と結びつき、さらにLEDRに out_data は結びついています。

LEDRは上述のように10bit 用意されていますが、ここでは 5 bit しか使われていません。なんとなく、この部分がFPGA上にはLEDは0から9まで用意されているにもかかわらず、LED0-4 までしか使われないという動作を決定づけてのでは?と怪しく思えてきます。

というわけでここで仮説を立ててみます。
”LED5-9が使われないのは top_adder_4bit.svでそう記述されているからである。”

LED5-9 が使われていないのが top_adder_4bit.sv の記述のせいであるなら、それを変更することで LED5-9 を使用することも可能になるはずです。
思いついた方法としては
●LEDR[0:9]を LEDR[5:9]に変更する。
 top_adder_4bit.sv の記述は adder_4bit というモジュールを、top_adder_4bitというモジュールで囲っているように思えます。

f:id:QZ2501:20170123062432p:plain

adder_4bit からの5 bit  の出力を top_adder_4bit のout_data という線に乗せ、それをLEDRに出力し、LEDRはFPGA上のLEDと結びついているから LEDが光るという動きをしているとすると、adder_4bit が出す出力が行きつく先を LEDR[0:9]のうちの5bit(そしてその結果LED0-4が選ばれた) とするのではなく、LEDR[5:9]に限定してしまえば光るLEDも変わるのではないでしょうか。

検証

条件を変えない、という観点から今回は前回の流れに沿ってまた一からプロジェクトを作ってみました。

一点だけ違うのはプロジェクトを作成する前に top_adder_4bit.sv の冒頭に書かれている、

module top_adder_4bit(
input wire CLOCK_50,
input wire [17:0] SW,
input wire [3:0] KEY,
output wire [9:0] LEDR
);

module top_adder_4bit(
input wire CLOCK_50,
input wire [17:0] SW,
input wire [3:0] KEY,
output wire [9:5] LEDR
);

に事前に変更するということだけです。

実際の手順は前回記述したものと変わらないので割愛させてください。

 

結果

書き込みが終わったら SW を適当に上げ下げしてみます。
すると、どうでしょう。思った通り LED5から LED9 までが光るようになっています。

f:id:QZ2501:20170123204333j:plain

というわけで使われていなかったLEDを光らせることに成功です!

 

終わりに

今回は少しだけ参考書に載っていないことを考えながらやってみるということにチャレンジしてみました。
使用している評価ボードには 7 セグメントLEDもあるので、今度はこちらを使うようにしてみるのもいいかもしれません。
CPUを作成するまで先は長いですが、ゆっくりでも確実に進めて行こうと思います。

では今回はこの辺りで。