-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcpu_top.sv
78 lines (65 loc) · 1.85 KB
/
cpu_top.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
module cpu (
output logic halt, load_ir,
input logic clk, rst, fetch, control_clk, alu_clk
);
timeunit 1ns;
timeprecision 100ps;
import opcodes::*;
logic [7:0] data, alu_out, accum, ir_out;
logic [4:0] pc_out, ir_addr, mux_addr;
opcode_t opcode;
logic load_ac, mem_rd, mem_wr, inc_pc, load_pc, zero;
//datapath connections
assign opcode = opcode_t'(ir_out[7:5]);
assign ir_addr = ir_out[4:0];
register accumulator (.out (accum),
.data_in (alu_out),
.clk,
.enable (load_ac),
.rst
);
controller controller1 (.load_ac,
.mem_rd,
.mem_wr,
.inc_pc,
.load_pc,
.load_ir,
.halt,
.opcode,
.zero,
.clk(control_clk),
.rst,
);
register ins_reg (.out (ir_out),
.data,
.clk,
.enable (load_ir),
.rst
);
counter pc (.count (pc_out),
.data (ir_addr),
.clk,
.load_pc (load_pc),
.enable (inc_pc),
.rst
);
alu alu1 (.out (alu_out),
.zero,
.clk(alu_clk) ,
.accum,
.data(data),
.opcode
);
mux mux1 ( .out (mux_addr),
.in_a (pc_out),
.in_b (ir_addr),
.fetch
);
memory memory1 (.clk(~control_clk),
.read (mem_rd),
.write (mem_wr),
.addr(mux_addr) ,
.data_in(alu_out),
.data_out(data)
);
endmodule