This repository was archived by the owner on Jun 6, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathControlUnit.v
More file actions
129 lines (102 loc) · 2.91 KB
/
ControlUnit.v
File metadata and controls
129 lines (102 loc) · 2.91 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 00:18:57 06/15/2024
// Design Name:
// Module Name: ControlUnit
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ControlUnit
#(
WORD_WIDTH = 8,
ADDRESS_WIDTH = 5,
SIGNAL_COUNT = 32,
FLAG_COUNT = 4,
MAX_CYCLES = 4
)
(
input CLK,
input [INSTR_WIDTH - 1:0] instr,
input [FLAG_COUNT-1:0] flags,
output reg fetch = 1,
output execute,
output reg [CYCLE_WIDTH-1:0] phase = 0,
output reg [SIGNAL_COUNT-1:0] signals = 0
);
assign execute = ~fetch;
parameter INSTR_WIDTH = WORD_WIDTH - ADDRESS_WIDTH; //$clog2(INSTR_COUNT);
parameter INSTR_COUNT = 2**INSTR_WIDTH;
parameter CYCLE_WIDTH = $clog2(MAX_CYCLES);
//parameter TOTAL_MAP_COUNT = INSTR_COUNT * (2**FLAG_COUNT);
//parameter TOTAL_MAP_WIDTH = INSTR_WIDTH + FLAG_COUNT;
parameter LENGTH_MAP_COUNT = INSTR_COUNT * (2**FLAG_COUNT);
parameter LENGTH_MAP_WIDTH = INSTR_WIDTH + FLAG_COUNT;
parameter TOTAL_MAP_COUNT = LENGTH_MAP_COUNT * MAX_CYCLES;
parameter TOTAL_MAP_WIDTH = LENGTH_MAP_WIDTH + CYCLE_WIDTH;
//reg [SIGNAL_COUNT-1:0] signalMap [TOTAL_MAP_COUNT-1:0] [MAX_CYCLES-1:0];
reg [SIGNAL_COUNT-1:0] signalMap [TOTAL_MAP_COUNT-1:0];
reg [CYCLE_WIDTH-1:0] instrLengthMap [LENGTH_MAP_COUNT-1:0];
wire [CYCLE_WIDTH-1:0] phaseKey = fetch ? 0 : phase;
wire [TOTAL_MAP_WIDTH-1:0] signalMapKey;
//assign signalMapKey = { instr, flags };
assign signalMapKey = { instr, flags, phaseKey };
integer f_sig, i, j, r;
initial
begin
//$readmemb("signals.mem", signalMap);
// Read signal map (2D)
// f_sig = $fopen("signals.mem", "r");
//
// for(i = 0; i < INSTR_COUNT; i = i + 1) begin
// for(j = 0; j < MAX_CYCLES; j = j + 1) begin
// r = $fscanf(f_sig, "%b", signalMap[i][j]);
// end
// end
// $fclose(f_sig);
`define SIGNALS_MAP signalMap
`include "meminit_signals.v"
`define LENGTHS_MAP instrLengthMap
`include "meminit_lengths.v"
// $readmemh("lengths.mem", instrLengthMap);
end
//reg [SIGNAL_COUNT-1:0] readSignals;
reg [CYCLE_WIDTH-1:0] instrLength;
always @(negedge CLK)
begin
if(fetch)
begin
// FETCH CYCLE
phase = 1;
//signals <= 0;
//instrLength = instrLengthMap[instr];
//readSignals = signalMap[instr][0];
//signals = signalMap[signalMapKey][0];
signals = signalMap[signalMapKey];
fetch = 0;
end else begin
// EXECUTE CYCLE
//signals <= readSignals;
//readSignals = signalMap[instr][phase];
//signals = signalMap[signalMapKey][phase];
signals = signalMap[signalMapKey];
instrLength = instrLengthMap[signalMapKey[TOTAL_MAP_WIDTH-1:CYCLE_WIDTH]];
if(phase == instrLength)
begin
fetch = 1;
end
phase = phase + 1'b1;
end
end
endmodule