1 from migen
.fhdl
.std
import *
2 from migen
.flow
.actor
import *
3 from migen
.flow
.network
import *
4 from migen
.actorlib
import structuring
, spi
5 from migen
.bank
.description
import *
6 from migen
.bank
.eventmanager
import *
7 from migen
.genlib
.record
import Record
9 from misoclib
.mem
.sdram
.frontend
import dma_lasmi
11 from misoclib
.com
.liteusb
.common
import *
13 class FtdiDMAWriter(Module
, AutoCSR
):
14 def __init__(self
, lasmim
):
15 self
.sink
= sink
= Sink(user_layout
)
18 pack_factor
= lasmim
.dw
//8
19 pack
= structuring
.Pack(phy_layout
, pack_factor
, reverse
=True)
20 cast
= structuring
.Cast(pack
.source
.payload
.layout
, lasmim
.dw
)
23 writer
= dma_lasmi
.Writer(lasmim
)
25 self
.dma
= InsertReset(spi
.DMAWriteController(writer
, mode
=spi
.MODE_SINGLE_SHOT
))
26 self
.comb
+= self
.dma
.reset
.eq(self
._reset
.r
& self
._reset
.re
)
28 # Remove sop/eop/length/dst fields from payload
30 pack
.sink
.stb
.eq(sink
.stb
),
31 pack
.sink
.payload
.eq(sink
.payload
),
32 sink
.ack
.eq(pack
.sink
.ack
)
37 g
.add_pipeline(pack
, cast
, self
.dma
)
38 self
.submodules
+= CompositeActor(g
)
41 self
.submodules
.ev
= EventManager()
42 self
.ev
.done
= EventSourcePulse()
44 self
.comb
+= self
.ev
.done
.trigger
.eq(sink
.stb
& sink
.eop
)
47 self
._crc
_failed
= CSRStatus()
49 If(sink
.stb
& sink
.eop
,
50 self
._crc
_failed
.status
.eq(sink
.error
)
53 class FtdiDMAReader(Module
, AutoCSR
):
54 def __init__(self
, lasmim
, tag
):
55 self
.source
= source
= Source(user_layout
)
57 reader
= dma_lasmi
.Reader(lasmim
)
58 self
.dma
= spi
.DMAReadController(reader
, mode
=spi
.MODE_SINGLE_SHOT
)
60 pack_factor
= lasmim
.dw
//8
61 packed_dat
= structuring
.pack_layout(8, pack_factor
)
62 cast
= structuring
.Cast(lasmim
.dw
, packed_dat
)
63 unpack
= structuring
.Unpack(pack_factor
, phy_layout
, reverse
=True)
68 If(self
.dma
.generator
._r
_shoot
.re
,
70 ).Elif(source
.stb
& source
.ack
,
74 g
.add_pipeline(self
.dma
, cast
, unpack
)
75 self
.submodules
+= CompositeActor(g
)
77 source
.stb
.eq(unpack
.source
.stb
),
78 source
.sop
.eq(cnt
== 0),
79 source
.eop
.eq(cnt
== (self
.dma
.length
*pack_factor
-1)),
80 source
.length
.eq(self
.dma
.length
*pack_factor
+4),
81 source
.d
.eq(unpack
.source
.d
),
83 unpack
.source
.ack
.eq(source
.ack
)
87 self
.submodules
.ev
= EventManager()
88 self
.ev
.done
= EventSourcePulse()
90 self
.comb
+= self
.ev
.done
.trigger
.eq(source
.stb
& source
.eop
)
92 class FtdiDMA(Module
, AutoCSR
):
93 def __init__(self
, lasmim_ftdi_dma_wr
, lasmim_ftdi_dma_rd
, tag
):
96 self
.submodules
.writer
= FtdiDMAWriter(lasmim_ftdi_dma_wr
)
97 self
.submodules
.reader
= FtdiDMAReader(lasmim_ftdi_dma_rd
, self
.tag
)
98 self
.submodules
.ev
= SharedIRQ(self
.writer
.ev
, self
.reader
.ev
)
100 self
.sink
= self
.writer
.sink
101 self
.source
= self
.reader
.source