/** * Disparity_Calc_1by1by80.v * Disparity calculator for a 1x1 window, comparing one pixel on from the left * camera with 80 pixels from the right camera. * Calculates the cell index of the pixel from the right window with * with the minimum intensity difference. * The cell index is translated to an 8-bit value representing the depth. * * Written by Peter Kung and Jsoon Kim */ module Disparity_Calc_1by1by80 ( iLDATA[7:0], iRDATA[639:0], oDIST[7:0]); input [7:0] iLDATA; // 1 8-bit pixel data from left camera input [639:0] iRDATA; // 80 8-bit pixel data from right camera output [7:0] oDIST; // 8-bit disparity value //Intermediate wires //8 bits per SAD * 80 disparities = 640 wire [639:0] oSAD; //Used to calculate the minimum absolute difference wire [7:0] min1, min2, min3, min4, min5, min6, min7, min8, min9, min10, min11, min12, min13, min14, min15, min16, min17, min18, min19, min20, min21, min22, min23, min24, min25, min26, min27, min28, min29, min30, min31, min32, min33, min34, min35, min36, min37, min38, min39, min40, min41, min42, min43, min44, min45, min46, min47, min48, min49, min50, min51, min52, min53, min54, min55, min56, min57, min58, min59, min60, min61, min62, min63, min64, min65, min66, min67, min68, min69, min70, min71, min72, min73, min74, min75, min76, min77, min78; //Used to calculate the index of the right camera pixel with the minimum absolute difference wire [7:0] minindex1, minindex2, minindex3, minindex4, minindex5, minindex6, minindex7, minindex8, minindex9, minindex10, minindex11, minindex12, minindex13, minindex14, minindex15, minindex16, minindex17, minindex18, minindex19, minindex20, minindex21, minindex22, minindex23, minindex24, minindex25, minindex26, minindex27, minindex28, minindex29, minindex30, minindex31, minindex32, minindex33, minindex34, minindex35, minindex36, minindex37, minindex38, minindex39, minindex40, minindex41, minindex42, minindex43, minindex44, minindex45, minindex46, minindex47, minindex48, minindex49, minindex50, minindex51, minindex52, minindex53, minindex54, minindex55, minindex56, minindex57, minindex58, minindex59, minindex60, minindex61, minindex62, minindex63, minindex64, minindex65, minindex66, minindex67, minindex68, minindex69, minindex70, minindex71, minindex72, minindex73, minindex74, minindex75, minindex76, minindex77, minindex78; //use generate statement genvar i; generate for (i = 0; i < 80; i = i + 1) begin : iter SAD_1by1 comp ( iLDATA, iRDATA[i*8+7:i*8], oSAD[i*8+7:i*8]); end endgenerate // Find minimum absolute intensity difference using binary search assign min1 = (oSAD[7:0] < oSAD[15:8] ? oSAD[7:0] : oSAD[15:8]); assign minindex1 = (oSAD[7:0] < oSAD[15:8] ? 255 : 255); assign min2 = (oSAD[23:16] < oSAD[31:24] ? oSAD[23:16] : oSAD[31:24]); assign minindex2 = (oSAD[23:16] < oSAD[31:24] ? 255 : 255); assign min3 = (oSAD[39:32] < oSAD[47:40] ? oSAD[39:32] : oSAD[47:40]); assign minindex3 = (oSAD[39:32] < oSAD[47:40] ? 254 : 254); assign min4 = (oSAD[55:48] < oSAD[63:56] ? oSAD[55:48] : oSAD[63:56]); assign minindex4 = (oSAD[55:48] < oSAD[63:56] ? 254 : 253); assign min5 = (oSAD[71:64] < oSAD[79:72] ? oSAD[71:64] : oSAD[79:72]); assign minindex5 = (oSAD[71:64] < oSAD[79:72] ? 252 : 252); assign min6 = (oSAD[87:80] < oSAD[95:88] ? oSAD[87:80] : oSAD[95:88]); assign minindex6 = (oSAD[87:80] < oSAD[95:88] ? 251 : 250); assign min7 = (oSAD[103:96] < oSAD[111:104] ? oSAD[103:96] : oSAD[111:104]); assign minindex7 = (oSAD[103:96] < oSAD[111:104] ? 249 : 248); assign min8 = (oSAD[119:112] < oSAD[127:120] ? oSAD[119:112] : oSAD[127:120]); assign minindex8 = (oSAD[119:112] < oSAD[127:120] ? 247 : 246); assign min9 = (oSAD[135:128] < oSAD[143:136] ? oSAD[135:128] : oSAD[143:136]); assign minindex9 = (oSAD[135:128] < oSAD[143:136] ? 245 : 243); assign min10 = (oSAD[151:144] < oSAD[159:152] ? oSAD[151:144] : oSAD[159:152]); assign minindex10 = (oSAD[151:144] < oSAD[159:152] ? 242 : 241); assign min11 = (oSAD[167:160] < oSAD[175:168] ? oSAD[167:160] : oSAD[175:168]); assign minindex11 = (oSAD[167:160] < oSAD[175:168] ? 239 : 237); assign min12 = (oSAD[183:176] < oSAD[191:184] ? oSAD[183:176] : oSAD[191:184]); assign minindex12 = (oSAD[183:176] < oSAD[191:184] ? 236 : 234); assign min13 = (oSAD[199:192] < oSAD[207:200] ? oSAD[199:192] : oSAD[207:200]); assign minindex13 = (oSAD[199:192] < oSAD[207:200] ? 232 : 230); assign min14 = (oSAD[215:208] < oSAD[223:216] ? oSAD[215:208] : oSAD[223:216]); assign minindex14 = (oSAD[215:208] < oSAD[223:216] ? 228 : 226); assign min15 = (oSAD[231:224] < oSAD[239:232] ? oSAD[231:224] : oSAD[239:232]); assign minindex15 = (oSAD[231:224] < oSAD[239:232] ? 224 : 221); assign min16 = (oSAD[247:240] < oSAD[255:248] ? oSAD[247:240] : oSAD[255:248]); assign minindex16 = (oSAD[247:240] < oSAD[255:248] ? 219 : 217); assign min17 = (oSAD[263:256] < oSAD[271:264] ? oSAD[263:256] : oSAD[271:264]); assign minindex17 = (oSAD[263:256] < oSAD[271:264] ? 214 : 211); assign min18 = (oSAD[279:272] < oSAD[287:280] ? oSAD[279:272] : oSAD[287:280]); assign minindex18 = (oSAD[279:272] < oSAD[287:280] ? 209 : 206); assign min19 = (oSAD[295:288] < oSAD[303:296] ? oSAD[295:288] : oSAD[303:296]); assign minindex19 = (oSAD[295:288] < oSAD[303:296] ? 203 : 200); assign min20 = (oSAD[311:304] < oSAD[319:312] ? oSAD[311:304] : oSAD[319:312]); assign minindex20 = (oSAD[311:304] < oSAD[319:312] ? 197 : 194); assign min21 = (oSAD[327:320] < oSAD[335:328] ? oSAD[327:320] : oSAD[335:328]); assign minindex21 = (oSAD[327:320] < oSAD[335:328] ? 191 : 188); assign min22 = (oSAD[343:336] < oSAD[351:344] ? oSAD[343:336] : oSAD[351:344]); assign minindex22 = (oSAD[343:336] < oSAD[351:344] ? 184 : 181); assign min23 = (oSAD[359:352] < oSAD[367:360] ? oSAD[359:352] : oSAD[367:360]); assign minindex23 = (oSAD[359:352] < oSAD[367:360] ? 178 : 174); assign min24 = (oSAD[375:368] < oSAD[383:376] ? oSAD[375:368] : oSAD[383:376]); assign minindex24 = (oSAD[375:368] < oSAD[383:376] ? 170 : 167); assign min25 = (oSAD[391:384] < oSAD[399:392] ? oSAD[391:384] : oSAD[399:392]); assign minindex25 = (oSAD[391:384] < oSAD[399:392] ? 163 : 159); assign min26 = (oSAD[407:400] < oSAD[415:408] ? oSAD[407:400] : oSAD[415:408]); assign minindex26 = (oSAD[407:400] < oSAD[415:408] ? 155 : 151); assign min27 = (oSAD[423:416] < oSAD[431:424] ? oSAD[423:416] : oSAD[431:424]); assign minindex27 = (oSAD[423:416] < oSAD[431:424] ? 147 : 143); assign min28 = (oSAD[439:432] < oSAD[447:440] ? oSAD[439:432] : oSAD[447:440]); assign minindex28 = (oSAD[439:432] < oSAD[447:440] ? 138 : 134); assign min29 = (oSAD[455:448] < oSAD[463:456] ? oSAD[455:448] : oSAD[463:456]); assign minindex29 = (oSAD[455:448] < oSAD[463:456] ? 130 : 125); assign min30 = (oSAD[471:464] < oSAD[479:472] ? oSAD[471:464] : oSAD[479:472]); assign minindex30 = (oSAD[471:464] < oSAD[479:472] ? 120 : 116); assign min31 = (oSAD[487:480] < oSAD[495:488] ? oSAD[487:480] : oSAD[495:488]); assign minindex31 = (oSAD[487:480] < oSAD[495:488] ? 111 : 106); assign min32 = (oSAD[503:496] < oSAD[511:504] ? oSAD[503:496] : oSAD[511:504]); assign minindex32 = (oSAD[503:496] < oSAD[511:504] ? 101 : 96); assign min33 = (oSAD[519:512] < oSAD[527:520] ? oSAD[519:512] : oSAD[527:520]); assign minindex33 = (oSAD[519:512] < oSAD[527:520] ? 91 : 86); assign min34 = (oSAD[535:528] < oSAD[543:536] ? oSAD[535:528] : oSAD[543:536]); assign minindex34 = (oSAD[535:528] < oSAD[543:536] ? 81 : 75); assign min35 = (oSAD[551:544] < oSAD[559:552] ? oSAD[551:544] : oSAD[559:552]); assign minindex35 = (oSAD[551:544] < oSAD[559:552] ? 70 : 65); assign min36 = (oSAD[567:560] < oSAD[575:568] ? oSAD[567:560] : oSAD[575:568]); assign minindex36 = (oSAD[567:560] < oSAD[575:568] ? 59 : 53); assign min37 = (oSAD[583:576] < oSAD[591:584] ? oSAD[583:576] : oSAD[591:584]); assign minindex37 = (oSAD[583:576] < oSAD[591:584] ? 48 : 42); assign min38 = (oSAD[599:592] < oSAD[607:600] ? oSAD[599:592] : oSAD[607:600]); assign minindex38 = (oSAD[599:592] < oSAD[607:600] ? 36 : 30); assign min39 = (oSAD[615:608] < oSAD[623:616] ? oSAD[615:608] : oSAD[623:616]); assign minindex39 = (oSAD[615:608] < oSAD[623:616] ? 24 : 18); assign min40 = (oSAD[631:624] < oSAD[639:632] ? oSAD[631:624] : oSAD[639:632]); assign minindex40 = (oSAD[631:624] < oSAD[639:632] ? 12 : 5); assign min41 = (min1 < min2 ? min1 : min2); assign minindex41 = (min1 < min2 ? minindex1 : minindex2); assign min42 = (min3 < min4 ? min3 : min4); assign minindex42 = (min3 < min4 ? minindex3 : minindex4); assign min43 = (min5 < min6 ? min5 : min6); assign minindex43 = (min5 < min6 ? minindex5 : minindex6); assign min44 = (min7 < min8 ? min7 : min8); assign minindex44 = (min7 < min8 ? minindex7 : minindex8); assign min45 = (min9 < min10 ? min9 : min10); assign minindex45 = (min9 < min10 ? minindex9 : minindex10); assign min46 = (min11 < min12 ? min11 : min12); assign minindex46 = (min11 < min12 ? minindex11 : minindex12); assign min47 = (min13 < min14 ? min13 : min14); assign minindex47 = (min13 < min14 ? minindex13 : minindex14); assign min48 = (min15 < min16 ? min15 : min16); assign minindex48 = (min15 < min16 ? minindex15 : minindex16); assign min49 = (min17 < min18 ? min17 : min18); assign minindex49 = (min17 < min18 ? minindex17 : minindex18); assign min50 = (min19 < min20 ? min19 : min20); assign minindex50 = (min19 < min20 ? minindex19 : minindex20); assign min51 = (min21 < min22 ? min21 : min22); assign minindex51 = (min21 < min22 ? minindex21 : minindex22); assign min52 = (min23 < min24 ? min23 : min24); assign minindex52 = (min23 < min24 ? minindex23 : minindex24); assign min53 = (min25 < min26 ? min25 : min26); assign minindex53 = (min25 < min26 ? minindex25 : minindex26); assign min54 = (min27 < min28 ? min27 : min28); assign minindex54 = (min27 < min28 ? minindex27 : minindex28); assign min55 = (min29 < min30 ? min29 : min30); assign minindex55 = (min29 < min30 ? minindex29 : minindex30); assign min56 = (min31 < min32 ? min31 : min32); assign minindex56 = (min31 < min32 ? minindex31 : minindex32); assign min57 = (min33 < min34 ? min33 : min34); assign minindex57 = (min33 < min34 ? minindex33 : minindex34); assign min58 = (min35 < min36 ? min35 : min36); assign minindex58 = (min35 < min36 ? minindex35 : minindex36); assign min59 = (min37 < min38 ? min37 : min38); assign minindex59 = (min37 < min38 ? minindex37 : minindex38); assign min60 = (min39 < min40 ? min39 : min40); assign minindex60 = (min39 < min40 ? minindex39 : minindex40); assign min61 = (min41 < min42 ? min41 : min42); assign minindex61 = (min41 < min42 ? minindex41 : minindex42); assign min62 = (min43 < min44 ? min43 : min44); assign minindex62 = (min43 < min44 ? minindex43 : minindex44); assign min63 = (min45 < min46 ? min45 : min46); assign minindex63 = (min45 < min46 ? minindex45 : minindex46); assign min64 = (min47 < min48 ? min47 : min48); assign minindex64 = (min47 < min48 ? minindex47 : minindex48); assign min65 = (min49 < min50 ? min49 : min50); assign minindex65 = (min49 < min50 ? minindex49 : minindex50); assign min66 = (min51 < min52 ? min51 : min52); assign minindex66 = (min51 < min52 ? minindex51 : minindex52); assign min67 = (min53 < min54 ? min53 : min54); assign minindex67 = (min53 < min54 ? minindex53 : minindex54); assign min68 = (min55 < min56 ? min55 : min56); assign minindex68 = (min55 < min56 ? minindex55 : minindex56); assign min69 = (min57 < min58 ? min57 : min58); assign minindex69 = (min57 < min58 ? minindex57 : minindex58); assign min70 = (min59 < min60 ? min59 : min60); assign minindex70 = (min59 < min60 ? minindex59 : minindex60); assign min71 = (min61 < min62 ? min61 : min62); assign minindex71 = (min61 < min62 ? minindex61 : minindex62); assign min72 = (min63 < min64 ? min63 : min64); assign minindex72 = (min63 < min64 ? minindex63 : minindex64); assign min73 = (min65 < min66 ? min65 : min66); assign minindex73 = (min65 < min66 ? minindex65 : minindex66); assign min74 = (min67 < min68 ? min67 : min68); assign minindex74 = (min67 < min68 ? minindex67 : minindex68); assign min75 = (min69 < min70 ? min69 : min70); assign minindex75 = (min69 < min70 ? minindex69 : minindex70); assign min76 = (min71 < min72 ? min71 : min72); assign minindex76 = (min71 < min72 ? minindex71 : minindex72); assign min77 = (min73 < min74 ? min73 : min74); assign minindex77 = (min73 < min74 ? minindex73 : minindex74); assign min78 = (min76 < min77 ? min76 : min77); assign minindex78 = (min76 < min77 ? minindex77 : minindex77); assign oDIST = (min78 < min75 ? minindex78 : minindex75); endmodule