作者:小周

实验简述
将输入的数据流经过曼彻斯特编码器编码后经过解码器恢复为原来的输入序列。

一、曼彻斯特码简介
曼彻斯特码(Manchester code),又称数字双向码、分相码或相位编码(PE),是一种常用的二源码线路编码方式之一,被物理层使用来编码一个同步位流的时钟和数据。在通信技术中,用来表示所要发送比特流中的数据宇定时信号所结合起来的代码。常用在以太网通信,列车总线控制,工业总线等领域。

二、编码规则
有两个输入时钟,一个是基带时钟(起同步信号作用),一个是频带时钟。输入的数据流是基带时钟域信号,经过编码后变成频带时钟域信号输出。曼彻斯特编码是将输入为1的变成输出前半拍为1,后半拍为0,输入为0的变成前半拍为0,后半拍为1的频带信号。

三、时序图
输入序列以101为例,经过编码后应为100110

四、FPGA实现
1、顶层架构

2、信号说明

信号 功能 说明
clk_b 基带时钟,作为同步信号使用 外部输入
clk_f 频带时钟,系统工作时钟 外部输入
rst_n 系统复位 外部输入
enc_in 输入数据流 外部输入
enc_en 编码使能 外部输入
enc_out 数据流经编码后的输出,输入到解码模块 编码输出,解码输入
dec_en 解码使能 外部输入
dec_out 解码输出 输出

3、顶层代码

module manchester(clk_b, clk_f, rst_n, enc_in, enc_en, dec_out, dec_en);input clk_b, clk_f, rst_n;input enc_in;input enc_en;output dec_out;input dec_en;wire enc_out;manchester_enc ENC(.clk_f(clk_f),.clk_b(clk_b),.rst_n(rst_n),.enc_en(enc_en),.enc_in(enc_in),.enc_out(enc_out));manchester_dec DEC(.clk_f(clk_f),.clk_b(clk_b),.rst_n(rst_n),.dec_en(dec_en),.enc_out(enc_out),.dec_out(dec_out));

endmodule

4、编码模块

采用状态机来实现编码模块。
当检测到编码使能为高时,状态机开始执行,判断clk_b的值为1时,在S1状态等待,当clk_b的值为0时,判断输入的值是1还是0。(clk_b主要起基频同步作用)如果是1,跳转到S2状态,并将enc_out赋值为1。到S2状态后,无条件跳回S1状态,并将enc_out赋值为0。如果是0,跳转到S3状态,并将enc_out赋值为0。到S3状态后,无条件跳回S1状态,并将enc_out赋值为1。
状态转移图如下:

说明:圆圈代表状态,→ 代表转移,转移下面的文本框代表转移时的动作。以后文章的状态转移图均按此绘制。

编码模块代码

module manchester_enc(clk_f, clk_b, rst_n, enc_en, enc_in, enc_out);input clk_f, clk_b, rst_n;input enc_en;input enc_in;output reg enc_out;reg [2:0] state_c, state_n;localparam S1 = 3'b001;localparam S2 = 3'b010;localparam S3 = 3'b100;wire S12S2_start  ;wire S12S3_start  ;wire S22S1_start  ;wire S33S1_start  ;//四段式状态机//第一段:同步时序always模块,格式化描述次态寄存器迁移到现态寄存器(不需更改-always@(posedge clk_f or negedge rst_n)beginif(!rst_n)beginstate_c <= S1;endelse beginstate_c <= state_n;endend//第二段:组合逻辑always模块,描述状态转移条件判斍always@(*)beginif(enc_en)case(state_c)S1:beginif(S12S2_start)beginstate_n = S2;endelse if(S12S3_start)beginstate_n = S3;endelse beginstate_n = state_c;endendS2:beginif(S22S1_start)beginstate_n = S1;endelse beginstate_n = state_c;endendS3:beginif(S33S1_start)beginstate_n = S1;endelse beginstate_n = state_c;endenddefault:beginstate_n = S1;endendcaseelsestate_n = S1;end
//第三段:设计转移条件assign S12S2_start   = state_c==S1    && clk_b && !enc_in;assign S12S3_start   = state_c==S1    && clk_b && enc_in;assign S22S1_start   = state_c==S2    && 1;assign S33S1_start   = state_c==S3    && 1;//第四段:同步时序always模块,格式化描述寄存器输出(可有多个输出-always @(posedge clk_f or negedge rst_n)beginif(!rst_n)beginenc_out <=1'b0;      //初始匍endelse if(enc_en)if((state_c==S1 && !enc_in) || (state_c==S3))beginenc_out <= 1'b0;endelse if((state_c==S1 && enc_in) || (state_c==S2))beginenc_out <= 1'b1;endelse beginenc_out <= 1'b0;endelseenc_out <=1'b0;
endendmodule

5、 解码模块

解码模块也采用状态机实现,当检测到dec_en为高时,状态机才执行,判断clk_b的值,当clk_b为0时,在S1上等待,当clk_b为1时,判断enc_out的值,为1时跳转到S2状态,并将dec_out赋值为。S2状态无条件跳转到S1状态。为0时,跳转到S3状态并将dec_out赋值为0。S3状态无条件跳转到S1状态。
状态转移图如下:

解码模块代码

module manchester_dec(clk_f, clk_b, rst_n, dec_en, enc_out, dec_out);input clk_f, clk_b, rst_n;input dec_en;input enc_out;output reg dec_out;reg [2:0] state_c, state_n;localparam S1 = 3'b001;localparam S2 = 3'b010;localparam S3 = 3'b100;wire S12S2_start  ;wire S12S3_start  ;wire S22S1_start  ;wire S33S1_start  ;always@(posedge clk_f or negedge rst_n)beginif(!rst_n)beginstate_c <= S1;endelse beginstate_c <= state_n;endend//第二段:组合逻辑always模块,描述状态转移条件判斍
always@(*)beginif(dec_en)case(state_c)S1:beginif(S12S2_start)beginstate_n = S2;endelse if(S12S3_start)beginstate_n = S3;endelse beginstate_n = state_c;endendS2:beginif(S22S1_start)beginstate_n = S1;endelse beginstate_n = state_c;endendS3:beginif(S33S1_start)beginstate_n = S1;endelse beginstate_n = state_c;endenddefault:beginstate_n = S1;endendcaseelsestate_n = S1;end
//第三段:设计转移条件
assign S12S2_start   = state_c==S1    && (!clk_b) && enc_out;
assign S12S3_start   = state_c==S1    && (!clk_b) && (!enc_out);
assign S22S1_start   = state_c==S2    && 1;
assign S33S1_start   = state_c==S3    && 1;//第四段:同步时序always模块,格式化描述寄存器输出(可有多个输出-always @(posedge clk_f or negedge rst_n)beginif(!rst_n)begindec_out <=1'b0;      //初始匍endelse if(dec_en)if(state_c==S1 && (!clk_b) && enc_out)begindec_out <= 1'b1;endelse if((state_c==S1 && (!clk_b) && (!enc_out)))begindec_out <= 1'b0;endelse begindec_out <= dec_out;endelsedec_out <=1'b0;endendmodule

6、仿真验证

tb文件参考工程文件夹中的sim文件夹

输入的数据流enc_in为1011,对应的曼彻斯特码应为10011010

我们看到输入到编码模块的enc_in与解码模块的dec_out的输出是一样的

再来看编码之后的数据流

enc_out为10011010与结果一致

解码模块图形

【至简设计案例系列】基于FPGA的曼彻斯特编码解码设计相关推荐

  1. verilog 算法加速模块设计流程_基于FPGA的图像加速器的设计

    基于 FPGA 的图像加速器的设计 摘 要 介绍了一种基于 FPGA 的图像加速器的设计.本文硬件加速器的实质是通过流水线 设计来减少多余的操作达到加速的目的的, 内存是由 DMA 控制器访问, 之后 ...

  2. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  3. 【至简设计案例系列】基于FPGA的密码锁(XILINX ISE版)

    本文为明德扬原创及录用文章,转载请注明出处! 作者:造就狂野青春 一.总体设计 1.概述 本文基于明德扬至简设计法和明德扬设计规范,设计了一个基于FPGA的数字密码锁,实现了在拨码开关条件下,按键设置 ...

  4. 简谈基于FPGA的千兆以太网设计

    简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货. 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学 ...

  5. 源码系列:基于FPGA的自动售货机设计(附源工程)

    今天给大侠带来基于FPGA的自动售货机设计,附源码,获取源码,请在"FPGA技术江湖"公众号内回复" 自动售货机设计源码",可获取源码文件.话不多说,上货. 设 ...

  6. 基于FPGA的遥控数字时钟设计

    基于FPGA的遥控数字时钟设计报告 ​ ​ Author:张宏宇 摘要 ​ 数字时钟是一种通过数字显示时间的计时装置,本次项目采用Cyclone Ⅳ系列芯片,使用QuartusII开发环境,使用Ver ...

  7. 基于FPGA的VGA/LCD显示控制器设计(中)

    今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货. 之前也有图像处理以及V ...

  8. 基于 FPGA Vivado 的数字钟设计(附源工程)

    今天给大侠带来基于 FPGA Vivado 的数字钟设计,开发板实现使用的是Digilent basys 3,如有想要入手 basys 3 开发板的,可以联系牛总:18511371833.话不多说,上 ...

  9. 基于FPGA的USB接口控制器设计(VHDL)(中)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第二篇,中篇,USB通信原理.USB 系统开发以及设计实例.话不多说,上货. 之前有关于 Veril ...

最新文章

  1. 【组队学习】【31期】 吃瓜教程——西瓜书+南瓜书
  2. day20-自定义分页2
  3. python学习路线-Python学习路线
  4. windows下Pycharm中安装Pygame
  5. 小企业的第一台服务器如何选?
  6. .net项目进不去后台解决
  7. shiro-cas------整合springboot客户端
  8. java实验报告_java实验一实验报告
  9. Python使用Reportlab处理PDF数据 - 字体
  10. SEGGER RTT使用总结
  11. C++很难?神级程序员自述对C++的认识!见解独到能少走很多弯路!
  12. 【很有趣】用Python实现一个简单的人脸识别,原来我和这个明星如此相似
  13. 论文到底怎么降重才有效
  14. 留给10年后的自己观看,T4-7生活就像那条小巷!
  15. 微信戴圣诞帽的一个简易实现程序
  16. PKI CA RA KMC
  17. 关于Quartus II 13.0破解失败问题
  18. java中GUI中显示当前时间_javaGUI界面实现动态时间显示——Swing中的计时器Timer
  19. Audio Codec介绍-6(音频设备的3种硬件接口--PCM,IIS和AC97)
  20. 液晶面板里面有些什么配件_一个手机的液晶总成都包含什么部件?

热门文章

  1. 茉莉花开,千万千万要生个男孩子!
  2. 【15】将一个正整数分解质因数 例如:输入90,打印出90=2*3*3*5
  3. STEVAL-MKI109V3评估板 PART2 - LPS27HHW的应用
  4. 算法大总结之----10大经典排序算法(从小到大排列)
  5. 项目管理:项目管理过程
  6. 5月11日绿健简报,星期三,农历四月十一
  7. 你不知道的开源操作系统汇总
  8. 什么是hash碰撞 , HashMap是如何解决hash碰撞的 ?
  9. 期刊论文发表为什么不能一稿多投
  10. 使用TransDecoder寻找转录本中的编码区