当前位置:   article > 正文

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

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如下:

  1. module manchester_encoder (
  2. input wire clk,
  3. input wire rst,
  4. input wire [7:0] data_in, // 8-bit data input
  5. input wire start, // Start signal
  6. output reg manchester_out // Manchester encoded output
  7. );
  8. reg [3:0] cnt;
  9. reg state; // Current state
  10. reg last_state; // Last state
  11. always @(posedge clk or posedge rst) begin
  12. if (rst) begin
  13. cnt <= 4'b0;
  14. state <= 1'b0;
  15. last_state <= 1'b0;
  16. manchester_out <= 1'b0;
  17. end else begin
  18. if (start && cnt == 4'd7) begin
  19. // When start is high and cnt reaches the end of the bit period
  20. state <= ~state; // Flip the state
  21. last_state <= state;
  22. cnt <= 4'b0; // Reset counter
  23. end else begin
  24. cnt <= cnt + 1'b1;
  25. manchester_out <= state;
  26. end
  27. end
  28. end
  29. always @(posedge clk) begin
  30. if (cnt == 4'd3) begin
  31. // At the middle of the bit period
  32. manchester_out <= ~last_state;
  33. end
  34. end
  35. // Data shifting logic
  36. always @(posedge clk) begin
  37. if (start) begin
  38. if (data_in[0]) begin
  39. state <= 1'b1;
  40. end else begin
  41. state <= 1'b0;
  42. end
  43. end
  44. end
  45. endmodule

2.2 曼码解码原理

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

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

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

  1. module manchester_decoder (
  2. input wire clk,
  3. input wire rst,
  4. input wire manchester_in, // Manchester encoded input
  5. output reg [7:0] data_out, // 8-bit decoded data output
  6. output reg start, // Start signal for decoding
  7. output reg valid_data // Valid data indicator
  8. );
  9. reg [3:0] cnt;
  10. reg state;
  11. reg last_state;
  12. reg [2:0] bit_counter;
  13. always @(posedge clk or posedge rst) begin
  14. if (rst) begin
  15. cnt <= 4'b0;
  16. state <= 1'b0;
  17. last_state <= 1'b0;
  18. bit_counter <= 3'b0;
  19. start <= 1'b0;
  20. valid_data <= 1'b0;
  21. end else begin
  22. if (manchester_in != last_state) begin
  23. // Detect transition
  24. if (cnt == 4'd3) begin
  25. // At the middle of the bit period
  26. state <= manchester_in;
  27. bit_counter <= bit_counter + 1'b1;
  28. end
  29. cnt <= cnt + 1'b1;
  30. last_state <= manchester_in;
  31. end
  32. end
  33. end
  34. always @(posedge clk) begin
  35. if (bit_counter == 3'b100) begin
  36. // End of the bit period
  37. bit_counter <= 3'b0;
  38. start <= 1'b1;
  39. end
  40. end
  41. always @(posedge clk) begin
  42. if (start) begin
  43. if (state) begin
  44. data_out[0] <= 1'b1;
  45. end else begin
  46. data_out[0] <= 1'b0;
  47. end
  48. start <= 1'b0;
  49. valid_data <= 1'b1;
  50. end
  51. end
  52. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/1020018
推荐阅读
相关标签
  

闽ICP备14008679号