manchester

preview
3星 · 超过75%的资源 需积分: 0 3 下载量 91 浏览量 更新于2013-06-23 1 收藏 21KB DOC 举报
verilog语言描述 module bianma(din,rst,clk16x,clk96,start,tx,sr,state,clk_en,man); input rst,clk16x,start; input[7:0] din; output tx,clk96,sr,state,clk_en,man; 模块`bianma`是用Verilog语言编写的,它的主要功能是实现曼彻斯特编码(Manchester Encoding)。在数字通信中,曼彻斯特编码是一种时钟数据恢复和同步的方法,它通过将每个数据位的边界与相应的电平变化相对应来编码数据。这种编码方式在本地时钟和接收端之间提供了一种内在的同步机制。 模块`bianma`有以下输入和输出: - 输入: - `rst`: 重置信号,用于初始化内部状态。 - `clk16x`: 一个16倍的时钟输入,用于生成曼彻斯特编码所需的时钟频率。 - `start`: 开始信号,当该信号有效(高电平)时,模块开始编码过程。 - `din[7:0]`: 8位数据输入,需要被编码的数据。 - 输出: - `tx`: 编码后的曼彻斯特编码数据输出。 - `clk96`: 生成的96分频时钟,即`clk16x`的96分之一,用于驱动编码过程。 - `sr[7:0]`: shift register,内部移位寄存器,存储待编码的数据。 - `state[3:0]`: 状态机的状态,指示当前处于编码过程中的哪个阶段。 - `clk_en`: 时钟使能信号,控制编码是否进行。 - `man`: Manchester编码标志,表示当前时钟周期内是否有电平翻转。 模块的主要逻辑分为以下几个部分: 1. **分频器**:使用`always @(posedge clk16x)`语句定义了一个分频器,通过计数器`cnt`将`clk16x`分频为`clk96`。当`cnt`达到7时,`clk96`的值取反,实现了96分频。 2. **时钟使能逻辑**:`always @(negedge clk16x or negedge start or posedge rst)`块处理`clk_en`的控制。在`rst`低电平时,`clk_en`被置为0;在`start`信号有效且非重置状态下,`clk_en`被置为1;当状态机处于12(二进制4'd12)时,`clk_en`被置为0,以停止编码。 3. **曼彻斯特编码**:`always @(negedge clk96 or posedge rst)`块完成曼彻斯特编码。在`rst`低电平时,`tx`被置为1,`sr`清零。根据状态机的不同状态,`tx`的值由`sr`中的数据或固定值决定,并且`sr`会按照曼彻斯特编码的规则进行移位。同时,`man`信号被设置为`tx`和`clk96`的异或结果,表示当前时钟周期内是否存在电平翻转。 4. **状态机**:`always @(posedge clk96 or posedge rst or negedge clk_en)`块定义了一个4位的状态机,`state`在不同状态之间进行转换,控制整个编码过程。在`rst`或`clk_en`无效时,状态重置为0,否则状态自动加1,循环执行编码过程。 这个模块可以作为一个独立的组件,用于将输入的8位数据`din`编码成曼彻斯特编码的串行数据`tx`,同时提供了与编码过程相关的辅助信号如`clk96`, `sr`, `state`, `clk_en`, 和 `man`。在实际应用中,可能需要结合其他模块(如串并转换器、接口控制器等)一起工作,实现完整的串行通信系统。
u011177288
  • 粉丝: 0
  • 资源: 2
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜