MODULE xxx TITLE 'Logik für xxx mit 20MHz Wait-State-Generator' DECLARATIONS "Takte und IO-Zugriff-Steuer-Eingänge CLK_20 pin; " 20MHz vom Oszillator !IORD pin; " IO-Lesestrobe vom µP !IOWR pin; " IO-Schreibstrobe vom µP " sonstige Eingänge !RESET pin; " vom Watchdog IOD0 pin; " für BOOT-Bit !COL_WAIT pin; " Wait von Farbgrafikcontroller " CS-Signal-Ausgänge !CS_AD pin istype 'com'; " AD-Wandler (IO) "Ausgänge für Wait-State-Erzeugung WS0 pin istype 'reg, buffer';" Bit 0 WS1 pin istype 'reg, buffer';" Bit 1 WS2 pin istype 'reg, buffer';" Bit 2 WS3 pin istype 'reg, buffer';" Bit 3 WS4 pin istype 'reg, buffer';" Bit 4 WS_REQ pin istype 'com'; " Wait erforderlich wait_counter = [WS4, WS3, WS2, WS1, WS0]; "Wait-Signal-Aktivierung sreg1 state_register; S0..S1 state; " sonstige Ausgänge !WAIT pin istype 'com'; " Hardware-Wait-States an µP "KONSTANTEN für IO-PORT-Adressen GLCD_BASE = !A25 & !A24 & A23 & A22 & !A21 & !A12; " 0x00C00000 wird mit IOD0 für Wait-Init verwendet ADU_BASE = !A25 & A24 & A23 & !A22 & !A21 & !A12; " 0x01800000 EQUATIONS " Ports CS_AD = !RESET & ADU_BASE; "Wait-State-Erzeugung WS_REQ = !RESET & (IORD # IOWR); wait_counter.clk = CLK_20; wait_counter.aclr = !WS_REQ; wait_counter.aset = 0; when wait_counter.fb < 31 then wait_counter := wait_counter.fb + 1; else wait_counter := wait_counter.fb; sreg1.clk = CLK_20; state_diagram sreg1 state S0: test =0; G1 =1; WAIT = ((IORD # IOWR) & (wait_counter.fb < 14)); if(GLCD_BASE & IOD0) then S1 else S0; state S1: test = 1; G1 = 0; WAIT = ((IORD # IOWR) & (wait_counter.fb < 14))# (COL_WAIT); if (GLCD_BASE & !IOD0) then S0 else S1; async_reset S0:RESET; sync_reset S0: 0; END