3
3
from migen .fhdl .std import *
4
4
from migen .bus import wishbone
5
5
from migen .genlib .record import *
6
- from migen .genlib .cdc import MultiReg
7
6
from migen .bank .description import *
8
7
from migen .flow .actor import *
9
- from migen .flow .network import *
10
8
from migen .actorlib .fifo import SyncFIFO
11
9
from migen .actorlib import structuring , spi
12
10
from migen .bank .eventmanager import *
13
11
14
12
from misoclib .mem .sdram .frontend import dma_lasmi
15
13
16
14
from gateware .csc .ycbcr422to444 import YCbCr422to444
17
- from gateware .csc .ymodulator import YModulator
18
-
19
-
20
- class EncoderReader (Module , AutoCSR ):
21
- def __init__ (self , lasmim ):
22
- self .source = source = Source (EndpointDescription ([("data" , 16 )], packetized = True ))
23
-
24
- reader = dma_lasmi .Reader (lasmim )
25
- self .dma = spi .DMAReadController (reader , mode = spi .MODE_SINGLE_SHOT )
26
-
27
- pack_factor = lasmim .dw // 16
28
- packed_dat = structuring .pack_layout (16 , pack_factor )
29
- cast = structuring .Cast (lasmim .dw , packed_dat )
30
- unpack = structuring .Unpack (pack_factor , [("data" , 16 )], reverse = True )
31
-
32
-
33
- # graph
34
- g = DataFlowGraph ()
35
- g .add_pipeline (self .dma , cast , unpack )
36
- self .submodules += CompositeActor (g )
37
- self .comb += Record .connect (unpack .source , source )
38
-
39
- self .sync += \
40
- If (self .dma ._busy .status == 0 ,
41
- source .sop .eq (1 ),
42
- ).Elif (source .stb & source .ack ,
43
- source .sop .eq (0 )
44
- )
45
-
46
- # irq
47
- self .submodules .ev = EventManager ()
48
- self .ev .done = EventSourceProcess ()
49
- self .ev .finalize ()
50
- self .comb += self .ev .done .trigger .eq (self .dma ._busy .status )
51
15
52
16
53
17
class EncoderBandwidth (Module , AutoCSR ):
@@ -78,46 +42,74 @@ def __init__(self, platform):
78
42
# # #
79
43
80
44
# chroma upsampler
81
- self .submodules .chroma_upsampler = chroma_upsampler = YCbCr422to444 ()
45
+ chroma_upsampler = RenameClockDomains (YCbCr422to444 (), "encoder" )
46
+ self .submodules += chroma_upsampler
82
47
self .comb += [
83
48
Record .connect (self .sink , chroma_upsampler .sink , leave_out = ["data" ]),
84
49
chroma_upsampler .sink .y .eq (self .sink .data [:8 ]),
85
50
chroma_upsampler .sink .cb_cr .eq (self .sink .data [8 :])
86
51
]
87
52
88
- # encoder fifo
89
- encoder_fifo_full = Signal ()
90
- self .comb += chroma_upsampler .source .ack .eq (~ encoder_fifo_full )
91
-
92
53
# output fifo
93
54
output_fifo_almost_full = Signal ()
94
- self .submodules .output_fifo = output_fifo = SyncFIFO ([("data" , 8 )], 1024 )
55
+ output_fifo = RenameClockDomains (SyncFIFO ([("data" , 8 )], 1024 ), "encoder" )
56
+ self .submodules += output_fifo
95
57
self .comb += [
96
58
output_fifo_almost_full .eq (output_fifo .fifo .level > 1024 - 128 ),
97
59
Record .connect (output_fifo .source , self .source )
98
60
]
99
61
62
+ # Wishbone cross domain crossing
63
+ jpeg_bus = wishbone .Interface ()
64
+ self .specials += Instance ("wb_async_reg" ,
65
+ i_wbm_clk = ClockSignal (),
66
+ i_wbm_rst = ResetSignal (),
67
+ i_wbm_adr_i = self .bus .adr ,
68
+ i_wbm_dat_i = self .bus .dat_w ,
69
+ o_wbm_dat_o = self .bus .dat_r ,
70
+ i_wbm_we_i = self .bus .we ,
71
+ i_wbm_sel_i = self .bus .sel ,
72
+ i_wbm_stb_i = self .bus .stb ,
73
+ o_wbm_ack_o = self .bus .ack ,
74
+ o_wbm_err_o = self .bus .err ,
75
+ #o_wbm_rty_o=,
76
+ i_wbm_cyc_i = self .bus .cyc ,
77
+
78
+ i_wbs_clk = ClockSignal ("encoder" ),
79
+ i_wbs_rst = ResetSignal ("encoder" ),
80
+ o_wbs_adr_o = jpeg_bus .adr ,
81
+ i_wbs_dat_i = jpeg_bus .dat_r ,
82
+ o_wbs_dat_o = jpeg_bus .dat_w ,
83
+ o_wbs_we_o = jpeg_bus .we ,
84
+ o_wbs_sel_o = jpeg_bus .sel ,
85
+ o_wbs_stb_o = jpeg_bus .stb ,
86
+ i_wbs_ack_i = jpeg_bus .ack ,
87
+ i_wbs_err_i = jpeg_bus .err ,
88
+ i_wbs_rty_i = 0 ,
89
+ o_wbs_cyc_o = jpeg_bus .cyc )
90
+
91
+
100
92
# encoder
101
93
self .specials += Instance ("JpegEnc" ,
102
- i_CLK = ClockSignal (),
103
- i_RST = ResetSignal (),
104
-
105
- i_OPB_ABus = Cat (Signal (2 ), self . bus .adr ) & 0x3ff ,
106
- i_OPB_BE = self . bus .sel ,
107
- i_OPB_DBus_in = self . bus .dat_w ,
108
- i_OPB_RNW = ~ self . bus .we ,
109
- i_OPB_select = self . bus . stb & self . bus .cyc ,
110
- o_OPB_DBus_out = self . bus .dat_r ,
111
- o_OPB_XferAck = self . bus .ack ,
94
+ i_CLK = ClockSignal ("encoder" ),
95
+ i_RST = ResetSignal ("encoder" ),
96
+
97
+ i_OPB_ABus = Cat (Signal (2 ), jpeg_bus .adr ) & 0x3ff ,
98
+ i_OPB_BE = jpeg_bus .sel ,
99
+ i_OPB_DBus_in = jpeg_bus .dat_w ,
100
+ i_OPB_RNW = ~ jpeg_bus .we ,
101
+ i_OPB_select = jpeg_bus . stb & jpeg_bus .cyc ,
102
+ o_OPB_DBus_out = jpeg_bus .dat_r ,
103
+ o_OPB_XferAck = jpeg_bus .ack ,
112
104
#o_OPB_retry=,
113
105
#o_OPB_toutSup=,
114
- o_OPB_errAck = self . bus .err ,
106
+ o_OPB_errAck = jpeg_bus .err ,
115
107
116
- i_iram_wdata = Cat ( chroma_upsampler .source .y ,
117
- chroma_upsampler .source .cb ,
118
- chroma_upsampler .source .cr ) ,
119
- i_iram_wren = chroma_upsampler .source .stb & ~ encoder_fifo_full ,
120
- o_iram_fifo_afull = encoder_fifo_full ,
108
+ i_fdct_ack = chroma_upsampler .source .ack ,
109
+ i_fdct_stb = chroma_upsampler .source .stb ,
110
+ i_fdct_data = Cat ( chroma_upsampler .source .y ,
111
+ chroma_upsampler .source .cb ,
112
+ chroma_upsampler . source . cr ) ,
121
113
122
114
o_ram_byte = output_fifo .sink .data ,
123
115
o_ram_wren = output_fifo .sink .stb ,
@@ -127,6 +119,9 @@ def __init__(self, platform):
127
119
# add vhdl sources
128
120
platform .add_source_dir (os .path .join (platform .soc_ext_path , "gateware" , "encoder" , "vhdl" ))
129
121
122
+ # add verilog sources
123
+ platform .add_source (os .path .join (platform .soc_ext_path , "gateware" , "encoder" , "verilog" , "wb_async_reg.v" ))
124
+
130
125
# bandwidth
131
- self .submodules .bandwidth = EncoderBandwidth ()
126
+ self .submodules .bandwidth = EncoderBandwidth () # XXX add CDC
132
127
self .comb += self .bandwidth .nbytes_inc .eq (self .source .stb & self .source .ack )
0 commit comments