OpenCores
URL https://opencores.org/ocsvn/dmt_tx/dmt_tx/trunk

Subversion Repositories dmt_tx

[/] [dmt_tx/] [trunk/] [myhdl/] [rtl/] [bit_order.py] - Blame information for rev 30

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 dannori
 
2
 
3
from myhdl import *
4
 
5
 
6
def bit_order(clk, reset,
7
              fast_data_avail_i, fast_rden_o, fast_data_i,
8
              inter_data_avail_i, inter_rden_o, inter_data_i,
9
              ready_o, enable_i, fast_bits_i, inter_bits_i,
10
              data_out_valid_o, data_out_o,
11
              DWIDTH=15):
12
  '''Bit order block
13
 
14
  I/O pins:
15
  =========
16
  clk                 : clock input
17
  reset               : reset input
18
 
19
  fast_data_avail_i   : signal that there are fast data available
20
  fast_rden_o         : read pulse for the fast data input
21
  fast_data_i         : fast data input. Data come from the FIFO and are 8
22
                        bit wide
23
 
24
  inter_data_avail_i  : signal that there are interleaved data available
25
  inter_rden_o        : read pulse for the interleaved data input
26
  inter_data_i        : interleaved data input. Data come from the FIFO
27
                        and are 8 bit wide
28
 
29
  ready_o             : signal that with enable_i a new processing cycle
30
                        can start
31
  enable_i            : pulse to enable the processing for the set input
32
                        data
33
  fast_bits_i         : number of bits to be extracted from the fast data
34
                        path
35
  inter_bits_i        : number of bits to be extracted from the
36
                        interleaved data path
37
 
38
  data_out_valid_o    : signal that after an enable_i pulse the data_out_o
39
                        value is valid
40
  data_out_o          : DWIDTH bit wide output data
41
 
42
 
43
  parameters:
44
  ===========
45
 
46
  DWIDTH              : output data width. Resembles the maximum number
47
                        of bits to be loaded per carrier
48
  '''
49
 
50
  #
51
  # signal setup
52
 
53
  t_state = enum('IDLE', 'FP_LOAD', 'IP_LOAD', 'FIP_SHIFT', 'DOUT')
54
 
55
  state = Signal(t_state.IDLE)
56
 
57
  SWIDTH = (DWIDTH-1-8) + 2*8       # shift register width
58
 
59
  fp_shift_reg, ip_shift_reg \
60
      = [Signal(intbv(0)[SWIDTH:]) for i in range(2)]
61
 
62
  fp_process, ip_process, fp_needs_load, ip_needs_load \
63
      = [Signal(bool(0)) for i in range(4)]
64
 
65
  fp_shift_load, ip_shift_load \
66
      = [Signal(int(0)) for i in range(2)]
67
 
68
 
69
  #
70
  # logic
71
 
72
  @always_comb
73
  def comb_logic_ready():
74
    if state == t_state.IDLE or data_out_valid_o:
75
      ready_o.next = 1
76
    else:
77
      ready_o.next = 0
78
 
79
  @always_comb
80
  def comb_logic():
81
    fp_needs_load.next = fast_bits_i > fp_shift_load
82
    ip_needs_load.next = inter_bits_i > ip_shift_load
83
 
84
    fp_process.next = fast_bits_i > 0
85
    ip_process.next = inter_bits_i > 0
86
 
87
 
88
  @always(clk.posedge, reset.posedge)
89
  def fsm():
90
 
91
    if reset:
92
      state.next = t_state.IDLE
93
    else:
94
 
95
      if state == t_state.IDLE:
96
 
97
        if enable_i and fp_process and fp_needs_load:
98
          state.next = t_state.FP_LOAD
99
        elif enable_i and not fp_process and ip_process and ip_needs_load:
100
          state.next = t_state.IP_LOAD
101
        elif enable_i and not fp_process and ip_process and not ip_needs_load:
102
          state.next = t_state.FIP_SHIFT
103
 
104
      elif state == t_state.FP_LOAD:
105
 
106
        if not fp_needs_load and ip_process and ip_needs_load:
107
          state.next = t_state.IP_LOAD
108
        elif not fp_needs_load and not ip_process:
109
          state.next = t_state.FIP_SHIFT
110
 
111
      elif state == t_state.IP_LOAD:
112
 
113
        if not ip_needs_load:
114
          state.next = t_state.IP_SHIFT
115
 
116
      elif state == t_state.FIP_SHIFT:
117
 
118
        state.next = t_state.DOUT
119
 
120
      elif state == t_state.DOUT:
121
 
122
        if data_out_valid_o and not enable_i:
123
          state.next = t_state.IDLE
124
        elif data_out_valid_o and enable_i \
125
            and fp_process and fp_needs_load:
126
          state.next = t_state.FP_LOAD
127
        elif data_out_valid_o and enable_i \
128
            and not fp_process and ip_process and ip_needs_load:
129
          state.next = t_state.IP_LOAD
130
        elif data_out_valid_o and enable_i \
131
            and fp_process or ip_process:
132
          state.next = t_state.FIP_SHIFT
133
 
134
 
135
 
136
  #
137
  # fast path load processing
138
  @always(clk.posedge, reset.negedge)
139
  def fp_load():
140
 
141
    if reset:
142
      fast_rden_o.next = 0
143
      fp_shift_load.next = 0
144
      fp_shift_reg.next = 0
145
 
146
    else:
147
      if state == t_state.FP_LOAD:
148
        if fp_needs_load and fast_data_avail_i and not fast_rden_o:
149
          fast_rden_o.next = 1
150
        elif fast_rden_o:
151
          fast_rden_o.next = 0
152
          fp_shift_load.next = fp_shift_load + 8
153
 
154
          if fp_shift_load > 0:
155
            fp_shift_reg.next = concat(fast_data_i, fp_shift_reg[fp_shift_load:])
156
          else:
157
            fp_shift_reg.next = fast_data_i
158
 
159
      elif state == t_state.FIP_SHIFT:
160
        fp_shift_load.next = fp_shift_load - fast_bits_i
161
 
162
 
163
  #
164
  # interleaved path load processing
165
  @always(clk.posedge, reset.negedge)
166
  def ip_load():
167
 
168
    if reset:
169
      inter_rden_o.next = 0
170
      ip_shift_load.next = 0
171
      ip_shift_reg.next = 0
172
 
173
    else:
174
      if state == t_state.IP_LOAD:
175
        if inter_data_avail_i and not inter_rden_o:
176
          inter_rden_o.next = 1
177
        elif inter_rden_o:
178
          inter_rden_o.next = 0
179
          ip_shift_load.next = ip_shift_load + 8
180
          if ip_shift_load > 0:
181
            ip_shift_reg.next = concat(inter_data_i, ip_shift_reg[ip_shift_load:])
182
          else:
183
            ip_shift_reg.next = inter_data_i
184
 
185
      elif state == t_state.FIP_SHIFT:
186
        ip_shift_load.next = ip_shift_load - inter_bits_i
187
 
188
 
189
  #
190
  # fast and interleaved path shift processing
191
  @always(clk.posedge, reset.negedge)
192
  def fp_ip_shift():
193
 
194
    if reset:
195
      data_out_o.next = 0
196
      data_out_valid_o.next = 0
197
 
198
    else:
199
 
200
      if state == t_state.FIP_SHIFT:
201
        if fp_process and not ip_process:
202
          data_out_o.next = fp_shift_reg[fast_bits_i:]
203
          fp_shift_reg.next = fp_shift_reg[:fast_bits_i]
204
 
205
        elif not fp_process and ip_process:
206
          data_out_o.next = ip_shift_reg[inter_bits_i:]
207
          ip_shift_reg.next = ip_shift_reg[:inter_bits_i]
208
 
209
        else:
210
          data_out_o.next = concat( ip_shift_reg[inter_bits_i:],
211
                                    fp_shift_reg[fast_bits_i:])
212
          fp_shift_reg.next = fp_shift_reg[:fast_bits_i]
213
          ip_shift_reg.next = ip_shift_reg[:inter_bits_i]
214
 
215
        data_out_valid_o.next = 1
216
 
217
      else:
218
 
219
        data_out_valid_o.next = 0
220
 
221
  return instances()

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.