-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmodelview_stack.v
147 lines (132 loc) · 4.12 KB
/
modelview_stack.v
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 21:42:52 10/23/2010
// Design Name:
// Module Name: modelview_stack
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
/* Stack grows UP, like the Disney movie
*
*
*
*/
module matrix_stacks(clk, matrix_mode, pop_en, push_en, data_in, data_out
);
input clk;
input [2:0] matrix_mode;
input pop_en;
input push_en;
input [127:0] data_in;
output reg [127:0] data_out;
reg [6:0] modelview_sp;
reg [6:0] projection_sp;
reg [127:0] modelview_stack [127:0]; // 2048 bytes (32 matrices) (infer BRAM?!?)
reg [127:0] projection_stack [7:0]; // 128 bytes (2 matrices)
reg [1:0] state;
initial begin
modelview_sp <= 3;
projection_sp <= 3;
// Hardcode identity matrices into both stacks
modelview_stack[3] <= 127'h3F800000000000000000000000000000;
modelview_stack[2] <= 127'h000000003F8000000000000000000000;
modelview_stack[1] <= 127'h00000000000000003F80000000000000;
modelview_stack[0] <= 127'h0000000000000000000000003F800000;
projection_stack[3] <= 127'h3F800000000000000000000000000000;
projection_stack[2] <= 127'h000000003F8000000000000000000000;
projection_stack[1] <= 127'h00000000000000003F80000000000000;
projection_stack[0] <= 127'h0000000000000000000000003F800000;
end
always @ posedge pop_en
begin
state <= 2'b00;
end
always @ posedge push_en
begin
state <= 2'b00;
case (matrix_mode)
3'b001:
begin
modelview_sp <= modelview_sp+4;
end
3'b010:
begin
projection_stack <= projection_sp+4;
end
default:
begin
end
endcase
end
always @ posedge clk
begin
case(state)
2'b00:
begin
state <= 2'b01;
if (pop_en)
begin
data_out <= model_view_stack[modelview_sp];
modelview_sp <= modelview_sp - 1;
end
else if (push_en)
begin
model_view_stack[current_sp] <= data_in;
end
end
2'b01:
begin
state <= 2'b10;
if (pop_en)
begin
data_out <= model_view_stack[modelview_sp];
modelview_sp <= modelview_sp - 1;
end
else if (push_en)
begin
model_view_stack[modelview_sp-1] <= data_in;
end
end
2'b10:
begin
state <= 2'b11;
if (pop_en)
begin
data_out <= model_view_stack[modelview_sp];
modelview_sp <= modelview_sp - 1;
end
else if (push_en)
begin
model_view_stack[modelview_sp-2] <= data_in;
end
end
2'b11:
begin
if (pop_en)
begin
data_out <= model_view_stack[modelview_sp];
modelview_sp <= modelview_sp - 1;
end
else if (push_en)
begin
model_view_stack[modelview_sp-3] <= data_in;
end
end
default
begin
end
endcase
end
endmodule