帧结构的串行数据接收器——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字构成一个帧。每帧的第一个字为同步字。
    连续检测到三个同步,即连续三个同步头和同步图案一样的帧,才开始进行数据接收

  • 详细设计-工作阶段非常明显

    • 失步阶段:检测同步头,根据情况确定是否转入同步状态
    • 同步阶段:检测同步头,如果匹配则接收数据,仍然处于同步阶段;否则转入失步状态。
    • 注意:是失步态下检测的一个同步字时需要每个时钟周期都要进行比较
  • 实现思路:采用状态机进行实现

    • 状态转换的控制
      • 计数器:接收位计数–>字,字计数–>数据帧
      • 比较器:接收数据与同步字的比较
  • 两个状态
    在这里插入图片描述
    该状态转换关系从功能需求很容易得出
    难点:需要检测三个连续的同步帧才能从失步态到同步态
    控制不清晰

  • 四状态划分
    在这里插入图片描述
    实现难点:每个帧持续8*64个时钟周期,其中第8个时钟周期结束需要同步头比较,后面的504个时钟周期接收数据(同步态)或空等(失步态)

  • 8个状态
    在这里插入图片描述

    • 在每个状态,省略了自身状态转移的情况
    • 每个R_Headx状态持续八个周期(Read_Head1)除外
    • 每个R_Datax状态持续504个周期
    • 需要设计一个记8和一个记504的计数器辅助进行控制
  • 代码部分
    完整代码

`timescale 1ns / 1psmodule S2P (reset,clk,serial_in,ior,iow,address,data,cnt
);input           reset;input           clk;input           serial_in;input           ior;input           iow;input   [7:0]   address;inout   [7:0]   data;output          cnt;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;reg             cnt;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 = R_Head1;endcaseendalways @(next_state,pres_state) beginif (pres_state == R_Data) cnt = 1'b1;else cnt = 1'b0;end // 移位器和计数器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 = 9'b1_1111_0111;else beginif (counter504_clr) counter504= 9'b1_1111_0111;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'b0000_0001;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
  • Testbench
`timescale 1ns / 1ps
module tb_S2P;reg       reset;reg       clk;reg       serial_in;reg       ior;reg       iow;reg [7:0] address;wire[7:0] data;wire       cnt;S2P s2p (.reset(reset),.clk(clk),.serial_in(serial_in),.ior(ior),.iow(iow),.address(address),.data(data),.cnt(cnt));reg [7:0] d;assign data = (ior == 1'b1)?d:8'bz;//assign data = (ior == 1'b0 &&address == 8'b1)?d:8'bz;always begin#10 clk = ~clk; endinteger i;initial beginserial_in = 1'bZ;#10 ; while (1) beginior = 1'b1;#20; serial_in = 1'b0;#20; serial_in = 1'b1;#20; serial_in = 1'b1;#20; serial_in = 1'b1;#20; serial_in = 1'b1;#20; serial_in = 1'b1;#20; serial_in = 1'b1;#20; serial_in = 1'b0;for (i = 1;i <= 63*8;i = i + 1)#20 serial_in = {$random}%2;end  endinitial beginclk = 0;reset = 1'b1;#20#5 reset = 1'b0;endinitial beginior = 1'b1;//address = 8'b0;//s2p.pres_state = 3'b1;iow = 1'b1;address = 8'b0;d = 8'b01111110;#20#5;iow = 1'b0;//address = 8'b0;#10;address = 8'b0000_0001;//ior = 1'b0;#5 iow = 1'b1;endalways @(cnt) beginior = ~cnt;endinitial begin#20#101000;$finish;end
endmodule
  • 仿真结果
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

react实现动态递增展示数字特效

在可视化展示界面时有一种场景&#xff0c;就是页面在初始化的时候&#xff0c;有些数字展示想要从某个值开始动态递增到实际值&#xff0c;形成一种动画效果。例如&#xff1a; 写一个数字递增的组件&#xff0c;代码如下&#xff1a; import {useEffect, useRef, useState} f…

火花塞工作原理

1.红旗H9轿车2023款发布 2023年元旦过后&#xff0c;红旗汽车在人民大会堂举办了红旗H9的新车发布会&#xff0c;一汽红旗全新的H9豪华轿车终于出炉了全套的配置参数&#xff0c;红旗H9的车身长度达到5137mm&#xff0c;宽度1904mm&#xff0c;轴距3060mm&#xff0c;总高则控…

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录 1、前言2、什么是 Hive 兼容模式&#xff1f;3、为什么要开启 Hive 模式&#xff1f;4、有什么副作用&#xff1f;5、如何开启 Hive 兼容模式&#xff1f;6、该场景下&#xff0c;能不能不开启 Hive 兼容模式&#xff1f;7、为什么不是DATE_FORMAT(datetime, string)&…

C语言的文件操作(炒详解)

⭐回顾回顾文件操作的相关细节⭐ 欢迎大家指正错误 &#x1f4dd;在之前的学习中&#xff0c;不管增加数据&#xff0c;减少数据&#xff0c;当程序退出时&#xff0c;所有的数据都会销毁&#xff0c;等下次运行程序时&#xff0c;又要重新输入相关数据&#xff0c;如果一直像这…

JS 原型和原型链

原型和原型链 1. 了解原型和原型链1.1 原型1.2 原型链 2. 原型2.1 prototype2.2 __proto__ 隐式原型 3. 原型链 1. 了解原型和原型链 1.1 原型 原型&#xff1a; prototype 又称显示原型 1、原型是一个普通对象 2、只有构造函数才具备该属性 3、公有属性可操作 1.2 原型链 原…

Quartz 建表语句SQL文件

SQL文件在jar里面&#xff0c;github下载 https://github.com/quartz-scheduler/quartz/releases/tag/v2.3.2 解压&#xff0c;sql文件路径&#xff1a;quartz-core\src\main\resources\org\quartz\impl\jdbcjobstore tables_mysql_innodb.sql # # In your Quartz propertie…

Python学习 day01(注意事项)

注释 变量 数据类型的转换 运算符 / 的结果为浮点数。若// 的两边有一个为浮点数&#xff0c;则结果为浮点数&#xff0c;否则为整数。 字符串

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求&#xff0c;从插件市场选了一个下载次数较多的组件引入到项目中uqrcode&#xff0c;使用步骤如下&#xff1a; 1、从插件市场下载 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287&#xff0c;若你是跟我一样是用uni-…

AI视频剪辑:批量智剪技巧大揭秘

对于许多内容创作者来说&#xff0c;视频剪辑是一项必不可少的技能。然而&#xff0c;传统的视频剪辑方法需要耗费大量的时间和精力。如今&#xff0c;有一种全新的剪辑方式正在改变这一现状&#xff0c;那就是批量AI智剪。这种智能化的剪辑方式能够让你在短时间内轻松剪辑大量…

【无标题】mysql 普通用户连接报错: MySql server has gone away

1、mysql 普通用户连接报错&#xff1a; MySql server has gone away 2、进入mysql错误日志位置查看输出日志显示错误为&#xff1a; [Warning] [MY-013130] [Server] Aborted connection 47 to db: unconnected user: tjcx host: 10.195.11.4 (init_connect command failed; …

嵌入式网络接口之MAC芯片与PHY芯片

目录 0. 参考文档 1.嵌入式网络接口简介 2.嵌入式网络硬件架构方案 2.1 SOC内未集成MAC芯片 2.2 SOC内集成MAC芯片 2.3 主流方案总结 2.3 参照实际网卡的说明 3.MII/RMII及MDIO接口 3.1 MII 3.2 RMII 3.3 MDIO 0. 参考文档 网卡构造&#xff1a;MAC与PHY的关系&…

【李沐深度学习笔记】矩阵计算(5)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第五篇&#xff0c;由于CSDN限制&#xff0c;只能被迫拆分 矩阵计算 多元函数的等高线 此处参考视频&#xff1a;熟肉)多元…

上PICO,沉浸式观看亚运直播,参与跨国界游戏竞技

备受瞩目的杭州第19届亚运会&#xff0c;将于9月23日正式开幕。据悉&#xff0c;这也是有史以来项目最多的一届亚运会&#xff0c;除部分传统奥运项目外&#xff0c;还包含武术、藤球、板球、克柔术、柔术等亚洲特色项目&#xff0c;以及霹雳舞、电子竞技等深受年轻人喜爱的新兴…

LeetCode算法动态规划—斐波那契数列

目录 剑指 Offer 10- I. 斐波那契数列 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#…

Labelme分割标注软件

Labelme分割标注软件 1、环境配置与安装1.1 创建conda虚拟环境(建议)1.2 安装Labelme 2、简单使用2.1 创建label标签文件2.2 启动labelme2.3 打开文件/文件夹2.4 设置保存结果路径2.5 标注目标2.6 保存json文件格式 3 格式转换3.1 转换语义分割标签3.2 转换实例分割标签 相关重…

中通快递一键查询,轻松掌握物流信息

在如今的快速发展的电商时代&#xff0c;快递已成为人们生活中不可或缺的一部分。随着快递业务的繁荣&#xff0c;快递公司也纷纷推出了各种查询方式&#xff0c;方便顾客随时掌握自己包裹的物流信息。在这其中&#xff0c;中通快递无疑是许多人选择的首选。下面&#xff0c;我…

【00】FISCO BCOS区块链简介

官方文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/introduction.html FISCO BCOS是由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台&#xff0c;由金链盟开源工作组协作打造&#xff0c;并于2017年正式对外开源。 F…

❤Uniapp报npx update-browserslist-db@latest

❤ Uniapp报npx update-browserslist-dblatest 按照提示先更新一下 npx update-browserslist-dblatest然后打开一下端口

MATLAB实现相关性分析

目录 一.基本理论 二.两类相关系数的对比 三.相关系数的假设检验 四.MATLAB的相关操作 五.其他有关的一些列技巧 六.案例展示 七.实战操作 一.基本理论 所谓相关系数&#xff0c;本质上是来衡量两组数据的关系大小——对应呈现函数关心的两种变量&#xff0c;那么我们可以…

MySQL数据库 -- 入门篇

1. MySQL概述 1.1 数据库相关概念 三个概念&#xff1a;数据库、数据库管理系统、SQL。 目前主流的关系型数据库管理系统的市场占有率排名如下&#xff1a; Oracle&#xff1a;大型的收费数据库&#xff0c;Oracle公司产品&#xff0c;价格昂贵。MySQL&#xff1a;开源免费…