银月
E1编码译码

E1编码译码

E1编码译码

E1结构

时钟2.048M,每秒有2.048M Bit,每秒有8000帧,每帧256Bit,每帧有32个时隙,每个时隙8Bit。

TS0 – TS31:
TS0用作帧同步用,8BIT一般为CRC+固定BIT。
TS16用来传输信令。
TS1-TS15,TS17-TS31共30个时隙用来传递话路,每路的带宽 8*8000 = 64K

32个隙,32路,其中2路传输专用信息,剩下30路用来传数据。
每路传输带宽:8(每帧中的每个时隙是8BIT)* 8000(每秒8000帧) = 64K

E1有成帧、成复帧、不成帧三种方式。

成帧:第0时隙用于传输帧同步数据,其余31个时隙用于传输有效数据。

成复帧:除了0时隙外,第16时隙是用于传输命令的,只有第1到第15,第17到第31共30个时隙用于传输有效数据;

不成帧:所有32个时隙都可用于传输有效数据。

TS0传送帧定位信号,用于帧同步。
TS16传送复帧定位信号,用于复帧同步。
所以我们现在做的E1算是成帧结构,没有成复帧,因为我们没有用到16时隙。

感觉成帧和成复帧区别不大,成帧也是0时隙交替发FAS(带同步码),NFAS(不带同步码)帧,成复帧也是,根据这个是完全可以识别0-16帧的。

复帧结构

16个帧构成1个复帧,前8帧称为SMF I,后8帧称为SMF II,
每个SMF长度为256 * 8 = 2048 bit 时长 1/2.048M * 2048 = 1ms,1个复帧时长2ms.

0,2,4,6…..帧叫偶帧(even),带了帧同步信号,带了帧同步信号的帧又叫FAS帧。

1,3,5,7,….帧叫奇帧(odd),不带帧同步信号,不带帧同步信号的帧又叫NFAS帧。

偶数帧里的 0011011,叫做帧同步码。

奇数帧第0BIT组成的001011叫做复帧同步码。

我们称TS1至TS15和TS17至TS31为“净荷”,TS0和TS16为“开销”。

复帧同步结构

1.偶数帧的TS0,帧同步码0011011。

2.奇数帧的TS0,非帧同步码。

3.奇数帧的TS0的BIT0,6个BIT0,001011,CRC复帧同步码。

4.复帧同步码:第0帧的TS16,前4比特为0000(代码里并没有去这样实现)

虽然代码里没有在TS16里实现复帧同步码,但是实现奇数帧里的复帧同步码,所以依据这个也是可以解出复帧的,可以识别0-16帧的。

E1 SSM字节

SSM字节代表时钟等级信息,可以通过SA4这个BIT来承载,也可以通过SA5 ….SA8来承载。
所以在发送的时候,是可以配置通过哪个比特来承载的。

E1编码

复帧计数

//[2:0]:每个时隙8个BIT
//[7:3]:每帧32个时隙
//[11:8]:每个复帧16帧
always @(posedge clk_sys or negedge rst_n)
begin
    if(rst_n == 1'b0)
        cnt <= 12'h0    ;
    else 
        cnt <=#U_DLY cnt + 12'h1    ;
end

帧同步码

always @(posedge clk_sys)
begin
    if(cnt[2:0] == 3'h0)
        frame_sync_data <=#U_DLY 8'b00011011    ;
    else
        frame_sync_data <=#U_DLY {frame_sync_data[6:0],1'b0}  ;
end

复帧同步码

always @(posedge clk_sys)
begin
    if(bit0_flg == 1'b1)
    begin
        if(ts0_flg == 1'b1)
        begin
            if(frame0_flg == 1'b1)
                frames_sync_data <=#U_DLY 8'b00101111   ;
            else if(even_flg == 1'b1)
                frames_sync_data <=#U_DLY {frames_sync_data[6:0],1'b0};
            else
                ;
        end
        else
            ;
    end
    else
        ;
end

always @(posedge clk_sys)
begin
    if(even_flg == 1'b1)
    begin
        if((bit1_flg == 1'b1)&&(ts0_flg == 1'b1))
        begin
            case(cnt_1dly[11:9])
                3'h0:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[3],ssm_code[3],ssm_code[3],ssm_code[3],ssm_code[3]};
                end
                3'h1:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[2],ssm_code[2],ssm_code[2],ssm_code[2],ssm_code[2]};
                end
                3'h2:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[1],ssm_code[1],ssm_code[1],ssm_code[1],ssm_code[1]};
                end
                3'h3:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[0],ssm_code[0],ssm_code[0],ssm_code[0],ssm_code[0]};
                end
                3'h4:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[3],ssm_code[3],ssm_code[3],ssm_code[3],ssm_code[3]};
                end
                3'h5:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[2],ssm_code[2],ssm_code[2],ssm_code[2],ssm_code[2]};
                end
                3'h6:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[1],ssm_code[1],ssm_code[1],ssm_code[1],ssm_code[1]};
                end
                3'h7:
                begin
                    odd_data <=#U_DLY {frames_sync_data[7],1'b1,1'b0,ssm_code[0],ssm_code[0],ssm_code[0],ssm_code[0],ssm_code[0]};
                end
                default:
                begin
                    odd_data <=#U_DLY 8'h0  ;
                end
            endcase
        end
        else
            ;
    end
    else
        odd_data <=#U_DLY {odd_data[6:0],1'b0};
end

crc4

always @(posedge clk_sys)
begin
    if((cnt[8:0] == 9'h2)&&(cnt[10:9] == 2'h0))
    begin
        crc4_reg[3] <=#U_DLY 1'b0 ^ e1_out_pre  ;
        crc4_reg[2] <=#U_DLY (1'b0 ^ e1_out_pre) ^ 1'b0  ;
        crc4_reg[1] <=#U_DLY 1'b0 ;
        crc4_reg[0] <=#U_DLY 1'b0 ;
    end
    else
    begin
        crc4_reg[3] <=#U_DLY crc4_reg[0] ^ e1_out_pre   ;
        crc4_reg[2] <=#U_DLY (crc4_reg[0] ^ e1_out_pre) ^ crc4_reg[3]  ;
        crc4_reg[1] <=#U_DLY crc4_reg[2] ;
        crc4_reg[0] <=#U_DLY crc4_reg[1] ;
    end
end

E1译码

帧同步信号

always @(posedge clk_200m or negedge rst_n) begin
    if(!rst_n)
        frame_sync <=#U_DLY 0; 
    else if(temp_reg0[6:0] == 7'b0011011)
        frame_sync <=#U_DLY 1;
    else
        frame_sync <=#U_DLY 0;   
end

复帧同步信号

case(sync_state)
    5'd0:begin
        cnt0       <=#U_DLY 9'd0;
        sync_state <=#U_DLY 5'd1;
    end

    5'd1:begin
        if(frame_sync)
            sync_state <=#U_DLY 5'd2;
        else 
            ;
    end

    5'd2:begin
        if(data_vild)
            cnt0 <=#U_DLY cnt0 + 9'd1;
        else
            ;

        if(cnt0 == 248 && data_vild)
            temp_reg1  <=#U_DLY {temp_reg1[6:0],e1_in_dly1};
        else
            temp_reg1  <=#U_DLY temp_reg1;
        
        if(temp_reg1==8'b00101111 && cnt0==504)
            sync_state <=#U_DLY 5'd3;
        else if(temp_reg1!=8'b00101111 && cnt0==257)
            sync_state <=#U_DLY 5'd0;
        else
            ;
    end

    5'd3:begin
        frames_sync <=#U_DLY 1;
        sync_state <=#U_DLY 5'd4;
    end

SSM信息

//奇数帧,第0时隙
always @(posedge clk_200m) begin
    if(cnt_bit[8:3]==6'b100000 && data_vild)
        temp_reg3 <=#U_DLY {temp_reg3[6:0],e1_in_dly1};
    else
        ;
end

always @(posedge clk_200m or negedge rst_n) begin
    if(!rst_n)
        cnt_sa       <=#U_DLY 3'd0;
    else 
    if(cnt_bit[8:0]==9'h10f && data_vild)begin
        sa[cnt_sa]   <=#U_DLY temp_reg3 ;
        cnt_sa       <=#U_DLY cnt_sa + 3'd1 ;
    end
    else
        ;
end

always @(posedge clk_200m) begin
    if(cnt_bit == 12'hfff)begin
        sa4_code <=#U_DLY {sa[0][4],sa[1][4],sa[2][4],sa[3][4],sa[4][4],sa[5][4],sa[6][4],sa[7][4]} ;
        sa5_code <=#U_DLY {sa[0][3],sa[1][3],sa[2][3],sa[3][3],sa[4][3],sa[5][3],sa[6][3],sa[7][3]} ;
        sa6_code <=#U_DLY {sa[0][2],sa[1][2],sa[2][2],sa[3][2],sa[4][2],sa[5][2],sa[6][2],sa[7][2]} ;
        sa7_code <=#U_DLY {sa[0][1],sa[1][1],sa[2][1],sa[3][1],sa[4][1],sa[5][1],sa[6][1],sa[7][1]} ;
        sa8_code <=#U_DLY {sa[0][0],sa[1][0],sa[2][0],sa[3][0],sa[4][0],sa[5][0],sa[6][0],sa[7][0]} ;
    end
    else
        ;
end

crc4

crc4c u0_crc4c(

    .clk_sys        (clk_200m),
    .rst_n          (),
    .crc_clean      (crc_clean),
    .crc_vild       (crc_vild),
    .crc_in         (crc_in),
    .crc_out        (crc_out )

);
本文作者:银月
本文链接:https://qs77544.top/E1编码译码/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可