FPGAプログラミング大全Xilinx編第2版 TD4 メモリ部実装 #8

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メモリ実装|
|09|未定|


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

### 今日のゴール
TD4のverilog化
メモリ部分を作る

### 実際のコード
メモリ部分を作成してみたがシミュレータだと上手く動かないので明日以降デバッグ

```
`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];

reg [3:0] command;
reg [3:0] im;

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;
    led = 4'b0000;
end

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

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


```

今日はここまで