0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-07

FPGAに再入門しようと思いたちFPGAプログラミング大全Xilinx編第2版を頭からやっていく7日目

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

FPGAプログラミング大全ではCPUを作る方に行かないのでしばらくCPUの作り方と合わせてやっていくことにする

25日終了時の目標

4004等の実CPUの実装

目次

# タイトル
01 ツール導入
02 実機テスト下準備
03 実機テスト
04 クロック利用
05 シミュレーション検証
06 TD4
07 TD4とりあえず実装

環境

【実装ボード】 Digilent Artix-7 35T Arty FPGA 評価キット
【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

今日はここまで

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?