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

Subversion Repositories tdm_switch

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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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