帧结构的串行数据接收器——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.mzph.cn/news/78280.shtml

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

相关文章

lnmp环境部署

linux版本:centos7 nginx版本:1.24 php版本:7.4 mysql版本:5.7 尽量yum安装,省时省力;之前有用lnmp2一键安装,但php版本会在安装后切换成一个很低的版本,原因未知。 注意事项&a…

9. xaml ComboBox控件

1.运行图像 2.运行源码 a.Xaml源码 <Grid Name="Grid1"><!--IsDropDownOpen="True" 默认就是打开的--><ComboBox x:Name="co

Spark集成hudi创建表报错

环境描述: hudi版本:0.13.1 spark版本:3.3.2 Hive版本:3.1.3 Hadoop版本:3.3.4 问题1: 描述:按照官方文档运行spark-sql创建spark的hudi表报错 建表语句: CREATE TABLE stg.spark_mor_test_01 (uuid string,name string,age int,ts …

transformer大语言模型(LLM)部署方案整理

说明 大模型的基本特征就是大&#xff0c;单机单卡部署会很慢&#xff0c;甚至显存不够用。毕竟不是谁都有H100/A100, 能有个3090就不错了。 目前已经有不少框架支持了大模型的分布式部署&#xff0c;可以并行的提高推理速度。不光可以单机多卡&#xff0c;还可以多机多卡。 …

useGetState自定义hooks解决useState 异步回调获取不到最新值

setState 的两种传参方式 1、直接传入新值 setState(options); const [state, setState] useState(0); setState(state 1); 2、传入回调函数 setState(callBack); const [state, setState] useState(0); setState((prevState) > prevState 1); // prevState 是改变之…

【网络教程】超越平凡:一文揭示SSH-keygen的神秘世界

SSH(Secure Shell)是一种网络协议,用于安全地连接到远程计算机。SSH-keygen 是 SSH 协议的一部分,用于生成、管理和转换身份验证密钥对。 SSH-keygen 命令的基本语法如下: ssh-keygen [选项]以下是 ssh-keygen 命令的一些常用选项和参数: -t:指定要生成的密钥类型。例如…

Python实现猎人猎物优化算法(HPO)优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

基于BLIP-2的看图问答原理及实现

大型语言模型 (LLM) 最近获得了很大的关注&#xff0c;出现了许多流行的模型&#xff0c;如 GPT、OPT、BLOOM 等。 这些模型擅长学习自然语言&#xff0c;非常适合构建聊天机器人、编码助手、决策助手或翻译系统。 然而&#xff0c;他们缺乏其他模式的知识—例如&#xff0c;他…

GIS地图服务数据可视化

GIS地图服务数据可视化 OSM&#xff08;Open Street Map&#xff0c;开放街道地图&#xff09;Bing地图&#xff08;必应地图&#xff09;Google地图&#xff08;谷歌地图&#xff09; 地图服务数据可视化是根据调用的地图服务请求Web服务器端的地图数据&#xff0c;实现地图数…

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…

SpringBoot+MySQL+Vue前后端分离的宠物领养救助管理系统(附论文)

文章目录 项目介绍主要功能截图:后台:登录个人中心宠物用品管理宠物领养管理用户管理用户领养管理宠物挂失管理论坛管理系统管理订单管理前台首页宠物挂失论坛信息宠物资讯部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创

前端面试的话术集锦第 6 篇:高频考点(事件机制 跨域 存储机制 浏览器缓存等)

这是记录前端面试的话术集锦第六篇博文——高频考点(事件机制 & 跨域 & 存储机制 & 浏览器缓存等),我会不断更新该博文。❗❗❗ 1. ⼿写 call、apply 及 bind 函数 ⾸先从以下⼏点来考虑如何实现这⼏个函数: 不传⼊第⼀个参数,那么上下⽂默认为window 改变了…

Java 复习笔记 - 常用API 下

文章目录 一&#xff0c;JDK7以前时间相关类&#xff08;一&#xff09;Date 时间&#xff08;二&#xff09;SimpleDateFormat 格式化时间&#xff08;三&#xff09;Calendar 日历 二&#xff0c;JDK8新增时间相关类&#xff08;一&#xff09;时区、时间和格式化&#xff08…

Layui + Flask 使用(01)

Layui 是一套开源免费的 Web UI 组件库,采用自身轻量级模块化规范,遵循原生态的 HTML/CSS/JavaScript 开发模式,极易上手,拿来即用,非常适合网页界面的快速构建。在使用了很久之后,也发现了一些问题。 先说优点: layui 采用的是原生的 HTML/CSS/JavaScript 技术开发,上…

R-YOLOv7-tiny检测浸水玉米胚乳裂纹

Detecting endosperm cracks in soaked maize using μCT technology and R-YOLOv7-tiny 1、模型1.1 C3_TR module(自己提出修改)1.2 CoT block注意力1.3 GhostConv模块2、模型整体流程图3、实验采用r - yolov7微模型和μCT技术对浸水玉米胚乳裂纹进行了检测。提出的ryolov7微…

Nginx参数配置详细说明【全局、http块、server块、events块】【已亲测】

Nginx重点参数配置说明 本文包含Nginx参数配置说明全局块、http块、server块、events块共计30多个参数配置与解释&#xff0c;其中常见参数包含配置错误出现的错误日志&#xff0c;能让你更快的解决问题。 该文的所有参数大部分经过单独测试&#xff0c;错误都是自己收集出来的…

iOS开发 蓝牙功能

iOS开发蓝牙功能主要分扫描中心和外设设备 Central: 中心设备,发起蓝牙连接的设备(一般指手机)Peripheral: 外设,被蓝牙连接的设备(一般是运动手环/蓝牙模块)Service:服务,每个设备会提供服务,一个设备有很多服务Characteristic:特征,每个服务中包含很多个特征,这些特征的权限…

付费进群搭建二维码

如今&#xff0c;在互联网时代&#xff0c;群组聊天已经成为人们高效沟通和合作的重要方式。然而&#xff0c;对于一些专业团队或机构来说&#xff0c;免费的系统可能无法满足他们对安全性、稳定性和个性化功能的要求。因此&#xff0c;他们需要寻找付费的群组系统&#xff0c;…

如何将安防视频监控系统/视频云存储EasyCVR平台推流到公网直播间?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

基于PyTorch使用LSTM实现新闻文本分类任务

本文参考 PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm1001.2014.3001.5501 文章目录 本文参考任务介绍做数据的导入 环境介绍导入必要的包介绍torchnet和keras做数据的导入给必要的参数命名加载文本数据数据前处理模型训…