帧结构的串行数据接收器——Verilog实现

用Verilog 实现一个帧结构的串行数据接收器;

  1. 串行数据输入为:NRZ数据加位时钟(BCL)格式,高位在前
    帧结构为:8位构成一个字,64字构成一个帧。每帧的第一个字为同步字。
  2. 同步字图案存储在可由CPU读写的同步字寄存器(端口地址00H)中
    串行接受器在连续检测到3个同步图案后,开始接受数据,并向CPU中传送数据。串行数据接收器每接收到一个字,先送到数据寄存器中, CPU以I/O读方式,从数据寄存器中读取数据(端口地址为01H)
  3. 若数据寄存器已满,再有数据写入时,则覆盖原有的数据。在数据寄存器为空时,CPU从数据寄存器中读到的数据将是同步字寄存器的内容。
    在接收数据过程中,若任何一帧的同步字不匹配,则进入到头步状态,停止数据接收。失步后,必须重新同步(连续检测到3个同步图案),然后开始新的数据接收。
  4. 寄存器的读写采用和8031类似的控制方式,有关信号包括:双向数据(DATA[7:0])、I/O地址(ADDR[7:0])、I/O写(IOW)、和I/O读(IOR),其中IOW和IOR都是低电平有效
  5. 设计者可以根据需要增加其它的输入输出信号

设计分析

  • 端口
    在这里插入图片描述
  • 输入数据和时钟之间的关系
    在这里插入图片描述
  • 帧结构
    8位构成一个字,64字构成一个帧。每帧的第一个字为同步字。
    连续检测到三个同步,即连续三个同步头和同步图案一样的帧,才开始进行数据接收
  • 详细设计-工作阶段非常明显
    • 失步阶段:检测同步头,根据情况确定是否转入同步状态
    • 同步阶段:检测同步头,如果匹配则接收数据,仍然处于同步阶段;否则转入失步状态。
    • 注意:是台下检测i的一个同步字时需要每个时钟周期都要进行比较
  • 实现思路:采用状态机进行实现
    • 状态转换的控制
      • 计数器:接收位计数–>字,字计数–>数据帧
      • 比较器:枕头数据与同步字的比较
  • 两个状态
    在这里插入图片描述
    该状态转换关系从功能需求很容易得出
    难点:需要检测三个连续的同步帧才能从失步态到同步态
    控制不清晰
  • 四状态划分
    在这里插入图片描述
    实现难点:每个帧持续8*64个时钟周期,其中第8个时钟周期结束需要同步头比较,后面的504个时钟周期接收数据(同步态)或空等(失步态)
  • 8个状态
    在这里插入图片描述
    • 在每个状态,省略了自身状态转移的情况
    • 每个R_Headx状态持续八个周期(Read_Head1)除外
    • 每个R_Datax状态持续504个周期
    • 需要设计一个记8和一个记64的计数器辅助进行控制
  • 代码部分
    完整代码
module S2P (reset,clk,serial_in,ior,iow,address,data
);input           reset;input           clk;input           serial_in;input           ior;input           iow;input   [7:0]   address;input   [7:0]   data;reg     [7:0]   Data;reg             counter8_en,counter504_en,counter8_clr,counter504_clr;reg     [2:0]   counter8;reg     [8:0]   counter504;reg     [7:0]   shifter,data_reg,sync_word;reg     [2:0]   pres_state,next_state;parameter R_Head1 = 3'b000,R_Data1 = 3'b001,R_Head2 = 3'b010,R_Data2 = 3'b011,R_Head3 = 3'b100,R_Data3 = 3'b101,R_Head = 3'b110,R_Data = 3'b111;   //状态机always @(posedge reset or posedge clk) beginif (reset) pres_state = R_Head1;else pres_state = next_state;endalways @(pres_state,shifter,counter8,counter504) begincase(pres_state)R_Head1: if (shifter == sync_word) next_state = R_Data1;else next_state = R_Head1;R_Data1: if (counter504 == 9'b0) next_state = R_Head2;else next_state = R_Data1;R_Head2: if (counter8 == 3'b0) beginif (shifter == sync_word) next_state = R_Data2;else next_state = R_Head1;end else next_state = R_Head2;R_Data2: if (counter504 == 9'b0) next_state = R_Head3;else next_state = R_Data2;R_Head3: if (counter8 == 3'b0) beginif (shifter == sync_word) next_state = R_Data3;else next_state = R_Head1;end else next_state = R_Head3; R_Data3: if (counter504 == 9'b0) next_state = R_Head;else next_state = R_Data3;R_Head: if (counter8 == 3'b0) beginif (shifter == sync_word) next_state = R_Data;else next_state = R_Head1;end else next_state = R_Head;R_Data: if (counter504 == 9'b0) next_state = R_Head;else  next_state = R_Data;default: next_state = pres_state;endcaseend// 移位器和计数器always @(posedge reset or posedge clk) beginif (reset) shifter = 8'b0;else shifter = {serial_in,shifter[7:1]};endalways @(posedge clk  or posedge reset) beginif (reset) counter8 = 3'b111;else beginif (counter8_clr) counter8 = 3'b111;else if (counter8_en)counter8 = counter8 - 1; endendalways @(posedge clk  or posedge reset) beginif (reset) counter504 = 3'b111;else beginif (counter504_clr) counter504= 3'b111;else if (counter504_en)counter504 = counter504 - 1; endend// 计数器计数使能和清零信号生成always @(pres_state) beginif (pres_state == R_Data1 || pres_state == R_Data2 || pres_state == R_Data3 || pres_state == R_Data)counter8_clr = 1'b1;else counter8_clr = 1'b0;endalways @(pres_state) beginif (pres_state == R_Head2 || pres_state == R_Head3 || pres_state == R_Head) counter8_en = 1'b1;else counter8_en = 1'b0;endalways @(pres_state) beginif (pres_state == R_Head1 || pres_state == R_Head2 || pres_state == R_Head3 || pres_state == R_Head) counter504_clr = 1'b1;else counter504_clr = 1'b0;endalways @(pres_state) beginif (pres_state == R_Data1 || pres_state == R_Data2 || pres_state == R_Data3 || pres_state == R_Data) counter504_en = 1'b1;else counter504_en = 1'b0;end//数据寄存器读写和同步字寄存器的写入always @(posedge reset or posedge clk)if (reset) data_reg = 8'b0;else if (counter504_en == 1'b1 && counter504[2:0] == 3'b0) data_reg = shifter;always @(posedge reset or posedge clk) beginif (reset) sync_word = 8'b0;else if (iow == 1'b0 && address == 8'b0) sync_word = data;endalways @(ior or address or data_reg) if (ior == 1'b0&&address == 8'b1) Data = data_reg;else Data = 8'bz;assign data = Data;
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132028.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——进程间通信(管道及共享内存)

目录 0. 前言 1. 进程通信的目的 2. 进程通信发展及分类 3. 进程通信匿名管道 3.1 什么是管道? 3.2 匿名管道系统调用 3.3 fork后子进程继承(基于内存级) 3.4 站在文件描述符角度-深度理解管道 3.5 站在内核角度-管道本质 3.6 父子…

C++之map迭代器函数begin、end、rbegin、rend、cbegin、cend、crbegin、crend总结(二百零五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

MES管理系统和ERP系统在生产制造管理中的应用

MES生产管理系统通过过程管理、质量管理、设备管理、产品跟踪和溯源、性能分析和物料管理等方面来管理生产制造,旨在建立规范的生产管理信息平台,提高企业核心竞争力。ERP系统则通过制定生产计划、细分物料需求计划、车间订单下达和生产回报等步骤进行生…

耐蚀合金连续油管最新版 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了耐蚀合金连续油管的订货、材料、制造、检验试验、标记等。 本文件适用于油气井用耐蚀合金连续油管(以下简称"油管")…

核心实验18_ospf高级_ENSP

项目场景: 核心实验18_ospf高级_ENSP 多区域虚链路 实搭拓扑图: 具体操作: R1: [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]net 1.1.1.0 0.0.0.255 [R1-ospf-1-area-0.0.0.0]net 10.1.12.0 0.0.0.255 [R1-os…

阿里云服务器配置选择指南(2023新版教程)

阿里云服务器配置选择_CPU内存/带宽/存储配置_小白指南,阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等,阿小云分享阿里云服务器配置选择方法,选择适合自己的云服务器…

Ubuntu18.04遇到的nodejs的坑记录

Ubuntu18.04安装nodejs的正确姿势 问题回顾 给我的博客网站整上代码高亮插件,在本地运行一切完美,可在我的Ubuntu18.04 bionic版本服务器上运行却报了以下的错误 ERROR in ./node_modules/highlight.js/lib/languages/xml.js Module parse failed: Er…

ArmSom-W3开发板之PCIE的开发指南(一)

1. 简介 RK3588从入门到精通本⽂介绍RK平台配置pcie的方法开发板:ArmSoM-W3 2、PCIE接口概述 PCIe(Peripheral Component Interconnect Express)是一种用于连接计算机内部组件的高速接口标准。以下是关于PCIe接口的简要介绍: …

uniapp 轮播列表左右滑动,滑动到中间放大

html <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpxnext-margin1rpx current0 change"swiperChange" ><block v-for"(item,index) in list"…

1020. 飞地的数量

1020. 飞地的数量 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 1020. 飞地的数量 https://leetcode.cn/problems/number-of-enclaves/description/ 完成情况&#xff1a; 解题思路&#xff1a; /**输入&…

uni-app直播从0到1实战

1.安装开发工具 2.创建项目 参考&#xff1a;uniapp从零到一的学习商城实战_云澜哥哥的博客-CSDN博客 3.编写公共样式&#xff1a;common.css & free.css App.vue引入公共文件&#xff1a; 图标库&#xff1a;iconfont-阿里巴巴矢量图标库

ARM Linux DIY(十二)NES 游戏

文章目录 前言交叉编译工具链使能 Cnes 游戏模拟器移植游戏手柄调试 前言 很多小伙伴为了不让自己的 V3s 吃灰&#xff0c;进而将其打造成游戏机。 我们 DIY 的板子具备屏幕、扬声器、USB Host&#xff08;可以接游戏手柄&#xff09;&#xff0c;当然也要凑一凑热闹。 交叉编…

CentOS 7删除virbr0虚拟网卡

在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡&#xff0c;这个是因为在虚拟化中有使用到libvirtd服务生成的&#xff0c;如果不需要可以关闭后去掉&#xff1a; 一、查看IP及网桥设备 [r…

[源码系列:手写spring] IOC第十三节:Bean作用域,增加prototype的支持

为了帮助大家更深入的理解bean的作用域&#xff0c;特意将BeanDefinition的双例支持留到本章节中&#xff0c;创建Bean,相关Reader读取等逻辑都有所改动。 内容介绍 在Spring中&#xff0c;Bean的作用域&#xff08;Scope&#xff09;定义了Bean的生命周期和可见性。包括单例和…

短剧解说小程序搭建,短剧解说小程序源码

短剧解说小程序搭建&#xff0c;短剧解说小程序源码 可定制开发小程序&#xff0c;H5&#xff0c;APP等系统 有需要可定制可出源码&#xff0c;这个是啥你懂的(VVVVVVVVVVV)&#xff1a;二五四九七八九零五九 需要源码或搭建可看上面的数字信息 短剧解说小程序搭建 小程序使用…

【案例教学】华为云API图像搜索ImageSearch的快捷性—AI帮助您快速归类图片

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI同类型的相片合并归类 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&#xff0c;基于华为云…

R5F5210BBDFB#10-ASEMI代理瑞萨芯片R5F5210BBDFB#10

编辑&#xff1a;ll R5F5210BBDFB#10-ASEMI代理瑞萨芯片R5F5210BBDFB#10 型号&#xff1a;R5F5210BBDFB#10 品牌&#xff1a;瑞萨&#xff08;Renesas) 封装&#xff1a;LFQFP-144 R5F5210BBDFB#10描述&#xff1a; R5F5210BBDFB#10具有1.62V至5.5V的宽工作电压范围&…

Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)

目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回&#xff0c;使…

USB接口针式打印机

1 针式打印机原理 - 针式打印机16针是纵向排列&#xff0c;每次打印垂直的16bit&#xff0c;然后右移一bit&#xff0c;继续下列打印&#xff1b;字节的MSB表示最上面的点&#xff0c;字节LSB表示最下面的点 - 由于汉字字模的点阵是横向排列的&#xff0c;而提供给打印头的信息…

看板管理:以可视化方式确定任务优先级

确定工作的优先级是我们今天都要面对的挑战。若处理不当&#xff0c;我们就可能试图一心多用&#xff0c;从而严重损害工作效率。 使用看板方法来设定工作优先级是一种非常直观、快速的方法。 确定工作优先级的看板方法 看板工作流程管理方法的核心在于工作可视化。工作被划…