曼彻斯特码编解码原理以及Verilog实现

来源:互联网 发布:大一统理论 知乎 编辑:程序博客网 时间:2024/05/22 09:07

曼彻斯特编码,也叫做相位编码(PE),是一个同步时钟编码技术,在以太网媒介系统中,被物理层使用来编码一个同步位流的时钟和数据。它的每一个数据比特都是由至少一次电压转换的形式所表示的。曼彻斯特编码因此被认为是一种自定时码。自定时意味着数据流的精确同步是可行的。每一个比特都准确的在一个预先定义时间时期的时间中被传送。这样的编码方式可以在长时间没有电平跳变的情况下,仍然对任意的二进制数据进行编码,并且防止在这种情况下同步时钟信号的丢失以及防止低通模拟电路中低频直流飘移所引起的比特错误。同时,如果保证传送的编码交流信号的直流分量为零并且能够防止中继信号的基线漂移,那么就很容易实现信号的恢复和防止能量的浪费。另外,曼彻斯特码还具有丰富的位定时信息。

    原理:曼彻斯特码是通过电平的跳变来对二进制数据“0”和“1”进行编码的,对于何种电平跳变对应何种数据,实际上有两种不同的数据约定:第一种约定是由G. E. Thomas,Andrew S. Tanenbaum等人在1949年提出的,它规定“0”是由低到高的电平跳变表示,“1”是由高到低的电平跳变;第二种约定则是在IEEE 802.4(令牌总线)以及IEEE 802.3 (以太网)中规定,按照这样的说法,由低到高的电平跳变表示“1”,由高到低的电平跳变表示“0”。在实际工程上,这两种约定在一定范围内均有应用。为了便于描述,若无特殊说明,曼彻斯特码的编码规则均采用第二种约定,即从低电平跳变到高电平表示“1”,从高电平跳变到低电平表示“0”。

    普通数字信号与曼彻斯特编码对比如图。

 [转载]曼彻斯特码编解码原理

      优点:数据和同步时钟统一编码,曼码中含有丰富的时钟信号,直流分量基本为零,接收器能够较容易恢复同步时钟,并同步解调出数据,具有很好的抗干扰性能,这使它更适合于信道传输。

       

        曼彻斯特编码器的设计

        对比普通二进制码的波形和曼彻斯特码的波形可知,曼彻斯特码在一个码元的开始时刻要对普通信号进行一次采样,并且有可能会发生一次跳变,在码元的中间位置一定发生跳变,因此编码信号的频率是数据时钟频率的两倍。

        曼彻斯特码是用“01”和“10”来表示普通二进制数据中的“1”和“0”的,因此在实际电路设计中,我们可以用采一个2选1数字选择器来完成此项功能。

        [转载]曼彻斯特码编解码原理

      曼彻斯特解码器的设计

     

        曼彻斯特解码电路设计的关键是如何准确地从曼彻斯特码的数据流中提取出“10”和“01”信号,并且把它们转换成普通二进制编码中的“0”和“1”。例如对于曼彻斯特码“01010101”,如果从第一位开始解码,得到的二进制编码就是“1111”,而若从第二位开始解码,得到的二进制编码就是“000”和头尾两个曼彻斯特码。由此可见,如果曼彻斯特码数据流中只有“1”或“0”是不能得到正确的译码结果的,如果曼彻斯特编码数据流中出现“00”,则“00”前后的码元必定是“1”;如果曼彻斯特编码数据流中出现“11”,则“00”前后的码元必定是“0”,因此,我们可以将“00”与“11”作为曼彻斯特码译码的标志位。

        为了更准确得解码曼彻斯特码,我们需要一个频率不小于奈奎斯特频率的采样时钟,即采样时钟的频率至少是曼彻斯特码频率的两倍,曼彻斯特码的频率是普通二进制编码信号频率的两倍,因此采样频率至少是数据频率的4倍。
        在实际设计电路时,我们可以采用一个缓存器,储存上一个时钟采集到的信号和当前时钟采集到的信号,当缓存器的内容是“01”时,输出“1”;当缓存器的内容是“10”时,输出“0”;当缓存器的内容是“00”或“11”时,输出维持不变。

[转载]曼彻斯特码编解码原理

曼彻斯特编码是非常常见的编码,网线就是采用这种编码。课本上说的“含有丰富的时钟信息”。

编码的步骤,是用01表示0,用10表示1。正是因为用跳变沿表示电平,使得它的频率是信号的两倍。

以下是编码的程序:


仿真的波形:


从波形可以看出,曼码可以避免连0或者连1。

这里有问题,我默认了时钟信号的频率是曼码频率的两倍,因为我必须利用时钟沿编码。不太清楚实际情况是什么样的,因为网上都是时钟信号频率等于编码频率,很奇怪。


下面介绍译码。译码的难度不是01以为0,10译为1,而是确定是吗时候开始译码。参考了一些书,他们是从检测到00或11后开始译码,因为00后一定是1,11后一定是0,所以就可以确认开始,然后两个为一组译码。

代码如下:



仿真结果:


由图中可以看出,译码从检测到11开始,因为11后面跟着0,所以译01,按顺序来是10,所以输出1,后面每隔两个码译一次,因为不能和前一个码混在一起。这样如果传输过程没有误码,后面再也不会出现翻译00或11的情况。在这里我故意弄出了个11,让fail错误信号置了1。


0 0