Skip to content

Commit 4987014

Browse files
committed
add load + store + sub and heavy refactor
1 parent 33e81a8 commit 4987014

File tree

12 files changed

+236
-215
lines changed

12 files changed

+236
-215
lines changed

info.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ project:
2020
- "top.v"
2121
- "cpu_core.v"
2222
- "alu_1bit.v"
23-
- "counter.v"
2423
- "fsm_control.v"
25-
- "shift_reg.v"
24+
- "accumulator.v"
2625
- "regfile_serial.v"
2726

2827
# The pinout of your project. Leave unused pins blank. DO NOT delete or add any pins.

src/accumulator.v

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// shift_reg.v - shift register with optional parallel load
2+
3+
`default_nettype none
4+
5+
module accumulator
6+
#(parameter WIDTH = 8)
7+
(
8+
input wire clk,
9+
input wire rst_n, // active-low synchronous reset
10+
input wire acc_write_en, // 1 -> perform load/shift
11+
input wire acc_load_en, // 1 -> parallel load, 0 -> shift
12+
input wire [WIDTH-1:0] acc_parallel_in,
13+
input wire alu_result, // bit entering during a shift
14+
output reg [WIDTH-1:0] acc_bits, // register contents
15+
output reg done
16+
);
17+
18+
reg [$clog2(WIDTH)-1:0] bit_index;
19+
20+
always @(posedge clk or negedge rst_n) begin
21+
if (!rst_n) begin
22+
acc_bits <= {WIDTH{1'b0}}; // synchronous clear
23+
bit_index <= 0;
24+
end else if (acc_load_en) begin
25+
acc_bits <= acc_parallel_in;
26+
bit_index <= 0;
27+
end else if (acc_write_en) begin
28+
acc_bits[bit_index] <= alu_result;
29+
bit_index <= bit_index + 1;
30+
end else begin
31+
bit_index <= 0;
32+
end
33+
end
34+
35+
36+
// Combinational logic
37+
always @(*) begin
38+
if (bit_index == WIDTH - 2) begin
39+
done = 1;
40+
end
41+
else begin
42+
done = 0;
43+
end
44+
end
45+
46+
endmodule

src/alu_1bit.v

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,62 @@
33
`default_nettype none
44

55
module alu_1bit (
6+
input wire clk,
7+
input wire rst_n,
68
input wire rs1,
79
input wire rs2,
8-
input wire carry_in,
9-
input wire [1:0] alu_op, // 2-bit op select
10-
output wire result,
11-
output wire carry_out
10+
input wire [2:0] alu_op, // 3-bit op select
11+
input wire alu_enable,
12+
input wire alu_start,
13+
output reg alu_result
1214
);
15+
16+
wire carry_out;
17+
reg carry_in;
18+
wire inverted = ~rs2; // Inverted rs2 for subtraction
1319

14-
wire add_result = rs1 ^ rs2 ^ carry_in;
15-
wire add_cout = (rs1 & rs2) | (rs1 & carry_in) | (rs2 & carry_in);
20+
always @(posedge clk or negedge rst_n) begin
21+
if (!rst_n) begin
22+
carry_in <= 0;
23+
alu_result <= 0;
24+
end else if (alu_enable) begin
25+
carry_in <= carry_out;
26+
// process one bit this cycle
27+
if (alu_op == 3'b000) begin
28+
alu_result <= rs1 ^ rs2 ^ carry_in;
29+
end else if (alu_op == 3'b001) begin
30+
alu_result <= rs1 ^ inverted ^ carry_in;
31+
end else if (alu_op == 3'b010) begin
32+
alu_result <= rs1 ^ rs2;
33+
end else if (alu_op == 3'b011) begin
34+
alu_result <= rs1 & rs2;
35+
end else if (alu_op == 3'b100) begin
36+
alu_result <= rs1 | rs2;
37+
end else begin
38+
alu_result <= 1'b0;
39+
end
40+
end
41+
end
1642

17-
wire and_result = rs1 & rs2;
18-
wire or_result = rs1 | rs2;
19-
wire xor_result = rs1 ^ rs2;
20-
21-
assign result = (alu_op == 2'b00) ? add_result :
22-
(alu_op == 2'b01) ? xor_result :
23-
(alu_op == 2'b10) ? and_result :
24-
(alu_op == 2'b11) ? or_result :
43+
assign carry_out = (alu_start && (alu_op == 3'b001)) ? 1'b1 :
44+
(alu_enable && (alu_op == 3'b001)) ? (rs1 & inverted) | (rs1 & carry_in) | (inverted & carry_in) :
45+
(alu_enable && (alu_op == 3'b000)) ? (rs1 & rs2) | (rs1 & carry_in) | (rs2 & carry_in) :
2546
1'b0;
2647

27-
assign carry_out = (alu_op == 2'b00) ? add_cout : 1'b0;
48+
//wire add_result = alu_op == ? rs1 ^ rs2 ^ carry_in : rs1 ^ ~rs2 ^ 1'b0;
49+
//wire add_cout = (rs1 & rs2) | (rs1 & carry_in) | (rs2 & carry_in);
50+
51+
// wire and_result = rs1 & rs2;
52+
// wire or_result = rs1 | rs2;
53+
// wire xor_result = rs1 ^ rs2;
54+
55+
// assign alu_result = (alu_op == 3'b000) ? rs1 ^ rs2 ^ carry_in :
56+
// (alu_op == 3'b001) ? rs1 ^ ~rs2 ^ 1'b0 :
57+
// (alu_op == 3'b010) ? rs2 ^ rs2 :
58+
// (alu_op == 3'b011) ? rs1 & rs2 :
59+
// (alu_op == 3'b100) ? rs1 | rs2 :
60+
// 1'b0;
61+
62+
// assign carry_out = ((alu_op == 3'b000) & carry_en) ? add_cout : 1'b0;
2863

2964
endmodule

src/counter.v

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/cpu_core.v

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,28 @@ module cpu_core (
99
input wire [11:0] instr,
1010
input wire inst_done,
1111
input wire btn_edge,
12-
output wire [7:0] out
12+
output wire [7:0] acc_bits
1313
);
1414

1515
// Wires between modules
1616
wire rs1_bit, rs2_bit, alu_result;
17-
wire [1:0] alu_op;
18-
wire carry_in, carry_out; // LINT fix: unused for now
17+
wire [2:0] alu_op;
1918

20-
wire reg_shift_en, acc_shift_en;
19+
wire alu_start;
20+
wire reg_shift_en, acc_write_en;
2121
wire imm_shift_en;
22-
wire reg_write_en, acc_write_en;
22+
wire reg_store_en, acc_load_en;
2323
wire en_counter, clr_counter;
2424
wire bit_done;
2525
wire carry_en;
26-
wire acc_out_bit;
2726

28-
wire [2:0] count; // unused
27+
wire [7:0] acc_parallel_in;
28+
wire [7:0] regfile_bits;
29+
30+
assign acc_parallel_in = acc_load_en ? (opcode[3] ? regfile_bits : instr[11:4]) // load from regfile if R-type, otherwise use imm
31+
: 8'b0;
2932

30-
// Carry register
31-
reg carry;
32-
always @(posedge clk)
33-
if (!rst_n)
34-
carry <= 0;
35-
else if (carry_en)
36-
carry <= 0;
37-
else
38-
carry <= carry_out;
33+
wire [2:0] count; // unused
3934

4035
// TODO: REGFILE
4136
regfile_serial regfile (
@@ -46,38 +41,33 @@ module cpu_core (
4641
.is_rtype(opcode[3]),
4742
.rs1_bit(rs1_bit),
4843
.rs2_bit(rs2_bit),
49-
.wr_bit(acc_out_bit),
50-
.wr_en(reg_write_en)
44+
.acc_bits(acc_bits),
45+
.regfile_bits(regfile_bits),
46+
.reg_store_en(reg_store_en)
5147
);
5248

5349
// Accumulator register
54-
shift_reg #(8) acc (
50+
accumulator #(8) acc (
5551
.clk(clk),
5652
.rst_n(rst_n),
57-
.en(acc_write_en),
58-
.serial_in(alu_result),
59-
.parallel_in(8'b0),
60-
.q(out)
53+
.acc_load_en(acc_load_en),
54+
.acc_parallel_in(acc_parallel_in),
55+
.acc_write_en(acc_write_en),
56+
.alu_result(alu_result),
57+
.acc_bits(acc_bits),
58+
.done(bit_done)
6159
);
6260

6361
// ALU
6462
alu_1bit alu (
63+
.clk(clk),
64+
.rst_n(rst_n),
6565
.rs1(rs1_bit),
6666
.rs2(rs2_bit),
67-
.carry_in(carry),
67+
.alu_start(alu_start),
6868
.alu_op(alu_op),
69-
.result(alu_result),
70-
.carry_out(carry_out)
71-
);
72-
73-
// Counter
74-
counter exec_counter (
75-
.clk(clk),
76-
.rstn(rst_n),
77-
.en(en_counter),
78-
.clr(clr_counter),
79-
.done(bit_done),
80-
.count(count) // not being used
69+
.alu_enable(carry_en),
70+
.alu_result(alu_result)
8171
);
8272

8373
// Control FSM
@@ -89,15 +79,13 @@ module cpu_core (
8979
.btn_edge(btn_edge),
9080
.bit_done(bit_done),
9181
.alu_op(alu_op),
82+
.alu_start(alu_start),
83+
.acc_load_en(acc_load_en),
9284
.acc_write_en(acc_write_en),
9385
.reg_shift_en(reg_shift_en),
94-
.reg_write_en(reg_write_en),
95-
.acc_shift_en(acc_shift_en),
86+
.reg_store_en(reg_store_en),
9687
.imm_shift_en(imm_shift_en),
97-
.clr_counter(clr_counter),
98-
.en_counter(en_counter),
9988
.carry_en(carry_en)
10089
);
10190

102-
wire _unused = &{carry_in, acc_shift_en, 1'b0, reg_write_en};
10391
endmodule

0 commit comments

Comments
 (0)