你好,如何用Verilog HDL实现CMI编码?

如题所述

    CMI码预备知识

    CMI又称传号反转码,是一种二电平非归零码。其中“0”码用固定的负、正电平表示,“1”码用交替的正、负电平表示。具有以下优点:(1)不存在直流分量,且低频分量较小;(2)信息码流中具有很强的时钟分量,便于从信号中提取时钟信息;(3)具有一定的检错能力。因此,在高次群的PCM系统中作为接口的码型,在速率低于8 848 kb/s的光纤数字传输系统中被推荐为线路传输码型。

    CMI码的编码原理。CMI码是一种1B2B码(一位信息码,二位码元),即将过来的一位码子用两位码子来表示。当过来“0”码时,编码输出固定的“01”码;当过来的是“1”码时,编码输出“00”或者“11”码,并且交替出现。

    CMI编码的一种Verilog HDL实现

module CMI(clk1, rst, clk2, cmi_en, cmi_in, cmi_out);

    input clk1;

    input rst;

    input clk2;        //clk1的2倍频

    input cmi_en;    //原始码输入使能信号

    input cmi_in;   //原始码输入,与clk1时钟同步

    output cmi_out;    //cmi码输出,与clk2时钟同步

    reg cmi_out;

    reg [1:0] cmi;        //cmi码寄存器

    reg mstate;            //存储"1"码的序列,以实现交替编码

    reg count;            //区分当前输出的CMI电平

    always@(posedge clk1 or posedge rst)

    if(rst)

        begin

            cmi <= 2'b00;

            mstate <=1'b0;

        end

    else if(cmi_en)

        if(cmi_in == 1'b0)

            cmi <= 2'b01;

        else

            begin

                cmi <= mstate ? 2'b11 : 2'b00;

                mstate <= ~mstate;

            end


    always@(posedge clk2 or posedge rst)

    if(rst)

        begin

            count <= 1'b0;

            cmi_out <= 1'b0;

        end

    else if(cmi_en)

        begin

            cmi_out <= count ? cmi[1]: cmi[0];

            count<=count+1;

        end

   endmodule

//说明,大体代码如上,要注意接口的时序关系

//上述代码未作编译,仅供参考

温馨提示:答案为网友推荐,仅供参考
相似回答