-- Elec 422 Project MAIN CONTROLLER PLA INPUTS: RESTART COUNT8 COUNT9; OUTPUTS: STOREXD STOREW ROTATEX ROTATEW MDS MWE MMULT LOADMULT CLRCNT8 CLRCNT9 CNT8A CNT8B SUBTRACT LACCUM LERROR CLRALL CLRACCUM; -- reset logic reset on RESTART to init(CLRALL CLRACCUM); init: -- initial state --> clear all latches goto LoadXD(STOREXD LOADMULT CLRCNT8 CLRCNT9); LoadXD: -- Load X & D inputs goto RotateXW(ROTATEX ROTATEW CNT8A); RotateXW: -- Rotate X & W stacks goto StartCNT8b(CNT8B); StartCNT8b: -- signal 8 counter w/ second control signal goto WaitMultXWDone; WaitMultXWDone: -- wait for the multiply of X & W to finish case (COUNT9 COUNT8) 10 => StartNextMultXW(LOADMULT LACCUM CLRCNT9); 11 => StartNextMultXW(LACCUM); endcase => WaitMultXWDone; StartNextMultXW: if COUNT8 then CalculateE(MMULT SUBTRACT) else RotateXW(ROTATEX ROTATEW CNT8A); CalculateE: goto GetE(MMULT SUBTRACT LERROR); GetE: goto WaitBeforeMult(MMULT); -- CLKB2 happens only on EVEN cycles WaitBeforeMult: goto StartMultXE(MWE MMULT LOADMULT CLRCNT8 CLRCNT9 CLRACCUM); StartMultXE: -- CLKB2 happens only on EVEN cycles if COUNT8 then RotateXFinal(MDS ROTATEX CLRCNT9) else GetWAdd1(MDS MMULT); GetWAdd1: -- first cycle of getting the weight goto GetWAdd2(MDS MMULT ROTATEX ROTATEW LACCUM CNT8A); GetWAdd2: -- second cycle of getting the weight (make sure adder output stable) goto StartCNT8b2(MDS CNT8B); StartCNT8b2: -- increment the count of # multiplies completed goto WaitMultXEDone(MDS); WaitMultXEDone: --wait for multiply operation to finish case (COUNT9 COUNT8) 10 => StartMultXE(MDS MWE STOREW LOADMULT CLRACCUM CLRCNT9); 11 => StartMultXE(MDS STOREW CLRACCUM); endcase => WaitMultXEDone(MDS); RotateXFinal: -- Rotate X one final time to prepare for next iteration goto WaitBeforeMult2; WaitBeforeMult2: -- wait for Rotate X completion before starting next multiply if COUNT9 then LoadXD(STOREXD LOADMULT CLRCNT8 CLRCNT9) else WaitBeforeMult2;