module bstate title 'Bullwinkle Bus Interface Decoder GAL S. Harrington Fall 94' bstate device 'P22V10'; "Inputs BCLK pin 1; SACK pin 2; "Stall Acknowledge from Rocky Source pin 3; StartConfig pin 4; StartWrite pin 5; StartRead pin 6; Sel3 pin 8; Sel2 pin 9; Sel1 pin 10; Sel0 pin 11; Full pin 13; "wired-OR of F signals from FPGAs active low "Outputs BBX_DIR pin 23; "Bullwinkle Bus Transceiver LBX3_EN pin 22; "Local Bus Transceiver 3 active low enable LBX2_EN pin 21; "Local Bus Transceiver 2 LBX1_EN pin 20; "Local Bus Transceiver 1 LBX0_EN pin 19; "Local Bus Transceiver 0 DAR_EN pin 18; "Data Acquisition Register active high enable Q1 pin 17 istype 'reg,buffer'; "State variables Q0 pin 16 istype 'reg,buffer'; Extract pin 15; "Active low control pin to FPGAs Program pin 14; "active-high reprogram signal to FPGAs "State Assignments StateReg = [Q1,Q0]; ConfigS = [0,0]; AcquireS = [0,1]; HostWriteS = [1,0]; HostReadS = [1,1]; Acquire = !Q1.FB & Q0.FB; Config = !Q1.FB & !Q0.FB; HostWrite = Q1.FB & !Q0.FB; HostRead = Q1.FB & Q0.FB; Sel = [Sel3,Sel2,Sel1,Sel0]; LBX_EN = [LBX3_EN,LBX2_EN,LBX1_EN,LBX0_EN]; Ck = .C.; X = .X.; Equations "!=NOT &=AND #=Or $=XOR !$=XNOR [Q1,Q0].C = BCLK; "Both of these signals are inverted by a 74LS14 "to improve fanout to the 4 FPGAs. Extract = !HostRead; Program = Config; "Data Acquisition Registers (four in lock-step) DAR_EN = Acquire; "Bullwinkle Bus Transceiver "DIR 0=fromHost,1=toHost BBX_DIR = HostRead; "write values to PC bus only in HostRead mode "Local Bus Transceivers (one per buffer module) "DIR 0=toHost,1=fromHost "LBX_DIR = Q0 "LBX_DIR = Acquire # HostRead; LBX_EN = !(Config # HostWrite # (HostRead & Sel)); state_diagram StateReg "Note that Full is active low state ConfigS: if (StartConfig) then ConfigS else if (StartWrite & !Source) then AcquireS else if (StartWrite & Source) then HostWriteS else ConfigS; state AcquireS: if (StartConfig) then ConfigS else if (StartRead # SACK # !Full) then HostReadS else if (StartWrite & Source) then HostWriteS else AcquireS; state HostWriteS: if (StartConfig) then ConfigS else if (StartRead # !Full) then HostReadS else if (StartWrite & !Source) then AcquireS else HostWriteS; state HostReadS: if (StartConfig) then ConfigS else if (StartWrite & !Source) then AcquireS else if (StartWrite & Source) then HostWriteS else HostReadS; test_vectors ( [BCLK,Full,SACK,Source,StartConfig,StartWrite,StartRead,Sel] -> [Q1,Q0,DAR_EN,BBX_DIR,LBX_EN,Extract,Program] ) "Enter configuration state (0,0) [Ck,X,X,X,1,X,X, X ] -> [0,0,0,0,^b0000,1,1]; [Ck,X,X,X,0,0,0, X ] -> [0,0,0,0,^b0000,1,1]; [Ck,1,0,0,0,0,0, X ] -> [0,0,0,0,^b0000,1,1]; "StartWrite (port write) signifies config done, go to Acquire state (0,1) [Ck,1,0,0,0,1,0, X ] -> [0,1,1,0,^b1111,1,0]; [Ck,1,0,0,0,0,0, X ] -> [0,1,1,0,^b1111,1,0]; "SACK signal puts us in HostRead state (1,1) [Ck,1,1,0,0,0,0,^b0001] -> [1,1,0,1,^b1110,0,0]; [Ck,1,0,0,0,0,0,^b0010] -> [1,1,0,1,^b1101,0,0]; [Ck,1,0,0,0,0,0,^b0100] -> [1,1,0,1,^b1011,0,0]; [Ck,1,0,0,0,0,0,^b1000] -> [1,1,0,1,^b0111,0,0]; "Issue StartWrite command through io port, from host this time [Ck,1,0,1,0,1,0, X ] -> [1,0,0,0,^b0000,1,0]; "Full signal puts us back in HostRead state [Ck,0,0,1,0,0,0,^b1000] -> [1,1,0,1,^b0111,0,0]; end bstate