@@ -36,16 +36,16 @@ def __init__(self, widths, parallelism=1, a_delay=0):
36
36
37
37
self .comb += [
38
38
xy_delay .i .eq (Cat (self .i .x , self .i .y )),
39
- z_delay .i .eq (Cat ([ zi [- widths .p :]
40
- for zi in accu .o .payload .flatten ()] )),
39
+ z_delay .i .eq (Cat (zi [- widths .p :]
40
+ for zi in accu .o .payload .flatten ())),
41
41
eqh (accu .i .p , self .i .p ),
42
42
accu .i .f .eq (self .i .f ),
43
43
accu .i .clr .eq (self .i .clr ),
44
44
accu .i .stb .eq (self .i .stb ),
45
45
self .i .ack .eq (accu .i .ack ),
46
46
accu .o .ack .eq (1 ),
47
47
[Cat (c .xi , c .yi ).eq (xy_delay .o ) for c in cordic ],
48
- Cat ([ c .zi for c in cordic ] ).eq (z_delay .o ),
48
+ Cat (c .zi for c in cordic ).eq (z_delay .o ),
49
49
]
50
50
51
51
@@ -71,8 +71,15 @@ def __init__(self, widths, orders, **kwargs):
71
71
f .o .ack .eq (self .ce ),
72
72
eqh (self .i .f , f .o .a0 ),
73
73
eqh (self .i .p , p .o .a0 ),
74
- self .i .clr .eq (self .clr ),
75
- self .i .stb .eq (p .o .stb & f .o .stb ),
74
+ self .i .stb .eq (p .o .stb | f .o .stb ),
75
+ ]
76
+
77
+ assert p .latency == 1
78
+ self .sync += [
79
+ self .i .clr .eq (0 ),
80
+ If (p .i .stb ,
81
+ self .i .clr .eq (self .clr ),
82
+ ),
76
83
]
77
84
78
85
@@ -94,20 +101,24 @@ def __init__(self, widths, orders, **kwargs):
94
101
95
102
96
103
class Config (Module ):
97
- def __init__ (self ):
98
- self .clr = Signal (4 )
99
- self .iq_en = Signal (2 )
100
- limit = [Signal ((16 , True )) for i in range (2 * 2 )]
101
- self .limit = [limit [i :i + 2 ] for i in range (0 , len (limit ), 2 )]
102
- self .i = Endpoint ([("addr" , bits_for (len (limit ) + 2 )), ("data" , 16 )])
104
+ def __init__ (self , width ):
105
+ self .clr = Signal (4 , reset = 0b1111 )
106
+ self .iq_en = Signal (2 , reset = 0b01 )
107
+ self .limit = [[Signal ((width , True ), reset = - (1 << width - 1 )),
108
+ Signal ((width , True ), reset = (1 << width - 1 ) - 1 )]
109
+ for i in range (2 )]
110
+ self .i = Endpoint ([("addr" , bits_for (4 + 2 * len (self .limit ))),
111
+ ("data" , 16 )])
103
112
self .ce = Signal ()
104
113
105
114
###
106
115
107
- div = Signal (16 )
116
+ div = Signal (16 , reset = 0 )
108
117
n = Signal .like (div )
118
+ pad = Signal ()
109
119
110
- reg = Array ([Cat (self .clr , self .iq_en ), Cat (div , n )] + self .limit )
120
+ reg = Array ([Cat (div , n ), self .clr , self .iq_en , pad ] +
121
+ sum (self .limit , []))
111
122
112
123
self .comb += [
113
124
self .i .ack .eq (1 ),
@@ -130,22 +141,22 @@ def __init__(self, width=16, parallelism=4, widths=None, orders=None):
130
141
orders = _Orders (a = 4 , f = 2 , p = 1 )
131
142
if widths is None :
132
143
widths = _Widths (t = width , a = orders .a * width , p = orders .p * width ,
133
- f = 3 * width + (orders .f - 1 )* width )
144
+ f = (orders .f + 2 )* width )
134
145
135
- cfg = Config ( )
136
- a1 = SplineParallelDDS (widths , orders )
137
- a2 = SplineParallelDDS ( widths , orders )
138
- b = SplineParallelDUC ( widths , orders , parallelism = parallelism ,
139
- a_delay = - a1 . latency )
146
+ self . submodules . a1 = a1 = SplineParallelDDS ( widths , orders )
147
+ self . submodules . a2 = a2 = SplineParallelDDS (widths , orders )
148
+ self . submodules . b = b = SplineParallelDUC (
149
+ widths , orders , parallelism = parallelism , a_delay = - a1 . latency )
150
+ cfg = Config ( widths . a )
140
151
u = Spline (width = widths .a , order = orders .a )
141
152
du = Delay (widths .a , a1 .latency + b .latency - u .latency )
142
- self .submodules += cfg , a1 , a2 , b , u , du
143
- self .cfg = cfg .i
153
+ self .submodules += cfg , u , du
144
154
self .u = u .tri (widths .t )
145
- self .i = [self .cfg , self .u , a1 .a , a1 .f , a1 .p , a2 .a , a2 .f , a2 .p , b .f , b .p ]
146
- self .y_in = [Signal ((width , True )) for i in range (b .parallelism )]
147
- self .y_out = b .yo
148
- self .o = [Signal ((width , True )) for i in range (b .parallelism )]
155
+ self .i = [cfg .i , self .u , a1 .a , a1 .f , a1 .p , a2 .a , a2 .f , a2 .p , b .f , b .p ]
156
+ self .i_names = "cfg u a1 f1 p1 a2 f2 p2 f0 p0" .split ()
157
+ self .i_named = dict (zip (self .i_names , self .i ))
158
+ self .y_in = [Signal ((width , True )) for i in range (parallelism )]
159
+ self .o = [Signal ((width , True )) for i in range (parallelism )]
149
160
self .widths = widths
150
161
self .orders = orders
151
162
self .parallelism = parallelism
@@ -167,10 +178,11 @@ def __init__(self, width=16, parallelism=4, widths=None, orders=None):
167
178
# wire up outputs and q_{i,o} exchange
168
179
for o , x , y in zip (self .o , b .xo , self .y_in ):
169
180
self .sync += [
170
- o .eq (self .sat_add ([du .o ,
181
+ o .eq (self .sat_add ([
182
+ du .o ,
171
183
Mux (cfg .iq_en [0 ], x , 0 ),
172
184
Mux (cfg .iq_en [1 ], y , 0 )])),
173
185
]
174
186
175
- def connect_q_from (self , buddy ):
176
- self .comb += Cat (self .y_in ).eq (Cat (buddy . y_out ))
187
+ def connect_y (self , buddy ):
188
+ self .comb += Cat (buddy .y_in ).eq (Cat (self . b . yo ))
0 commit comments