You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 line
3.9 KiB

  1. module router_sync(write_enb,fifo_full,vld_out_0,vld_out_1,vld_out_2,vld_out_3,soft_reset_0,soft_reset_1,soft_reset_2,soft_reset_3,clock,resetn,data_in,detect_add,full_0,full_1,full_2,full_3,empty_0,empty_1,empty_2,empty_3,write_enb_reg,read_enb_0,read_enb_1,read_enb_2,read_enb_3);
  2. output reg [3:0]write_enb;
  3. output vld_out_0,vld_out_1,vld_out_2,vld_out_3;
  4. output reg fifo_full,soft_reset_0,soft_reset_1,soft_reset_2,soft_reset_3;
  5. input [1:0]data_in;
  6. input clock,resetn,detect_add,write_enb_reg;
  7. input full_0,full_1,full_2,full_3,empty_0,empty_1,empty_2,empty_3,read_enb_0,read_enb_1,read_enb_2,read_enb_3;
  8. reg [1:0]temp_data_in;
  9. reg [5:0]count_0,count_1,count_2,count_3;
  10. assign vld_out_0=~empty_0;
  11. assign vld_out_1=~empty_1;
  12. assign vld_out_2=~empty_2;
  13. assign vld_out_3=~empty_3;
  14. //data_in
  15. always @(posedge clock) begin
  16. if(!resetn) begin
  17. temp_data_in<=2'b0;
  18. end
  19. else if (detect_add) begin
  20. temp_data_in<= data_in;
  21. end
  22. end
  23. //write enable
  24. always @(*) begin
  25. if (!resetn) begin
  26. write_enb<=4'b0000;
  27. end
  28. else if(write_enb_reg)
  29. begin
  30. case(temp_data_in)
  31. 2'b00: write_enb=4'b0001;
  32. 2'b01: write_enb=4'b0010;
  33. 2'b10: write_enb=4'b0100;
  34. 2'b11: write_enb=4'b1000;
  35. default write_enb=4'b0000;
  36. endcase
  37. end
  38. else
  39. write_enb=4'b0000;
  40. end
  41. //fifo operation
  42. always @(*) begin
  43. if(!resetn) begin
  44. fifo_full=1'b0;
  45. end
  46. else
  47. begin
  48. case(temp_data_in)
  49. 2'b00: fifo_full=full_0;
  50. 2'b01: fifo_full=full_1;
  51. 2'b10: fifo_full=full_2;
  52. 2'b11: fifo_full=full_3;
  53. default fifo_full=1'b0;
  54. endcase
  55. end
  56. end
  57. //soft reset counter
  58. // counter 0
  59. always@(posedge clock)
  60. begin
  61. if(!resetn)
  62. count_0<=5'b0;
  63. else if(vld_out_0)
  64. begin
  65. if(!read_enb_0)
  66. begin
  67. if(count_0==5'b11110)
  68. begin
  69. soft_reset_0<=1'b1;
  70. count_0<=1'b0;
  71. end
  72. else
  73. begin
  74. count_0<=count_0+1'b1;
  75. soft_reset_0<=1'b0;
  76. end
  77. end
  78. else
  79. count_0<=5'd0;
  80. end
  81. else
  82. count_0<=5'd0;
  83. end
  84. //counter 1
  85. always@(posedge clock)
  86. begin
  87. if(!resetn)
  88. count_1<=5'b0;
  89. else if(vld_out_1)
  90. begin
  91. if(!read_enb_1)
  92. begin
  93. if(count_1==5'b11110)
  94. begin
  95. soft_reset_1<=1'b1;
  96. count_1<=1'b0;
  97. end
  98. else
  99. begin
  100. count_1<=count_1+1'b1;
  101. soft_reset_1<=1'b0;
  102. end
  103. end
  104. else
  105. count_1<=5'd0;
  106. end
  107. else
  108. count_1<=5'd0;
  109. end
  110. //counter 2
  111. always@(posedge clock)
  112. begin
  113. if(!resetn)
  114. count_2<=5'b0;
  115. else if(vld_out_2)
  116. begin
  117. if(!read_enb_2)
  118. begin
  119. if(count_2==5'b11110)
  120. begin
  121. soft_reset_2<=1'b1;
  122. count_2<=1'b0;
  123. end
  124. else
  125. begin
  126. count_2<=count_2+1'b1;
  127. soft_reset_2<=1'b0;
  128. end
  129. end
  130. else
  131. count_2<=5'd0;
  132. end
  133. else
  134. count_2<=5'd0;
  135. end
  136. //counter 3
  137. always@(posedge clock)
  138. begin
  139. if(!resetn)
  140. count_3<=5'b0;
  141. else if(vld_out_3)
  142. begin
  143. if(!read_enb_3)
  144. begin
  145. if(count_3==5'b11110)
  146. begin
  147. soft_reset_3<=1'b1;
  148. count_3<=1'b0;
  149. end
  150. else
  151. begin
  152. count_3<=count_3+1'b1;
  153. soft_reset_3<=1'b0;
  154. end
  155. end
  156. else
  157. count_3<=5'd0;
  158. end
  159. else
  160. count_3<=5'd0;
  161. end
  162. endmodule