本帖最後由 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- /*
- SI5338 副程式
- 使用ATMEL GCC Toolchain
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include "si5338.h"
- void SI5338_WriteData(uint8_t devid,uint8_t addr,uint8_t data)
- {
- uint8_t status;
- status=TWI_Start();
- //_delay_ms(5);
- status=TWI_Write(devid);
- //_delay_ms(5);
-
- status=TWI_Write(addr);
- _delay_ms(5);
- status=TWI_Write(data);
- //_delay_ms(5);
-
- status=TWI_Stop();
- //_delay_ms(5);
- }
- void SI5338_Init(uint8_t devid)
- {
- int16_t i;
- struct SI5338_RegMap SI5338_RegData[NUM_REGS_MAX] ={
- { 0,0x00},
- { 1,0x00},
- { 2,0x00},
- { 3,0x00},
- { 4,0x00},
- { 5,0x00},
- { 6,0x08},
- { 7,0x00},
- { 8,0x70},
- { 9,0x0F},
- { 10,0x00},
- { 11,0x00},
- { 12,0x00},
- { 13,0x00},
- { 14,0x00},
- { 15,0x00},
- { 16,0x00},
- { 17,0x00},
- { 18,0x00},
- { 19,0x00},
- { 20,0x00},
- { 21,0x00},
- { 22,0x00},
- { 23,0x00},
- { 24,0x00},
- { 25,0x00},
- { 26,0x00},
- { 27,0x70},
- { 28,0x96},
- { 29,0x90},
- { 30,0xB0},
- { 31,0xC0},
- { 32,0xC0},
- { 33,0xC0},
- { 34,0xC0},
- { 35,0x00},
- { 36,0x04},
- { 37,0x04},
- { 38,0x04},
- { 39,0x04},
- { 40,0xEF},
- { 41,0x3D},
- { 42,0x2F},
- { 43,0x00},
- { 44,0x00},
- { 45,0x00},
- { 46,0x00},
- { 47,0x14},
- { 48,0x3A},
- { 49,0x00},
- { 50,0xC4},
- { 51,0x07},
- { 52,0x10},
- { 53,0x00},
- { 54,0x06},
- { 55,0x00},
- { 56,0x00},
- { 57,0x00},
- { 58,0x00},
- { 59,0x01},
- { 60,0x00},
- { 61,0x00},
- { 62,0x00},
- { 63,0x10},
- { 64,0x00},
- { 65,0x06},
- { 66,0x00},
- { 67,0x00},
- { 68,0x00},
- { 69,0x00},
- { 70,0x01},
- { 71,0x00},
- { 72,0x00},
- { 73,0x00},
- { 74,0x10},
- { 75,0x6F},
- { 76,0x05},
- { 77,0x74},
- { 78,0xC4},
- { 79,0x07},
- { 80,0x00},
- { 81,0xCD},
- { 82,0x15},
- { 83,0x04},
- { 84,0x00},
- { 85,0x10},
- { 86,0x5E},
- { 87,0x07},
- { 88,0xA8},
- { 89,0x80},
- { 90,0x00},
- { 91,0x00},
- { 92,0x85},
- { 93,0xCF},
- { 94,0x00},
- { 95,0x00},
- { 96,0x10},
- { 97,0xC4},
- { 98,0x2F},
- { 99,0xF0},
- {100,0x01},
- {101,0x00},
- {102,0x00},
- {103,0x71},
- {104,0x02},
- {105,0x00},
- {106,0x80},
- {107,0x00},
- {108,0x00},
- {109,0x00},
- {110,0x40},
- {111,0x00},
- {112,0x00},
- {113,0x00},
- {114,0x40},
- {115,0x00},
- {116,0x80},
- {117,0x00},
- {118,0x40},
- {119,0x00},
- {120,0x00},
- {121,0x00},
- {122,0x40},
- {123,0x00},
- {124,0x00},
- {125,0x00},
- {126,0x00},
- {127,0x00},
- {128,0x00},
- {129,0x00},
- {130,0x00},
- {131,0x00},
- {132,0x00},
- {133,0x00},
- {134,0x00},
- {135,0x00},
- {136,0x00},
- {137,0x00},
- {138,0x00},
- {139,0x00},
- {140,0x00},
- {141,0x00},
- {142,0x00},
- {143,0x00},
- {144,0x00},
- {145,0x00},
- {146,0xFF},
- {147,0x00},
- {148,0x00},
- {149,0x00},
- {150,0x00},
- {151,0x00},
- {152,0x00},
- {153,0x00},
- {154,0x00},
- {155,0x00},
- {156,0x00},
- {157,0x00},
- {158,0x00},
- {159,0x00},
- {160,0x00},
- {161,0x00},
- {162,0x00},
- {163,0x00},
- {164,0x00},
- {165,0x00},
- {166,0x00},
- {167,0x00},
- {168,0x00},
- {169,0x00},
- {170,0x00},
- {171,0x00},
- {172,0x00},
- {173,0x00},
- {174,0x00},
- {175,0x00},
- {176,0x00},
- {177,0x00},
- {178,0x00},
- {179,0x00},
- {180,0x00},
- {181,0x00},
- {182,0x00},
- {183,0x00},
- {184,0x00},
- {185,0x00},
- {186,0x00},
- {187,0x00},
- {188,0x00},
- {189,0x00},
- {190,0x00},
- {191,0x00},
- {192,0x00},
- {193,0x00},
- {194,0x00},
- {195,0x00},
- {196,0x00},
- {197,0x00},
- {198,0x00},
- {199,0x00},
- {200,0x00},
- {201,0x00},
- {202,0x00},
- {203,0x00},
- {204,0x00},
- {205,0x00},
- {206,0x00},
- {207,0x00},
- {208,0x00},
- {209,0x00},
- {210,0x00},
- {211,0x00},
- {212,0x00},
- {213,0x00},
- {214,0x00},
- {215,0x00},
- {216,0x00},
- {217,0x00},
- {218,0x00},
- {219,0x00},
- {220,0x00},
- {221,0x0D},
- {222,0x00},
- {223,0x00},
- {224,0xF4},
- {225,0xF0},
- {226,0x00},
- {227,0x00},
- {228,0x00},
- {229,0x00},
- {230,0x00},
- {231,0x00},
- {232,0x00},
- {233,0x00},
- {234,0x00},
- {235,0x00},
- {236,0x00},
- {237,0x00},
- {238,0x14},
- {239,0x00},
- {240,0x00},
- {241,0x65},
- {242,0x00},
- {243,0xF0},
- {244,0x00},
- {245,0x00},
- {246,0x00},
- {247,0x00},
- {248,0x00},
- {249,0xA8},
- {250,0x00},
- {251,0x84},
- {252,0x00},
- {253,0x00},
- {254,0x00},
- {255,1},
- { 0,0x00},
- { 1,0x00},
- { 2,0x00},
- { 3,0x00},
- { 4,0x00},
- { 5,0x00},
- { 6,0x00},
- { 7,0x00},
- { 8,0x00},
- { 9,0x00},
- { 10,0x00},
- { 11,0x00},
- { 12,0x00},
- { 13,0x00},
- { 14,0x00},
- { 15,0x00},
- { 16,0x00},
- { 17,0x01},
- { 18,0x00},
- { 19,0x00},
- { 20,0x90},
- { 21,0x31},
- { 22,0x00},
- { 23,0x00},
- { 24,0x01},
- { 25,0x00},
- { 26,0x00},
- { 27,0x00},
- { 28,0x00},
- { 29,0x00},
- { 30,0x00},
- { 31,0x00},
- { 32,0x00},
- { 33,0x01},
- { 34,0x00},
- { 35,0x00},
- { 36,0x90},
- { 37,0x31},
- { 38,0x00},
- { 39,0x00},
- { 40,0x01},
- { 41,0x00},
- { 42,0x00},
- { 43,0x00},
- { 44,0x00},
- { 45,0x00},
- { 46,0x00},
- { 47,0x00},
- { 48,0x00},
- { 49,0x01},
- { 50,0x00},
- { 51,0x00},
- { 52,0x90},
- { 53,0x31},
- { 54,0x00},
- { 55,0x00},
- { 56,0x01},
- { 57,0x00},
- { 58,0x00},
- { 59,0x00},
- { 60,0x00},
- { 61,0x00},
- { 62,0x00},
- { 63,0x00},
- { 64,0x00},
- { 65,0x01},
- { 66,0x00},
- { 67,0x00},
- { 68,0x90},
- { 69,0x31},
- { 70,0x00},
- { 71,0x00},
- { 72,0x01},
- { 73,0x00},
- { 74,0x00},
- { 75,0x00},
- { 76,0x00},
- { 77,0x00},
- { 78,0x00},
- { 79,0x00},
- { 80,0x00},
- { 81,0x00},
- { 82,0x00},
- { 83,0x00},
- { 84,0x90},
- { 85,0x31},
- { 86,0x00},
- { 87,0x00},
- { 88,0x01},
- { 89,0x00},
- { 90,0x00},
- { 91,0x00},
- { 92,0x00},
- { 93,0x00},
- { 94,0x00},
- {255,0},
- {246,2}};
- for(i=0;i<NUM_REGS_MAX;i++)
- {
- SI5338_WriteData(devid,SI5338_RegData[i].Reg_Addr,SI5338_RegData[i].Reg_Val);
- //_delay_ms(5);
- }
-
- }
- void SI5338_SetDatarate(uint8_t devid,float datarate)
- {
- struct SI5338_RegMap SI5338_RegData[21];
- struct SI5338_clock_Setting Clock_set;
- float refclock=159.25248/(datarate+0.12);
-
-
- uint32_t Res=100000;
- uint32_t A=16;
- uint32_t B=0;
- uint32_t C=1;
- uint32_t INT;
- uint32_t DEC;
- uint32_t NUM;
- uint16_t i;
- A=(uint32_t)refclock;
- B=(uint32_t)((refclock-A)*(float)Res);
- C=Res;
- //FreqOut=2488.32/(float)A+(float)B/(float)C);
- INT=floor(128.0*(A*C+B)/C-512);
- NUM=(((128.0*((double)A*(double)C+(double)B)/(double)C)-floor(128.0*((double)A*(double)C+(double)B)/(double)C))*(double)C);
- DEC=C;
- NUM<<=2;
- Clock_set.INT_R2=(INT & 0xff);
- Clock_set.INT_R1=(INT>>=8 & 0xff);
- Clock_set.INT_R0=(INT>>=8 & 0xff);
-
- Clock_set.NUM_R3=(NUM & 0xff);
- Clock_set.NUM_R2=(NUM>>=8 & 0xff);
- Clock_set.NUM_R1=(NUM>>=8 & 0xff);
- Clock_set.NUM_R0=(NUM>>=8 & 0xff);
-
- Clock_set.DEC_R3=(DEC & 0xff);
- Clock_set.DEC_R2=(DEC>>=8 & 0xff);
- Clock_set.DEC_R1=(DEC>>=8 & 0xff);
- Clock_set.DEC_R0=(DEC>>=8 & 0xff);
- /*
- Refernce Clock M0
- */
- //INT
- SI5338_RegData[0].Reg_Addr=53;
- SI5338_RegData[0].Reg_Val=Clock_set.INT_R2;
-
- SI5338_RegData[1].Reg_Addr=54;
- SI5338_RegData[1].Reg_Val=Clock_set.INT_R1;
-
- //NUM
- SI5338_RegData[2].Reg_Addr=55;
- SI5338_RegData[2].Reg_Val=Clock_set.NUM_R3|Clock_set.INT_R0;
-
- SI5338_RegData[3].Reg_Addr=56;
- SI5338_RegData[3].Reg_Val=Clock_set.NUM_R2;
-
- SI5338_RegData[4].Reg_Addr=57;
- SI5338_RegData[4].Reg_Val=Clock_set.NUM_R1;
-
- SI5338_RegData[5].Reg_Addr=58;
- SI5338_RegData[5].Reg_Val=Clock_set.NUM_R0;
- //DEN
- SI5338_RegData[6].Reg_Addr=59;
- SI5338_RegData[6].Reg_Val=Clock_set.DEC_R3;
-
- SI5338_RegData[7].Reg_Addr=60;
- SI5338_RegData[7].Reg_Val=Clock_set.DEC_R2;
- SI5338_RegData[8].Reg_Addr=61;
- SI5338_RegData[8].Reg_Val=Clock_set.DEC_R1;
- SI5338_RegData[9].Reg_Addr=62;
- SI5338_RegData[9].Reg_Val=Clock_set.DEC_R0;
- /*
- Refernce Clock M1
- */
- //INT
- SI5338_RegData[10].Reg_Addr=64;
- SI5338_RegData[10].Reg_Val=Clock_set.INT_R2;
- SI5338_RegData[11].Reg_Addr=65;
- SI5338_RegData[11].Reg_Val=Clock_set.INT_R1;
- //SI5338_RegData[12].Reg_Addr=66;
- //SI5338_RegData[12].Reg_Val=Clock_set.INT_R0;
- //NUM
- SI5338_RegData[12].Reg_Addr=66;
- SI5338_RegData[12].Reg_Val=Clock_set.NUM_R3|Clock_set.INT_R0;
- SI5338_RegData[13].Reg_Addr=67;
- SI5338_RegData[13].Reg_Val=Clock_set.NUM_R2;
- SI5338_RegData[14].Reg_Addr=68;
- SI5338_RegData[14].Reg_Val=Clock_set.NUM_R1;
- SI5338_RegData[15].Reg_Addr=69;
- SI5338_RegData[15].Reg_Val=Clock_set.NUM_R0;
- //DEN
- SI5338_RegData[16].Reg_Addr=70;
- SI5338_RegData[16].Reg_Val=Clock_set.DEC_R3;
- SI5338_RegData[17].Reg_Addr=71;
- SI5338_RegData[17].Reg_Val=Clock_set.DEC_R2;
- SI5338_RegData[18].Reg_Addr=72;
- SI5338_RegData[18].Reg_Val=Clock_set.DEC_R1;
- SI5338_RegData[19].Reg_Addr=73;
- SI5338_RegData[19].Reg_Val=Clock_set.DEC_R0;
- SI5338_RegData[20].Reg_Addr=246;
- SI5338_RegData[20].Reg_Val=2;
- for(i=0;i<21;i++)
- SI5338_WriteData(devid,SI5338_RegData[i].Reg_Addr,SI5338_RegData[i].Reg_Val);
- }
複製代碼 Maxim DS2174 部分程式控制碼- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay>
- #define EBERT_ENABLE() (PORTF&=~(1<<0))
- #define EBETT_DISABLE() (PORTF|=(1<<0))
- #define RD_ENABLE() (PORTF&=~(1<<1))
- #define RD_DISABLE() (PORTF|=(1<<1))
- #define WR_ENABLE() (PORTF&=~(1<<2))
- #define WR_DISABLE() (PORTF|=(1<<2))
- void EBERT_WriteData(unsigned char reg,unsigned char data)
- {
- EBERT_ENABLE();
- WR_ENABLE();
- PORTA=(reg & 0x0F); //4bit暫存器位址
- PORTD=data; //8bit資料
- WR_DISABLE();
- EBERT_DISABLE();
- }
- unsigned char EBERT_ReadData(unsigned char reg)
- {
- unsigned data;
- EBERT_ENABLE();
- RD_ENABLE();
- PORTA=(reg & 0x0F); //4bit暫存器位址
- data=PINE; //8bit資料
- RD_DISABLE();
- EBERT_DISABLE();
-
- return data;
- }
- void EBERT_Init(void)
- {
- BERT_WriteData(0x00,0x00); //Auto Resync,Pesudo Random Binrary Sequence
- BERT_WriteData(0x01,0x00); //Bit Mode,No Error Bit Inject
- BERT_WriteData(0x02,0x00); //No Error
- BERT_WriteData(0x03,0xFF); //Pattern Length
- BERT_WriteData(0x04,0x0C);
-
- }
- unsigned long long int EBERT_GetErrorCount(void)
- {
- unisnged long long int ErrorCount=0;
-
- ErrorCount|=EBERT_ReadData(0x0A);
- ErrorCount|=EBERT_ReadData(0x0B)<<8;
- ErrorCount|=EBERT_ReadData(0x0C)<<16;
- ErrorCount|=EBERT_ReadData(0x0D)<<24;
- ErrorCount|=EBERT_ReadData(0x0E)<<32;
- ErrorCount|=EBERT_ReadData(0x0F)<<40;
-
- return ErrorCount;
- }
複製代碼 四、測試波型
|