module iodecode title 'Bullwinkle PC I/O Decoder GAL S. Harrington Fall 94' iodecode device 'P22V10'; "Inputs PCLK pin 1; SA0 pin 2; SA1 pin 3; SA2 pin 4; SA3 pin 5; PortWrite pin 6; "Outputs Sel3 pin 23; "module 3 Select Sel2 pin 22; "module 2 Select Sel1 pin 21; "module 1 Select Sel0 pin 20; "module 0 Select Source pin 19; "0=remote, 1=local PageA16 pin 18; "0=D0000, 1=E0000 StartConfig pin 17; "Active high reprogram signal to FPGAs StartWrite pin 16; "other stimuli for state machine changes StartRead pin 15; GlobalReset pin 14; "reset all CLBs and IOBs in FPGA "Port Interface Logic "Interface Specification summary: "OUT P+0000 jumps into config mode "OUT P+0010 jumps into either Acquire or HostWrite mode "OUT P+0011 jumps into HostRead mode "OUT P+010x sets Source to x (0=remote, 1=local) "OUT P+011x sets PageA16 to x (0=E0000, 1=D0000) "OUT P+10xy enables only module given by xy "OUT P+110x sets all select signals to x "OUT P+1111 pulses global reset line "Macros SetValue = PortWrite & !SA3 & SA2; SelectAllMod = PortWrite & SA3 & SA2; SelectMod = PortWrite & SA3 & !SA2; SA = [SA3,SA2,SA1,SA0]; Sel = [Sel3,Sel2,Sel1,Sel0]; Mod = [SA1&SA0,SA1&!SA0,!SA1&SA0,!SA1&!SA0]; X = .X.; Equations "!=NOT &=AND #=Or $=XOR !$=XNOR StartRead = PortWrite & !SA3 & !SA2 & SA1 & SA0; StartWrite = PortWrite & !SA3 & !SA2 & SA1 & !SA0; StartConfig = PortWrite & !SA3 & !SA2 & !SA1 & !SA0; GlobalReset = PortWrite & SA3 & SA2 & SA1 & SA0; Source := ((SetValue & !SA1) & SA0) # (!(SetValue & !SA1) & Source); Source.C = PCLK; PageA16 := ((SetValue & SA1) & SA0) # (!(SetValue & SA1) & PageA16); PageA16.C = PCLK; Sel := (SelectAllMod & SA0) # (SelectMod & Mod) # (!SelectAllMod & !SelectMod & Sel.FB); Sel.C = PCLK; test_vectors ( [PCLK,SA,PortWrite] -> [Sel,Source,PageA16,StartConfig,StartWrite,StartRead,GlobalReset] ) [ X , X , 0 ] -> [ X , X, X, 0, 0, 0, 0 ]; [.C., ^b0101, 1 ] -> [ X , 1, X, 0, 0, 0, 0 ]; [.C., ^b0111, 1 ] -> [ X , 1, 1, 0, 0, 0, 0 ]; [.C., ^b0100, 1 ] -> [ X , 0, 1, 0, 0, 0, 0 ]; [.C., ^b0110, 1 ] -> [ X , 0, 0, 0, 0, 0, 0 ]; [.C., ^b1000, 1 ] -> [ ^b0001, 0, 0, 0, 0, 0, 0 ]; [.C., ^b1001, 1 ] -> [ ^b0010, 0, 0, 0, 0, 0, 0 ]; [.C., ^b1010, 1 ] -> [ ^b0100, 0, 0, 0, 0, 0, 0 ]; [.C., ^b1011, 1 ] -> [ ^b1000, 0, 0, 0, 0, 0, 0 ]; [.C., ^b1101, 1 ] -> [ ^b1111, 0, 0, 0, 0, 0, 0 ]; [.C., ^b0000, 1 ] -> [ ^b1111, 0, 0, 1, 0, 0, 0 ]; [.C., ^b0010, 1 ] -> [ ^b1111, 0, 0, 0, 1, 0, 0 ]; [.C., ^b0011, 1 ] -> [ ^b1111, 0, 0, 0, 0, 1, 0 ]; [.C., ^b1111, 1 ] -> [ ^b1111, 0, 0, 0, 0, 0, 1 ]; [.C., X , 0 ] -> [ ^b1111, 0, 0, 0, 0, 0, 0 ]; end iodecode