当前位置:   article > 正文

4.5交织_卷积交织原理

卷积交织原理

4.5.1分组交织器原理

4.5.2卷积交织器原理

4.5.3 802.11a中的交织

1、符号交织的实现

 

2、Data交织的实现

 

https://blog.csdn.net/weiweiliulu/article/details/48160057?locationNum=9&fps=1

代码:

  1. module DATA_interleaver(DINT_DIN,DINT_ND,INDEX_IN,DINT_RST,DINT_CLK,MODE_CON,DINT_DOUT,DINT_RDY);
  2. input DINT_DIN;
  3. input DINT_ND;
  4. input [8:0] INDEX_IN;
  5. input [1:0] MODE_CON;
  6. input DINT_RST;
  7. input DINT_CLK;
  8. output DINT_DOUT;
  9. output DINT_RDY;
  10. reg DIN; //register of input
  11. reg ND; //enable of output
  12. reg [8:0] INDEX; //register of index for output
  13. reg [1:0] MODE;
  14. reg [9:0] WA_1; //DINT_RAM_1 write address
  15. reg DIN_1; //DINT_RAM_1 input register
  16. reg REN_1; //DINT_RAM_1 enable read
  17. reg WEN_1; //DINT_RAM_1 enable write
  18. reg WAC_1; //control write address of 1st interleaver
  19. reg DINT_RDY_1; //DINT_RAM_1 enable output
  20. reg DIN_2; //DINT_RAM_2 input register
  21. reg [4:0] WA_2; //DINT_RAM_2 write address
  22. reg WEN_2; //DINT_RAM_2 enable write
  23. reg REN_2; //DINT_RAM_2 enable read
  24. reg WAC_2; //control write address of 2ed interleaver
  25. reg DINT_DV; //enable output
  26. reg DINT_DOUT; //output register
  27. reg DINT_RDY; //synchronize with output
  28. wire [9:0] RA_1; //DINT_RAM_1 read address
  29. wire [9:0] Q_1; //RCOUNT_1 counter of output
  30. wire DOUT_1; //DINT_RAM_1 output
  31. wire RST; //reset of IP core, enable under high leavel
  32. wire [4:0] Q_2; //RCOUNT_2 counter of output
  33. wire [4:0] RA_2; //DINT_RAM_2 read address
  34. wire DOUT_2; //DINT_RAM_2 output
  35. assign RST=~DINT_RST;
  36. assign RA_1=Q_1;
  37. /********************************************************************************/
  38. /**************************** register for input ****************************/
  39. always @ (negedge DINT_RST or posedge DINT_CLK)
  40. if (!DINT_RST)
  41. begin
  42. DIN<=1'b0;
  43. ND<=1'b0;
  44. INDEX<=9'b000000000;
  45. MODE<=2'b00;
  46. end
  47. else
  48. begin
  49. if (DINT_ND)
  50. begin
  51. DIN<=DINT_DIN;
  52. ND<=DINT_ND;
  53. INDEX<=INDEX_IN;
  54. MODE<=MODE_CON;
  55. end
  56. else
  57. begin
  58. DIN<=1'b0;
  59. ND<=1'b0;
  60. INDEX<=9'b000000000;
  61. end
  62. end
  63. /**********************************************************************************/
  64. /**************************** DINT_RAM_1 ****************************/
  65. // BRAM: depth is 384 bits, the 1st interleaver BRAM to store the data which already adjust the order
  66. DINT_RAM_1 dint_ram(
  67. .a(WA_1),
  68. .dpra(RA_1),
  69. .clk(DINT_CLK),
  70. .qdpo_clk(DINT_CLK),
  71. .d(DIN_1),
  72. .qdpo(DOUT_1),
  73. .qdpo_ce(REN_1),
  74. .qdpo_rst(RST),
  75. .we(WEN_1));
  76. /***************************************************************************/
  77. /**************************** RCOUNT_1 ****************************/
  78. // counter cycle is 384 to generate read address of DINT_RAM_1
  79. rcount_1 RCOUNT_1(
  80. .Q(Q_1),
  81. .CLK(DINT_CLK),
  82. .CE(REN_1),
  83. .SCLR(RST));
  84. /**********************************************************************************/
  85. /**************************** 1st interleaver ****************************/
  86. always @ (negedge DINT_RST or posedge DINT_CLK)
  87. if (!DINT_RST)
  88. begin
  89. WAC_1<=1'b0;
  90. WA_1<=10'b0000000000;
  91. WEN_1<=1'b0;
  92. DIN_1<=1'b0;
  93. REN_1<=1'b0;
  94. DINT_RDY_1<=1'b0;
  95. end
  96. else
  97. begin
  98. if (REN_1)
  99. DINT_RDY_1<=1'b1;
  100. else
  101. DINT_RDY_1<=1'b0;
  102. case (MODE)
  103. 2'b10:
  104. begin
  105. if (ND)
  106. begin
  107. if (!WAC_1)
  108. begin // input data write in the BRAM first half part and the end alternatively, under control of WAC_1.
  109. WA_1<=(INDEX[3:0]<<3)+(INDEX[3:0]<<2)+INDEX[8:4];
  110. DIN_1<=DIN;
  111. WEN_1<=1'b1;
  112. end
  113. else
  114. begin
  115. WA_1<=(INDEX[3:0]<<3)+(INDEX[3:0]<<2)+INDEX[8:4]+192;
  116. WEN_1<=1'b1;
  117. DIN_1<=DIN;
  118. end
  119. if(INDEX ==9'd192)
  120. begin
  121. WAC_1 <= ~WAC_1;
  122. REN_1 <= 1'b1;
  123. end
  124. end
  125. else
  126. begin
  127. WA_1<=10'b0000000000;
  128. WEN_1<=1'b0;
  129. DIN_1<=1'b0;
  130. end
  131. if (Q_1==191 || Q_1==383) //finish read of BRAM
  132. REN_1<=1'b0;
  133. end
  134. endcase
  135. end
  136. /******************************************************************************/
  137. /**************************** DINT_RAM_2 ****************************/
  138. // BRAM: depth is 32bits, as 2ed interleaver, change the write address too
  139. DINT_RAM_2 dint_ram2(
  140. .a(WA_2),
  141. .clk(DINT_CLK),
  142. .d(DIN_2),
  143. .we(WEN_2),
  144. .qdpo_ce(REN_2),
  145. .dpra(RA_2),
  146. .qdpo_clk(DINT_CLK),
  147. .qdpo(DOUT_2),
  148. .qdpo_rst(RST));
  149. /***************************************************************************/
  150. /**************************** WCOUNT_2 ****************************/
  151. count24 WCOUNT_2 (
  152. .Q(Q_2),
  153. .CLK(DINT_CLK),
  154. .CE(DINT_RDY_1),
  155. .SCLR(RST));
  156. /**********************************************************************************/
  157. /**************************** RCOUNT_2 ****************************/
  158. count24 RCOUNT_2 (
  159. .Q(RA_2),
  160. .CLK(DINT_CLK),
  161. .CE(REN_2),
  162. .SCLR(RST));
  163. /**********************************************************************************/
  164. /**************************** 2ed interleaver ****************************/
  165. always @ (negedge DINT_RST or posedge DINT_CLK)
  166. if (!DINT_RST)
  167. begin
  168. WEN_2<=1'b0;
  169. DIN_2<=1'b0;
  170. WAC_2<=1'b0;
  171. WA_2<=5'b00000;
  172. REN_2<=1'b0;
  173. DINT_DV<=1'b0;
  174. DINT_DOUT<=1'b0;
  175. DINT_RDY<=1'b0;
  176. end
  177. else
  178. begin
  179. case (MODE)
  180. 2'b10:
  181. begin
  182. if (DINT_RDY_1) //input data to the 2ed interleaver after finish the 1st interleaver
  183. begin
  184. WEN_2<=1'b1;
  185. DIN_2<=DOUT_1;
  186. if (WAC_2) //process the input data, change the write address or not with 12bits cycle alternatively, under control of WAC_2
  187. begin
  188. WA_2[4:1]<=Q_2[4:1];
  189. WA_2[0]<=~Q_2[0];
  190. end
  191. else
  192. WA_2<=Q_2;
  193. end
  194. else
  195. begin
  196. WEN_2<=1'b0;
  197. DIN_2<=1'b0;
  198. end
  199. if (Q_2==11 || Q_2==23) //finish write, begin to read
  200. begin
  201. WAC_2<=~WAC_2;
  202. REN_2<=1'b1;
  203. end
  204. if (RA_2==23 && !DINT_RDY_1)
  205. REN_2<=1'b0;
  206. end
  207. endcase
  208. if (REN_2)
  209. DINT_DV<=1'b1;
  210. else
  211. DINT_DV<=1'b0;
  212. if (DINT_DV) //data output
  213. begin
  214. DINT_DOUT<=DOUT_2;
  215. DINT_RDY<=1'b1;
  216. end
  217. else
  218. begin
  219. DINT_DOUT<=1'b0;
  220. DINT_RDY<=1'b0;
  221. end
  222. end
  223. endmodule

tb:

  1. `timescale 1ns/1ns
  2. module DATA_interleaver_tb();
  3. reg DINT_DIN;
  4. reg DINT_ND;
  5. reg [8:0] INDEX_IN;
  6. reg [1:0] MODE_CON;
  7. reg DINT_RST;
  8. reg DINT_CLK;
  9. wire DINT_DOUT;
  10. wire DINT_RDY;
  11. DATA_interleaver DATA_interleaver_inst(
  12. .DINT_DIN(DINT_DIN),
  13. .DINT_ND(DINT_ND),
  14. .INDEX_IN(INDEX_IN),
  15. .DINT_RST(DINT_RST),
  16. .DINT_CLK(DINT_CLK),
  17. .MODE_CON(MODE_CON),
  18. .DINT_DOUT(DINT_DOUT),
  19. .DINT_RDY(DINT_RDY)
  20. );
  21. integer i=0;
  22. integer j=0;
  23. initial begin
  24. DINT_RST=0;
  25. DINT_CLK=0;
  26. MODE_CON = 2'b00;
  27. INDEX_IN = 9'b000000000;
  28. DINT_ND = 0;
  29. DINT_DIN = 0;
  30. #20.1
  31. DINT_RST = 1;
  32. MODE_CON = 2'b10;
  33. DINT_ND = 1;
  34. #5
  35. for (i=0;j<2;j=j+1)
  36. #1000
  37. begin
  38. for (i=0;i<384;i=i+1)
  39. begin
  40. #5
  41. DINT_DIN = {$random} % 2;
  42. INDEX_IN = i + 9'd1;
  43. DINT_ND = 1;
  44. end
  45. DINT_ND = 0;
  46. end
  47. #1000000
  48. $stop;
  49. end
  50. always #5 DINT_CLK = ~DINT_CLK;
  51. endmodule

 

 

第一级交织:交织公式的地址读入,顺序读出

第二级交织:每24个数据为一组,12个数据顺序不变,后12个数据每相邻两个交换位置

注意:采样时钟是否能采到相应的值,笔者进行测试的时候,采样时钟,未能采到191,后改正。

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/628026
推荐阅读
相关标签
  

闽ICP备14008679号