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