Craig Evans
/
ELEC2645_FSM_Counter_2021
Counter using FSM
main.cpp@0:8fabd65058e2, 2020-12-10 (annotated)
- Committer:
- eencae
- Date:
- Thu Dec 10 13:29:01 2020 +0000
- Revision:
- 0:8fabd65058e2
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:8fabd65058e2 | 1 | /* |
eencae | 0:8fabd65058e2 | 2 | |
eencae | 0:8fabd65058e2 | 3 | 2645_FSM_Counter |
eencae | 0:8fabd65058e2 | 4 | |
eencae | 0:8fabd65058e2 | 5 | Sample code from ELEC2645 |
eencae | 0:8fabd65058e2 | 6 | |
eencae | 0:8fabd65058e2 | 7 | Demonstrates how to implement a simple FSM counter |
eencae | 0:8fabd65058e2 | 8 | |
eencae | 0:8fabd65058e2 | 9 | (c) Craig A. Evans, University of Leeds, Dec 2020 |
eencae | 0:8fabd65058e2 | 10 | |
eencae | 0:8fabd65058e2 | 11 | */ |
eencae | 0:8fabd65058e2 | 12 | #include "mbed.h" |
eencae | 0:8fabd65058e2 | 13 | #include "platform/mbed_thread.h" // for putting the thread to sleep |
eencae | 0:8fabd65058e2 | 14 | |
eencae | 0:8fabd65058e2 | 15 | // create a bus for writing to the output (LEDs) at once |
eencae | 0:8fabd65058e2 | 16 | BusOut output(LED4,LED3,LED2,LED1); |
eencae | 0:8fabd65058e2 | 17 | |
eencae | 0:8fabd65058e2 | 18 | // array of states in the FSM, each element is the output of the counter |
eencae | 0:8fabd65058e2 | 19 | // set the output in binary to make it easier, 0 is LED on, 1 is LED off |
eencae | 0:8fabd65058e2 | 20 | int g_fsm[4] = {0b0001,0b0010,0b0100,0b1000}; |
eencae | 0:8fabd65058e2 | 21 | |
eencae | 0:8fabd65058e2 | 22 | int main() |
eencae | 0:8fabd65058e2 | 23 | { |
eencae | 0:8fabd65058e2 | 24 | int state = 0; |
eencae | 0:8fabd65058e2 | 25 | |
eencae | 0:8fabd65058e2 | 26 | while(1) { // loop forever |
eencae | 0:8fabd65058e2 | 27 | |
eencae | 0:8fabd65058e2 | 28 | output = g_fsm[state]; // output current state |
eencae | 0:8fabd65058e2 | 29 | |
eencae | 0:8fabd65058e2 | 30 | // check which state we are in and see which the next state should be |
eencae | 0:8fabd65058e2 | 31 | switch(state) { |
eencae | 0:8fabd65058e2 | 32 | case 0: |
eencae | 0:8fabd65058e2 | 33 | state = 1; |
eencae | 0:8fabd65058e2 | 34 | break; |
eencae | 0:8fabd65058e2 | 35 | case 1: |
eencae | 0:8fabd65058e2 | 36 | state = 2; |
eencae | 0:8fabd65058e2 | 37 | break; |
eencae | 0:8fabd65058e2 | 38 | case 2: |
eencae | 0:8fabd65058e2 | 39 | state = 3; |
eencae | 0:8fabd65058e2 | 40 | break; |
eencae | 0:8fabd65058e2 | 41 | case 3: |
eencae | 0:8fabd65058e2 | 42 | state = 0; |
eencae | 0:8fabd65058e2 | 43 | break; |
eencae | 0:8fabd65058e2 | 44 | default: |
eencae | 0:8fabd65058e2 | 45 | error("Invalid state"); |
eencae | 0:8fabd65058e2 | 46 | state = 0; //invalid state - call error routine |
eencae | 0:8fabd65058e2 | 47 | // and jump to starting state i.e. state = 0 |
eencae | 0:8fabd65058e2 | 48 | break; |
eencae | 0:8fabd65058e2 | 49 | } |
eencae | 0:8fabd65058e2 | 50 | |
eencae | 0:8fabd65058e2 | 51 | thread_sleep_for(500); // 500 ms delay |
eencae | 0:8fabd65058e2 | 52 | } |
eencae | 0:8fabd65058e2 | 53 | } |