]> iEval git - clump.git/blobdiff - chip.v
Make it work
[clump.git] / chip.v
diff --git a/chip.v b/chip.v
index ff16cedd5ca796ae4e881ee7f5d643da3b6b8dca..12006404f1da684b5c77e5632555219c29bffb89 100644 (file)
--- a/chip.v
+++ b/chip.v
@@ -1,11 +1,13 @@
-`define OP_NOP   3'd0
-`define OP_LOADA 3'd1
-`define OP_LOADB 3'd2
-`define OP_STORE 3'd3
-`define OP_READ  3'd4
-`define OP_LOADI 3'd5
-`define OP_ROUTE 3'd6
-`define OP_RUG   3'd7
+`include "news.v"
+
+`define OP_NOP    3'd0
+`define OP_LOADA  3'd1
+`define OP_LOADB  3'd2
+`define OP_STORE  3'd3
+`define OP_STOREI 3'd4
+`define OP_LOADI  3'd5
+`define OP_ROUTE  3'd6
+`define OP_LED    3'd7
 
 `define DIRECTION_N  3'd0
 `define DIRECTION_NE 3'd1
@@ -16,7 +18,7 @@
 `define DIRECTION_W  3'd6
 `define DIRECTION_NW 3'd7
 
-module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, output reg [15:0] mem_in, input [15:0] mem_out, output reg mem_write);
+module chip(input clk, input [2:0] op, input [15:0] I, output reg [15:0] mem_in, input [15:0] mem_out, output reg mem_write, output reg [3:0] led_out = 0);
 
    // parity is unimplemented
 
@@ -35,18 +37,10 @@ module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, o
    wire          edge_ = I[7];
    wire [3:0] cube = I[11:8];
 
-   // OP_ROUTE
-   wire [5:0] cycle = I[5:0];
-   wire [1:0] check = I[7:6];
-   wire [3:0] xor_  = I[11:8];
-   wire [2:0] snarf = I[14:12];
-   wire          odd   = I[15];
-
-   // OP_RUG
-   wire          rw = I[0];
-   wire          ac = I[1];
-   wire          news = I[2];
-   wire [4:0] reg_ = I[8:4];
+   // OP_LED
+   wire          mode   = I[4];
+   wire [1:0] offset = I[1:0];
+   wire [3:0] leds   = I[3:0];
 
 
    reg [15:0] A = 0;
@@ -58,14 +52,13 @@ module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, o
    reg [7:0]  alu_sum = 0;
    reg [7:0]  alu_carry = 0;
    reg [15:0] cube_in;
-   reg                   io;
 
    // these are not really regs
 
    reg [15:0]  alu_sum_out;
    reg [15:0]  alu_carry_out;
 
-   reg [2:0]  alu_index [15:0];
+   reg [2:0]   alu_index [15:0];
 
    reg [15:0]  idx;
 
@@ -77,139 +70,6 @@ module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, o
          end
    end
 
-   reg [3:0] newstable[0:15][0:7];
-
-   initial begin
-         newstable[0][0] = 12;
-         newstable[0][1] = 13;
-         newstable[0][2] = 1;
-         newstable[0][3] = 5;
-         newstable[0][4] = 4;
-         newstable[0][5] = 7;
-         newstable[0][6] = 3;
-         newstable[0][7] = 15;
-         newstable[1][0] = 13;
-         newstable[1][1] = 14;
-         newstable[1][2] = 2;
-         newstable[1][3] = 6;
-         newstable[1][4] = 5;
-         newstable[1][5] = 4;
-         newstable[1][6] = 0;
-         newstable[1][7] = 12;
-         newstable[2][0] = 14;
-         newstable[2][1] = 15;
-         newstable[2][2] = 3;
-         newstable[2][3] = 7;
-         newstable[2][4] = 6;
-         newstable[2][5] = 5;
-         newstable[2][6] = 1;
-         newstable[2][7] = 13;
-         newstable[3][0] = 15;
-         newstable[3][1] = 12;
-         newstable[3][2] = 0;
-         newstable[3][3] = 4;
-         newstable[3][4] = 7;
-         newstable[3][5] = 6;
-         newstable[3][6] = 2;
-         newstable[3][7] = 14;
-         newstable[4][0] = 0;
-         newstable[4][1] = 1;
-         newstable[4][2] = 5;
-         newstable[4][3] = 9;
-         newstable[4][4] = 8;
-         newstable[4][5] = 11;
-         newstable[4][6] = 7;
-         newstable[4][7] = 3;
-         newstable[5][0] = 1;
-         newstable[5][1] = 2;
-         newstable[5][2] = 6;
-         newstable[5][3] = 10;
-         newstable[5][4] = 9;
-         newstable[5][5] = 8;
-         newstable[5][6] = 4;
-         newstable[5][7] = 0;
-         newstable[6][0] = 2;
-         newstable[6][1] = 3;
-         newstable[6][2] = 7;
-         newstable[6][3] = 11;
-         newstable[6][4] = 10;
-         newstable[6][5] = 9;
-         newstable[6][6] = 5;
-         newstable[6][7] = 1;
-         newstable[7][0] = 3;
-         newstable[7][1] = 0;
-         newstable[7][2] = 4;
-         newstable[7][3] = 8;
-         newstable[7][4] = 11;
-         newstable[7][5] = 10;
-         newstable[7][6] = 6;
-         newstable[7][7] = 2;
-         newstable[8][0] = 4;
-         newstable[8][1] = 5;
-         newstable[8][2] = 9;
-         newstable[8][3] = 13;
-         newstable[8][4] = 12;
-         newstable[8][5] = 15;
-         newstable[8][6] = 11;
-         newstable[8][7] = 7;
-         newstable[9][0] = 5;
-         newstable[9][1] = 6;
-         newstable[9][2] = 10;
-         newstable[9][3] = 14;
-         newstable[9][4] = 13;
-         newstable[9][5] = 12;
-         newstable[9][6] = 8;
-         newstable[9][7] = 4;
-         newstable[10][0] = 6;
-         newstable[10][1] = 7;
-         newstable[10][2] = 11;
-         newstable[10][3] = 15;
-         newstable[10][4] = 14;
-         newstable[10][5] = 13;
-         newstable[10][6] = 9;
-         newstable[10][7] = 5;
-         newstable[11][0] = 7;
-         newstable[11][1] = 4;
-         newstable[11][2] = 8;
-         newstable[11][3] = 12;
-         newstable[11][4] = 15;
-         newstable[11][5] = 14;
-         newstable[11][6] = 10;
-         newstable[11][7] = 6;
-         newstable[12][0] = 8;
-         newstable[12][1] = 9;
-         newstable[12][2] = 13;
-         newstable[12][3] = 1;
-         newstable[12][4] = 0;
-         newstable[12][5] = 3;
-         newstable[12][6] = 15;
-         newstable[12][7] = 11;
-         newstable[13][0] = 9;
-         newstable[13][1] = 10;
-         newstable[13][2] = 14;
-         newstable[13][3] = 2;
-         newstable[13][4] = 1;
-         newstable[13][5] = 0;
-         newstable[13][6] = 12;
-         newstable[13][7] = 8;
-         newstable[14][0] = 10;
-         newstable[14][1] = 11;
-         newstable[14][2] = 15;
-         newstable[14][3] = 3;
-         newstable[14][4] = 2;
-         newstable[14][5] = 1;
-         newstable[14][6] = 13;
-         newstable[14][7] = 9;
-         newstable[15][0] = 11;
-         newstable[15][1] = 8;
-         newstable[15][2] = 12;
-         newstable[15][3] = 0;
-         newstable[15][4] = 3;
-         newstable[15][5] = 2;
-         newstable[15][6] = 14;
-         newstable[15][7] = 10;
-   end // initial begin
-
    reg [3:0] flags_addr_latch;
    reg [3:0] flags_addr;
 
@@ -238,19 +98,11 @@ module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, o
    RAM #(.ADDRESS_BITS(3)) flags (.clk(clk), .write(flags_write), .addr(flags_addr[2:0]), .in(flags_in), .out(flags_out));
 
    reg [15:0]  flag_or_news;
+   reg [15:0]  news_out;
 
-   reg [15:0]  newsidx;
+   news newspaper (.news_in(latest_news), .direction(flags_addr[2:0]), .news_out(news_out));
 
-   always @* begin
-         if(flags_addr[3]) begin // read from news
-                for(idx = 0; idx < 16; idx++) begin
-                       newsidx = newstable[idx][flags_addr[2:0]];
-                       flag_or_news[idx] = latest_news[newsidx];
-                end
-         end else begin
-                flag_or_news = flags_out;
-         end
-   end
+   assign flag_or_news = flags_addr[3] ? news_out : flags_out;
 
    always @ (posedge clk) begin
          if(mem_write)
@@ -269,7 +121,6 @@ module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, o
                         F <= flag_or_news;
                         A <= mem_out;
                         C <= mem_out;
-                        io <= io_pin;
                         if (bsel)
                           B <= cube_in;
                  end
@@ -296,18 +147,33 @@ module chip(input clk, input [2:0] op, input [15:0] I, input io_pin, input CS, o
                         mem_write <= 1;
                  end
 
-               `OP_READ:
+               `OP_STOREI:
                  begin
-                        if (CS)
-                          mem_in <= mem_out;
+                        mem_in <= I;
+                        mem_write <= 1;
                  end
-
+/*
                `OP_LOADI:
                  begin
                         C <= mem_out;
                         A <= I;
                         alu_sum <= 8'b11110000; // out of A, B, F, select exactly A
                  end
+*/
+
+               `OP_LED:
+                 begin
+                        if(!mode)
+                          led_out <= leds;
+                        else if(offset == 0)
+                          led_out <= mem_out[3:0];
+                        else if(offset == 1)
+                          led_out <= mem_out[7:4];
+                        else if(offset == 2)
+                          led_out <= mem_out[11:8];
+                        else if(offset == 3)
+                          led_out <= mem_out[15:12];
+                 end
 
 /*             `OP_RUG:
                  begin
This page took 0.029195 seconds and 4 git commands to generate.