@@ -27,7 +27,8 @@ module XC2CBitstream(
27
27
config_write_en, config_write_addr, config_write_data,
28
28
left_zia_config, right_zia_config,
29
29
left_and_config, right_and_config,
30
- left_or_config, right_or_config
30
+ left_or_config, right_or_config,
31
+ left_mc_config, right_mc_config
31
32
);
32
33
33
34
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -58,6 +59,9 @@ module XC2CBitstream(
58
59
output reg [16 * 56 - 1 :0 ] left_or_config;
59
60
output reg [16 * 56 - 1 :0 ] right_or_config;
60
61
62
+ output reg [27 * 16 - 1 :0 ] left_mc_config;
63
+ output reg [27 * 16 - 1 :0 ] right_mc_config;
64
+
61
65
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
62
66
// The SRAM copy of the config bitstream (directly drives device behavior)
63
67
@@ -114,11 +118,17 @@ module XC2CBitstream(
114
118
integer nbit;
115
119
integer nterm;
116
120
integer toprow;
121
+ integer orow;
122
+ integer mcell;
123
+ integer mcblock;
117
124
118
125
always @(* ) begin
119
126
for (row= 0 ; row< 48 ; row= row+ 1 ) begin
120
127
121
128
toprow = row - 8 ;
129
+ orow = row - 20 ;
130
+ mcell = row / 3 ;
131
+ mcblock = row % 3 ;
122
132
123
133
// Rows 0..19: MC-AND-ZIA-AND-MC
124
134
// Rows 20...27: MC-OR--GLB-OR--MC
@@ -129,14 +139,14 @@ module XC2CBitstream(
129
139
// We have stuff at the top and bottom of array, with global config in the middle
130
140
if (row > 27 ) begin
131
141
for (nbit= 0 ; nbit< 8 ; nbit= nbit+ 1 ) begin
132
- right_zia_config[toprow* 8 + nbit] <= ram_bitstream[toprow][123 + nbit* 2 ];
133
- left_zia_config[toprow* 8 + nbit] <= ram_bitstream[toprow][122 + nbit* 2 ];
142
+ right_zia_config[toprow* 8 + nbit] <= ram_bitstream[toprow][123 + nbit* 2 ];
143
+ left_zia_config[toprow* 8 + nbit] <= ram_bitstream[toprow][122 + nbit* 2 ];
134
144
end
135
145
end
136
146
else if (row < 20 ) begin
137
147
for (nbit= 0 ; nbit< 8 ; nbit= nbit+ 1 ) begin
138
- right_zia_config[row* 8 + nbit] <= ram_bitstream[row][123 + nbit* 2 ];
139
- left_zia_config[row* 8 + nbit] <= ram_bitstream[row][122 + nbit* 2 ];
148
+ right_zia_config[row* 8 + nbit] <= ram_bitstream[row][123 + nbit* 2 ];
149
+ left_zia_config[row* 8 + nbit] <= ram_bitstream[row][122 + nbit* 2 ];
140
150
end
141
151
end
142
152
@@ -146,27 +156,43 @@ module XC2CBitstream(
146
156
// Left side: 121:10
147
157
if (row > 27 ) begin
148
158
for (nterm= 0 ; nterm< 56 ; nterm= nterm+ 1 ) begin
149
- right_and_config[nterm* 80 + toprow* 2 + 0 ] <= ram_bitstream[toprow][249 - nterm* 2 - 1 ];
150
- right_and_config[nterm* 80 + toprow* 2 + 1 ] <= ram_bitstream[toprow][249 - nterm* 2 - 0 ];
159
+ right_and_config[nterm* 80 + toprow* 2 + 0 ] <= ram_bitstream[toprow][249 - nterm* 2 - 1 ];
160
+ right_and_config[nterm* 80 + toprow* 2 + 1 ] <= ram_bitstream[toprow][249 - nterm* 2 - 0 ];
151
161
152
- left_and_config[nterm* 80 + toprow* 2 + 0 ] <= ram_bitstream[toprow][10 + nterm* 2 + 0 ];
153
- left_and_config[nterm* 80 + toprow* 2 + 1 ] <= ram_bitstream[toprow][10 + nterm* 2 + 1 ];
162
+ left_and_config[nterm* 80 + toprow* 2 + 0 ] <= ram_bitstream[toprow][10 + nterm* 2 + 0 ];
163
+ left_and_config[nterm* 80 + toprow* 2 + 1 ] <= ram_bitstream[toprow][10 + nterm* 2 + 1 ];
154
164
end
155
165
end
156
166
157
167
else if (row < 20 ) begin
158
168
for (nterm= 0 ; nterm< 56 ; nterm= nterm+ 1 ) begin
159
- right_and_config[nterm* 80 + row* 2 + 0 ] <= ram_bitstream[row][249 - nterm* 2 - 1 ];
160
- right_and_config[nterm* 80 + row* 2 + 1 ] <= ram_bitstream[row][249 - nterm* 2 - 0 ];
169
+ right_and_config[nterm* 80 + row* 2 + 0 ] <= ram_bitstream[row][249 - nterm* 2 - 1 ];
170
+ right_and_config[nterm* 80 + row* 2 + 1 ] <= ram_bitstream[row][249 - nterm* 2 - 0 ];
161
171
162
- left_and_config[nterm* 80 + row* 2 + 0 ] <= ram_bitstream[row][10 + nterm* 2 + 0 ];
163
- left_and_config[nterm* 80 + row* 2 + 1 ] <= ram_bitstream[row][10 + nterm* 2 + 1 ];
172
+ left_and_config[nterm* 80 + row* 2 + 0 ] <= ram_bitstream[row][10 + nterm* 2 + 0 ];
173
+ left_and_config[nterm* 80 + row* 2 + 1 ] <= ram_bitstream[row][10 + nterm* 2 + 1 ];
164
174
end
165
175
end
166
176
167
177
// PLA OR array
178
+ // One bit per product term, two OR terms per row
168
179
if ( (row >= 20 ) && (row <= 27 ) ) begin
169
- // TODO
180
+ for (nterm= 0 ; nterm< 56 ; nterm= nterm+ 1 ) begin
181
+ right_or_config[(orow* 2 )* 56 + nterm] <= ram_bitstream[orow][249 - nterm* 2 + 0 ];
182
+ right_or_config[(orow* 2 + 1 )* 56 + nterm] <= ram_bitstream[orow][249 - nterm* 2 + 1 ];
183
+
184
+ left_or_config[(orow* 2 )* 56 + nterm] <= ram_bitstream[orow][249 - nterm* 2 + 0 ];
185
+ left_or_config[(orow* 2 + 1 )* 56 + nterm] <= ram_bitstream[orow][249 - nterm* 2 + 1 ];
186
+ end
187
+ end
188
+
189
+ // Macrocells
190
+ // 9 bits per row, takes 3 rows to provision one macrocell
191
+ // Right side: 258:250 (mirrored)
192
+ // Left side: 9:1
193
+ for (nbit= 0 ; nbit< 9 ; nbit= nbit+ 1 ) begin
194
+ left_mc_config[mcell* 27 + (2 - mcblock)* 9 + nbit] <= ram_bitstream[row][9 - nbit];
195
+ right_mc_config[mcell* 27 + (2 - mcblock)* 9 + nbit] <= ram_bitstream[row][250 + nbit];
170
196
end
171
197
172
198
end
0 commit comments