FPGAプログラミング大全Xilinx編第2版 TD4 完成 #9

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とりあえず実装](https://qiita.com/Gazyu/items/721967444237a72f04e9)|
|07|[TD4メモリ実装](https://qiita.com/Gazyu/items/f18e19b48becbead6dd8)|
|09|TD4完成|
|10|未定|

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

### 今日のゴール
TD4のFPGA実装完了

### 実際のコード
うまく動かない理由はデータ初期を正しくしていなかったこととプログラムカウンタが最後まで到達したことを正しくハンドリングできていないことだった

```
`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 finish_flag;
reg [3:0]   program_counter;
reg [7:0]   program;

reg [7:0] MEM[3:0];

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

initial begin
    MEM[0] = 8'b00110001;
    MEM[1] = 8'b01110001;
    MEM[2] = 8'b00000001;
    MEM[3] = 8'b01010001;
    MEM[4] = 8'b10010000;
    MEM[5] = 8'b00000000;
    MEM[7] = 8'b00000000;
    MEM[8] = 8'b00000000;
    MEM[9] = 8'b00000000;
    MEM[10] = 8'b00000000;
    MEM[11] = 8'b00000000;
    MEM[12] = 8'b00000000;
    MEM[13] = 8'b00000000;
    MEM[14] = 8'b00000000;
    MEM[15] = 8'b00000000;
    program_counter = 4'b0000;
    register_a = 4'b0000;
    register_b = 4'b0000;
    program = 8'b00000000;
    finish_flag = 0;
end

always @(posedge CLK100MHZ ) begin
// MEMからかprogram_counterのアドレスの命令をprogramに読み込む
    program = MEM[program_counter];

// 命令	意味	オペコード
// 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

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


endmodule


```

一旦TD4の実装がおわりなんとなくの肌感が掴めたので明日からは実際の4004CPUに着手する

今日はここまで