FPGAプログラミング大全Xilinx編第2版 TD4 実行部実装 #7

FPGAに再入門しようと思いたち[FPGAプログラミング大全Xilinx編第2版](https://www.amazon.co.jp/FPGA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%A4%A7%E5%85%A8-Xilinx%E7%B7%A8-%E7%AC%AC2%E7%89%88-%E5%B0%8F%E6%9E%97-%E5%84%AA/dp/4798063266/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1S5G3UKPB55O9&keywords=FPGA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%A4%A7%E5%85%A8Xilinx%E7%B7%A8%E7%AC%AC2%E7%89%88&qid=1669893715&qu=eyJxc2MiOiIwLjc2IiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=fpga%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%A4%A7%E5%85%A8xilinx%E7%B7%A8%E7%AC%AC2%E7%89%88%2Caps%2C151&sr=8-1)を頭からやっていく7日目

時期的にも良いので一人Advent Calendarで25日続ける

FPGAプログラミング大全ではCPUを作る方に行かないのでしばらく[CPUの作り方](https://www.amazon.co.jp/CPU%E3%81%AE%E5%89%B5%E3%82%8A%E3%81%8B%E3%81%9F-%E6%B8%A1%E6%B3%A2-%E9%83%81-ebook/dp/B08639XM13/ref=sr_1_1?adgrpid=56066879911&gclid=Cj0KCQiA7bucBhCeARIsAIOwr-9UTCHVPClOIgYn0LaaqYmR4g2MWF40orC-R0t2tmpx87cU-Wj1ko0aAljrEALw_wcB&hvadid=618673188431&hvdev=c&hvlocphy=1009300&hvnetw=g&hvqmt=e&hvrand=12178006679013735266&hvtargid=kwd-335340839695&hydadcr=15818_13600556&jp-ad-ap=0&keywords=cpu%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9&qid=1670330101&sr=8-1)と合わせてやっていくことにする

### 25日終了時の目標
4004等の実CPUの実装

### 目次
| # | タイトル |
|:-:|:-:|
|   01|  [ツール導入](https://qiita.com/Gazyu/items/8f3797abf4ddc88ecacd) |
|  02 |  [実機テスト下準備](https://qiita.com/Gazyu/items/b59e0a1e023005bc02d5) |
|  03 |  [実機テスト](https://qiita.com/Gazyu/items/23ec4da6c241d95bfa8e) |
|04|[クロック利用](https://qiita.com/Gazyu/items/a653fe87023323f308de)|
|05|[シミュレーション検証](https://qiita.com/Gazyu/items/508370018465c164120b)|
|06|[TD4](https://qiita.com/Gazyu/items/08377deaa0413dd111cb)|
|07|TD4とりあえず実装|


### 環境
【実装ボード】 [Digilent Artix-7 35T Arty FPGA 評価キット](https://japan.xilinx.com/products/boards-and-kits/arty.html#resources)
【OS】 Windows10
【IDE】 Vivado 2022.2

### 今日のゴール
TD4を実際にVerilogHDLに落とし込む

### 実際のコード
プログラムコードが実際にある定数に入っていたと仮定した場合に、クロックの立ち上がりでプログラムコードを実行するコード
命令は実行できるが、プログラムカウンタの値を参照してプログラムの実体を読んでくる場所がまだできていない
また、実際のプログラムを保存しておく場所がないのでそれも作らないといけない

```
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2022/12/02 22:34:10
// Design Name: 
// Module Name: LED_Test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module LED_Test(
   input   CLK100MHZ,
   input    [3:0]   sw,
   output  reg [3:0]   led
   );

reg [3:0]   register_a;
reg [3:0]   register_b;
reg carry;
reg [3:0]   program_counter;
reg [7:0]   program;

wire command = program[7:4];
wire im = program[3:0];

always @(posedge CLK100MHZ ) begin
// TODO どこからかprogram_counterのアドレスの命令をprogramに読み込む

// 命令	意味	オペコード
// ADD A, Im	AレジスタにImを加算	0000
// ADD B, Im	BレジスタにImを加算	0101
// MOV A, Im	AレジスタにImを入れる	0011
// MOV B, Im	BレジスタにImを入れる	0111
// MOV A, B	AレジスタにBのデータを入れる	0001
// MOV B, A	BレジスタにAのデータを入れる	0100
// JMP Im	Imアドレスにジャンプ(絶対アドレスのみサポート)	1111
// INC Im	キャリーフラグがない場合のみImアドレスにジャンプ（必ず加算命令の直後のみ実行）	1110
// IN A	入力ポートからAレジスタに転送	0010
// IN B	入力ポートからBレジスタに転送	0110
// OUT B	Bレジスタのデータを出力ポートに転送	1001
// OUT Im	データをそのまま出力ポートに転送	1011


    case (command)
        4'b0000:begin    
            { carry , register_a } = register_a + im;
        end
        4'b0101:begin    
            { carry , register_b } = register_b + im;
        end
        4'b0011:begin    
            register_a = im;
        end
        4'b0111:begin    
            register_b = im;
        end
        4'b0001:begin    
            register_a = register_b;
        end
        4'b0100: begin    
            register_b = register_a;
        end
        4'b1111:begin    
            program_counter = im;
        end
        4'b1110:begin
            if(!carry)
                program_counter = im;
        end
        4'b0010:begin    
            register_a = sw;
        end
        4'b0110:begin    
            register_b = sw;
        end
        4'b1001:begin    
            led = register_b;
        end
        4'b1011:begin    
            led = im;
        end
    endcase

end 


endmodule

```

今日はここまで