【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现

news/2024/5/14 4:43:44/文章来源:https://blog.csdn.net/weixin_45137708/article/details/127836138

EEPROM读写控制模块实现

  • 一、模块功能分析
  • 二、输入/输出信号
  • 三、EEPROM读写控制模块状态机
  • 四、EEPROM读写控制模块实现
  • 五、仿真测试

写在前面:
FPGA实现IIC协议读写EEPROM相关文章:
IIC通信协议
【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现
在上篇文章中已经对IIC协议和IIC接口驱动实现进行了详细介绍,本文介绍EEPROM读写控制模块的实现。

一、模块功能分析

EEPROM读写控制模块需要根据接收到的按键读写请求信号以及I2C接口模块返回的信号发送读写请求、控制指令、数据字节给I2C接口模块,以及接收I2C接口模块返回的数据。

二、输入/输出信号

EEPROM读写控制模块输入/输出信号如下:
在这里插入图片描述

信号说明:

信号I/O类型说明
rdin[7:0]inputI2C接口模块读回的数据
rdin_vldinputI2C接口模块读回的数据有效标志
rw_doneinputI2C接口读写一字节数据完成标志
rd_reqinput读请求
wr_reqinput写请求
reqoutput输出给I2C接口模块的读写请求
cmd[3:0]output控制命令
wr_dout[7:0]output要发送的数据/控制字节

三、EEPROM读写控制模块状态机

EEPROM读写控制模块状态转移图如下:
在这里插入图片描述

状态说明:
IDLE:空闲状态,等待读写请求。
SEND_WRREQ:发送写请求、控制指令、写控制字、地址、数据字节给I2C接口模块。
SEND_RDREQ :发送读请求、控制指令、写控制字、地址、读控制字给I2C接口模块。
WAIT_WRDONE:等待I2C接口模块写数据完成。
WAIT_RDDONE:等待I2C接口模块读数据完成。
WR_DONE:I2C接口模块写数据完成。
RD_DONE:I2C接口模块读数据完成。

四、EEPROM读写控制模块实现

EEPROM读写控制模块verilog代码如下:

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.13                        
//  Design Name: i2c_eeprom    
//  Module Name: eeprom_ctrl         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: 使用I2C协议读写EEPROM驱动控制模块
//  **************************************************************
module eeprom_ctrl (input               clk                 ,input               rst_n               ,//  key_filterinput               wr_req              ,       //  读请求input               rd_req              ,       //  写请求//  i2c_interfaceinput   [7:0]       rdin                ,       //  从I2C接口读回的数据input               rdin_vld            ,input               rw_done             ,       //  读写一字节数据完成标志output              req                 ,       //  读写请求output  [7:0]       wr_dout             ,       //  要发送的数据output  [3:0]       cmd                   
);//  参数定义//  状态机参数定义localparam  IDLE        =   7'b000_0001 ,SEND_WRREQ  =   7'b000_0010 ,   //  发送写请求SEND_RDREQ  =   7'b000_0100 ,   //  发送读请求WAIT_WRDONE =   7'b000_1000 ,   //  等待写数据完成WAIT_RDDONE =   7'b001_0000 ,   //  等待读数据完成WR_DONE     =   7'b010_0000 ,   //  写数据完成RD_DONE     =   7'b100_0000 ;   //  读数据完成//  信号定义reg     [6:0]       state_c                 ;reg     [6:0]       state_n                 ;reg     [3:0]       byte_num                ;   //  字节数reg     [3:0]       cnt_byte                ;   //  字节计数器wire                add_cnt_byte            ;wire                end_cnt_byte            ;reg     [7:0]       wrdata                  ;   //  寄存将要发送的数据reg     [3:0]       command                 ;   //  寄存将要发送的命令reg                 rw_req                  ;//  状态转移条件wire                idle2sendwrreq          ;wire                idle2sendrdreq          ;wire                sendwrreq2waitwrdone    ;wire                sendrdreq2waitrddone    ;wire                waitwrdone2wrdone       ;wire                waitwrdone2sendwrreq    ;wire                waitrddone2rddone       ;wire                waitrddone2sendrdreq    ;wire                wrdone2idle             ;wire                rddone2idle             ;//  状态机always @(posedge clk or negedge rst_n)beginif(!rst_n)beginstate_c <= IDLE ;endelse beginstate_c <= state_n ;endendalways @(*)begincase (state_c)IDLE: beginif(idle2sendwrreq)state_n = SEND_WRREQ ;else if(idle2sendrdreq)state_n = SEND_RDREQ ;elsestate_n = state_c ;endSEND_WRREQ: beginif(sendwrreq2waitwrdone)state_n = WAIT_WRDONE ;elsestate_n = state_c ;endSEND_RDREQ: beginif(sendrdreq2waitrddone)state_n = WAIT_RDDONE ;elsestate_n = state_c ;endWAIT_WRDONE: beginif(waitwrdone2wrdone)state_n = WR_DONE ;else if(waitwrdone2sendwrreq)state_n = SEND_WRREQ ;elsestate_n = state_c ;endWAIT_RDDONE: beginif(waitrddone2rddone)state_n = RD_DONE ;else if(waitrddone2sendrdreq)state_n = SEND_RDREQ ;elsestate_n = state_c ;endWR_DONE: beginif(wrdone2idle)state_n = IDLE ;elsestate_n = state_c ;endRD_DONE: beginif(rddone2idle)state_n = IDLE ;elsestate_n = state_c ;enddefault: state_n = IDLE ;endcaseend//  状态转移assign idle2sendwrreq      = state_c == IDLE        && wr_req       ;assign idle2sendrdreq      = state_c == IDLE        && rd_req       ;  assign sendwrreq2waitwrdone= state_c == SEND_WRREQ  && (1'b1)       ;assign sendrdreq2waitrddone= state_c == SEND_RDREQ  && (1'b1)       ;assign waitwrdone2wrdone   = state_c == WAIT_WRDONE && end_cnt_byte ;assign waitwrdone2sendwrreq= state_c == WAIT_WRDONE && (cnt_byte < 2) && rw_done    ;assign waitrddone2rddone   = state_c == WAIT_RDDONE && end_cnt_byte ;assign waitrddone2sendrdreq= state_c == WAIT_RDDONE && (cnt_byte < 3) && rw_done    ;assign wrdone2idle         = state_c == WR_DONE     && (1'b1)       ;assign rddone2idle         = state_c == RD_DONE     && (1'b1)       ;//  byte_numalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginbyte_num <= 0 ;endelse if(wr_req)beginbyte_num <= 3 ;endelse if(rd_req)beginbyte_num <= 4 ;endelse if(wrdone2idle | rddone2idle)beginbyte_num <= 0 ;endend//  cnt_bytealways @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_byte <= 0 ;endelse if(add_cnt_byte)beginif(end_cnt_byte)begincnt_byte <= 0 ;end				else begin	    cnt_byte <= cnt_byte + 1 ;end 		    endend                   assign	add_cnt_byte = rw_done ;assign	end_cnt_byte = add_cnt_byte && (cnt_byte == byte_num - 1) ;//  rw_reqalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginrw_req <= 1'b0 ;endelse if(idle2sendwrreq | idle2sendrdreq | sendwrreq2waitwrdone | sendrdreq2waitrddone)beginrw_req <= 1'b1 ;endelse beginrw_req <= 1'b0 ;endend//  wrdata   commandalways @(*)beginif(state_c == SEND_WRREQ)begincase (cnt_byte)0: begin wrdata = 8'b1010_0000 ;command = 4'b1010 ; end    //  写控制字1: begin wrdata = 8'b1101_1001 ;command = 4'b1000 ; end    //  写地址2: begin wrdata = 8'b1111_1001 ;command = 4'b1001 ; end    //  写数据default: begin wrdata = 8'b0 ;command = 4'b0 ;endendcaseendelse if(state_c == SEND_RDREQ)begincase (cnt_byte)0: begin wrdata = 8'b1010_0000 ;command = 4'b1010 ; end    //  写控制字1: begin wrdata = 8'b1101_1001 ;command = 4'b1000 ; end    //  读地址2: begin wrdata = 8'b1010_0001 ;command = 4'b1010 ; end    //  写读控制字3: begin wrdata = 8'b0 ;command = 4'b0101 ;      end    //  读数据default: begin wrdata = 8'b0 ;command = 4'b0 ;end     endcaseendend//  输出assign  req = rw_req ;assign  cmd = command ;assign  wr_dout = wrdata ;endmodule                               

五、仿真测试

写数据:
在这里插入图片描述
读数据
在这里插入图片描述

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

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

相关文章

Kafka消费者之相关参数及分区分配再平衡

一、消费者重要参数 深刻的理解这些参数有利于大家在面对自己的项目场景上对配置文件有更好的把握&#xff01; 参数名称描述bootstrap.servers向 Kafka 集群建立初始连接用到的 host/port 列表。key.deserializer 和value.deserializer指定接收消息的 key 和 value 的反序列…

Spring--基于注解管理bean

基于注解管理bean 实验一&#xff1a;标记与扫描 注解 和 XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框架检测到注解标记 的位置&#xff0c;然后针对这个位置按照注解标记的功能来执行具体操作。 本质…

【ASM】字节码操作 工具类与常用类 asm-utils 与 asm-commons

1.概述 本章节主要是对 ASM中的 工具类与常用类 ,包asm-utils 与 asm-commons 两个包中的一些类进行讲解的介绍。 2. asm-util 在asm-util.jar当中,主要介绍CheckClassAdapter和TraceClassVisitor类。在TraceClassVisitor类当中,会涉及到Printer、ASMifier 和Textifier类。…

Vue中 引入使用 element-resize-detector 监听 Dom 元素 宽度、高度 变化

1. 前言 很多做pc端平台的小伙伴都遇到过这样一个问题&#xff1a;在做侧边栏菜单时会有一个收缩和展开的一个功能&#xff0c;在伸缩的过程中右边的页面的宽度就会随之改变。我上网查了查 &#xff0c;也动手试了试 window.onresize ()>{}。却不尽人意&#xff0c;因为它…

进程管理命令 动态监控进程 rpm yum

学习视频:074_韩顺平Linux_服务管理(2)_哔哩哔哩_bilibili 目录 进程管理命令基本介绍 PS命令 显示系统执行的进程 终止进程kill和killall 查看进程树pstree 服务管理 服务管理 打开或者关闭指定端口 动态监控进程 监控网络状态 …

数字IC手撕代码-XX公司笔试真题(脉冲密度调制)

前言&#xff1a; 本专栏旨在记录高频笔面试手撕代码题&#xff0c;以备数字前端秋招&#xff0c;本专栏所有文章提供原理分析、代码及波形&#xff0c;所有代码均经过本人验证。 目录如下&#xff1a; 1.数字IC手撕代码-分频器&#xff08;任意偶数分频&#xff09; 2.数字I…

nginx之https加密网站

目录 一、密钥算法 二、SSL虚拟主机 一、密钥算法 常见密钥算法&#xff1a; 对称加密&#xff1a;AES、DES 非对称加密&#xff1a;RSA、DSA 【注】对称加密的加密和解密使用的是同一把钥匙&#xff0c;非对称加密的加密和解密使用的不是一把钥匙&#xff0c;在对网…

0093 二分查找算法,分治算法

/* * 二分查找算法 * 前提&#xff1a;数组必须有序 * 1.确定该数组的中间值下标 mid(leftright)/2 * 2.让需要查找的数target和arr[mid]比较 * * 非递归算法 * 递归算法 */ public class BinarySearch_ { public static void main(String[] args) { int[…

【Python】常量和变量类型

目录 1.常量和表达式 2. 变量和类型 2.1 变量是什么 2.2 变量的语法 2.3 变量的类型 2.4 动态类型特性 1.常量和表达式 我们可以把Python当成一个计算器&#xff0c;来进行一些算式运算&#xff0c;如 print(1 2 - 1) print(1 2 * 2) print(1 2 / 2) 注&#xff1a;在…

pta-sql补题(2)

目录​​​​​​​ 插入insert&#xff1a; 两种语法形式&#xff1a; 插入记录&#xff08;一&#xff09; 表结构: 表样例 输出 插入记录&#xff08;二&#xff09; 表结构: 表样例 结果判定: 更新update 语法 更新记录&#xff08;一&#xff09; 表结构: …

Python——正则表达式的应用

文章目录前言正则表达式方法re.search方法group方法re.match方法re.findall方法re.finditer方法re.split方法re.sub方法正则表达式的应用前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 正则表达式是字符串处理的有力工具和技术。 使用正在表达式的目的…

Hackthebox系列 Starting point Tier0 Meow记录

免责声明&#xff1a;本教程仅限学术讨论使用&#xff0c;请勿作用于非法用途&#xff01;&#xff01;&#xff01;如有用于非法用途&#xff0c;本人概不负责。 目录题目来源题目TASK 1TASK 2TASK 3TASK 4TASK 5TASK 6NMAP端口扫描TASK 7Telnet访问TASK 8TASK 9参考题目来源 …

【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】

一.RPC框架必会的基本知识 1.1 什么是RPC&#xff1f; RPC&#xff08;Remote Procedure Call ——远程过程调用&#xff09;&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络的技术。 一次完整的RPC同步调用流程&#xff1a; 服务…

rust编程语言(chapter 1)

目录 1. rust安装 2. Hello Rust 3. Cargo包管理器 3.1 cargo简介 3.2 cargo创建项目 3.3 构建和运行项目 3.4 debug和release版本构建 1. rust安装 rust提供了一个命令行的工具rustup&#xff0c;可以用来管理和安装rust的版本以及相关的工具集。 那么首先&#xff0c…

python游戏库pygame经典教程

目录 一.Pygame程序基本搭建过程 1.初始化化程序 2.创建Surface对象 3.事件监听 4.游戏循环 二.Pygame Display显示模块详解 1.将Surface对象粘贴至主窗口上 2.设置窗口主窗口 3.填充主窗口背景&#xff0c;参数值RGB 4.设置窗口标题 5.更新屏幕内容 6.pygame.display其他方…

java家政服务中心网站mysql

目 录 第一章 绪论 5 1.1 课题开发背景 5 1.2 课题研究意义 5 1.3 本课题主要工作 5 第二章 相关技术介绍 6 2.1 JSP技术 6 2.2 MyEclipse 6 2.3 MySQL数据库 7 2.4 J2EE 技术 8 2.5 B/S架构 9 第三章 系统分析 12 3.1 系统可行性分…

Python 考试练习题 2

一、选择题 1、下列是 python 合法标识符的是&#xff08; B&#xff09;。 A. 2variable B. variable2 C. $anothervar D. if 2、在 python 中字符串的表示方式是&#xff08;D &#xff09;。 A.采用单引号包裹 B.采用双引号包裹 C.采用三重单引号包裹 D.ABC 都是 3、设有…

nginx调度器

目录 源码安装nginx rpm安装nginx 调度器配置 节点服务器配置 源码包下载&#xff1a;http://nginx.org/en/download.html &#xff08;mainline:开发版 stable&#xff1a;稳定版&#xff09; rpm包的yum源&#xff1a;http://nginx.org/packages/centos/7/x86_64/ 本次通…

爬取医药卫生知识服务系统的药品数据——超详细流程

爬取医药卫生知识服务系统的药品数据——超详细流程 文章目录爬取医药卫生知识服务系统的药品数据——超详细流程前言一、寻找药品数据二、爬取药品ID1.资源获取2.数据提取3.资源保存4.主函数5.总体代码三、爬取药品信息1.加载资源ID2.获取数据3.数据提取4.保存信息5.主函数6.总…

Python统治编程界?Java第一个不服

要问现在什么程序设计语言最火&#xff1f;当然是——Python。 近日&#xff0c;TIOBE公布了2022年11月的编程语言排行榜&#xff0c;Python稳居第1名&#xff01;在Python之后&#xff0c;排第2名的是C语言&#xff0c;第3名是Java。但要说Python统治了编程界&#xff0c;Jav…