@@ -4,6 +4,9 @@ module Test.Cores.I2C.Config where
4
4
5
5
import Clash.Prelude
6
6
import Clash.Explicit.SimIO
7
+ import Numeric (showHex )
8
+
9
+ import Clash.Cores.I2C.ByteMaster (I2COperation (.. ))
7
10
8
11
data ConfStateMachine = CONFena |
9
12
CONFaddr | CONFaddrAck |
@@ -12,24 +15,22 @@ data ConfStateMachine = CONFena |
12
15
CONFstop
13
16
deriving Show
14
17
15
- data ConfS = ConfS { i2cConfStateM :: ConfStateMachine
16
- , i2cClaim :: Bool
17
- , i2cWrite :: Bool
18
- , i2cDin :: Vec 8 Bit
19
- , i2cLutIndex :: Index 16
20
- , i2cFault :: Bool
18
+ data ConfS = ConfS { i2cConfStateM :: ConfStateMachine
19
+ , i2cConfClaim :: Bool
20
+ , i2cConfOp :: Maybe I2COperation
21
+ , i2cConfLutIndex :: Index 16
22
+ , i2cConfFault :: Bool
21
23
}
22
24
23
25
type ConfI = (Bool ,Bool ,Bool ,Bool ,Bool )
24
- type ConfO = (Bool ,Bool , BitVector 8 ,Bool ,Bool )
26
+ type ConfO = (Bool ,Maybe I2COperation ,Bool ,Bool )
25
27
26
28
confInit :: ConfS
27
- confInit = ConfS { i2cConfStateM = CONFena
28
- , i2cClaim = False
29
- , i2cWrite = False
30
- , i2cDin = repeat low
31
- , i2cLutIndex = 0
32
- , i2cFault = False
29
+ confInit = ConfS { i2cConfStateM = CONFena
30
+ , i2cConfClaim = False
31
+ , i2cConfOp = Nothing
32
+ , i2cConfLutIndex = 0
33
+ , i2cConfFault = False
33
34
}
34
35
35
36
configT
@@ -38,7 +39,7 @@ configT
38
39
-> SimIO ConfO
39
40
configT s0 (rst,ena,cmdAck,rxAck,al) = do
40
41
s <- readReg s0
41
- let ConfS confStateM claim write din lutIndex fault = s
42
+ let ConfS confStateM claim i2cOp lutIndex fault = s
42
43
43
44
let i2cSlvAddr = 0x34 :: BitVector 8
44
45
@@ -51,88 +52,84 @@ configT s0 (rst,ena,cmdAck,rxAck,al) = do
51
52
sNext <- if rst then pure confInit else case confStateM of
52
53
CONFena
53
54
| ena && not done
54
- -> pure s { i2cConfStateM = CONFaddr }
55
+ -> pure s { i2cConfStateM = CONFaddr
56
+ , i2cConfClaim = True
57
+ }
55
58
| done
56
59
-> do display " done"
57
60
pure s
58
61
59
62
CONFaddr
60
- -> pure s { i2cConfStateM = CONFaddrAck
61
- , i2cClaim = True
62
- , i2cWrite = True
63
- , i2cDin = unpack i2cSlvAddr
64
- }
63
+ -> do
64
+ display $ " CONFaddr, writing: " <> showHex i2cSlvAddr " "
65
+ pure s { i2cConfStateM = CONFaddrAck
66
+ , i2cConfOp = Just ( WriteData ( unpack i2cSlvAddr))
67
+ }
65
68
66
69
CONFaddrAck
67
70
| success
68
- -> do display " CONFaddrAck"
69
- pure s { i2cConfStateM = CONFreg
70
- , i2cWrite = False
71
+ -> if rxAck then do
72
+ display " CONFaddrAck"
73
+ pure s { i2cConfStateM = CONFreg
74
+ , i2cConfOp = Nothing
75
+ }
76
+ else do
77
+ display " Failure CONFaddr"
78
+ pure s { i2cConfStateM = CONFena
79
+ , i2cConfFault = True
71
80
}
72
81
73
82
CONFreg
74
- -> if not rxAck then do
83
+ -> do
84
+ display $
85
+ " CONFreg, writing: " <> showHex (fst lutData) " " <>
86
+ " , lutIndex: " <> show lutIndex
87
+ pure s { i2cConfStateM = CONFregAck
88
+ , i2cConfOp = Just (WriteData (unpack (fst lutData)))
89
+ }
90
+ CONFregAck
91
+ | success
92
+ -> if rxAck then do
75
93
display " Success CONFreg"
76
- pure s { i2cConfStateM = CONFregAck
77
- , i2cWrite = True
78
- , i2cDin = unpack (fst lutData)
79
- , i2cFault = False
94
+ pure s { i2cConfStateM = CONFdata
95
+ , i2cConfOp = Nothing
80
96
}
81
97
else do
82
98
display " Failure CONFreg"
83
- _ <- finish 1
84
99
pure s { i2cConfStateM = CONFena
85
- , i2cFault = True
100
+ , i2cConfFault = True
86
101
}
87
102
88
- CONFregAck
89
- | success
90
- -> do display " CONFregAck"
91
- pure s { i2cConfStateM = CONFdata
92
- , i2cWrite = False
93
- }
94
-
95
103
CONFdata
96
- -> if not rxAck then do
104
+ -> do display $ " CONFdata, writing: " <> showHex (snd lutData) " "
105
+ pure s { i2cConfStateM = CONFdataAck
106
+ , i2cConfOp = Just (WriteData (unpack (snd lutData)))
107
+ }
108
+ CONFdataAck
109
+ | success
110
+ -> if rxAck then do
97
111
display " Success CONFdata"
98
- pure s { i2cConfStateM = CONFdataAck
99
- , i2cWrite = True
100
- , i2cClaim = False
101
- , i2cDin = unpack (snd lutData)
102
- , i2cFault = False
112
+ pure s { i2cConfStateM = CONFstop
113
+ , i2cConfOp = Nothing
103
114
}
104
115
else do
105
116
display " Failure CONFdata"
106
- _ <- finish 1
107
117
pure s { i2cConfStateM = CONFena
108
- , i2cFault = True
118
+ , i2cConfFault = True
109
119
}
110
120
111
- CONFdataAck
112
- | success
113
- -> do display " CONFdataAck"
114
- pure s { i2cConfStateM = CONFstop
115
- , i2cWrite = False
116
- }
117
-
118
121
CONFstop
119
- -> if not rxAck then do
122
+ -> do
120
123
display " Success CONFstop"
121
- pure s { i2cConfStateM = CONFena
122
- , i2cLutIndex = lutIndex + 1
123
- , i2cFault = False
124
- }
125
- else do
126
- display " Failure CONFstop"
127
- _ <- finish 1
128
- pure s { i2cConfStateM = CONFena
129
- , i2cFault = True
124
+ pure s { i2cConfStateM = CONFena
125
+ , i2cConfClaim = False
126
+ , i2cConfLutIndex = lutIndex + 1
130
127
}
131
128
132
129
_ -> pure s
133
130
134
131
writeReg s0 sNext
135
- pure (claim,write,pack din ,done,fault)
132
+ pure (claim,i2cOp ,done,fault)
136
133
137
134
configLut :: Index 16 -> (BitVector 8 , BitVector 8 )
138
135
configLut i
0 commit comments