HNU工训中心:平台 2HDL 语言与验证实验报告

news2024/11/25 10:30:26

一、自定 FSM 说明

1、状态描述

State0:睡觉,如果闹钟响则起床吃早餐,否则继续睡觉

State1:吃早餐,吃完去上课

State2:上课,上完课后如果要开会就去开会,否则去自习

State3:自习,自习会后吃午餐

State4:开会,开会完后吃午餐

State5:吃午餐,吃完午餐去睡午觉

State6:睡午觉,睡晚午觉后如果要运动则去运动,否则打游戏

State7:运动,运动完后洗澡

State8:打游戏,打完游戏后洗澡

State9:洗澡,洗完澡后吃晚餐

State10:吃晚餐,吃完晚餐后如果要上晚自习则去上自习,否则看 电影

State11:晚自习,晚自习完后去睡觉

State12:看电影,看完电影后睡觉

2、设计代码说明

首先对模块名进行定义,其中包括输入和输出接口:

 接着对定义的 12状态进行编码:

然后是状态直接根据输入的控制信号来进行状态转移的代码:

 

3、仿真波形说明(截图+文字标注) 

测试文件代码:

如图对于第一天来说,有一个判断语句是 zot==4’b1011 才会执行下 面的语句,即 state11 时。而一开始所有控制信号都为 0,则第一天 的状态过程会是 state0 ->state1 ->state3 ->state5 ->state6 ->state8 ->state9 ->state10 ->state11 ->state0。

在状态到了 state11 的 200ms 后,meet 会为 1,此时会进入 state4。 而在进入 state6 时 sport 控制信号被设置为 1,故会进入 state7, 最后进入 state12 回到 state0。所以第二次的状态过程是 state0 ->state1 ->state2 ->state4 ->state5 ->state6 ->state7 ->state9 ->state10 ->state12 ->state0。

通过仿真查看验证:

可以看到红色框框出的即为第一天的状态转移,绿色框出的是第二天 的状态转移,和上面分析的一致,正确。

二、EEPROM 读写代码设计及仿真  

 1、代码说明

1. 端口

2.状态

每个状态用 8 位 16 进制数表示,对照上面图中 SDA 上数据传输情况, 每一位数据传输都有一个对应的状态,多出了一些等待状态。 

 

3. SCL 同步

时钟的频率很高,读写数据不能以时钟周期为周期进行,设备进行响 应和读写需要的时间远大于时钟周期,因此使用 SCL 同步方式来同 步时序。

SCL 周期是通过时钟周期实现的。 一个 scl 周期是 30 个时钟周期。使用 div_cnt 来记录时钟周期数, 30 个一次循环 

 4.状态更新

5.读写命令的判断 

读写命令是通过端口输入 write_op 和 read_op 确定的,这两个信号 是低电平有效,用了 wr_op 和 rd_op 两个寄存器把输入的 write_op 和 read_op 取反,这样如果有读或写命令,wr_op 或 rd_op 为 1,复 位和操作结束(wr_opover)时都要清零,接下来就用 wr_op 和 rd_op 判断是否读 写了,这里仅仅是把原来低电平有效的信号替换为两个 高电平有效信号。

6.下一状态判断 

Byte Write : START + DEVICE +ACK + ADDR + ACK + DATA + ACK + STOP

Random Read : START + DEVICE + ACK +ADDR + ACK+START + DEVICE + DATA + NO ACK + STO

下一状态的更新是在 scl_tick(每 30 个 clk),上面下划线划出的 部分是相同的,无论读写,一开始的状态更新都是按照上面下划线的 顺 序依次更新状态,这时候的器件地址都是 10100000(write), 到了 ADDR 的 ACK,即 W_AACK 时会根据 wr_op 和 rd_op 决定接下来进 入怎样的 状态,wr_op 会开始到状态 W_DATA 读数据;rd_op 会到 WAIT_WTICK3,然后继续 START。操作结束后需要等待一个信号 d5ms_over 才能回到 空闲,控制器件工作的频率不要太高。

 

 

 

 7.SCL 同步实现

空闲,等待,操作结束,start 开始等状态下 SCL 都是高电平,因此 不需要 clr_scl 对 SCL 清零。另外 clr_scl 只在 scl_ls(scl 的低电 平开始)处 才置 1,把 scl 清 0,在 15 个 clk 周期的 scl_hs 处,再 把 scl 拉高,就实现了 SCL 周期

8.SDA 实现

代码后半都是 SDA 实现的部分,因为太长所以一段一段分析。

下面的一段是实现 SDA 的控制信号声明,这些信号在对应的状态且 scl 在低电平的中心时置 1,告诉 SDA 该怎么做,i2c_reg 用来暂存 scl 上 的数据,i2c_rlf 是在读写数据时用的,使用的部分在下一段 代码 

 接下来就是根据控制信号进行操作,把对应操作的数据放到 i2c_reg 里,准备向 SDA 线上传输,i2c_rlf 为 1 时 i2creg 会左移一位,因 为 sda 是单位宽的,每次把 i2creg 的最高位送到 sda 上,因此左移 就是一位一位把数据送到 sda 上

接下来是 sda 输出的控制,sda 使能在主机写数据地址,数据时都 是 1,使能为 1 时器件靠 sda 输出 i2creg 的最高位。NOACK 以外的其 他 响应信号,以及读的数据,都是从机发到 sda 线上的,这时主机 的 sda 使能为 0,不可以发出数据

 

 以下是读数据的操作,用 sda_wr 控制,在 scl 高电平的中心(数据 稳定时)往 read_data 里读数据,左移补 sda,就一位一位的用 sda 发的 数据更新了 read_data,这时 sda 是从机在发数据

9.操作结束,等待

最后就是操作结束后的等待时间,d5ms_cnt 用来记时钟周期,记满 了就会把 d5ms_over 置 1,在上面状态转换的部分,最后进入 STOP 状 态等待的就是这个信号,等到了这个信号,I2C 就回到空闲状态 了。 

最后,这个模块里没有 ACK 处理的部分,只是在应该收到 ACK 的时候 从 sda 读信号出来,没有进行判断,或许是交给主机来做的

2、TestBench 代码说明 

TestBench 主要代码如下:

 

根据上面的代码发现,我们可以知道读写命令是通过端口输入 write_op 和 read_op 确定的。所以该程序先写再读,波形应该也是 这样。

3、仿真波形说明(截图+文字标注)

 

SCL 为高时,SDA 为下降沿的时候,设备开始工作。先由主机写入器 件地址,然后写入数据地址,每次写入后从机都会回复一个 ACK 信号 表示收到。其中器件地址是从机 EEPROM 的地址 1010000X,X 为 0 表 示写,1 表示读,一开始写入器件地址时,X 都是 0。进行写操作, 接下来只需要由主机发出数据就可以了,从机发出 ACK 响应回复收 到。

 

进行读操作,重新写一遍器件地址,这次 X 就是 1 了,表示接下来要 读数据了,从机读出数据,主机收到数据以后回复 NOACK 给从机表示 收到数据。

三、实验总结 

通过这次实验,我学会了很多知识点,比如如何自定义状态机, Verilog 的基本语法,如何编写 testbench 测试文件,如何使用 modelsim 软件进行仿真测试。同时对于 I2C 协议有了更深层次的理 解,对于 EEPROM 代码能够详细阐述其含义。这次实验对我的编码能 力也有了极大提升,也能够通过分析状态图来解释状态转移。 这次实验同时也遇到了很多困难,比如对 Verilog 语法不熟悉,以及 对 modelsim 软件的安装存在疑问等,不过通过向老师和同学求助可 以得到解决

 

 

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

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

相关文章

LiveGBS国标GB/T28181视频流媒体平台-功能视频集中录制存储云端录像H264|H265|HEVC视频存储

LiveGBS国标GB/T28181视频流媒体平台-视频集中录制存储云端录像H264|H265|HEVC视频存储1、云端录像存储2、手动配置录像2.1、按需录像2.2、一直录像3、录像计划3.1、录像计划入口3.2、新增录像计划3.3、编辑录像计划3.4、关联通道4、查看云端录像4.1、查看录像4.1.1、时间轴模式…

vue路由文件拆分管理

随着项目的原来越大,路由越来越多,我们的路由也会越来越多,如果都集中在一个文件中,会很冗杂文件很长。这时候我们可以将路由文件拆分,可读、方便管理。多人合作添加路由也能更多的避免代码冲突 代码拆分目录如图&…

18 客户端服务发现源码分析

Nacos客户端服务发现源码分析 总体流程 首先我们先通过一个图来直观的看一下,Nacos客户端的服务发现,其实就是封装参数、调用服务接口、获得返回实例列表。 但是如果我们要是细化这个流程,会发现不仅包括了通过NamingService获取服务列表&…

运筹系列79:使用Julia进行column generation求解

1. 案例建模 我们对cutting stock问题进行建模。rolls的尺寸为W,每个型号的需求量和尺寸分别为d和w,如下: struct Piecew::Float64d::Int endstruct Datapieces::Vector{Piece}W::Float64 endfunction Base.show(io::IO, d::Data)println(i…

hls.js如何播放m3u8文件(实例)?

HLS(HTTP Live Streaming)是一种视频流传输协议,是苹果推出的适用于iOS与macOS平台的流媒体传输协议。它将视频分割成若干个小段,每个小段大小一般为2~10秒不等,并通过HTTP协议进行传输。通过在每个小段之间插入若干秒…

C++学习笔记-多线程

传统的C&#xff08;C11之前&#xff09;中并没有引入线程这个概念&#xff0c;在C11出来之前&#xff0c;如果我们想要在C中实现多线程&#xff0c;需要借助操作系统平台提供的API&#xff0c;比如Linux的<pthread.h>&#xff0c;或者windows下的<windows.h> 。 …

数据结构——链表讲解(1)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月3日 内容&#xff1a;数据结构链表讲解 目录 前言&#xff1a; 链表的概念&#xff1a; 1.为什么要有链表&#xff1a; 2.链表的运行原理&#xff1a; 3.链表的形态多少&#xff1a; 4.单链表的代码书写&#xff1…

QML定时器

QML使用Timer使用定时器 Timer 计时器可用于触发操作一次&#xff0c;或以给定的间隔重复触发。 常用属性&#xff1a; interval 设置触发器之间的间隔&#xff08;以毫秒为单位&#xff09;。 默认间隔为 1000 毫秒。 repeat 设置重复&#xff0c;为真&#xff0c;则以指定的…

【力扣】stack容器的探索之有效的括号

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《算法详解》 愿你生如夏花之绚烂&#xff0c;幸运永远与你相伴&#xff0c;疯狂常在。 目录一. &#x1f981; Stack容器的来历1.1 操作栈的方法二. &#x1f981; Stack的使用2.1 题目2.2 分析2.3 详细算法实现2.4 力扣AC截图三…

vscode与C++安装与使用【不好用来骂我】

网上教程很多&#xff0c;但是都不太好用&#xff0c;这是我垃圾堆里淘金淘出来的教程&#xff1a; 安装软件 安装 Visual Studio Code: 你需要下载并安装 Visual Studio Code&#xff0c;可以在官网下载 https://code.visualstudio.com/download。 安装 C 扩展: 在 Visual S…

【基础算法】单链表的OJ练习(2) # 链表的中间结点 # 链表中倒数第k个结点 #

文章目录前言链表的中间结点链表中倒数第k个结点写在最后前言 对于单链表的OJ练习&#xff0c;需要深刻理解做题的思路&#xff0c;这样我们才能够在任何场景都能够熟练的解答有关链表的问题。 关于OJ练习&#xff08;1&#xff09;&#xff1a;-> 传送门 <-&#xff0c…

支持向量机简单介绍

1.概述 支持向量机&#xff08;SVM&#xff0c;支持向量网络&#xff09;&#xff0c;是机器学习中获得关注最多的算法没有之一。它源于统计学习理论。 | | | 功能有监督学习线性二分类与多分类&#xff08;Linear Support Vector Classification&#xff09;非线性二分类与多…

你真的会用三元运算符吗?

在我们日常搬砖中&#xff0c;我们经常会看到三元运算符&#xff0c;但是你了解三元运算符到底是怎么用吗&#xff1f;接下来我们就下来详细介绍一下三元运算符大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#x…

职场人必备的6款实用办公app,每一款都是心头爱

打工人不容易啊&#xff0c;不提高工作效率怕是要被淘汰了。今天给大家分享6款职场人必备的实用办公APP&#xff0c;免费效率神器让工作事半功倍。这些APP每一款都是我的心头爱&#xff0c;肯定会让人大开眼界的&#xff0c;超级实用&#xff0c;直接往下看吧。1、向日葵远程控…

docker前端开发环境搭建

docker 做本地开发环境的好处&#xff1a; 隔离环境 各项目所需node等版本不一&#xff0c;切换起来比较麻烦&#xff0c;虽用 nvm可 来解决&#xff0c;但使用 docker 更优 快速配置环境 新电脑&#xff0c;新系统&#xff0c;新环境&#xff0c;第一件事就是配置开发环境。下…

[Java代码审计]—MCMS

环境搭建 MCMS 5.2.4&#xff1a;https://gitee.com/mingSoft/MCMS/tree/5.2.4/利用 idea 打开项目 创建数据库 mcms&#xff0c;导入 doc/mcms-5.2.8.sql 修改 src/main/resources/application-dev.yml 中关于数据库设置参数 启动项目登录后台 http://localhost:8080/ms/l…

【NLP】自动化计算文本文件TTR的bash脚本

自动化计算文本文件TTR的bash脚本 简介 这是一个可以计算文本文件TTR的bash脚本&#xff0c;文件名为&#xff1a;calculate_TTR.sh。它会接收一个文件名作为参数&#xff0c;并输出总单词数、特异单词数和TTR。 TTR是什么 TTR&#xff08;Type-Token Ratio&#xff09;是用…

javaweb期末复习重点

2022.12.12javaweb复习重点 10个选择题10个填空题10个判断2-3简答题2个程序题&#xff08;15分一个&#xff09; 1.HTML、Javascript、divcss ? 详细解释 HTML HTML(Hyper Text Mark-up Language)即超文本标记语言&#xff0c;是用于描述网页的一种标记语言。简单来说&…

九龙证券|全面推进技术研发,6G概念爆火!多家上市公司表示已布局

据商场研讨组织估计&#xff0c;2040年全球6G商场规划逾越3400亿美元。 6G概念指数逆市大涨5.61% 3月2日&#xff0c;6G概念指数逆市上涨5.61%。成份股中&#xff0c;本川智能、沃特股份、邦本科技、我国卫通涨停&#xff1b;信科移动-U大涨14.61%&#xff0c;亚光科技、信维通…

html常用标签2和语法练习

目录 1.表单标签 form标签 input标签 选择框 复选框:checkbox 按钮框:button 文件选择框 多行编辑框:textarea 2.html语法练习 展示简历信息 填写简历信息 ​编辑 3.HTML特殊字符 1.表单标签 表单是让用户输入信息的重要途径 表单域:包含表单元素的区域,重点是form…