@@ -4,6 +4,7 @@ module Test.Cores.I2C.Slave where
4
4
5
5
import Clash.Prelude
6
6
import Clash.Explicit.SimIO
7
+ import Control.Monad (when )
7
8
8
9
data ACConfTestS = ACCTS { i2cSlaveRegFile :: Vec 16 (Unsigned 8 )
9
10
, i2cSlaveAddr :: Vec 8 Bit
@@ -13,6 +14,7 @@ data ACConfTestS = ACCTS { i2cSlaveRegFile :: Vec 16 (Unsigned 8)
13
14
, i2cSlavePrevSDA :: Bit
14
15
, i2cSlaveSdaOut :: Bit
15
16
, i2cSlaveRegAddr :: Unsigned 8
17
+ , i2cSlaveDebug :: Bool
16
18
}
17
19
18
20
data AudioTestSM = ATidle | ATaddr | ATaddrAck | ATreg | ATregAck | ATval | ATvalAck | ATstop
@@ -30,13 +32,14 @@ i2cSlaveInit = ACCTS { i2cSlaveRegFile = replicate d16 0x0
30
32
, i2cSlavePrevSDA = high
31
33
, i2cSlaveSdaOut = high
32
34
, i2cSlaveRegAddr = 0
35
+ , i2cSlaveDebug = False
33
36
}
34
37
35
38
i2cSlaveT :: Reg ACConfTestS -> ACConfTestI -> SimIO ACConfTestO
36
39
i2cSlaveT s0 (scl,sda) = do
37
40
s <- readReg s0
38
41
39
- let ACCTS regFile addr cntr atStateM prevSCL prevSDA sdaOut regAddr = s
42
+ let ACCTS regFile addr cntr atStateM prevSCL prevSDA sdaOut regAddr debug = s
40
43
41
44
let startCondition = (prevSDA == high && sda == low) && scl == high
42
45
stopCondition = (prevSDA == low && sda == high) && scl == high
@@ -47,17 +50,17 @@ i2cSlaveT s0 (scl,sda) = do
47
50
48
51
stateMachine <- case atStateM of
49
52
ATidle
50
- | startCondition -> do display " start"
53
+ | startCondition -> do when debug $ display " start"
51
54
pure s {i2cSlaveAtStateM = ATaddr }
52
55
ATaddr
53
56
| cntr == 8 -> if validAddr then do
54
- display " valid addr"
57
+ when debug $ display " valid addr"
55
58
pure s { i2cSlaveAtStateM = ATaddrAck
56
59
, i2cSlaveAddr = repeat low
57
60
, i2cSlaveCntr = 0
58
61
}
59
62
else do
60
- display $ " invalid addr: " <> show addr
63
+ when debug $ display $ " invalid addr: " <> show addr
61
64
pure s { i2cSlaveAtStateM = ATidle
62
65
, i2cSlaveAddr = repeat low
63
66
, i2cSlaveCntr = 0
@@ -67,20 +70,20 @@ i2cSlaveT s0 (scl,sda) = do
67
70
, i2cSlaveSdaOut = high
68
71
}
69
72
ATaddrAck
70
- | sclRising -> do display " addrAck"
73
+ | sclRising -> do when debug $ display " addrAck"
71
74
pure s { i2cSlaveAtStateM = ATreg
72
75
, i2cSlaveSdaOut = low
73
76
}
74
77
ATreg
75
78
| cntr == 8 -> if validRegAddr then do
76
- display " valid reg addr"
79
+ when debug $ display " valid reg addr"
77
80
pure s { i2cSlaveAtStateM = ATregAck
78
81
, i2cSlaveAddr = repeat low
79
82
, i2cSlaveCntr = 0
80
83
, i2cSlaveRegAddr = shiftR (bitCoerce addr) 1
81
84
}
82
85
else do
83
- display $ " invalid reg addr: " <> show addr
86
+ when debug $ display $ " invalid reg addr: " <> show addr
84
87
pure s { i2cSlaveAtStateM = ATidle
85
88
, i2cSlaveAddr = repeat low
86
89
, i2cSlaveCntr = 0
@@ -90,12 +93,12 @@ i2cSlaveT s0 (scl,sda) = do
90
93
, i2cSlaveSdaOut = high
91
94
}
92
95
ATregAck
93
- | sclRising -> do display " regAck"
96
+ | sclRising -> do when debug $ display " regAck"
94
97
pure s { i2cSlaveAtStateM = ATval
95
98
, i2cSlaveSdaOut = low
96
99
}
97
100
ATval
98
- | cntr == 8 -> do display " val"
101
+ | cntr == 8 -> do when debug $ display " val"
99
102
pure s { i2cSlaveAtStateM = ATvalAck
100
103
, i2cSlaveAddr = repeat low
101
104
, i2cSlaveCntr = 0
@@ -107,12 +110,12 @@ i2cSlaveT s0 (scl,sda) = do
107
110
, i2cSlaveSdaOut = high
108
111
}
109
112
ATvalAck
110
- | sclRising -> do display " valAck"
113
+ | sclRising -> do when debug $ display " valAck"
111
114
pure s { i2cSlaveAtStateM = ATstop
112
115
, i2cSlaveSdaOut = low
113
116
}
114
117
ATstop
115
- | stopCondition -> do display " stop"
118
+ | stopCondition -> do when debug $ display " stop"
116
119
pure s { i2cSlaveAtStateM = ATidle
117
120
, i2cSlaveSdaOut = high
118
121
}
0 commit comments