1//: version "2.1" 2//: property encoding = "iso8859-1" 3//: property locale = "en" 4//: property prefix = "_GG" 5//: property title = "Coke Machine Interface" 6 7`timescale 1ns/1ns 8 9//: /netlistBegin main 10module main; //: root_module 11wire w6; //: /sn:0 {0}(57,149)(42,149){1} 12wire w7; //: /sn:0 {0}(57,165)(42,165){1} 13wire w16; //: /sn:0 {0}(240,117)(255,117){1} 14wire [7:0] w14; //: /sn:0 {0}(#:240,85)(255,85){1} 15wire [2:0] w19; //: /sn:0 {0}(#:240,165)(255,165){1} 16wire w15; //: /sn:0 {0}(240,101)(255,101){1} 17wire w4; //: /sn:0 {0}(57,117)(42,117){1} 18wire w3; //: /sn:0 {0}(57,101)(42,101){1} 19wire [5:0] w0; //: /sn:0 {0}(#:57,53)(42,53){1} 20wire w21; //: /sn:0 {0}(240,197)(255,197){1} 21wire w24; //: /sn:0 {0}(240,245)(255,245){1} 22wire w23; //: /sn:0 {0}(240,229)(255,229){1} 23wire [2:0] w20; //: /sn:0 {0}(#:240,181)(255,181){1} 24wire [5:0] w1; //: /sn:0 {0}(#:57,69)(42,69){1} 25wire w25; //: /sn:0 {0}(240,261)(255,261){1} 26wire [2:0] w18; //: /sn:0 {0}(#:240,149)(255,149){1} 27wire w8; //: /sn:0 {0}(57,181)(42,181){1} 28wire w22; //: /sn:0 {0}(240,213)(255,213){1} 29wire w17; //: /sn:0 {0}(240,133)(255,133){1} 30wire [5:0] w12; //: /sn:0 {0}(#:240,53)(255,53){1} 31wire w11; //: /sn:0 {0}(57,229)(42,229){1} 32wire w2; //: /sn:0 {0}(57,85)(42,85){1} 33wire w10; //: /sn:0 {0}(57,213)(42,213){1} 34wire [5:0] w13; //: /sn:0 {0}(#:240,69)(255,69){1} 35wire w5; //: /sn:0 {0}(57,133)(42,133){1} 36wire w9; //: /sn:0 {0}(57,197)(42,197){1} 37wire w26; //: /sn:0 {0}(240,277)(255,277){1} 38//: enddecls 39 40 cokemachine g0 (.INSACK(w11), .RETINS(w10), .CHGCOM(w9), .BILLOUT(w8), .BILLLT(w7), .BILLIN(w6), .NOCHG(w5), .CHGN(w4), .CHGD(w3), .CHGQ(w2), .ELIGHT(w1), .DISP(w0), .DISPACK(w26), .CHGACK(w25), .BILLACK(w24), .CNRET(w23), .BILLOK(w22), .BILLSNS(w21), .NUMN(w20), .NUMD(w19), .NUMQ(w18), .INSN(w17), .INSD(w16), .INSQ(w15), .COST(w14), .EMPTY(w13), .PRESS(w12)); //: @(58, 37) /sz:(181, 256) /sn:0 /p:[ Li0>0 Li1>0 Li2>0 Li3>0 Li4>0 Li5>0 Li6>0 Li7>0 Li8>0 Li9>0 Li10>0 Li11>0 Ro0<0 Ro1<0 Ro2<0 Ro3<0 Ro4<0 Ro5<0 Ro6<0 Ro7<0 Ro8<0 Ro9<0 Ro10<0 Ro11<0 Ro12<0 Ro13<0 Ro14<0 ] 41 42endmodule 43//: /netlistEnd 44 45//: /hdlBegin cokemachine 46//: interface /sz:(181, 272) /bd:[ Li0>COST[7:0](208/272) Li1>INSACK(192/272) Li2>RETINS(176/272) Li3>CHGCOM(160/272) Li4>BILLOUT(144/272) Li5>BILLLT(128/272) Li6>BILLIN(112/272) Li7>NOCHG(96/272) Li8>CHGN(80/272) Li9>CHGD(64/272) Li10>CHGQ(48/272) Li11>ELIGHT[5:0](32/272) Li12>DISP[5:0](16/272) Bi0>_RESET(92/181) Ro0<BILLNG(240/272) Ro1<DISPACK(224/272) Ro2<CHGACK(208/272) Ro3<BILLACK(192/272) Ro4<CNRET(176/272) Ro5<BILLOK(160/272) Ro6<BILLSNS(144/272) Ro7<NUMN[2:0](128/272) Ro8<NUMD[2:0](112/272) Ro9<NUMQ[2:0](96/272) Ro10<INSN(80/272) Ro11<INSD(64/272) Ro12<INSQ(48/272) Ro13<EMPTY[5:0](32/272) Ro14<PRESS[5:0](16/272) ] 47//: enddecls 48module cokemachine(DISP, ELIGHT, CHGCOM, CHGQ, CHGD, CHGN, NOCHG, BILLIN, BILLOUT, BILLLT, RETINS, INSACK, EMPTY, PRESS, INSQ, INSD, INSN, BILLSNS, BILLOK, BILLNG, COST,CNRET, BILLACK, DISPACK, CHGACK); 49 50 input [5:0] DISP; // Dispense drink 51 input [5:0] ELIGHT; // Empty light 52 input CHGCOM; // Commit change 53 input CHGQ, CHGD, CHGN; // Make change (quarter, dime, nickle) 54 input NOCHG; // No change light 55 input BILLIN, BILLOUT; // Move bill in or out 56 input BILLLT; // Insert bill light 57 input RETINS; // Return inserted coins 58 input INSACK; // Acknoeledge a coin insertion 59 input [7:0] COST; // Cost per drink in nickles 60 input _RESET; // Reset the coke machine. 61 62 output [5:0] EMPTY, PRESS; // Empty sensor, button press sensor 63 output INSQ, INSD, INSN; // Sense coin insertion (quarter, dime, nickle) 64 output [2:0] NUMQ, NUMD, NUMN; // Number of coins in changer (quarter, dime, nickle) 65 output BILLSNS; // Sense bill in bill slot 66 output BILLOK, BILLNG; // Scanner reports bill ok (or no good) 67 output CNRET; // Coin return pressed 68 output BILLACK; // Acknowledge a BILLIN/BILLOUT signal 69 output DISPACK; // Acknowledge a DISP signal 70 output CHGACK; // Acknowledge a change signal 71 72 reg [5:0] EMPTY, PRESS; 73 reg INSQ, INSD, INSN; 74 reg [2:0] NUMQ, NUMD, NUMN; 75 reg BILLSNS; 76 reg BILLOK, BILLNG; 77 reg CNRET; 78 reg BILLACK; 79 reg DISPACK; 80 reg CHGACK; 81 82 initial 83 begin 84 CHGACK = 1'b0; 85 DISPACK = 1'b0; 86 $tkg$post("CokeMachine","%m"); 87 $tkg$exec("CokeMachine::setCost %m %d",COST); 88 $tkg$exec("CokeMachine::resetMachine %m %d",_RESET); 89 end 90 91 // 92 // Respon to changes in the "empty" light. 93 // 94 always @ (ELIGHT) 95 $tkg$exec("CokeMachine::setEmpty %m {%b %b %b %b %b %b}", ELIGHT[0],ELIGHT[1],ELIGHT[2],ELIGHT[3],ELIGHT[4],ELIGHT[5]); 96 97 // 98 // Respond to changes in the "dispense" signal. 99 // 100 wire D0 = DISP[0]; 101 always @ (D0) 102 if (D0 && !DISPACK) 103 begin 104 #10 $tkg$exec("CokeMachine::dispense %m 0"); 105 DISPACK = 1'b1; 106 end 107 else if (!D0) 108 #10 DISPACK = 1'b0; 109 110 wire D1 = DISP[1]; 111 always @ (D1) 112 if (D1 && !DISPACK) 113 begin 114 #10 $tkg$exec("CokeMachine::dispense %m 1"); 115 DISPACK = 1'b1; 116 end 117 else if (!D1) 118 #10 DISPACK = 1'b0; 119 120 wire D2 = DISP[2]; 121 always @ (D2) 122 if (D2 && !DISPACK) 123 begin 124 #10 $tkg$exec("CokeMachine::dispense %m 2"); 125 DISPACK = 1'b1; 126 end 127 else if (!D2) 128 #10 DISPACK = 1'b0; 129 130 wire D3 = DISP[3]; 131 always @ (D3) 132 if (D3 && !DISPACK) 133 begin 134 #10 $tkg$exec("CokeMachine::dispense %m 3"); 135 DISPACK = 1'b1; 136 end 137 else if (!D3) 138 #10 DISPACK = 1'b0; 139 140 wire D4 = DISP[4]; 141 always @ (D4) 142 if (D4 && !DISPACK) 143 begin 144 #10 $tkg$exec("CokeMachine::dispense %m 4"); 145 DISPACK = 1'b1; 146 end 147 else if (!D4) 148 #10 DISPACK = 1'b0; 149 150 wire D5 = DISP[5]; 151 always @ (D5) 152 if (D5 && !DISPACK) 153 begin 154 #10 $tkg$exec("CokeMachine::dispense %m 5"); 155 DISPACK = 1'b1; 156 end 157 else if (!D5) 158 #10 DISPACK = 1'b0; 159 160 // 161 // Make change 162 // 163 always @ (CHGQ) 164 if (CHGQ && !CHGACK) 165 begin 166 #10 $tkg$exec("CokeMachine::ejectChange %m 25"); 167 CHGACK = 1'b1; 168 end 169 else if (!CHGQ) 170 #10 CHGACK = 1'b0; 171 172 always @ (CHGD) 173 if (CHGD && !CHGACK) 174 begin 175 #10 $tkg$exec("CokeMachine::ejectChange %m 10"); 176 CHGACK = 1'b1; 177 end 178 else if (!CHGD) 179 #10 CHGACK = 1'b0; 180 181 always @ (CHGN) 182 if (CHGN && !CHGACK) 183 begin 184 #10 $tkg$exec("CokeMachine::ejectChange %m 5"); 185 CHGACK = 1'b1; 186 end 187 else if (!CHGN) 188 #10 CHGACK = 1'b0; 189 190 always @ (CHGCOM) 191 if (CHGCOM && !CHGACK) 192 begin 193 #10 $tkg$exec("CokeMachine::commitInserted %m"); 194 CHGACK = 1'b1; 195 end 196 else if (!CHGCOM) 197 CHGACK = 1'b0; 198 199 always @ (RETINS) 200 if (RETINS && !CHGACK) 201 begin 202 #10 $tkg$exec("CokeMachine::returnInserted %m"); 203 CHGACK = 1'b1; 204 end 205 else if (!RETINS) 206 CHGACK = 1'b0; 207 208 // 209 // Acknowledge coin insertion 210 // 211 always @ (INSACK) $tkg$exec("CokeMachine::insertAck %m -value %b",INSACK); 212 213 214 always @ (COST) $tkg$exec("CokeMachine::setCost %m %d",COST); 215 always @ (_RESET) $tkg$exec("CokeMachine::resetMachine %m %d",_RESET); 216 217 // 218 // No change, and insert bill lights 219 // 220// always @ (NOCHG) $tkg$exec("CokeMachine::setNoChange %m %b",NOCHG); 221// always @ (BILLLT) $tkg$exec("CokeMachine::setBillLight %m %b",BILLLT); 222 always @ (NOCHG) $tkg$send("%m.NOCHG",NOCHG); 223 always @ (BILLLT) $tkg$send("%m.BILLLT",BILLLT); 224 225 226 227 // 228 // Bill reader handling 229 // 230 always @ (BILLIN) 231 #10 $tkg$exec("CokeMachine::billIn %m -value %b",BILLIN); 232 233 always @ (BILLOUT) 234 #10 $tkg$exec("CokeMachine::billOut %m -value %b",BILLOUT); 235 236 always #10 EMPTY = $tkg$recv("%m.EMPTY"); 237 always #10 PRESS = $tkg$recv("%m.PRESS"); 238 always #10 INSQ = $tkg$recv("%m.INSQ"); 239 always #10 INSD = $tkg$recv("%m.INSD"); 240 always #10 INSN = $tkg$recv("%m.INSN"); 241 always #10 NUMQ = $tkg$recv("%m.NUMQ"); 242 always #10 NUMD = $tkg$recv("%m.NUMD"); 243 always #10 NUMN = $tkg$recv("%m.NUMN"); 244 always #10 BILLSNS = $tkg$recv("%m.BILLSNS"); 245 always #10 CNRET = $tkg$recv("%m.CNRET"); 246 always #10 BILLOK = $tkg$recv("%m.BILLOK"); 247 always #10 BILLNG = $tkg$recv("%m.BILLNG"); 248 always #10 BILLACK = $tkg$recv("%m.BILLACK"); 249 250endmodule 251//: /hdlEnd 252 253 254`timescale 1ns/1ns 255 256 257`timescale 1ns/1ns 258 259