双极性码
双极性码是一种数字信号编码方式,用正、负和零三种电平表示二进制数据。单极性码会积累直流分量,这样就不能使用变压器在数据通信设备和所处环境之间提供良好绝缘的交流藕合,直流分量还会损坏连接点的表面电镀层;双极性码的直流分量大大减少,这对数据传输是很有利的。常见双极性码包括AMI(Alternate Mark Inversion)码和HDB3(High-Density Bipolar 3)码。
-
AMI码:用交替的正负电平表示“1”,“0”则用零电平表示。
-
HDB3码:在AMI基础上,通过插入特定的“破坏”脉冲来避免长串零电平,确保同步。
FPGA实现双极性编码:通过加入符号位指示极性
- 以下是使用 Verilog 实现双极性码(以 AMI 编码为例)的代码示例:
AMI 编码的 Verilog 实现
module AMI_Encoder (
input wire clk, // 时钟信号
input wire reset, // 复位信号
input wire data_in, // 输入二进制数据
output reg [1:0] ami_out // 输出 AMI 编码(2位:符号位 + 数据位)
);
reg last_bit; // 上一个输入比特
reg polarity; // 当前极性(0: 负,1: 正)
always @(posedge clk or posedge reset) begin
if (reset) begin
// 复位时初始化
ami_out <= 2'b00; // 输出零电平
last_bit <= 1'b0;
polarity <= 1'b0;
end else begin
if (data_in == 1'b1) begin
if (last_bit == 1'b1) begin
// 如果上一个比特也是1,则翻转极性
polarity <= ~polarity;
end
// 输出当前极性的1
ami_out <= {polarity, 1'b1};
last_bit <= 1'b1;
end else begin
// 输入为0,输出零电平
ami_out <= 2'b00;
last_bit <= 1'b0;
end
end
end
endmodule
-
输入输出:
data_in
:输入的二进制数据(0 或 1)。ami_out
:输出的 AMI 编码,用 2 位表示:ami_out[1]
:符号位(0 表示负,1 表示正)。ami_out[0]
:数据位(0 表示零电平,1 表示非零电平)。
-
逻辑实现:
- 当输入为
1
时,交替输出正负电平。 - 当输入为
0
时,输出零电平。 - 使用
polarity
寄存器记录当前极性(正或负),并在连续输入1
时翻转极性。
- 当输入为
FPGA实现双极性编码:放大器实现
- 通过类似“双相编码”的形式实现,“-1”码用“01”两个相位表示,“1”码用“10”两个相位表示,“0”码用“00”表示,但是两个数据同时输出,作为放大器的同向和反向输入端的输入。
CG
- 数字信号编码格式图:https://cs.nju.edu.cn/yafeng/DataComTue/1035.pdf
- 实际上运算放大器存在失调电压,即运算放大器的两个输入端电压完全相同,输出不为0 V,但是一般都非常小,可忽略