Skip to content

Commit 781888a

Browse files
committedJun 15, 2017
XC2CZIA: added initial ZIA structure for 32-macrocell device
1 parent 700bb97 commit 781888a

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed
 

Diff for: ‎hdl/xc2c-model/XC2CZIA.v

+174
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
`default_nettype none
2+
/***********************************************************************************************************************
3+
* Copyright (C) 2016-2017 Andrew Zonenberg and contributors *
4+
* *
5+
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General *
6+
* Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) *
7+
* any later version. *
8+
* *
9+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
10+
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for *
11+
* more details. *
12+
* *
13+
* You should have received a copy of the GNU Lesser General Public License along with this program; if not, you may *
14+
* find one here: *
15+
* https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt *
16+
* or you may search the http://www.gnu.org website for the version 2.1 license, or you may write to the Free Software *
17+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *
18+
**********************************************************************************************************************/
19+
20+
/**
21+
@brief Global routing fabric - the "Zero Power Interconnect Array"
22+
*/
23+
module XC2CZIA(
24+
dedicated_in, ibuf_in, macrocell_in,
25+
zia_out,
26+
config_bits);
27+
28+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
29+
// Device configuration
30+
31+
parameter MACROCELLS = 32; //A variant implied for 32/64, no support for base version
32+
33+
initial begin
34+
if(MACROCELLS != 32) begin
35+
$display("ZIA not implemented for other device densities");
36+
$finish;
37+
end
38+
end
39+
40+
localparam NUM_IBUFS = 32; //TODO: function or something
41+
localparam NUM_MCELLS = 32;
42+
43+
localparam BITS_PER_ROW = 8;
44+
45+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
46+
// Inputs
47+
48+
input wire dedicated_in; //only present in 32a
49+
50+
input wire[NUM_IBUFS-1:0] ibuf_in; //Inputs (from flipflop or input buffer)
51+
//{fb2, fb1}
52+
input wire[NUM_MCELLS-1:0] macrocell_in; //Inputs (from XOR gate or flipflop)
53+
//{fb2, fb1}
54+
55+
output reg[39:0] zia_out; //40 outputs to the function block
56+
57+
input wire[40 * BITS_PER_ROW-1 : 0] config_bits; //The actual config bitstream for this ZIA block
58+
59+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
60+
// Reshuffle the bitstream into proper rows
61+
62+
reg[BITS_PER_ROW-1:0] row_config[39:0];
63+
64+
integer i;
65+
always @(*) begin
66+
for(i=0; i<40; i=i+1)
67+
assign row_config[i] = config_bits[i*BITS_PER_ROW +: BITS_PER_ROW];
68+
end
69+
70+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
71+
// Inputs to the ROM muxes
72+
73+
/*
74+
64:54 First group (left side, next to VCCINT rail)
75+
53:43 Second group
76+
42:32 Third group
77+
31:21 Fourth group
78+
20:10 Fifth group
79+
9:0 Sixth group (rightmost)
80+
*/
81+
wire[65:0] zbus =
82+
{
83+
macrocell_in,
84+
ibuf_in[31:16],
85+
dedicated_in,
86+
ibuf_in[15:0]
87+
};
88+
89+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
90+
// The ROM muxes (M3-M4 vias)
91+
92+
//This is for the XC2C32A only
93+
//TODO: do other densities
94+
wire[7:0] zia_row_inputs[39:0];
95+
assign zia_row_inputs[0] = {2'b10, zbus[58], zbus[46], zbus[34], zbus[22], zbus[10], zbus[0]};
96+
assign zia_row_inputs[1] = {2'b10, zbus[61], zbus[48], zbus[41], zbus[23], zbus[11], zbus[1]};
97+
assign zia_row_inputs[2] = {2'b10, zbus[60], zbus[53], zbus[35], zbus[30], zbus[12], zbus[2]};
98+
assign zia_row_inputs[3] = {2'b10, zbus[55], zbus[47], zbus[42], zbus[26], zbus[13], zbus[3]};
99+
assign zia_row_inputs[4] = {2'b10, zbus[59], zbus[44], zbus[38], zbus[28], zbus[14], zbus[4]};
100+
assign zia_row_inputs[5] = {2'b10, zbus[56], zbus[50], zbus[40], zbus[31], zbus[15], zbus[5]};
101+
assign zia_row_inputs[6] = {2'b10, zbus[62], zbus[52], zbus[33], zbus[21], zbus[16], zbus[6]};
102+
assign zia_row_inputs[7] = {2'b10, zbus[64], zbus[45], zbus[32], zbus[27], zbus[17], zbus[7]};
103+
assign zia_row_inputs[8] = {2'b10, zbus[57], zbus[43], zbus[39], zbus[25], zbus[18], zbus[8]};
104+
assign zia_row_inputs[9] = {2'b10, zbus[54], zbus[51], zbus[37], zbus[24], zbus[19], zbus[9]};
105+
assign zia_row_inputs[10] = {2'b10, zbus[63], zbus[49], zbus[36], zbus[29], zbus[20], zbus[7]};
106+
assign zia_row_inputs[11] = {2'b10, zbus[59], zbus[47], zbus[35], zbus[23], zbus[11], zbus[0]};
107+
assign zia_row_inputs[12] = {2'b10, zbus[64], zbus[50], zbus[37], zbus[30], zbus[12], zbus[1]};
108+
assign zia_row_inputs[13] = {2'b10, zbus[62], zbus[49], zbus[42], zbus[24], zbus[19], zbus[2]};
109+
assign zia_row_inputs[14] = {2'b10, zbus[61], zbus[44], zbus[36], zbus[31], zbus[15], zbus[3]};
110+
assign zia_row_inputs[15] = {2'b10, zbus[56], zbus[48], zbus[33], zbus[27], zbus[17], zbus[4]};
111+
assign zia_row_inputs[16] = {2'b10, zbus[60], zbus[45], zbus[39], zbus[29], zbus[20], zbus[5]};
112+
assign zia_row_inputs[17] = {2'b10, zbus[57], zbus[51], zbus[41], zbus[22], zbus[10], zbus[6]};
113+
assign zia_row_inputs[18] = {2'b10, zbus[63], zbus[53], zbus[34], zbus[21], zbus[16], zbus[7]};
114+
assign zia_row_inputs[19] = {2'b10, zbus[55], zbus[46], zbus[32], zbus[28], zbus[14], zbus[8]};
115+
assign zia_row_inputs[20] = {2'b10, zbus[58], zbus[43], zbus[40], zbus[26], zbus[13], zbus[9]};
116+
assign zia_row_inputs[21] = {2'b10, zbus[54], zbus[52], zbus[38], zbus[25], zbus[18], zbus[8]};
117+
assign zia_row_inputs[22] = {2'b10, zbus[60], zbus[48], zbus[36], zbus[24], zbus[12], zbus[0]};
118+
assign zia_row_inputs[23] = {2'b10, zbus[54], zbus[53], zbus[39], zbus[26], zbus[19], zbus[1]};
119+
assign zia_row_inputs[24] = {2'b10, zbus[55], zbus[51], zbus[38], zbus[31], zbus[13], zbus[2]};
120+
assign zia_row_inputs[25] = {2'b10, zbus[63], zbus[50], zbus[33], zbus[25], zbus[20], zbus[3]};
121+
assign zia_row_inputs[26] = {2'b10, zbus[62], zbus[45], zbus[37], zbus[22], zbus[16], zbus[4]};
122+
assign zia_row_inputs[27] = {2'b10, zbus[57], zbus[49], zbus[34], zbus[28], zbus[18], zbus[5]};
123+
assign zia_row_inputs[28] = {2'b10, zbus[61], zbus[46], zbus[40], zbus[30], zbus[11], zbus[6]};
124+
assign zia_row_inputs[29] = {2'b10, zbus[58], zbus[52], zbus[42], zbus[23], zbus[10], zbus[7]};
125+
assign zia_row_inputs[30] = {2'b10, zbus[64], zbus[44], zbus[35], zbus[21], zbus[17], zbus[8]};
126+
assign zia_row_inputs[31] = {2'b10, zbus[56], zbus[47], zbus[32], zbus[29], zbus[15], zbus[9]};
127+
assign zia_row_inputs[32] = {2'b10, zbus[59], zbus[43], zbus[41], zbus[27], zbus[14], zbus[9]};
128+
assign zia_row_inputs[33] = {2'b10, zbus[61], zbus[49], zbus[37], zbus[25], zbus[13], zbus[0]};
129+
assign zia_row_inputs[34] = {2'b10, zbus[60], zbus[43], zbus[42], zbus[28], zbus[15], zbus[1]};
130+
assign zia_row_inputs[35] = {2'b10, zbus[54], zbus[44], zbus[40], zbus[27], zbus[20], zbus[2]};
131+
assign zia_row_inputs[36] = {2'b10, zbus[56], zbus[52], zbus[39], zbus[22], zbus[14], zbus[3]};
132+
assign zia_row_inputs[37] = {2'b10, zbus[64], zbus[51], zbus[34], zbus[26], zbus[11], zbus[4]};
133+
assign zia_row_inputs[38] = {2'b10, zbus[63], zbus[46], zbus[38], zbus[23], zbus[17], zbus[5]};
134+
assign zia_row_inputs[39] = {2'b10, zbus[58], zbus[50], zbus[35], zbus[29], zbus[19], zbus[6]};
135+
136+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
137+
// The SRAM muxes
138+
139+
always @(*) begin
140+
141+
for(i=0; i<40; i=i+1) begin
142+
143+
//The real silicon uses a tristate mux so bus fights are possible if multiple bits are asserted.
144+
//For the FPGA model, use an if/else cascade to resolve ambiguity (rather than bus fight)
145+
//Note that bit 7 is active high but the rest are active low.
146+
//This is done to ensure that a blank bitstream (all 1s) puts the chip in a sane state.
147+
//TODO: model OGATE properly during the config step?
148+
if(row_config[i][7])
149+
zia_out[i] <= zia_row_inputs[i][7];
150+
else if(!row_config[i][6])
151+
zia_out[i] <= zia_row_inputs[i][6];
152+
else if(!row_config[i][5])
153+
zia_out[i] <= zia_row_inputs[i][5];
154+
else if(!row_config[i][4])
155+
zia_out[i] <= zia_row_inputs[i][4];
156+
else if(!row_config[i][3])
157+
zia_out[i] <= zia_row_inputs[i][3];
158+
else if(!row_config[i][2])
159+
zia_out[i] <= zia_row_inputs[i][2];
160+
else if(!row_config[i][1])
161+
zia_out[i] <= zia_row_inputs[i][1];
162+
else if(!row_config[i][0])
163+
zia_out[i] <= zia_row_inputs[i][0];
164+
165+
//Default to 0 if no bits are active.
166+
//The real silicon has a weak keeper circuit for this
167+
else
168+
zia_out[i] <= 0;
169+
170+
end
171+
172+
end
173+
174+
endmodule

0 commit comments

Comments
 (0)
Please sign in to comment.