基于FPGA的1553B总线接口曼彻斯特编解码器设计概述

目录

1.1553B总线

1.1 物理层

1.2 逻辑层

1.3 通信模式

1.4 消息格式

1.5 传输控制

2. 曼彻斯特解码器

2.1 曼码编码原理

2.2 曼码解码原理


       在现代航空电子、军事系统和一些工业应用中,数据总线扮演着极其重要的角色。其中,ARINC 1553B总线是一种广泛使用的高速串行数据总线标准,用于飞机和其他军用系统的通信。为了确保数据传输的可靠性和完整性,ARINC 1553B采用了曼彻斯特编码(通常称为曼码)作为信号编码方式。曼码不仅能够提供位同步功能,还能保证信号中的直流分量为零,这对于长距离传输非常有益。

1.1553B总线

       ARINC 1553B总线采用了一种双冗余差分信号线的物理层设计,以提高系统的可靠性和容错能力。该总线支持多个终端设备,包括命令/响应型终端(如远程终端RTs)和广播型终端(如监控终端MTs)。每个终端都具有唯一的地址,并且能够根据指令进行数据交换。其结构如下图所示:

1.1 物理层

       ARINC 1553B总线采用双冗余的差分信号线,每条信号线都包含一对互补的差分信号线,以提高系统的可靠性和容错能力。这些信号线连接到总线上的所有设备,并且每个设备都必须有一个耦合装置,例如变压器或光耦合器,用于隔离总线信号与设备内部信号。

1.2 逻辑层

       逻辑层定义了总线上的通信规则和消息格式。总线支持两种类型的设备:远程终端(RTs)和监控终端(MTs)。RTs可以是命令/响应型终端,也可以是只响应型终端。MTs通常是总线监控器,可以监听总线上的所有通信活动。

1.3 通信模式

ARINC 1553B支持两种主要的通信模式:

命令/响应模式:在这种模式下,一个RT向另一个RT发送一条命令,后者随后返回一条响应消息。

广播模式:一个RT可以向所有其他RT广播消息,而不期望任何响应。

1.4 消息格式

ARINC 1553B的消息由一系列字组成,每个字包含20位的信息。消息格式包括以下部分:

同步字:用于帧同步。

命令/状态字:包含源地址、目的地址、命令代码等信息。

数据字:携带实际的数据。

状态字:包含响应状态、错误代码等信息。

1.5 传输控制

       总线上的传输控制是由MT执行的,它负责启动、停止传输,并监控总线活动。MT还可以进行故障检测和隔离。

2. 曼彻斯特解码器

       曼彻斯特码是一种广泛应用于航空电子综合系统中的总线数据传输的双极性码。它在每个码位中点存在一个跳变。1信号是一个由1到0的负跳沿,而0信号是由0到1的正跳沿。它本身包含了自定时的信息。因此它不需要独立的信道来传输位定信息,它可以直接从数据中分离出定时时钟,同时还能与变压器耦合相协调,十分适合用在变压器耦合形式,长度为150m(500英尺)左右的场合,因此在航空电子综合系统中,它是最主要的形式。 

2.1 曼码编码原理

       曼码是一种双相编码方式,其特点是每个比特周期内至少有一次跳变。这意味着无论发送的是0还是1,信号都会在每个比特周期的中间位置改变电平。曼码的编码规则如下:

如果发送的是0,则信号在比特周期的开始处从高电平跳变到低电平;
如果发送的是1,则信号在比特周期的开始处从低电平跳变到高电平。
这样的编码方式确保了每个比特都有一个中间跳变,接收端可以根据这个跳变来实现位同步。

曼码编码器的主要组件包括:

数据输入缓冲器:用于暂存待发送的数据。
时钟生成器:产生位同步时钟信号。
曼码发生器:根据输入数据产生曼码信号。
输出驱动器:将曼码信号转换成差分信号输出至总线。

其基本结构如下图所示:

核心Verilog如下:

module manchester_encoder (
    input wire clk,
    input wire rst,
    input wire [7:0] data_in,  // 8-bit data input
    input wire start,           // Start signal
    output reg manchester_out   // Manchester encoded output
);

reg [3:0] cnt;
reg state;                     // Current state
reg last_state;                // Last state

always @(posedge clk or posedge rst) begin
    if (rst) begin
        cnt <= 4'b0;
        state <= 1'b0;
        last_state <= 1'b0;
        manchester_out <= 1'b0;
    end else begin
        if (start && cnt == 4'd7) begin
            // When start is high and cnt reaches the end of the bit period
            state <= ~state;    // Flip the state
            last_state <= state;
            cnt <= 4'b0;        // Reset counter
        end else begin
            cnt <= cnt + 1'b1;
            manchester_out <= state;
        end
    end
end

always @(posedge clk) begin
    if (cnt == 4'd3) begin
        // At the middle of the bit period
        manchester_out <= ~last_state;
    end
end

// Data shifting logic
always @(posedge clk) begin
    if (start) begin
        if (data_in[0]) begin
            state <= 1'b1;
        end else begin
            state <= 1'b0;
        end
    end
end

endmodule

2.2 曼码解码原理

       曼码解码器的核心是曼码检测器,它的任务是从曼码信号中提取出原始的二进制数据。这可以通过比较每个比特周期内的信号变化来完成。如果在一个比特周期内检测到一次信号跳变,则输出相应的二进制比特值。

曼码解码器通常包含以下几个关键组件:

输入接收器:从总线上接收差分信号。
时钟恢复单元:从接收信号中恢复出位同步时钟。
曼码检测器:识别曼码信号并将其转换成二进制数据。
数据输出缓冲器:存储解码后的数据供后续处理。
核心Verilog如下所示:

module manchester_decoder (
    input wire clk,
    input wire rst,
    input wire manchester_in,   // Manchester encoded input
    output reg [7:0] data_out,  // 8-bit decoded data output
    output reg start,           // Start signal for decoding
    output reg valid_data       // Valid data indicator
);

reg [3:0] cnt;
reg state;
reg last_state;
reg [2:0] bit_counter;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        cnt <= 4'b0;
        state <= 1'b0;
        last_state <= 1'b0;
        bit_counter <= 3'b0;
        start <= 1'b0;
        valid_data <= 1'b0;
    end else begin
        if (manchester_in != last_state) begin
            // Detect transition
            if (cnt == 4'd3) begin
                // At the middle of the bit period
                state <= manchester_in;
                bit_counter <= bit_counter + 1'b1;
            end
            cnt <= cnt + 1'b1;
            last_state <= manchester_in;
        end
    end
end

always @(posedge clk) begin
    if (bit_counter == 3'b100) begin
        // End of the bit period
        bit_counter <= 3'b0;
        start <= 1'b1;
    end
end

always @(posedge clk) begin
    if (start) begin
        if (state) begin
            data_out[0] <= 1'b1;
        end else begin
            data_out[0] <= 1'b0;
        end
        start <= 1'b0;
        valid_data <= 1'b1;
    end
end

endmodule

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值