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

Subversion Repositories tdm_switch

[/] [tdm_switch/] [web_uploads/] [tdm_switch_b.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 root
`timescale 1ns / 1ns
2
 
3
module tdm_switch_top (
4
                       clk_in,
5
                       clk_out,
6
                       frame_sync,
7
                       rx_stream,
8
                       tx_stream,
9
                       reset,
10
                       mpi_clk,
11
                       mpi_cs,
12
                       mpi_rw,
13
                       mpi_addr,
14
                       mpi_data_in,
15
                       mpi_data_out
16
                      );
17
 
18
//=======================================================================================
19
//====================== IO PORT DESCRIPTION ============================================
20
 
21
input           clk_in;
22
output          clk_out;
23
output          frame_sync;
24
 
25
input           [7:0] rx_stream;
26
output          [7:0] tx_stream;
27
 
28
input           reset;
29
 
30
input           mpi_clk;
31
input           mpi_cs;
32
input           mpi_rw;
33
input           [8:0] mpi_addr;
34
input           [8:0] mpi_data_in;
35
output          [8:0] mpi_data_out;
36
 
37
//=======================================================================================
38
//====================== PARAMETER DESCRIPTION ==========================================
39
 
40
parameter pu = 1'b1;
41
parameter pd = 1'b0;
42
 
43
//=======================================================================================
44
//====================== REGISTER DESCRIPTION ===========================================
45
 
46
reg             [7:0] rx_shift_reg_0;
47
reg             [7:0] rx_shift_reg_1;
48
reg             [7:0] rx_shift_reg_2;
49
reg             [7:0] rx_shift_reg_3;
50
reg             [7:0] rx_shift_reg_4;
51
reg             [7:0] rx_shift_reg_5;
52
reg             [7:0] rx_shift_reg_6;
53
reg             [7:0] rx_shift_reg_7;
54
 
55
reg             [7:0] tx_shift_reg_0;
56
reg             [7:0] tx_shift_reg_1;
57
reg             [7:0] tx_shift_reg_2;
58
reg             [7:0] tx_shift_reg_3;
59
reg             [7:0] tx_shift_reg_4;
60
reg             [7:0] tx_shift_reg_5;
61
reg             [7:0] tx_shift_reg_6;
62
reg             [7:0] tx_shift_reg_7;
63
 
64
reg             [7:0] rx_buf_reg_0;
65
reg             [7:0] rx_buf_reg_1;
66
reg             [7:0] rx_buf_reg_2;
67
reg             [7:0] rx_buf_reg_3;
68
reg             [7:0] rx_buf_reg_4;
69
reg             [7:0] rx_buf_reg_5;
70
reg             [7:0] rx_buf_reg_6;
71
reg             [7:0] rx_buf_reg_7;
72
 
73
reg             [7:0] tx_buf_reg_0;
74
reg             [7:0] tx_buf_reg_1;
75
reg             [7:0] tx_buf_reg_2;
76
reg             [7:0] tx_buf_reg_3;
77
reg             [7:0] tx_buf_reg_4;
78
reg             [7:0] tx_buf_reg_5;
79
reg             [7:0] tx_buf_reg_6;
80
reg             [7:0] tx_buf_reg_7;
81
 
82
reg             [1:0] frame_delay_cnt_0;
83
reg             [1:0] frame_delay_cnt_1;
84
reg             [1:0] frame_delay_cnt_2;
85
reg             [1:0] frame_delay_cnt_3;
86
reg             [1:0] frame_delay_cnt_4;
87
reg             [1:0] frame_delay_cnt_5;
88
reg             [1:0] frame_delay_cnt_6;
89
reg             [1:0] frame_delay_cnt_7;
90
 
91
reg             [1:0] frame_delay_buf_0;
92
reg             [1:0] frame_delay_buf_1;
93
reg             [1:0] frame_delay_buf_2;
94
reg             [1:0] frame_delay_buf_3;
95
reg             [1:0] frame_delay_buf_4;
96
reg             [1:0] frame_delay_buf_5;
97
reg             [1:0] frame_delay_buf_6;
98
reg             [1:0] frame_delay_buf_7;
99
 
100
reg             div_reg;
101
reg             [8:0] frame_cnt;
102
reg             [4:0] c_mem_addr_cnt;
103
reg             [4:0] d_mem_addr_cnt;
104
reg             [15:0] data_in_bus;
105
reg             [1:0] ctrl_out_reg;
106
reg             mem_page_sel;
107
 
108
//=======================================================================================
109
//====================== WIRE DESCRIPTION ===============================================
110
 
111
wire            clk_4096k;
112
wire            clk_2048k;
113
wire            frame_8k;
114
wire            g_rst;
115
 
116
wire            tx_sr_load;
117
wire            rx_buf_load;
118
 
119
wire            load_rx_buf_0;
120
wire            load_rx_buf_1;
121
wire            load_rx_buf_2;
122
wire            load_rx_buf_3;
123
wire            load_rx_buf_4;
124
wire            load_rx_buf_5;
125
wire            load_rx_buf_6;
126
wire            load_rx_buf_7;
127
 
128
wire            tx_buf_wen;
129
wire            data_wen;
130
wire            cd_en;
131
 
132
wire            [7:0] d_mem_addr;
133
wire            [1:0] d_mem_low_addr;
134
wire            [4:0] d_mem_high_addr;
135
 
136
wire            [7:0] c_mem_addr;
137
wire            [2:0] c_mem_low_addr;
138
wire            [4:0] c_mem_high_addr;
139
 
140
wire            [7:0] data_out_bus;
141
 
142
wire            [2:0] tx_buf_addr;
143
 
144
wire            [8:0] cd_mem_addr;
145
wire            [15:0] cd_data;
146
 
147
wire            ram_en;
148
 
149
wire            [15:0] mpi_mem_bus_in;
150
wire            [15:0] mpi_mem_bus_out;
151
 
152
wire            [1:0] ctrl_in;
153
wire            [1:0] ctrl_out;
154
 
155
//=======================================================================================
156
//====================== IO AND CLK BUFFERS =============================================
157
 
158
assign g_rst = reset;
159
assign clk_4096k = clk_in;
160
assign clk_2048k = div_reg;
161
assign clk_out = clk_2048k;
162
assign frame_sync = frame_8k;
163
 
164
always @ (posedge clk_4096k or negedge g_rst)
165
    if (!g_rst)
166
       div_reg <= 0;
167
     else
168
       div_reg <= ~div_reg;
169
 
170
//=======================================================================================
171
//====================== FRAME SYNC GENERATION ==========================================
172
 
173
always @ (negedge clk_4096k or negedge g_rst)
174
    if (!g_rst)
175
       frame_cnt <= 0;
176
     else
177
       frame_cnt <= frame_cnt + 1;
178
 
179
assign frame_8k = (frame_cnt == 9'h00A) ? 1'b1 : 1'b0;
180
 
181
//=======================================================================================
182
//====================== SYNC SIGNALS FOR INPUT STREAMS =================================
183
 
184
assign rx_buf_load = (frame_cnt[3:0] == 4'hA) ? 1'b1 : 1'b0;
185
 
186
always @ (negedge clk_2048k or posedge rx_buf_load)
187
    if (rx_buf_load)
188
       begin
189
         frame_delay_cnt_0 <= frame_delay_buf_0 + 1;
190
         frame_delay_cnt_1 <= frame_delay_buf_1 + 1;
191
         frame_delay_cnt_2 <= frame_delay_buf_2 + 1;
192
         frame_delay_cnt_3 <= frame_delay_buf_3 + 1;
193
         frame_delay_cnt_4 <= frame_delay_buf_4 + 1;
194
         frame_delay_cnt_5 <= frame_delay_buf_5 + 1;
195
         frame_delay_cnt_6 <= frame_delay_buf_6 + 1;
196
         frame_delay_cnt_7 <= frame_delay_buf_7 + 1;
197
       end
198
     else
199
       begin
200
         if (frame_delay_cnt_0 == 0)
201
            frame_delay_cnt_0 <= frame_delay_cnt_0;
202
          else
203
            frame_delay_cnt_0 <= frame_delay_cnt_0 + 2'b11;
204
 
205
         if (frame_delay_cnt_1 == 0)
206
            frame_delay_cnt_1 <= frame_delay_cnt_1;
207
          else
208
            frame_delay_cnt_1 <= frame_delay_cnt_1 + 2'b11;
209
 
210
         if (frame_delay_cnt_2 == 0)
211
            frame_delay_cnt_2 <= frame_delay_cnt_2;
212
          else
213
            frame_delay_cnt_2 <= frame_delay_cnt_2 + 2'b11;
214
 
215
         if (frame_delay_cnt_3 == 0)
216
            frame_delay_cnt_3 <= frame_delay_cnt_3;
217
          else
218
            frame_delay_cnt_3 <= frame_delay_cnt_3 + 2'b11;
219
 
220
         if (frame_delay_cnt_4 == 0)
221
            frame_delay_cnt_4 <= frame_delay_cnt_4;
222
          else
223
            frame_delay_cnt_4 <= frame_delay_cnt_4 + 2'b11;
224
 
225
         if (frame_delay_cnt_5 == 0)
226
            frame_delay_cnt_5 <= frame_delay_cnt_5;
227
          else
228
            frame_delay_cnt_5 <= frame_delay_cnt_5 + 2'b11;
229
 
230
         if (frame_delay_cnt_6 == 0)
231
            frame_delay_cnt_6 <= frame_delay_cnt_6;
232
          else
233
            frame_delay_cnt_6 <= frame_delay_cnt_6 + 2'b11;
234
 
235
         if (frame_delay_cnt_7 == 0)
236
            frame_delay_cnt_7 <= frame_delay_cnt_7;
237
          else
238
            frame_delay_cnt_7 <= frame_delay_cnt_7 + 2'b11;
239
       end
240
 
241
assign load_rx_buf_0 = (frame_delay_cnt_0 == 2'b01) ? 1'b1 : 1'b0;
242
assign load_rx_buf_1 = (frame_delay_cnt_1 == 2'b01) ? 1'b1 : 1'b0;
243
assign load_rx_buf_2 = (frame_delay_cnt_2 == 2'b01) ? 1'b1 : 1'b0;
244
assign load_rx_buf_3 = (frame_delay_cnt_3 == 2'b01) ? 1'b1 : 1'b0;
245
assign load_rx_buf_4 = (frame_delay_cnt_4 == 2'b01) ? 1'b1 : 1'b0;
246
assign load_rx_buf_5 = (frame_delay_cnt_5 == 2'b01) ? 1'b1 : 1'b0;
247
assign load_rx_buf_6 = (frame_delay_cnt_6 == 2'b01) ? 1'b1 : 1'b0;
248
assign load_rx_buf_7 = (frame_delay_cnt_7 == 2'b01) ? 1'b1 : 1'b0;
249
 
250
//=======================================================================================
251
//====================== SERIAL INPUT TO PARALLEL CONVERTIONS ===========================
252
 
253
always @ (negedge clk_2048k)
254
    begin
255
      rx_shift_reg_0 <= {rx_stream[0], rx_shift_reg_0[7:1]};
256
      rx_shift_reg_1 <= {rx_stream[1], rx_shift_reg_1[7:1]};
257
      rx_shift_reg_2 <= {rx_stream[2], rx_shift_reg_2[7:1]};
258
      rx_shift_reg_3 <= {rx_stream[3], rx_shift_reg_3[7:1]};
259
      rx_shift_reg_4 <= {rx_stream[4], rx_shift_reg_4[7:1]};
260
      rx_shift_reg_5 <= {rx_stream[5], rx_shift_reg_5[7:1]};
261
      rx_shift_reg_6 <= {rx_stream[6], rx_shift_reg_6[7:1]};
262
      rx_shift_reg_7 <= {rx_stream[7], rx_shift_reg_7[7:1]};
263
    end
264
 
265
//=======================================================================================
266
//====================== Rx BUFFER LOAD =================================================
267
 
268
always @ (posedge clk_2048k)
269
    if (load_rx_buf_0)
270
       rx_buf_reg_0 <= rx_shift_reg_0;
271
     else
272
       rx_buf_reg_0 <= rx_buf_reg_0;
273
 
274
always @ (posedge clk_2048k)
275
    if (load_rx_buf_1)
276
       rx_buf_reg_1 <= rx_shift_reg_1;
277
     else
278
       rx_buf_reg_1 <= rx_buf_reg_1;
279
 
280
always @ (posedge clk_2048k)
281
    if (load_rx_buf_2)
282
       rx_buf_reg_2 <= rx_shift_reg_2;
283
     else
284
       rx_buf_reg_2 <= rx_buf_reg_2;
285
 
286
always @ (posedge clk_2048k)
287
    if (load_rx_buf_3)
288
       rx_buf_reg_3 <= rx_shift_reg_3;
289
     else
290
       rx_buf_reg_3 <= rx_buf_reg_3;
291
 
292
always @ (posedge clk_2048k)
293
    if (load_rx_buf_4)
294
       rx_buf_reg_4 <= rx_shift_reg_4;
295
     else
296
       rx_buf_reg_4 <= rx_buf_reg_4;
297
 
298
always @ (posedge clk_2048k)
299
    if (load_rx_buf_5)
300
       rx_buf_reg_5 <= rx_shift_reg_5;
301
     else
302
       rx_buf_reg_5 <= rx_buf_reg_5;
303
 
304
always @ (posedge clk_2048k)
305
    if (load_rx_buf_6)
306
       rx_buf_reg_6 <= rx_shift_reg_6;
307
     else
308
       rx_buf_reg_6 <= rx_buf_reg_6;
309
 
310
always @ (posedge clk_2048k)
311
    if (load_rx_buf_7)
312
       rx_buf_reg_7 <= rx_shift_reg_7;
313
     else
314
       rx_buf_reg_7 <= rx_buf_reg_7;
315
 
316
//=======================================================================================
317
//====================== PARALLEL TO SERIAL OUTPUT CONVERTIONS ==========================
318
 
319
assign tx_sr_load = (frame_cnt[3:0] == 4'hA) ? 1'b1 : 1'b0;
320
 
321
always @ (posedge clk_2048k)
322
    if (tx_sr_load)
323
       begin
324
         tx_shift_reg_0 <= tx_buf_reg_0;
325
         tx_shift_reg_1 <= tx_buf_reg_1;
326
         tx_shift_reg_2 <= tx_buf_reg_2;
327
         tx_shift_reg_3 <= tx_buf_reg_3;
328
         tx_shift_reg_4 <= tx_buf_reg_4;
329
         tx_shift_reg_5 <= tx_buf_reg_5;
330
         tx_shift_reg_6 <= tx_buf_reg_6;
331
         tx_shift_reg_7 <= tx_buf_reg_7;
332
       end
333
     else
334
       begin
335
         tx_shift_reg_0 <= {1'b0, tx_shift_reg_0[7:1]};
336
         tx_shift_reg_1 <= {1'b0, tx_shift_reg_1[7:1]};
337
         tx_shift_reg_2 <= {1'b0, tx_shift_reg_2[7:1]};
338
         tx_shift_reg_3 <= {1'b0, tx_shift_reg_3[7:1]};
339
         tx_shift_reg_4 <= {1'b0, tx_shift_reg_4[7:1]};
340
         tx_shift_reg_5 <= {1'b0, tx_shift_reg_5[7:1]};
341
         tx_shift_reg_6 <= {1'b0, tx_shift_reg_6[7:1]};
342
         tx_shift_reg_7 <= {1'b0, tx_shift_reg_7[7:1]};
343
       end
344
 
345
assign tx_stream[0] = tx_shift_reg_0[0];
346
assign tx_stream[1] = tx_shift_reg_1[0];
347
assign tx_stream[2] = tx_shift_reg_2[0];
348
assign tx_stream[3] = tx_shift_reg_3[0];
349
assign tx_stream[4] = tx_shift_reg_4[0];
350
assign tx_stream[5] = tx_shift_reg_5[0];
351
assign tx_stream[6] = tx_shift_reg_6[0];
352
assign tx_stream[7] = tx_shift_reg_7[0];
353
 
354
//=======================================================================================
355
//====================== Tx BUFFER LOAD =================================================
356
 
357
assign tx_buf_addr = frame_cnt[2:0] + 3'b110;
358
assign tx_buf_wen = ((frame_cnt[3:0] > 4'h1) & (frame_cnt[3:0] < 4'hA)) ? 1'b1 : 1'b0;
359
 
360
always @ (posedge clk_4096k)
361
    case ({tx_buf_wen, tx_buf_addr})
362
      4'h8 : tx_buf_reg_0 <= data_out_bus;
363
      4'h9 : tx_buf_reg_1 <= data_out_bus;
364
      4'hA : tx_buf_reg_2 <= data_out_bus;
365
      4'hB : tx_buf_reg_3 <= data_out_bus;
366
      4'hC : tx_buf_reg_4 <= data_out_bus;
367
      4'hD : tx_buf_reg_5 <= data_out_bus;
368
      4'hE : tx_buf_reg_6 <= data_out_bus;
369
      4'hF : tx_buf_reg_7 <= data_out_bus;
370
    endcase
371
 
372
//=======================================================================================
373
//====================== DATA MEMORY ADDRESS GENERATION =================================
374
 
375
assign d_mem_addr = {mem_page_sel, d_mem_high_addr, d_mem_low_addr};
376
 
377
assign d_mem_high_addr = d_mem_addr_cnt;
378
 
379
assign d_mem_low_addr = frame_cnt[2:1] + 2'b11;
380
 
381
always @ (posedge clk_2048k or negedge g_rst)
382
    if (!g_rst)
383
       mem_page_sel <= 0;
384
     else
385
       if (frame_8k)
386
          mem_page_sel <= ~mem_page_sel;
387
        else
388
          mem_page_sel <= mem_page_sel;
389
 
390
 
391
always @ (posedge clk_2048k)
392
    if (tx_sr_load & frame_8k)
393
       d_mem_addr_cnt <= 5'h1F;
394
     else
395
       if (tx_sr_load)
396
          d_mem_addr_cnt <= d_mem_addr_cnt + 1;
397
        else
398
          d_mem_addr_cnt <= d_mem_addr_cnt;
399
 
400
//=======================================================================================
401
//====================== CONNECTION MEMORY ADDRESS GENERATION ===========================
402
 
403
assign c_mem_addr = {c_mem_high_addr, c_mem_low_addr};
404
 
405
assign c_mem_high_addr = c_mem_addr_cnt;
406
 
407
assign c_mem_low_addr = frame_cnt[2:0];
408
 
409
always @ (posedge clk_2048k)
410
    if (rx_buf_load & frame_8k)
411
       c_mem_addr_cnt <= 5'h01;
412
     else
413
       if (rx_buf_load)
414
          c_mem_addr_cnt <= c_mem_addr_cnt + 1;
415
        else
416
          c_mem_addr_cnt <= c_mem_addr_cnt;
417
 
418
//=======================================================================================
419
//====================== DATA MEMORY MODULE =============================================
420
 
421
always @ (d_mem_addr[1:0], rx_buf_reg_7, rx_buf_reg_6, rx_buf_reg_5, rx_buf_reg_4, rx_buf_reg_3, rx_buf_reg_2, rx_buf_reg_1, rx_buf_reg_0)
422
    case (d_mem_addr[1:0])
423
       2'b00 : data_in_bus = {rx_buf_reg_1, rx_buf_reg_0};
424
       2'b01 : data_in_bus = {rx_buf_reg_3, rx_buf_reg_2};
425
       2'b10 : data_in_bus = {rx_buf_reg_5, rx_buf_reg_4};
426
     default : data_in_bus = {rx_buf_reg_7, rx_buf_reg_6};
427
    endcase
428
 
429
assign cd_mem_addr = {~mem_page_sel, cd_data[7:0]};
430
assign data_wen = ((frame_cnt[3:0] > 4'h1) & (frame_cnt[3:0] < 4'hA)) ? 1'b1 : 1'b0;
431
assign cd_en = (frame_cnt[3:0] < 4'h8) ? 1'b1 : 1'b0;
432
 
433
RAMB4_S8_S16 d_mem (
434
                    .DOA (data_out_bus),
435
                    .DOB (),
436
                    .ADDRA (cd_mem_addr),
437
                    .ADDRB (d_mem_addr),
438
                    .CLKA (clk_4096k),
439
                    .CLKB (clk_2048k),
440
                    .DIA ({8{pd}}),
441
                    .DIB (data_in_bus),
442
                    .ENA (pu),
443
                    .ENB (data_wen),
444
                    .RSTA (~g_rst),
445
                    .RSTB (~g_rst),
446
                    .WEA (pd),
447
                    .WEB (pu),
448
                    .GSR (~g_rst)
449
                   );
450
 
451
//=======================================================================================
452
//====================== CONNECTION MEMORY MODULE =======================================
453
 
454
assign mpi_data_out = (mpi_cs & ~mpi_addr[8]) ? mpi_mem_bus_out[8:0] :
455
                      (mpi_cs & mpi_addr[8]) ? {7'h00, ctrl_out} : 9'hzzz;
456
 
457
assign mpi_mem_bus_in = {{7{pd}}, mpi_data_in};
458
assign ram_en = mpi_cs & ~mpi_addr[8];
459
 
460
RAMB4_S16_S16 c_mem (
461
                     .DOA (cd_data),
462
                     .DOB (mpi_mem_bus_out),
463
                     .ADDRA (c_mem_addr),
464
                     .ADDRB (mpi_addr[7:0]),
465
                     .CLKA (clk_4096k),
466
                     .CLKB (mpi_clk),
467
                     .DIA ({16{pd}}),
468
                     .DIB (mpi_mem_bus_in),
469
                     .ENA (cd_en),
470
                     .ENB (ram_en),
471
                     .RSTA (~g_rst),
472
                     .RSTB (~g_rst),
473
                     .WEA (pd),
474
                     .WEB (~mpi_rw),
475
                     .GSR (~g_rst)
476
                    );
477
 
478
//=======================================================================================
479
//====================== TO CONTROLL REGISTER ACCESS UNIT ===============================
480
 
481
assign ctrl_in = mpi_data_in[1:0];
482
 
483
always @ (posedge mpi_clk)
484
   case ({mpi_rw, mpi_cs, mpi_addr[8], mpi_addr[3:0]})
485
          7'b0110000 : frame_delay_buf_0 <= ctrl_in;
486
          7'b0110001 : frame_delay_buf_1 <= ctrl_in;
487
          7'b0110010 : frame_delay_buf_2 <= ctrl_in;
488
          7'b0110011 : frame_delay_buf_3 <= ctrl_in;
489
          7'b0110100 : frame_delay_buf_4 <= ctrl_in;
490
          7'b0110101 : frame_delay_buf_5 <= ctrl_in;
491
          7'b0110110 : frame_delay_buf_6 <= ctrl_in;
492
          7'b0110111 : frame_delay_buf_7 <= ctrl_in;
493
        endcase
494
 
495
always @ (posedge mpi_clk)
496
   case ({mpi_cs, mpi_addr[8], mpi_addr[3:0]})
497
          6'b110000 : ctrl_out_reg <= frame_delay_buf_0;
498
          6'b110001 : ctrl_out_reg <= frame_delay_buf_1;
499
          6'b110010 : ctrl_out_reg <= frame_delay_buf_2;
500
          6'b110011 : ctrl_out_reg <= frame_delay_buf_3;
501
          6'b110100 : ctrl_out_reg <= frame_delay_buf_4;
502
          6'b110101 : ctrl_out_reg <= frame_delay_buf_5;
503
          6'b110110 : ctrl_out_reg <= frame_delay_buf_6;
504
          6'b110111 : ctrl_out_reg <= frame_delay_buf_7;
505
        endcase
506
 
507
assign  ctrl_out = ctrl_out_reg;
508
 
509
//=======================================================================================
510
//====================== ================================================================
511
 
512
//=======================================================================================
513
 
514
endmodule

powered by: WebSVN 2.1.0

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