/dvbt/trunk/release/rtl/rtl_top_fold/kes_fold_rtl.v

http://github.com/zaqwes8811/decoder-reed-solomon · V · 330 lines · 279 code · 12 blank · 39 comment · 6 complexity · 770bfa5020e0aed3fd660569623a3b9e MD5 · raw file

  1. /**
  2. file : kes_fold_rtl.v
  3. abst. : ????????????????? ?????????? ???????????
  4. ??? kes-?????
  5. feat. :
  6. con. :
  7. kes_block_rtl #(
  8. .FFACTOR(FFACTOR));
  9. label_kes(
  10. .clk(clk), .rst(rst), .clk_ena(clk_ena),
  11. // control ////
  12. .kes_slave(kes_slave),
  13. // out
  14. .kes_master(kes_master),
  15. // dataflow ///
  16. .psindrom(psindrom),
  17. // out
  18. .plambda(plambda),
  19. .phomega(phomega)
  20. );
  21. */
  22. `include "vc_top.v"
  23. module kes_fold_rtl(
  24. rst, clk, clk_ena,
  25. // control ////
  26. kes_slave,
  27. // out
  28. kes_master, // ?? ??? ????? ?????
  29. //kes_master_short,
  30. // dataflow ///
  31. psindroms,
  32. // out
  33. plambda,
  34. phomega,
  35. degree
  36. );
  37. input clk, rst, clk_ena;
  38. input kes_slave;
  39. input [`SC_OUT_WIDTH-1:0] psindroms; // ??????????? ?????????? ????????
  40. output kes_master;
  41. output [`DEGREE_BUS-1:0] degree;
  42. //
  43. output [`KES_OUT_HOME-1:0] phomega;
  44. wire [`KES_OUT_HOME-1:0] phomega_tmp;
  45. output [`KES_OUT_LAM-1:0] plambda; // ??????????? ?????????? ????????
  46. wire [`KES_OUT_LAM-1:0] plambda_tmp; //
  47. // enab.
  48. wire windows;
  49. wire carry; // LCr - ??????? ???????? ???????(?????)
  50. assign clk_ena_cont = clk_ena & carry & windows; // ????????
  51. wire clk_ena_calc;
  52. assign clk_ena_calc = clk_ena & windows;
  53. wire load;
  54. assign load = kes_slave;
  55. wire pre_kes_master;
  56. wire pre_master = clk_ena & pre_kes_master;
  57. // loc. //
  58. wire [(`WIDTH)*(`ST)-1:0] first_zeros; // ?????? ????
  59. assign first_zeros = 0;
  60. wire [(`WIDTH)*3*(`ST+1)-1:0] psyndval_src_tmp; // ??? ???. ?????
  61. wire [`WIDTH-1:0] intcon [`NUM_BLK-2:0]; // ?????????? ????? ???????
  62. // out.
  63. wire [`WIDTH-1:0] deltair;
  64. wire [`WIDTH-1:0] tttar;
  65. // contr.
  66. wire [`WIDTH-1:0] gammar;
  67. wire [`WIDTH-1:0] tst;
  68. wire [`WIDTH-1:0] delta0r;
  69. assign delta0r = deltair;
  70. wire MCr;
  71. wire LCr;
  72. // ??? ??????. ???????
  73. wire [`ST:0] scan_w; // ?? ???????, ?? ????? ????????? ? ????. ???.
  74. wire [`DEGREE_BUS-1:0] degree_tmp;
  75. //
  76. wire [`BIG_DEL-1:0] bigdelta [0:(`NUM_BLK-1)]; // ??????? ????????
  77. wire [(`BIG_DEL)*(`NUM_BLK)-1:0] pdelta;
  78. wire [(`BIG_DEL)*(`NUM_BLK)-1:0] pdelta_tmp;
  79. wire [2*8-1:0] last_zeros; // ? ????????? ?? ??????, ????? ????? ????????
  80. assign last_zeros = 0;
  81. wire [`SC_OUT_WIDTH-1:0] psindroms_rout; // ??????????? ?????????? ????????
  82. // split and union
  83. // ????????????? ???????? ??????.// ???? ???, ?.?. ???? ??? ?????? ?????????
  84. genvar b;
  85. generate for(b = 1; b < 2*(`ST)+1; b = b+1) begin : as // ???????????? ????????
  86. assign psindroms_rout[(b)*(`WIDTH)-1:(b-1)*(`WIDTH)] =
  87. psindroms[`SC_OUT_WIDTH-1-(b-1)*(`WIDTH):`SC_OUT_WIDTH-(b)*(`WIDTH)];
  88. end endgenerate
  89. assign psyndval_src_tmp =
  90. { // ????? ????????? ?????? ??????
  91. psindroms_rout,
  92. // ?????????? ?????? ? ????? ????????
  93. first_zeros,
  94. // ?????????
  95. 8'd1};
  96. wire [(`WIDTH)*(`NUM_REG)*(`NUM_BLK)-1:0] psyndval_src; // ??? ???. ?????
  97. generate if(`FLAG == 1) begin
  98. assign psyndval_src = {psyndval_src_tmp};
  99. end endgenerate
  100. generate if(`FLAG == 0) begin
  101. assign psyndval_src = {psyndval_src_tmp, last_zeros};
  102. end endgenerate
  103. // con. ///
  104. // ??????????? ??????????? ?????????? ? ???????? ???????
  105. // ?????????? ?????? ? ???????
  106. sm_control_v3 #(
  107. .WIDTH(`WIDTH+1),
  108. .MOD_COUNT(`KES_DELAY_FOLD))
  109. label_kes( // ???? ????????
  110. .clk(clk), .rst(rst), .clk_ena(clk_ena),
  111. // control ///
  112. // slave
  113. .first(load), // ?????????? ???????? ? ???????? ??????? ??????? ?????
  114. .windows(windows),
  115. // master
  116. .last(pre_kes_master) // ?????????? ???????? ? ???? ???????? ???????
  117. );
  118. // ???????????? ??????? ?????????????
  119. a_dff #(.WIDTH(1)) label_aff_out_ena(
  120. .clk(clk), .aclr(rst), .ena(clk_ena),
  121. .data(pre_master),
  122. .q(
  123. pre_kes_master_tmp)
  124. ); //* /
  125. // ?????????? ??????????
  126. calc_control
  127. ccontr(
  128. .clk(clk), .rst(rst), .clk_ena(clk_ena_cont),
  129. // control /////
  130. .deltar(
  131. delta0r), // ??????? ???????
  132. .load(load),
  133. // out ///
  134. .deltarout(delta0r_tst),
  135. .gammar(gammar),
  136. .MCr(MCr)
  137. );
  138. assign rst_warrn = carry | load;
  139. counter_load_down_set #( // ?????????? ???????
  140. .MOD_COUNT(`NUM_REG),
  141. .WIDTH(`NUM_REG)) // ????? ? ???????, ??? ???? ?????
  142. label_cl(
  143. .clk(clk), .rst(rst),
  144. .clk_ena(clk_ena_calc),
  145. // control ///
  146. .load(
  147. rst_warrn),
  148. //carry), // ????????? ??????
  149. .set(pre_master),
  150. // out
  151. .carry(carry), // ???????? ????????
  152. // datastream ///
  153. .dfload(`NUM_REG-1) // data for loading
  154. );
  155. assign LCr = carry;
  156. // con. PE /// /// /// ///
  157. genvar bb; // ????????? ?????? ? ???????????? ????
  158. generate for(bb = 1; bb < `NUM_BLK+1 ; bb = bb+1) begin :asd
  159. assign pdelta_tmp[(bb)*(`BIG_DEL)-1:(bb-1)*(`BIG_DEL)] = bigdelta[(`NUM_BLK)-bb];
  160. end endgenerate
  161. generate for(bb = 1; bb < `NUM_BY+1; bb = bb+1) begin : asdf // ???????????? ????????
  162. assign pdelta[(bb)*(`WIDTH)-1:(bb-1)*(`WIDTH)] =
  163. pdelta_tmp[(`BIG_DEL)*(`NUM_BLK)-1-(bb-1)*(`WIDTH):(`BIG_DEL)*(`NUM_BLK)-(bb)*(`WIDTH)];
  164. end endgenerate
  165. PE_fold PE0_fold(
  166. .clk(clk), .rst(rst), .clk_ena(clk_ena_calc),
  167. // control
  168. .load(load), // ???????? ????????
  169. .MCr(MCr),
  170. .LCr(LCr),
  171. // dataflow ///
  172. .delta0r(delta0r), // ??????? ???????
  173. .gammar(gammar), //
  174. /////
  175. .deltaiir(
  176. intcon[0]),
  177. //deltaiir),
  178. .syndvali(
  179. psyndval_src[(`NUM_BLK)*((`WIDTH)*(`NUM_REG))-1:
  180. (`NUM_BLK-1)*(`WIDTH*(`NUM_REG))]), // ???????. ???? ?????????
  181. // out
  182. .deltair(deltair), // ?? ??????????? ?????? del0 ?? ????
  183. .bigdelta(bigdelta[0])
  184. );
  185. // ????. ??. ??.
  186. genvar g;
  187. generate for(g = 1; g < (`NUM_BLK-1); g = g+1) begin : adfas
  188. PE_fold
  189. PEj_fold(
  190. .clk(clk), .rst(rst), .clk_ena(clk_ena_calc),
  191. // control
  192. .load(load), // ???????? ????????
  193. .MCr(MCr),
  194. .LCr(LCr),
  195. // dataflow ///
  196. .delta0r(delta0r), // ??????? ???????
  197. .gammar(gammar), //
  198. /////////
  199. .deltaiir(
  200. intcon[g]),
  201. //deltaiir),
  202. .syndvali(
  203. psyndval_src[(`NUM_BLK-g)*((`WIDTH)*(`NUM_REG))-1:
  204. (`NUM_BLK-1-g)*(`WIDTH*(`NUM_REG))]),
  205. // out
  206. .deltair(
  207. intcon[g-1]), // ?? ??????????? ??????
  208. .bigdelta(bigdelta[g])
  209. );
  210. end endgenerate
  211. // ?????????
  212. PE_fold
  213. PE_last_fold(
  214. .clk(clk), .rst(rst), .clk_ena(clk_ena_calc),
  215. // control
  216. .load(load), // ???????? ????????
  217. .MCr(MCr),
  218. .LCr(LCr),
  219. // dataflow ///
  220. .delta0r(delta0r), // ??????? ???????
  221. .gammar(gammar), //
  222. /////////
  223. .deltaiir(0),
  224. .syndvali(
  225. psyndval_src[(`NUM_BLK-(`NUM_BLK-1))*((`WIDTH)*(`NUM_REG))-1:
  226. (`NUM_BLK-1-(`NUM_BLK-1))*(`WIDTH*(`NUM_REG))]),// ??????????????? ????????
  227. // out
  228. .deltair(intcon[(`NUM_BLK-1)-1]),
  229. /////
  230. .bigdelta(bigdelta[(`NUM_BLK-1)])
  231. );
  232. // ????. ???. ? ?????? ???????
  233. // out. and tst ///
  234. // ????????? ?????
  235. generate for(g = 1; g < `ST+1; g = g+1) begin : asdfg
  236. assign phomega_tmp[(g)*(`WIDTH)-1:(g-1)*(`WIDTH)] =
  237. pdelta[(g)*(`WIDTH)-1:(g-1)*(`WIDTH)];
  238. end endgenerate
  239. // latch homega
  240. a_dff #(.WIDTH(`KES_OUT_LAM)) label_homega(
  241. .clk(clk), .aclr(rst), .ena(pre_master),
  242. .data(phomega_tmp),
  243. .q(phomega));
  244. // ????????? ??????
  245. // c ???????
  246. generate for(g = 1; g < `ST+1+1; g = g+1) begin : qw
  247. assign plambda_tmp[(g)*(`WIDTH)-1:(g-1)*(`WIDTH)] =
  248. pdelta[(g+`ST)*(`WIDTH)-1:(g-1+`ST)*(`WIDTH)];
  249. zero_detect_owire_not // ??????? ??????? ????????
  250. label_not_zd(
  251. .in(pdelta[(g+`ST)*(`WIDTH)-1:(g-1+`ST)*(`WIDTH)]), //
  252. .out(scan_w[g-1])
  253. );
  254. end endgenerate
  255. pow_pol_8 // ??????????? ??????????
  256. label_pow_pol_8(
  257. // datastream ///
  258. .din(scan_w[`ST:1]),
  259. // out
  260. .dout(degree_tmp)
  261. );
  262. a_dff #(.WIDTH(`DEGREE_BUS)) label_aff_deg(
  263. .clk(clk), .aclr(rst), .ena(pre_master),
  264. .data(degree_tmp),
  265. .q(degree)); //* /
  266. // latch Lambda
  267. // ??????????? ? ???????? ????????
  268. a_dff #(.WIDTH(`KES_OUT_LAM)) label_plambda(
  269. .clk(clk), .aclr(rst), .ena(pre_master),
  270. .data(plambda_tmp),
  271. .q(
  272. plambda));
  273. //plambda_dnc));
  274. //assign plambda =
  275. //degree_tmp;
  276. //kes_slave;
  277. //delta0r;
  278. // ??????
  279. sm_control_v3 #(
  280. .WIDTH(`WIDTH+1),
  281. .MOD_COUNT(`SC_DELAY)
  282. )label_sm_full( // ???? ????????
  283. .clk(clk), .rst(rst), .clk_ena(clk_ena),
  284. // control ///
  285. // slave
  286. .first(kes_slave), // ?????????? ???????? ? ???????? ??????? ??????? ?????
  287. .windows(windows_tmp),
  288. // master
  289. .last(pre_kes_master_full) // ?????????? ???????? ? ???? ???????? ???????
  290. );
  291. // ???????????? ??????? ?????????????
  292. a_dff #(.WIDTH(1)) label_aff_out_ena_2(
  293. .clk(clk), .aclr(rst), .ena(clk_ena),
  294. .data(pre_kes_master_full),
  295. .q(kes_master)); //* /
  296. //assign kes_master =
  297. //LCr;
  298. //MCr;
  299. //pre_kes_master_tmp;
  300. endmodule
  301. /**
  302. deb. :
  303. `define POS 1//1*9+1+7
  304. assign degree =
  305. {4'b0,degree_tmp};
  306. //plambda[(`POS)*(`WIDTH)-1:(`POS-1)*(`WIDTH)];
  307. //phomega[(`POS)*(`WIDTH)-1:(`POS-1)*(`WIDTH)];
  308. */