forked from M-Labs/artiq-zynq
dma: fix endianness issues
This commit is contained in:
parent
a9f725dd33
commit
ae7ca22db9
@ -6,14 +6,7 @@ from migen_axi.interconnect import axi
|
|||||||
|
|
||||||
from artiq.gateware.rtio.analyzer import message_len, MessageEncoder
|
from artiq.gateware.rtio.analyzer import message_len, MessageEncoder
|
||||||
|
|
||||||
|
import endianness
|
||||||
def convert_endianness(signal):
|
|
||||||
assert len(signal) % 8 == 0
|
|
||||||
nbytes = len(signal)//8
|
|
||||||
signal_bytes = []
|
|
||||||
for i in range(nbytes):
|
|
||||||
signal_bytes.append(signal[8*i:8*(i+1)])
|
|
||||||
return Cat(*reversed(signal_bytes))
|
|
||||||
|
|
||||||
|
|
||||||
class AXIDMAWriter(Module, AutoCSR):
|
class AXIDMAWriter(Module, AutoCSR):
|
||||||
@ -64,7 +57,7 @@ class AXIDMAWriter(Module, AutoCSR):
|
|||||||
membus.w.id.eq(0),
|
membus.w.id.eq(0),
|
||||||
membus.w.valid.eq(self.sink.stb),
|
membus.w.valid.eq(self.sink.stb),
|
||||||
self.sink.ack.eq(membus.w.ready),
|
self.sink.ack.eq(membus.w.ready),
|
||||||
membus.w.data.eq(convert_endianness(self.sink.data)),
|
membus.w.data.eq(endianness.convert_signal(self.sink.data)),
|
||||||
membus.w.strb.eq(2**(dw//8)-1),
|
membus.w.strb.eq(2**(dw//8)-1),
|
||||||
]
|
]
|
||||||
beat_count = Signal(max=burst_length)
|
beat_count = Signal(max=burst_length)
|
||||||
|
@ -6,6 +6,8 @@ from migen_axi.interconnect import axi
|
|||||||
|
|
||||||
from artiq.gateware.rtio.dma import RawSlicer, RecordConverter, RecordSlicer, TimeOffset, CRIMaster
|
from artiq.gateware.rtio.dma import RawSlicer, RecordConverter, RecordSlicer, TimeOffset, CRIMaster
|
||||||
|
|
||||||
|
import endianness
|
||||||
|
|
||||||
|
|
||||||
AXI_BURST_LEN = 16
|
AXI_BURST_LEN = 16
|
||||||
|
|
||||||
@ -50,7 +52,7 @@ class AXIReader(Module):
|
|||||||
self.comb += [
|
self.comb += [
|
||||||
self.source.stb.eq(membus.r.valid),
|
self.source.stb.eq(membus.r.valid),
|
||||||
membus.r.ready.eq(self.source.ack),
|
membus.r.ready.eq(self.source.ack),
|
||||||
self.source.data.eq(membus.r.data),
|
self.source.data.eq(endianness.convert_signal(membus.r.data)),
|
||||||
# Note that when eop_pending=1, no new transactions are made and inflight_cnt is no longer incremented
|
# Note that when eop_pending=1, no new transactions are made and inflight_cnt is no longer incremented
|
||||||
self.source.eop.eq(eop_pending & membus.r.last & (inflight_cnt == 1))
|
self.source.eop.eq(eop_pending & membus.r.last & (inflight_cnt == 1))
|
||||||
]
|
]
|
||||||
|
21
src/gateware/endianness.py
Normal file
21
src/gateware/endianness.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
from migen import *
|
||||||
|
|
||||||
|
|
||||||
|
def convert_signal(signal):
|
||||||
|
assert len(signal) % 8 == 0
|
||||||
|
nbytes = len(signal)//8
|
||||||
|
signal_bytes = []
|
||||||
|
for i in range(nbytes):
|
||||||
|
signal_bytes.append(signal[8*i:8*(i+1)])
|
||||||
|
return Cat(*reversed(signal_bytes))
|
||||||
|
|
||||||
|
|
||||||
|
def convert_value(value, size):
|
||||||
|
assert size % 8 == 0
|
||||||
|
nbytes = size//8
|
||||||
|
result = 0
|
||||||
|
for i in range(nbytes):
|
||||||
|
result <<= 8
|
||||||
|
result |= value & 0xff
|
||||||
|
value >>= 8
|
||||||
|
return result
|
@ -10,6 +10,7 @@ from artiq.gateware import rtio
|
|||||||
from artiq.gateware.rtio import cri
|
from artiq.gateware.rtio import cri
|
||||||
from artiq.gateware.rtio.phy import ttl_simple
|
from artiq.gateware.rtio.phy import ttl_simple
|
||||||
|
|
||||||
|
import endianness
|
||||||
import dma
|
import dma
|
||||||
|
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ class AXIMemorySim:
|
|||||||
data = self.data[addr]
|
data = self.data[addr]
|
||||||
else:
|
else:
|
||||||
data = 0
|
data = 0
|
||||||
|
data = endianness.convert_value(data, len(self.bus.r.data))
|
||||||
yield from self.bus.write_r(request.id, data, last=i == request_len-1)
|
yield from self.bus.write_r(request.id, data, last=i == request_len-1)
|
||||||
else:
|
else:
|
||||||
yield
|
yield
|
||||||
|
Loading…
Reference in New Issue
Block a user