12 `define DIRECTION_N 3'd0
13 `define DIRECTION_NE 3'd1
14 `define DIRECTION_E 3'd2
15 `define DIRECTION_SE 3'd3
16 `define DIRECTION_S 3'd4
17 `define DIRECTION_SW 3'd5
18 `define DIRECTION_W 3'd6
19 `define DIRECTION_NW 3'd7
21 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, output reg [3:0] led_out = 0);
23 // parity is unimplemented
26 wire [3:0] flagr = I[3:0];
28 wire [0:7] aluc = I[12:5];
31 wire [3:0] cond = I[3:0];
33 wire [0:7] alus = I[12:5];
36 wire [3:0] flagw = I[3:0];
38 wire [3:0] cube = I[11:8];
41 wire [5:0] cycle = I[5:0];
42 wire [1:0] check = I[7:6];
43 wire [3:0] xor_ = I[11:8];
44 wire [2:0] snarf = I[14:12];
51 wire [4:0] reg_ = I[8:4];
55 wire [1:0] offset = I[1:0];
56 wire [3:0] leds = I[3:0];
65 reg [7:0] alu_sum = 0;
66 reg [7:0] alu_carry = 0;
70 // these are not really regs
72 reg [15:0] alu_sum_out;
73 reg [15:0] alu_carry_out;
75 reg [2:0] alu_index [15:0];
80 for(idx = 0; idx < 16; idx=idx+1) begin
81 alu_index[idx] = (A[idx] << 2) + (B[idx] << 1) + F[idx];
82 alu_sum_out[idx] <= alu_sum[alu_index[idx]];
83 alu_carry_out[idx] <= alu_carry[alu_index[idx]];
87 reg [3:0] flags_addr_latch;
92 flags_addr <= flags_addr_latch;
107 wire [15:0] flags_out;
110 reg [15:0] latest_news;
112 RAM #(.ADDRESS_BITS(3)) flags (.clk(clk), .write(flags_write), .addr(flags_addr[2:0]), .in(flags_in), .out(flags_out));
114 reg [15:0] flag_or_news;
117 news newspaper (.news_in(latest_news), .direction(flags_addr[1:0]), .news_out(news_out));
119 assign flag_or_news = flags_addr[3] ? news_out : flags_out;
121 always @ (posedge clk) begin
124 if(flags_write) begin
126 flags_addr_latch <= 0;
146 Cond <= inv ? ~flag_or_news : flag_or_news;
153 for(idx = 0; idx < 16; idx++) begin
154 flags_in[idx] = Cond[idx] ? alu_carry_out[idx] : flags_out[idx];
155 latest_news[idx] <= flags_in[idx];
157 if(flags_addr) begin // we do not write to flag 0
159 flags_addr_latch <= flags_addr;
161 mem_in <= alu_sum_out;
175 alu_sum <= 8'b11110000; // out of A, B, F, select exactly A
184 led_out <= mem_out[3:0];
186 led_out <= mem_out[7:4];
188 led_out <= mem_out[11:8];
190 led_out <= mem_out[15:12];
195 if(!rw && ac && !news)
200 if(!rw && !ac && !news)
205 if(rw && ac && !news)
210 if(rw && !ac && !news)
215 if(rw && !ac && news)