一、简介
CMI 编码即传号反转码,是一种常用的线路编码方式,:
- 编码规则:CMI 编码将二进制 “0” 码编为 “01”,二进制 “1” 码交替地编为 “11” 和 “00”。例如,对于二进制序列 1011001,经过 CMI 编码后变为 00010011010100。
- 特点
- 有同步信息:CMI 码属于二电平不归零码,由于编码后 “1” 码对应两个不同的码组,“0” 码对应固定码组,因此接收端可以通过检测 “1” 码的不同码组来提取同步信息,具有良好的同步性能。
- 误码检测能力:CMI 码具有一定的误码检测能力。因为正常编码中只有 “01”“11”“00” 三种码组,若出现其他码组形式,则可判断传输中出现了误码。
- 频谱特性好:其功率谱中不含直流分量,低频分量也较少,高频分量也受到一定限制,频谱特性较为合理,适合在各种传输介质中传输。
- 应用:CMI 编码在光纤通信、数字微波通信等领域得到了广泛应用。例如,在 SDH(同步数字体系)网络中,CMI 码被用作线路编码方式之一,用于实现信号在光纤线路上的可靠传输。
二、24位串行数据,cmi编码实现
module cmi_encoder (
input wire clk, // 时钟信号
input wire rst_n, // 异步复位,低电平有效
input wire data_in, // 串行输入数据
input wire data_valid, // 数据有效信号
output reg cmi_out // CMI编码输出
);
// 内部状态寄存器
reg prev_bit; // 存储前一个输入比特
reg prev_level; // 存储前一个输出电平
reg [4:0] bit_counter; // 24位计数器
// 初始化
initial begin
prev_bit = 1'b0;
prev_level = 1'b0;
bit_counter = 5'd0;
cmi_out = 1'b0;
end
// 主编码过程
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// 异步复位
prev_bit <= 1'b0;
prev_level <= 1'b0;
bit_counter <= 5'd0;
cmi_out <= 1'b0;
end else if (data_valid) begin
if (bit_counter < 5'd24) begin
// CMI编码规则:
// 0 -> 01
// 1 -> 00或11交替
if (data_in == 1'b0) begin
// 输入为0,编码为01
if (prev_level == 1'b0) begin
cmi_out <= 1'b1;
end else begin
cmi_out <= 1'b0;
end
prev_level <= ~prev_level;
end else begin
// 输入为1,编码为00或11(交替)
cmi_out <= prev_level;
prev_level <= ~prev_level;
end
prev_bit <= data_in;
bit_counter <= bit_counter + 1'b1;
end else begin
// 24位编码完成,等待新的数据
bit_counter <= 5'd0;
cmi_out <= 1'b0;
end
end else begin
// 数据无效时保持输出
cmi_out <= cmi_out;
end
end
// 可选:添加一个输出信号指示编码完成
wire encoding_done = (bit_counter == 5'd24);
endmodule