aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlavian Kaufmann <flavian@flaviankaufmann.ch>2024-05-08 10:55:45 +0200
committerFlavian Kaufmann <flavian@flaviankaufmann.ch>2024-05-08 10:55:45 +0200
commitaa005bc8b667668eb43c0ae62e00aefd1c3c1af5 (patch)
treea491b20a750cf0dac413aa10deb2ead3b6266fc3 /src
parent80fee7a2db703f029989c40e823c2ccdeb078fca (diff)
downloadriscv_cpu-aa005bc8b667668eb43c0ae62e00aefd1c3c1af5.tar.gz
riscv_cpu-aa005bc8b667668eb43c0ae62e00aefd1c3c1af5.zip
assemble simple rom
Diffstat (limited to 'src')
-rw-r--r--src/alu_op_decode.v1
-rw-r--r--src/control_unit.v108
-rw-r--r--src/cpu.v1
-rw-r--r--src/ram.v4
-rw-r--r--src/register_file.v69
-rw-r--r--src/rom.v4
-rw-r--r--src/top.v16
7 files changed, 172 insertions, 31 deletions
diff --git a/src/alu_op_decode.v b/src/alu_op_decode.v
index 64bb94b..8e801c8 100644
--- a/src/alu_op_decode.v
+++ b/src/alu_op_decode.v
@@ -1,5 +1,6 @@
module alu_op_decode (
input [6:0] opcode,
+ input [1:0] alu_ctrl,
input [2:0] funct3,
input [6:0] funct7,
output reg [3:0] alu_op
diff --git a/src/control_unit.v b/src/control_unit.v
index a0d398a..d82db2a 100644
--- a/src/control_unit.v
+++ b/src/control_unit.v
@@ -6,14 +6,14 @@ module control_unit (
input alu_zero,
input alu_equal,
output pc_we,
- output mem_addr_src,
- output mem_we,
- output instr_we,
- output [1:0] result_src,
+ output reg mem_addr_src,
+ output reg mem_we,
+ output reg instr_we,
+ output reg [1:0] result_src,
output [3:0] alu_op,
- output [1:0] alu_a_src,
- output [1:0] alu_b_src,
- output rf_we
+ output reg [1:0] alu_a_src,
+ output reg [1:0] alu_b_src,
+ output reg rf_we
);
parameter s00_fetch = 4'h0,
@@ -62,27 +62,89 @@ always @ (*) begin
endcase
end
-wire branch;
-wire pc_update;
+reg branch;
+reg pc_update;
+reg [1:0] alu_ctrl;
assign pc_we = (alu_zero & branch) | pc_update;
-/*
+
always @ (*) begin
- case(state)
- s00_fetch:
- s01_decode:
- s02_mem_addr:
- s03_mem_read:
- s04_mem_wb:
- s05_mem_write:
- s06_execute_r:
- s07_alu_wb:
- s08_execute_i:
- s09_jal:
- s10_beq:
+ branch = 1'b0;
+ pc_update = 1'b0;
+ mem_we = 1'b0;
+ rf_we = 1'b0;
+ instr_we = 1'b0;
+ case(state)
+ s00_fetch: begin
+ mem_addr_src <= 1'b0;
+ instr_we = 1'b1;
+ alu_a_src <= 2'b00;
+ alu_b_src <= 2'b10;
+ alu_ctrl <= 2'b00;
+ result_src <= 2'b10;
+ pc_update = 1'b1;
+ end
+ s01_decode: begin
+ alu_a_src <= 2'b01;
+ alu_b_src <= 2'b01;
+ alu_ctrl <= 2'b00;
+ end
+ s02_mem_addr: begin
+ alu_a_src <= 2'b10;
+ alu_b_src <= 2'b01;
+ alu_ctrl <= 2'b00;
+ end
+ s03_mem_read: begin
+ result_src <= 2'b00;
+ mem_addr_src <= 1'b1;
+ end
+ s04_mem_wb: begin
+ result_src <= 2'b01;
+ rf_we = 1'b1;
+ end
+ s05_mem_write: begin
+ result_src <= 2'b00;
+ mem_addr_src <= 1'b1;
+ mem_we = 1'b1;
+ end
+ s06_execute_r: begin
+ alu_a_src <= 2'b10;
+ alu_b_src <= 2'b00;
+ alu_ctrl <= 2'b10;
+ end
+ s07_alu_wb: begin
+ result_src <= 2'b00;
+ rf_we = 1'b1;
+ end
+ s08_execute_i: begin
+ alu_a_src <= 2'b10;
+ alu_b_src <= 2'b01;
+ alu_ctrl <= 2'b10;
+ end
+ s09_jal: begin
+ alu_a_src <= 2'b01;
+ alu_b_src <= 2'b10;
+ alu_ctrl <= 2'b00;
+ result_src <= 2'b00;
+ pc_update = 1'b1;
+ end
+ s10_beq: begin
+ alu_a_src <= 2'b10;
+ alu_b_src <= 2'b00;
+ alu_ctrl <= 2'b01;
+ result_src <= 2'b00;
+ branch = 1'b1;
+ end
endcase
end
-*/
+
+alu_op_decode aod (
+ .opcode(opcode),
+ .alu_ctrl(alu_ctrl),
+ .funct3(funct3),
+ .funct7(funct7),
+ .alu_op(alu_op)
+);
endmodule
diff --git a/src/cpu.v b/src/cpu.v
index c6f9f9e..b839477 100644
--- a/src/cpu.v
+++ b/src/cpu.v
@@ -7,6 +7,7 @@ module cpu (
// Control Unit
wire mem_addr_src;
+wire mem_we;
wire pc_we;
wire instr_we;
wire rf_we;
diff --git a/src/ram.v b/src/ram.v
index f92c66f..92b14a2 100644
--- a/src/ram.v
+++ b/src/ram.v
@@ -21,9 +21,9 @@ always @(posedge clk or posedge rst) begin
memory[i] <= 0;
end else begin
if (we) begin
- memory[addr] = data_write;
+ { memory[addr + 3], memory[addr + 2], memory[addr + 1], memory[addr + 0] } = data_write;
end
- data_read = memory[addr];
+ data_read = { memory[addr + 3], memory[addr + 2], memory[addr + 1], memory[addr + 0] };
end
end
diff --git a/src/register_file.v b/src/register_file.v
index 5142a69..58ba061 100644
--- a/src/register_file.v
+++ b/src/register_file.v
@@ -8,9 +8,76 @@ module register_file (
reg [31:0] registers[31:1];
+wire [31:0] reg_x0_zero,
+ reg_x1_ra,
+ reg_x2_sp,
+ reg_x3_gp,
+ reg_x4_tp,
+ reg_x5_t0,
+ reg_x6_t1,
+ reg_x7_t2,
+ reg_x8_s0_fp,
+ reg_x9_s1,
+ reg_x10_a0,
+ reg_x11_a1,
+ reg_x12_a2,
+ reg_x13_a3,
+ reg_x14_a4,
+ reg_x15_a5,
+ reg_x16_a6,
+ reg_x17_a7,
+ reg_x18_s2,
+ reg_x19_s3,
+ reg_x20_s4,
+ reg_x21_s5,
+ reg_x22_s6,
+ reg_x23_s7,
+ reg_x24_s8,
+ reg_x25_s9,
+ reg_x26_s10,
+ reg_x27_s11,
+ reg_x28_t3,
+ reg_x29_t4,
+ reg_x30_t5,
+ reg_x31_t6;
+
+assign reg_x0_zero = 32'b0;
+assign reg_x1_ra = registers[1];
+assign reg_x2_sp = registers[2];
+assign reg_x3_gp = registers[3];
+assign reg_x4_tp = registers[4];
+assign reg_x5_t0 = registers[5];
+assign reg_x6_t1 = registers[6];
+assign reg_x7_t2 = registers[7];
+assign reg_x8_s0_fp = registers[8];
+assign reg_x9_s1 = registers[9];
+assign reg_x10_a0 = registers[10];
+assign reg_x11_a1 = registers[11];
+assign reg_x12_a2 = registers[12];
+assign reg_x13_a3 = registers[13];
+assign reg_x14_a4 = registers[14];
+assign reg_x15_a5 = registers[15];
+assign reg_x16_a6 = registers[16];
+assign reg_x17_a7 = registers[17];
+assign reg_x18_s2 = registers[18];
+assign reg_x19_s3 = registers[19];
+assign reg_x20_s4 = registers[20];
+assign reg_x21_s5 = registers[21];
+assign reg_x22_s6 = registers[22];
+assign reg_x23_s7 = registers[23];
+assign reg_x24_s8 = registers[24];
+assign reg_x25_s9 = registers[25];
+assign reg_x26_s10 = registers[26];
+assign reg_x27_s11 = registers[27];
+assign reg_x28_t3 = registers[28];
+assign reg_x29_t4 = registers[29];
+assign reg_x30_t5 = registers[30];
+assign reg_x31_t6 = registers[31];
+
+
integer i;
always @(posedge clk or rst) begin
- if (rst) begin
+ if (rst) begin
for (i = 1; i < 32; i = i + 1)
registers[i] <= 32'b0;
end else begin
diff --git a/src/rom.v b/src/rom.v
index aa8c359..0a00479 100644
--- a/src/rom.v
+++ b/src/rom.v
@@ -9,14 +9,14 @@ module rom #(
`include "include/log2.vh"
-reg [7:0] memory [SIZE-1:0];
+reg [7:0] memory [0:SIZE-1];
initial begin
$readmemh("rom/rom.hex", memory, 0, SIZE-1);
end
always @(posedge clk) begin
- data_read = memory[addr];
+ data_read <= {memory[addr + 3], memory[addr + 2], memory[addr + 1], memory[addr + 0] };
end
diff --git a/src/top.v b/src/top.v
index 845b17c..37e33d7 100644
--- a/src/top.v
+++ b/src/top.v
@@ -1,9 +1,19 @@
module top (
input clk,
- input key,
- output [5:0] led
+ input key
+ //output [5:0] led
);
+wire rst;
+assign rst = ~key;
+
+cpu cpu (
+ .clk(clk),
+ .rst(rst)
+);
+
+/*
+
reg [5:0] ctr_q;
wire [5:0] ctr_d;
wire clk_slow;
@@ -22,5 +32,5 @@ end
assign ctr_d = ctr_q + 6'b1;
assign led = ~ctr_q;
-
+*/
endmodule