【电路笔记 通信】8B_10B编码 高速数据传输的串行数据编码技术 论文流程对应实现(简化版本,仅编码数值)

文章目录

    • [0810逻辑总览 The 8B/10B coding map](#0810逻辑总览 The 8B/10B coding map)
    • [5B/6B encoding](#5B/6B encoding)
    • [3B/4B encoding](#3B/4B encoding)
    • [Special characters 略](#Special characters 略)

0810逻辑总览 The 8B/10B coding map

  • 由八条数据线 A、B、C、D、E、F、G、H (注意:使用大写字母表示)、一条控制线 K ,以及一条以字节速率运行的时钟线 BYTECLK 组成。只编码数据的情况下控制线 K 被简化。
    • 基于LUT的8B/10B编码器;RD初始为0;

    • 先进行5B/6B编码,并更新RD信号;

    • 再根据更新后的RD信号进行3B/4B编码,且产生下次编码的RD信号;

    • 这十条(data_10b <= {data_4b,data_6b};)编码后的数据线 abcdeifghj 通常与串行 接口;其中,a 位 必须首先传输,而 j 位最后传输。

5B/6B encoding

  • 表格中像18、19、20、21、22这样的数据编码后是平衡的(0、1个数相同),使用rd <= rd; 转换规则;其他数据则使用rd <= ~rd; 转换规则。

    encode_5b_6b: begin
    encode_load_data_flag <= 1'b0;
    case (data_5b)
    5'd0: begin
    data_6b <= rd ? 6'b000110 : 6'b111001;
    rd <= ~rd;
    end
    5'd1: begin
    data_6b <= rd ? 6'b010001 : 6'b101110;
    rd <= ~rd;
    end
    5'd2: begin
    data_6b <= rd ? 6'b010010 : 6'b101101;
    rd <= ~rd;
    end
    5'd3: begin
    data_6b <= 6'b100011;
    rd <= rd;
    end
    5'd4: begin
    data_6b <= rd ? 6'b010100 : 6'b101011;
    rd <= ~rd;
    end
    5'd5: begin
    data_6b <= 6'b100101;
    rd <= rd;
    end
    5'd6: begin
    data_6b <= 6'b100110;
    rd <= rd;
    end
    5'd7: begin
    data_6b <= rd ? 6'b111000 : 6'b000111;
    rd <= rd;
    end
    5'd8: begin
    data_6b <= rd ? 6'b011000 : 6'b100111;
    rd <= ~rd;
    end
    5'd9: begin
    data_6b <= 6'b101001;
    rd <= rd;
    end
    5'd10: begin
    data_6b <= 6'b101010;
    rd <= rd;
    end
    5'd11: begin
    data_6b <= 6'b001011;
    rd <= rd;
    end
    5'd12: begin
    data_6b <= 6'b101100;
    rd <= rd;
    end
    5'd13: begin
    data_6b <= 6'b001101;
    rd <= rd;
    end
    5'd14: begin
    data_6b <= 6'b001110;
    rd <= rd;
    end
    5'd15: begin
    data_6b <= rd ? 6'b000101 : 6'b111010;
    rd <= ~rd;
    end
    5'd16: begin
    data_6b <= rd ? 6'b001001 : 6'b110110;
    rd <= ~rd;
    end
    5'd17: begin
    data_6b <= 6'b110001;
    rd <= rd;
    end
    5'd18: begin
    data_6b <= 6'b110010;
    rd <= rd;
    end
    5'd19: begin
    data_6b <= 6'b010011;
    rd <= rd;
    end
    5'd20: begin
    data_6b <= 6'b110100;
    rd <= rd;
    end
    5'd21: begin
    data_6b <= 6'b010101;
    rd <= rd;
    end
    5'd22: begin
    data_6b <= 6'b010110;
    rd <= rd;
    end
    5'd23: begin
    data_6b <= rd ? 6'b101000 : 6'b010111;
    rd <= ~rd;
    end
    5'd24: begin
    data_6b <= rd ? 6'b001100 : 6'b110011;
    rd <= ~rd;
    end
    5'd25: begin
    data_6b <= 6'b011001;
    rd <= rd;
    end
    5'd26: begin
    data_6b <= 6'b011010;
    rd <= rd;
    end
    5'd27: begin
    data_6b <= rd ? 6'b100100 : 6'b011011;
    rd <= ~rd;
    end
    5'd28: begin
    data_6b <= 6'b011100;
    rd <= rd;
    end
    5'd29: begin
    data_6b <= rd ? 6'b100010 : 6'b011101;
    rd <= ~rd;
    end
    5'd30: begin
    data_6b <= rd ? 6'b100001 : 6'b011110;
    rd <= ~rd;
    end
    5'd31: begin
    data_6b <= rd ? 6'b001010 : 6'b110101;
    rd <= ~rd;
    end
    default: ;
    endcase
    end

3B/4B encoding

复制代码
encode_3b_4b: begin
	case (data_3b)
		3'd0: begin
			data_4b <= rd ? 4'b0010 : 4'b1101;
			rd <= ~rd;
		end
		3'd1: begin
			data_4b <= 4'b1001;
			rd <= rd;
		end
		3'd2: begin
			data_4b <= 4'b1010;
			rd <= rd;
		end
		3'd3: begin
			data_4b <= rd ? 4'b1100 : 4'b0011;
			rd <= rd;
		end
		3'd4: begin
			data_4b <= rd ? 4'b0100 : 4'b1011;
			rd <= ~rd;
		end
		3'd5: begin
			data_4b <= 4'b0101;
			rd <= rd;
		end
		3'd6: begin
			data_4b <= 4'b0110;
			rd <= rd;
		end
		3'd7: begin
			if (((rd = 1'b1) && ~data_6b[5] && ~data_6b[4]) || ((rd == 1'b0) && data_6b[5] && data_6b[4])) begin
				data_4b <= rd ? 4'b0001 : 4'b1110;   // D.x.A7 (Alternate)
			end
			else begin
				data_4b <= rd ? 4'b1000 : 4'b0111;   // D.x.P7 (Primary)
			end
			rd <= ~rd;
		end
		default: ;
	endcase
end
  • 编码完成后组合输出时,低 6 位(data_6b)的结尾可能会和当前 4 位的开头组合出太长的连续 0 或 1。

  • 在表 3 中,D.7 行 ,一对零失衡的 6B 子块111000000111 )被分配给单个数据点,并具有类似于适用于非零失衡子块的失衡约束。这个编码特性将最大数字和变化(DSV )从 8 降低到 6 ,并结合表 4 中 3B/4B 编码器D/K.X.311000011 )的类似规则,消除了所有 运行长度为 6 的序列,以及大多数 运行长度为 5 的序列。

  • D/K.y.A7 编码可以在 ghjab 位的尾部字符边界生成一个 运行长度 为5的序列;引入 D/K.y.A7 编码点是为了消除 eifgh 中的运行长度为 5 的序列。每当需要时,A7 编码会替换 P7 编码。

verilog 复制代码
3'd7: begin
    if (((rd = 1'b1) && ~data_6b[5] && ~data_6b[4]) || ((rd == 1'b0) && data_6b[5] && data_6b[4])) begin
        data_4b <= rd ? 4'b0001 : 4'b1110;  // D.x.A7 (Alternate)
    end
    else begin
        data_4b <= rd ? 4'b1000 : 4'b0111;  // D.x.P7 (Primary)
    end
    rd <= ~rd;
end

Special characters 略

  • 特殊字符在此定义为超出编码一个数据字节所需的 256 个编码点。它们通常用于建立字节同步、标记数据包的开始和结束,有时也用于信号控制功能,如 ABORTRESETSHUT-OFFIDLE 和链路诊断。表 5 中显示的十二个特殊字符可以通过表 3 和表 4 中定义的编码规则生成。它们都符合一般编码约束,即最大运行长度为 5 和最大数字和变化为 6。
  • 在该编码中,有三个字符(K.28.1K.28.5K.28.7 )具有逗号特性。它们在表 5 中以星号标记,并用粗体字突出显示其唯一的逗号序列。这三个字符也是最适合作为信息包起始和结束标记的分隔符。
相关推荐
handler0117 小时前
从零实现自动化构建:Linux Makefile 完全指南
linux·c++·笔记·学习·自动化
Hello_Embed18 小时前
嵌入式上位机开发入门(二十六):将 MQTT 测试程序加入 APP 任务
网络·笔记·网络协议·tcp/ip·嵌入式
不会编程的懒洋洋18 小时前
C# Task async/await CancellationToken
笔记·c#·线程·面向对象·task·同步异步
zhangrelay21 小时前
蓝桥云课五分钟-通关自动控制-octave
笔记·学习
_李小白1 天前
【AI大模型学习笔记之平台篇】第六篇:安卓开发AI工具介绍(Android CLI、Android Skill和Android Knowledge Base)
人工智能·笔记·学习
YaBingSec1 天前
玄机靶场:供应链安全-供应链应急-Part2 通关笔记
java·笔记·安全
qeen871 天前
【算法笔记】双指针及其经典例题解析
c++·笔记·算法·双指针
China_Yanhy1 天前
生产笔记:AI 集群的极致成本与数据保命指南
人工智能·笔记
云起SAAS1 天前
小智笔记APP源码 | 8大广告联盟聚合(穿山甲/优量汇/快手/百度) | 应用市场过审极速版 | uni-app全栈商用项目
笔记·uni-app·广告联盟·笔记app
ouliten1 天前
cuda编程笔记(41)--异步数据拷贝
笔记·cuda