diff options
| author | jackkoenig | 2016-10-26 16:40:36 -0700 |
|---|---|---|
| committer | Jack Koenig | 2017-02-02 22:53:03 -0800 |
| commit | dd51b917566e6b30c3f123ca22a0393e73c2afe8 (patch) | |
| tree | f81fce104ccc3405c7924c76618483750a4350bb /src/test/resources | |
| parent | b0a328492383108509c322189ed2803f671d7a59 (diff) | |
Revamp VendingMachine.scala as cookbook example
* Move to cookbook
* Change FSM implementation to use switch & is
* Add non-FSM implementation
* Add execution-driven test
Diffstat (limited to 'src/test/resources')
| -rw-r--r-- | src/test/resources/VerilogVendingMachine.v | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/test/resources/VerilogVendingMachine.v b/src/test/resources/VerilogVendingMachine.v new file mode 100644 index 00000000..c01259bd --- /dev/null +++ b/src/test/resources/VerilogVendingMachine.v @@ -0,0 +1,44 @@ +// See LICENSE for license details. + +// A simple Verilog FSM vending machine implementation +module VerilogVendingMachine( + input clock, + input reset, + input nickel, + input dime, + output dispense +); + parameter sIdle = 3'd0, s5 = 3'd1, s10 = 3'd2, s15 = 3'd3, sOk = 3'd4; + reg [2:0] state; + wire [2:0] next_state; + + assign dispense = (state == sOk) ? 1'd1 : 1'd0; + + always @(*) begin + case (state) + sIdle: if (nickel) next_state <= s5; + else if (dime) next_state <= s10; + else next_state <= state; + s5: if (nickel) next_state <= s10; + else if (dime) next_state <= s15; + else next_state <= state; + s10: if (nickel) next_state <= s15; + else if (dime) next_state <= sOk; + else next_state <= state; + s15: if (nickel) next_state <= sOk; + else if (dime) next_state <= sOk; + else next_state <= state; + sOk: next_state <= sIdle; + endcase + end + + // Go to next state + always @(posedge clock) begin + if (reset) begin + state <= sIdle; + end else begin + state <= next_state; + end + end +endmodule + |
