| Copyright | (C) 2013-2016 University of Twente 2017 Google Inc. |
|---|---|
| License | BSD2 (see the file LICENSE) |
| Maintainer | Christiaan Baaij <christiaan.baaij@gmail.com> |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Clash.Explicit.Mealy
Description
Whereas the output of a Moore machine depends on the previous state, the output of a Mealy machine depends on current transition.
Mealy machines are strictly more expressive, but may impose stricter timing requirements.
Mealy machines with explicit clock and reset ports
Arguments
| :: Clock dom gated |
|
| -> Reset dom synchronous | |
| -> (s -> i -> (s, o)) | Transfer function in mealy machine form:
|
| -> s | Initial state |
| -> Signal dom i -> Signal dom o | Synchronous sequential function with input and output matching that of the mealy machine |
Create a synchronous function from a combinational function describing a mealy machine
import qualified Data.List as L
macT
:: Int -- Current state
-> (Int,Int) -- Input
-> (Int,Int) -- (Updated state, output)
macT s (x,y) = (s',s)
where
s' = x * y + s
mac
:: Clock domain Source
-> Reset domain Asynchronous
-> Signal domain (Int, Int)
-> Signal domain Int
mac clk rst = mealy clk rst macT 0
>>>simulate (mac systemClockGen systemResetGen) [(1,1),(2,2),(3,3),(4,4)][0,1,5,14... ...
Synchronous sequential functions can be composed just like their combinational counterpart:
dualMac ::Clockdomain gated ->Resetdomain synchronous -> (Signaldomain Int,Signaldomain Int) -> (Signaldomain Int,Signaldomain Int) ->Signaldomain Int dualMac clk rst (a,b) (x,y) = s1 + s2 where s1 =mealyclk rst mac 0 (bundle(a,x)) s2 =mealyclk rst mac 0 (bundle(b,y))
Arguments
| :: (Bundle i, Bundle o) | |
| => Clock dom gated | |
| -> Reset dom synchronous | |
| -> (s -> i -> (s, o)) | Transfer function in mealy machine form:
|
| -> s | Initial state |
| -> Unbundled dom i -> Unbundled dom o | Synchronous sequential function with input and output matching that of the mealy machine |
A version of mealy that does automatic Bundleing
Given a function f of type:
f :: Int -> (Bool,Int) -> (Int,(Int,Bool))
When we want to make compositions of f in g using mealy', we have to
write:
g clk rst a b c = (b1,b2,i2)
where
(i1,b1) = unbundle (mealy clk rst f 0 (bundle (a,b)))
(i2,b2) = unbundle (mealy clk rst f 3 (bundle (i1,c)))
Using mealyB' however we can write:
g clk rst a b c = (b1,b2,i2)
where
(i1,b1) = mealyB clk rst f 0 (a,b)
(i2,b2) = mealyB clk rst f 3 (i1,c)