aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_fpga/cu.v
diff options
context:
space:
mode:
Diffstat (limited to 'atk16_fpga/cu.v')
-rw-r--r--atk16_fpga/cu.v252
1 files changed, 124 insertions, 128 deletions
diff --git a/atk16_fpga/cu.v b/atk16_fpga/cu.v
index e68a3d5..1f8ea60 100644
--- a/atk16_fpga/cu.v
+++ b/atk16_fpga/cu.v
@@ -65,7 +65,13 @@
module cu(
input wire clk,
input wire rst,
- input wire [3:0] int_lines
+ input wire [3:0] int_lines,
+
+ output reg [15:0] sram_addr,
+ output reg [15:0] sram_in,
+ input wire [15:0] sram_out,
+ output wire sram_cs_n,
+ output reg sram_wr_n, sram_rd_n
);
reg [15:0] regbank [0:7];
reg [15:0] decoded_tmp;
@@ -79,19 +85,8 @@ module cu(
reg [3:0] int_line_regs;
reg int_en = 1;
- reg [15:0] mem_addr;
- reg [15:0] mem_data_in;
- reg mem_read_en, mem_write_en;
- wire [15:0] mem_data_out;
- reg mem_waiting = 0;
- sram sram_inst(
- .cs_n(1'd0),
- .wr_n(~mem_write_en),
- .rd_n(~mem_read_en),
- .addr({ 2'd0, mem_addr }),
- .data_in(mem_data_in),
- .data_out(mem_data_out)
- );
+ reg sram_waiting = 0;
+ assign sram_cs_n = 1'b0;
reg [2:0] alu_sel;
reg [15:0] alu_a;
@@ -124,6 +119,7 @@ module cu(
integer i;
always @(posedge clk or posedge rst) begin
+
// Handle reset button
if (rst) begin
phase <= `PH_RESET;
@@ -161,8 +157,8 @@ module cu(
phase <= `PH_FETCH;
pc <= 16'd0;
- mem_read_en <= 0;
- mem_write_en <= 0;
+ sram_rd_n <= 1;
+ sram_wr_n <= 1;
for (i = 0; i < 8; i = i + 1) begin
regbank[i] <= 16'd0;
@@ -171,16 +167,16 @@ module cu(
// Fetch stage
else if (phase == `PH_FETCH) begin
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc;
+ sram_waiting <= 1;
end else begin
- mem_read_en <= 0;
- ir <= mem_data_out;
+ sram_rd_n <= 1;
+ ir <= sram_out;
phase <= `PH_DECODE;
pc <= pc + 16'd1;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
@@ -212,27 +208,27 @@ module cu(
phase <= `PH_EXECUTE;
end
else if (ir[1] == 1 && ir[0] == 0) begin // addressing mode: absolute, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= regbank[ir[8:6]];
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= regbank[ir[8:6]];
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
else if (ir[1] == 0 && ir[0] == 0) begin // addressing mode: pc relative, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc + regbank[ir[8:6]] - 1;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc + regbank[ir[8:6]] - 1;
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end
@@ -251,27 +247,27 @@ module cu(
phase <= `PH_EXECUTE;
end
else if (ir[1] == 1 && ir[0] == 0) begin // addressing mode: absolute, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= regbank[ir[8:6]];
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= regbank[ir[8:6]];
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
else if (ir[1] == 0 && ir[0] == 0) begin // addressing mode: pc relative, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc + regbank[ir[8:6]] - 1;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc + regbank[ir[8:6]] - 1;
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end
@@ -301,27 +297,27 @@ module cu(
phase <= `PH_FETCH;
end
else if (ir[11] == 1 && ir[10] == 0) begin // addressing mode: absolute, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= regbank[ir[9:6]];
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= regbank[ir[9:6]];
+ sram_waiting <= 1;
end else begin
- pc <= mem_data_out;
- mem_read_en <= 0;
+ pc <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
else if (ir[11] == 0 && ir[10] == 0) begin // addressing mode: pc relative, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc + regbank[ir[9:6]] - 1;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc + regbank[ir[9:6]] - 1;
+ sram_waiting <= 1;
end else begin
- pc <= mem_data_out;
- mem_read_en <= 0;
+ pc <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end
@@ -338,27 +334,27 @@ module cu(
phase <= `PH_FETCH;
end
else if (ir[11] == 1 && ir[10] == 0) begin // addressing mode: absolute, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= {6'd0, ir[9:0]};
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= {6'd0, ir[9:0]};
+ sram_waiting <= 1;
end else begin
- pc <= mem_data_out;
- mem_read_en <= 0;
+ pc <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
else if (ir[11] == 0 && ir[10] == 0) begin // addressing mode: pc relative, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc + {{6{ir[9]}}, ir[9:0]} - 1;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc + {{6{ir[9]}}, ir[9:0]} - 1;
+ sram_waiting <= 1;
end else begin
- pc <= mem_data_out;
- mem_read_en <= 0;
+ pc <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end
@@ -376,27 +372,27 @@ module cu(
phase <= `PH_EXECUTE;
end
else if (ir[11] == 1 && ir[10] == 0) begin // addressing mode: absolute, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= regbank[ir[7:5]];
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= regbank[ir[7:5]];
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
else if (ir[11] == 0 && ir[10] == 0) begin // addressing mode: pc relative, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc + regbank[ir[7:5]] - 1;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc + regbank[ir[7:5]] - 1;
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end
@@ -414,27 +410,27 @@ module cu(
phase <= `PH_EXECUTE;
end
else if (ir[11] == 1 && ir[10] == 0) begin // addressing mode: absolute, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= {8'd0, ir[7:0]};
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= {8'd0, ir[7:0]};
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
else if (ir[11] == 0 && ir[10] == 0) begin // addressing mode: pc relative, indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= pc + {{8{ir[7]}}, ir[7:0]} - 1;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= pc + {{8{ir[7]}}, ir[7:0]} - 1;
+ sram_waiting <= 1;
end else begin
- decoded_tmp <= mem_data_out;
- mem_read_en <= 0;
+ decoded_tmp <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_EXECUTE;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end
@@ -467,27 +463,27 @@ module cu(
phase <= `PH_FETCH;
end
`OP_LDR: begin
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= decoded_tmp;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= decoded_tmp;
+ sram_waiting <= 1;
end else begin
- regbank[ir[11:9]] <= mem_data_out; // dereference address
- mem_read_en <= 0;
+ regbank[ir[11:9]] <= sram_out; // dereference address
+ sram_rd_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
`OP_STR: begin
- if (~mem_waiting) begin
- mem_write_en <= 1;
- mem_addr <= decoded_tmp;
- mem_data_in <= regbank[ir[5:3]];
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_wr_n <= 0;
+ sram_addr <= decoded_tmp;
+ sram_in <= regbank[ir[5:3]];
+ sram_waiting <= 1;
end else begin
- mem_write_en <= 0;
+ sram_wr_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
`OP_LDI: begin
@@ -501,15 +497,15 @@ module cu(
phase <= `PH_FETCH;
end
else if (ir[0] == 0) begin // indirect
- if (~mem_waiting) begin
- mem_read_en <= 1;
- mem_addr <= decoded_tmp;
- mem_waiting <= 1;
+ if (~sram_waiting) begin
+ sram_rd_n <= 0;
+ sram_addr <= decoded_tmp;
+ sram_waiting <= 1;
end else begin
- regbank[ir[11:9]] <= mem_data_out;
- mem_read_en <= 0;
+ regbank[ir[11:9]] <= sram_out;
+ sram_rd_n <= 1;
phase <= `PH_FETCH;
- mem_waiting <= 0;
+ sram_waiting <= 0;
end
end
end