SOGO論壇
  登入   註冊   找回密碼
查看: 1093|回覆: 0
列印 上一主題 下一主題

[技術文章] 低成本誤碼測試儀設計 [複製連結]

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-5-4 12:36:10 |只看該作者 |倒序瀏覽 | x 1
本帖最後由 alphi 於 2012-5-4 12:35 編輯

一、前言
  在通訊系統中常常需要使用誤碼測試儀來判斷通訊品質好壞,但是通常一台要價不便宜以太克的BERTScope BSA125C 就至少要四百萬台幣
   
  而便宜一點的Centellax TG1B1 也要八十 幾萬


  當然另一種常見方式就是自行使用FPGA去製作相關功能.這樣就必須花費許多技術成本.以我為例使用Xilinx Virtex-6 一顆就要30000~40000元台幣(使用Xilinx 是因為他已經有相關的Application Notes,只要花時間去修改跟增加功能).最後就是本文採用現有 IC達到功能.

  本文中採用Maxim DS2174 E-BERT(增強型誤碼測試),其特性如下:
   (a) 位元率(Bit rate)最高可達 155Mbps
   (b) 測式樣式(Test Pattern):PRBS1~PRBS32
   (c) 使用者自訂樣式(User Define Pattern): 512bytes= 4096bits
   (d) 誤碼計數器:48bit (以155Mbps進行測試可以量測時間為504小時:2^48/155Mbps=504hours)
   (e) 支援誤碼插入(Error Injection)

二、原理
     Function Diagram如下圖所示
     

三、實做
由於想要產生5Mbps~155Mbps,所以採用VCO Oscillator 比較不適合,所以採用SiLabs公司出產的Low Jitter 4Channel AnyClock IC:SI5338A
SI5338 產生LVPECL Clock 相關程式碼,使用ATMEL AVR ATMEGA128A MCU
  1. /*
  2.                SI5338 副程式
  3.                      使用ATMEL GCC Toolchain
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <math.h>

  8. #include "si5338.h"

  9. void SI5338_WriteData(uint8_t devid,uint8_t addr,uint8_t data)
  10. {
  11.         uint8_t status;
  12.         status=TWI_Start();
  13.         //_delay_ms(5);

  14.         status=TWI_Write(devid);
  15.         //_delay_ms(5);
  16.        
  17.         status=TWI_Write(addr);
  18.         _delay_ms(5);


  19.         status=TWI_Write(data);
  20.         //_delay_ms(5);
  21.        
  22.         status=TWI_Stop();
  23.         //_delay_ms(5);
  24. }




  25. void SI5338_Init(uint8_t devid)
  26. {
  27.         int16_t i;
  28.         struct SI5338_RegMap        SI5338_RegData[NUM_REGS_MAX] ={
  29.         {  0,0x00},
  30. {  1,0x00},
  31. {  2,0x00},
  32. {  3,0x00},
  33. {  4,0x00},
  34. {  5,0x00},
  35. {  6,0x08},
  36. {  7,0x00},
  37. {  8,0x70},
  38. {  9,0x0F},
  39. { 10,0x00},
  40. { 11,0x00},
  41. { 12,0x00},
  42. { 13,0x00},
  43. { 14,0x00},
  44. { 15,0x00},
  45. { 16,0x00},
  46. { 17,0x00},
  47. { 18,0x00},
  48. { 19,0x00},
  49. { 20,0x00},
  50. { 21,0x00},
  51. { 22,0x00},
  52. { 23,0x00},
  53. { 24,0x00},
  54. { 25,0x00},
  55. { 26,0x00},
  56. { 27,0x70},
  57. { 28,0x96},
  58. { 29,0x90},
  59. { 30,0xB0},
  60. { 31,0xC0},
  61. { 32,0xC0},
  62. { 33,0xC0},
  63. { 34,0xC0},
  64. { 35,0x00},
  65. { 36,0x04},
  66. { 37,0x04},
  67. { 38,0x04},
  68. { 39,0x04},
  69. { 40,0xEF},
  70. { 41,0x3D},
  71. { 42,0x2F},
  72. { 43,0x00},
  73. { 44,0x00},
  74. { 45,0x00},
  75. { 46,0x00},
  76. { 47,0x14},
  77. { 48,0x3A},
  78. { 49,0x00},
  79. { 50,0xC4},
  80. { 51,0x07},
  81. { 52,0x10},
  82. { 53,0x00},
  83. { 54,0x06},
  84. { 55,0x00},
  85. { 56,0x00},
  86. { 57,0x00},
  87. { 58,0x00},
  88. { 59,0x01},
  89. { 60,0x00},
  90. { 61,0x00},
  91. { 62,0x00},
  92. { 63,0x10},
  93. { 64,0x00},
  94. { 65,0x06},
  95. { 66,0x00},
  96. { 67,0x00},
  97. { 68,0x00},
  98. { 69,0x00},
  99. { 70,0x01},
  100. { 71,0x00},
  101. { 72,0x00},
  102. { 73,0x00},
  103. { 74,0x10},
  104. { 75,0x6F},
  105. { 76,0x05},
  106. { 77,0x74},
  107. { 78,0xC4},
  108. { 79,0x07},
  109. { 80,0x00},
  110. { 81,0xCD},
  111. { 82,0x15},
  112. { 83,0x04},
  113. { 84,0x00},
  114. { 85,0x10},
  115. { 86,0x5E},
  116. { 87,0x07},
  117. { 88,0xA8},
  118. { 89,0x80},
  119. { 90,0x00},
  120. { 91,0x00},
  121. { 92,0x85},
  122. { 93,0xCF},
  123. { 94,0x00},
  124. { 95,0x00},
  125. { 96,0x10},
  126. { 97,0xC4},
  127. { 98,0x2F},
  128. { 99,0xF0},
  129. {100,0x01},
  130. {101,0x00},
  131. {102,0x00},
  132. {103,0x71},
  133. {104,0x02},
  134. {105,0x00},
  135. {106,0x80},
  136. {107,0x00},
  137. {108,0x00},
  138. {109,0x00},
  139. {110,0x40},
  140. {111,0x00},
  141. {112,0x00},
  142. {113,0x00},
  143. {114,0x40},
  144. {115,0x00},
  145. {116,0x80},
  146. {117,0x00},
  147. {118,0x40},
  148. {119,0x00},
  149. {120,0x00},
  150. {121,0x00},
  151. {122,0x40},
  152. {123,0x00},
  153. {124,0x00},
  154. {125,0x00},
  155. {126,0x00},
  156. {127,0x00},
  157. {128,0x00},
  158. {129,0x00},
  159. {130,0x00},
  160. {131,0x00},
  161. {132,0x00},
  162. {133,0x00},
  163. {134,0x00},
  164. {135,0x00},
  165. {136,0x00},
  166. {137,0x00},
  167. {138,0x00},
  168. {139,0x00},
  169. {140,0x00},
  170. {141,0x00},
  171. {142,0x00},
  172. {143,0x00},
  173. {144,0x00},
  174. {145,0x00},
  175. {146,0xFF},
  176. {147,0x00},
  177. {148,0x00},
  178. {149,0x00},
  179. {150,0x00},
  180. {151,0x00},
  181. {152,0x00},
  182. {153,0x00},
  183. {154,0x00},
  184. {155,0x00},
  185. {156,0x00},
  186. {157,0x00},
  187. {158,0x00},
  188. {159,0x00},
  189. {160,0x00},
  190. {161,0x00},
  191. {162,0x00},
  192. {163,0x00},
  193. {164,0x00},
  194. {165,0x00},
  195. {166,0x00},
  196. {167,0x00},
  197. {168,0x00},
  198. {169,0x00},
  199. {170,0x00},
  200. {171,0x00},
  201. {172,0x00},
  202. {173,0x00},
  203. {174,0x00},
  204. {175,0x00},
  205. {176,0x00},
  206. {177,0x00},
  207. {178,0x00},
  208. {179,0x00},
  209. {180,0x00},
  210. {181,0x00},
  211. {182,0x00},
  212. {183,0x00},
  213. {184,0x00},
  214. {185,0x00},
  215. {186,0x00},
  216. {187,0x00},
  217. {188,0x00},
  218. {189,0x00},
  219. {190,0x00},
  220. {191,0x00},
  221. {192,0x00},
  222. {193,0x00},
  223. {194,0x00},
  224. {195,0x00},
  225. {196,0x00},
  226. {197,0x00},
  227. {198,0x00},
  228. {199,0x00},
  229. {200,0x00},
  230. {201,0x00},
  231. {202,0x00},
  232. {203,0x00},
  233. {204,0x00},
  234. {205,0x00},
  235. {206,0x00},
  236. {207,0x00},
  237. {208,0x00},
  238. {209,0x00},
  239. {210,0x00},
  240. {211,0x00},
  241. {212,0x00},
  242. {213,0x00},
  243. {214,0x00},
  244. {215,0x00},
  245. {216,0x00},
  246. {217,0x00},
  247. {218,0x00},
  248. {219,0x00},
  249. {220,0x00},
  250. {221,0x0D},
  251. {222,0x00},
  252. {223,0x00},
  253. {224,0xF4},
  254. {225,0xF0},
  255. {226,0x00},
  256. {227,0x00},
  257. {228,0x00},
  258. {229,0x00},
  259. {230,0x00},
  260. {231,0x00},
  261. {232,0x00},
  262. {233,0x00},
  263. {234,0x00},
  264. {235,0x00},
  265. {236,0x00},
  266. {237,0x00},
  267. {238,0x14},
  268. {239,0x00},
  269. {240,0x00},
  270. {241,0x65},
  271. {242,0x00},
  272. {243,0xF0},
  273. {244,0x00},
  274. {245,0x00},
  275. {246,0x00},
  276. {247,0x00},
  277. {248,0x00},
  278. {249,0xA8},
  279. {250,0x00},
  280. {251,0x84},
  281. {252,0x00},
  282. {253,0x00},
  283. {254,0x00},
  284. {255,1},
  285. {  0,0x00},
  286. {  1,0x00},
  287. {  2,0x00},
  288. {  3,0x00},
  289. {  4,0x00},
  290. {  5,0x00},
  291. {  6,0x00},
  292. {  7,0x00},
  293. {  8,0x00},
  294. {  9,0x00},
  295. { 10,0x00},
  296. { 11,0x00},
  297. { 12,0x00},
  298. { 13,0x00},
  299. { 14,0x00},
  300. { 15,0x00},
  301. { 16,0x00},
  302. { 17,0x01},
  303. { 18,0x00},
  304. { 19,0x00},
  305. { 20,0x90},
  306. { 21,0x31},
  307. { 22,0x00},
  308. { 23,0x00},
  309. { 24,0x01},
  310. { 25,0x00},
  311. { 26,0x00},
  312. { 27,0x00},
  313. { 28,0x00},
  314. { 29,0x00},
  315. { 30,0x00},
  316. { 31,0x00},
  317. { 32,0x00},
  318. { 33,0x01},
  319. { 34,0x00},
  320. { 35,0x00},
  321. { 36,0x90},
  322. { 37,0x31},
  323. { 38,0x00},
  324. { 39,0x00},
  325. { 40,0x01},
  326. { 41,0x00},
  327. { 42,0x00},
  328. { 43,0x00},
  329. { 44,0x00},
  330. { 45,0x00},
  331. { 46,0x00},
  332. { 47,0x00},
  333. { 48,0x00},
  334. { 49,0x01},
  335. { 50,0x00},
  336. { 51,0x00},
  337. { 52,0x90},
  338. { 53,0x31},
  339. { 54,0x00},
  340. { 55,0x00},
  341. { 56,0x01},
  342. { 57,0x00},
  343. { 58,0x00},
  344. { 59,0x00},
  345. { 60,0x00},
  346. { 61,0x00},
  347. { 62,0x00},
  348. { 63,0x00},
  349. { 64,0x00},
  350. { 65,0x01},
  351. { 66,0x00},
  352. { 67,0x00},
  353. { 68,0x90},
  354. { 69,0x31},
  355. { 70,0x00},
  356. { 71,0x00},
  357. { 72,0x01},
  358. { 73,0x00},
  359. { 74,0x00},
  360. { 75,0x00},
  361. { 76,0x00},
  362. { 77,0x00},
  363. { 78,0x00},
  364. { 79,0x00},
  365. { 80,0x00},
  366. { 81,0x00},
  367. { 82,0x00},
  368. { 83,0x00},
  369. { 84,0x90},
  370. { 85,0x31},
  371. { 86,0x00},
  372. { 87,0x00},
  373. { 88,0x01},
  374. { 89,0x00},
  375. { 90,0x00},
  376. { 91,0x00},
  377. { 92,0x00},
  378. { 93,0x00},
  379. { 94,0x00},
  380. {255,0},
  381. {246,2}};



  382.         for(i=0;i<NUM_REGS_MAX;i++)
  383.         {
  384.                 SI5338_WriteData(devid,SI5338_RegData[i].Reg_Addr,SI5338_RegData[i].Reg_Val);
  385.                 //_delay_ms(5);
  386.         }
  387.        
  388. }
  389. void SI5338_SetDatarate(uint8_t devid,float datarate)
  390. {
  391.         struct SI5338_RegMap SI5338_RegData[21];
  392.         struct SI5338_clock_Setting Clock_set;

  393.         float refclock=159.25248/(datarate+0.12);
  394.        
  395.        
  396.         uint32_t Res=100000;
  397.         uint32_t A=16;
  398.         uint32_t B=0;
  399.         uint32_t C=1;
  400.         uint32_t INT;
  401.         uint32_t DEC;
  402.         uint32_t NUM;
  403.         uint16_t i;

  404.         A=(uint32_t)refclock;
  405.         B=(uint32_t)((refclock-A)*(float)Res);
  406.         C=Res;

  407.         //FreqOut=2488.32/(float)A+(float)B/(float)C);
  408.         INT=floor(128.0*(A*C+B)/C-512);
  409.         NUM=(((128.0*((double)A*(double)C+(double)B)/(double)C)-floor(128.0*((double)A*(double)C+(double)B)/(double)C))*(double)C);
  410.         DEC=C;
  411.         NUM<<=2;

  412.         Clock_set.INT_R2=(INT & 0xff);
  413.         Clock_set.INT_R1=(INT>>=8 & 0xff);
  414.         Clock_set.INT_R0=(INT>>=8 & 0xff);
  415.        
  416.         Clock_set.NUM_R3=(NUM & 0xff);
  417.         Clock_set.NUM_R2=(NUM>>=8 & 0xff);
  418.         Clock_set.NUM_R1=(NUM>>=8 & 0xff);
  419.         Clock_set.NUM_R0=(NUM>>=8 & 0xff);
  420.        
  421.         Clock_set.DEC_R3=(DEC & 0xff);
  422.         Clock_set.DEC_R2=(DEC>>=8 & 0xff);
  423.         Clock_set.DEC_R1=(DEC>>=8 & 0xff);
  424.         Clock_set.DEC_R0=(DEC>>=8 & 0xff);

  425.         /*
  426.                         Refernce Clock M0
  427.         */
  428.         //INT
  429.         SI5338_RegData[0].Reg_Addr=53;
  430.         SI5338_RegData[0].Reg_Val=Clock_set.INT_R2;
  431.        
  432.         SI5338_RegData[1].Reg_Addr=54;
  433.         SI5338_RegData[1].Reg_Val=Clock_set.INT_R1;
  434.        

  435.         //NUM
  436.         SI5338_RegData[2].Reg_Addr=55;
  437.         SI5338_RegData[2].Reg_Val=Clock_set.NUM_R3|Clock_set.INT_R0;
  438.        
  439.         SI5338_RegData[3].Reg_Addr=56;
  440.         SI5338_RegData[3].Reg_Val=Clock_set.NUM_R2;
  441.        
  442.         SI5338_RegData[4].Reg_Addr=57;
  443.         SI5338_RegData[4].Reg_Val=Clock_set.NUM_R1;
  444.        
  445.         SI5338_RegData[5].Reg_Addr=58;
  446.         SI5338_RegData[5].Reg_Val=Clock_set.NUM_R0;

  447.         //DEN
  448.         SI5338_RegData[6].Reg_Addr=59;
  449.         SI5338_RegData[6].Reg_Val=Clock_set.DEC_R3;
  450.        
  451.         SI5338_RegData[7].Reg_Addr=60;
  452.         SI5338_RegData[7].Reg_Val=Clock_set.DEC_R2;

  453.         SI5338_RegData[8].Reg_Addr=61;
  454.         SI5338_RegData[8].Reg_Val=Clock_set.DEC_R1;

  455.         SI5338_RegData[9].Reg_Addr=62;
  456.         SI5338_RegData[9].Reg_Val=Clock_set.DEC_R0;


  457.         /*
  458.                         Refernce Clock M1
  459.         */

  460.         //INT
  461.         SI5338_RegData[10].Reg_Addr=64;
  462.         SI5338_RegData[10].Reg_Val=Clock_set.INT_R2;

  463.         SI5338_RegData[11].Reg_Addr=65;
  464.         SI5338_RegData[11].Reg_Val=Clock_set.INT_R1;

  465.         //SI5338_RegData[12].Reg_Addr=66;
  466.         //SI5338_RegData[12].Reg_Val=Clock_set.INT_R0;

  467.         //NUM
  468.         SI5338_RegData[12].Reg_Addr=66;
  469.         SI5338_RegData[12].Reg_Val=Clock_set.NUM_R3|Clock_set.INT_R0;

  470.         SI5338_RegData[13].Reg_Addr=67;
  471.         SI5338_RegData[13].Reg_Val=Clock_set.NUM_R2;

  472.         SI5338_RegData[14].Reg_Addr=68;
  473.         SI5338_RegData[14].Reg_Val=Clock_set.NUM_R1;

  474.         SI5338_RegData[15].Reg_Addr=69;
  475.         SI5338_RegData[15].Reg_Val=Clock_set.NUM_R0;

  476.         //DEN
  477.         SI5338_RegData[16].Reg_Addr=70;
  478.         SI5338_RegData[16].Reg_Val=Clock_set.DEC_R3;

  479.         SI5338_RegData[17].Reg_Addr=71;
  480.         SI5338_RegData[17].Reg_Val=Clock_set.DEC_R2;

  481.         SI5338_RegData[18].Reg_Addr=72;
  482.         SI5338_RegData[18].Reg_Val=Clock_set.DEC_R1;

  483.         SI5338_RegData[19].Reg_Addr=73;
  484.         SI5338_RegData[19].Reg_Val=Clock_set.DEC_R0;

  485.         SI5338_RegData[20].Reg_Addr=246;
  486.         SI5338_RegData[20].Reg_Val=2;
  487.    for(i=0;i<21;i++)
  488.                 SI5338_WriteData(devid,SI5338_RegData[i].Reg_Addr,SI5338_RegData[i].Reg_Val);
  489. }
複製代碼
Maxim DS2174 部分程式控制碼
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay>

  4. #define EBERT_ENABLE()  (PORTF&=~(1<<0))
  5. #define EBETT_DISABLE() (PORTF|=(1<<0))

  6. #define RD_ENABLE()     (PORTF&=~(1<<1))
  7. #define RD_DISABLE()    (PORTF|=(1<<1))

  8. #define WR_ENABLE()     (PORTF&=~(1<<2))
  9. #define WR_DISABLE()    (PORTF|=(1<<2))

  10. void EBERT_WriteData(unsigned char reg,unsigned char data)
  11. {
  12.     EBERT_ENABLE();
  13.     WR_ENABLE();
  14.     PORTA=(reg & 0x0F); //4bit暫存器位址
  15.     PORTD=data;         //8bit資料
  16.     WR_DISABLE();
  17.     EBERT_DISABLE();
  18. }
  19. unsigned char EBERT_ReadData(unsigned char reg)
  20. {
  21.     unsigned data;
  22.     EBERT_ENABLE();
  23.     RD_ENABLE();
  24.     PORTA=(reg & 0x0F); //4bit暫存器位址
  25.     data=PINE;         //8bit資料
  26.     RD_DISABLE();
  27.     EBERT_DISABLE();
  28.    
  29.     return data;
  30. }
  31. void EBERT_Init(void)
  32. {
  33.     BERT_WriteData(0x00,0x00); //Auto Resync,Pesudo Random Binrary Sequence
  34.     BERT_WriteData(0x01,0x00); //Bit Mode,No Error Bit Inject
  35.     BERT_WriteData(0x02,0x00); //No Error
  36.     BERT_WriteData(0x03,0xFF); //Pattern Length
  37.     BERT_WriteData(0x04,0x0C);
  38.    
  39. }
  40. unsigned long long int EBERT_GetErrorCount(void)
  41. {
  42.     unisnged long long int ErrorCount=0;
  43.    
  44.     ErrorCount|=EBERT_ReadData(0x0A);
  45.     ErrorCount|=EBERT_ReadData(0x0B)<<8;
  46.     ErrorCount|=EBERT_ReadData(0x0C)<<16;
  47.     ErrorCount|=EBERT_ReadData(0x0D)<<24;
  48.     ErrorCount|=EBERT_ReadData(0x0E)<<32;
  49.     ErrorCount|=EBERT_ReadData(0x0F)<<40;
  50.    
  51.     return ErrorCount;
  52. }
複製代碼
四、測試波型
已有 1 人評分威望 收起 理由
又靜 + 1 您發表的文章內容豐富,無私分享造福眾人,.

總評分: 威望 + 1   查看全部評分

喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

失敗只有一種:那就是半途而廢
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2025-5-14 22:14

© 2004-2025 SOGO論壇 OURSOGO.COM
回頂部