IIC 随机写+多次写 可以控制写几次
```verilog
module icc_tx#(parameter SIZE = 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV= 50_000_000 ,parameter SPEED = 100_000 ,parameter LED = 50
)( input wire clk ,//系统层input wire rst_n ,inout wire sda ,//物理侧output wire scl ,input wire valid ,//用户侧(写使能)input wire [15:0] addr ,input wire [8*SIZE-1:0] data ,output wire led ,output wire a //ASK状态 1的时候就是该状态否则不是该状态
);
reg scl_r ;
reg sda_o ;
reg sda_i ;
reg [5:0] state ;
reg [((SIZE+3)*8-1):0] data_r ;//SIZE+1 因为还有带上地址加写命令0 不减一是为了产生空白的位不然移位会多移一位
reg [9:0] cunt_0 ;//开始位的计数器 记到500 start
reg [9:0] cunt_1 ;//BUSY与ASK的计数器 用来产生时钟 也方便cunt_2也就是cunt_bit计数
reg [9:0] cunt_2 ;//每一bit数据维持的时间 只在BUSY状态下计数
reg [3:0] cunt_3 ;// 每一次应答加一 计数发了多少数据
reg [30:0] cunt_4 ;//计数小灯点亮时间 1s
reg [9:0] cunt_5 ;
parameter CUNT_MAX=CLK_DIV/SPEED ;
parameter ADDR =7'b101_0000 ;//地址
parameter IDEL =6'b000_001 ;
parameter START =6'b000_010 ;
parameter BUSY =6'b000_100 ;
parameter ASK =6'b001_000 ;
parameter ERROR =6'b010_000 ;
parameter STOP =6'b100_000 ;assign scl=scl_r ;
assign a =(state==ASK)?1'b1:1'b0 ;
assign sda=(state==ASK)?1'bz:sda_o;
//assign sda = sda_o;
//错误状态下led一直亮
assign led=(state==ERROR)?1:0 ;//
always @(posedge clk ) beginif(state==ASK&&cunt_1==(CUNT_MAX/4*3))sda_i<=sda;elsesda_i<=sda_i;end
//数据的缓存 加移位
always @(posedge clk ) begin if(state==IDEL&&valid==1)data_r<={ADDR,1'b0,addr,data}; //单次写else if(cunt_1==4&&state==BUSY) ///data_r<=(data_r<<1); //先赋值再移位了elsedata_r<=data_r;
end
//开始位的 start计数器 记到500
always @(posedge clk ) beginif(state==START)cunt_0<=cunt_0+1;elsecunt_0<=0;
end
//cunt_1
always @(posedge clk ) beginif(state==BUSY||state==ASK)beginif(cunt_1==CUNT_MAX-1)cunt_1<=0;elsecunt_1<=cunt_1+1;endelsecunt_1<=0;
end
//cunt_2
always @(posedge clk ) beginif(state==BUSY)beginif(cunt_1==CUNT_MAX-1)cunt_2<=cunt_2+1;else cunt_2<=cunt_2;endelsecunt_2<=0;
end
//cunt_3 计数发送了几个bit数据
always @(posedge clk ) beginif(state==ASK)beginif(cunt_1==66)cunt_3<=cunt_3+1;elsecunt_3<=cunt_3;endelse if(state==BUSY)cunt_3<=cunt_3;elsecunt_3<=0;
end
//cunt_4
always @(posedge clk ) beginif(state==ERROR)cunt_4<=cunt_4+1;elsecunt_4<=0;
end
//结束位计数 cunt_5
always @(posedge clk ) beginif(state==STOP)cunt_5<=cunt_5+1;elsecunt_5<=0;
end
//状态的转移
always @(posedge clk or negedge rst_n) beginif(!rst_n)state<=IDEL;else begincase (state)IDEL :beginif(valid==1)state<=START;elsestate<=state;endSTART:beginif(cunt_0==CUNT_MAX-1)state<=BUSY;elsestate<=state;endBUSY : beginif(cunt_2==10'd7&&cunt_1==CUNT_MAX-1)state<=ASK;elsestate<=state;endASK :beginif(cunt_1==CUNT_MAX-1)beginif(sda_i==0)beginif(cunt_3==(SIZE+3))state<=STOP;elsestate<=BUSY;endelsestate<=ERROR;endelsestate<=state;endERROR :beginif(cunt_4==LED)state<=IDEL;elsestate<=state;endSTOP :beginif(cunt_5==CUNT_MAX-1)state<=IDEL;elsestate<=state;enddefault: state<=state;endcaseend
end
//时钟线scl的描述
always @(posedge clk ) beginif(state == IDEL || state == START)scl_r <= 1'b1;else if(state == BUSY || state == ASK)beginif(cunt_1 >=0 && cunt_1 <= (CUNT_MAX / 2)) scl_r <= 1'b0;else scl_r <= 1'b1;endelse if(state == STOP)beginscl_r <= 1'b1;endelse scl_r <= 1'b1;
end
//数据线sda的描述
always @(posedge clk ) begincase (state)IDEL : sda_o<=1'b1;START: beginif(cunt_0<CUNT_MAX/2) //也可以起始位状态直接置低置低时间就是cunt_0==250 sda_o<=1;elsesda_o<=0;endBUSY :beginif(cunt_1==1) ///一定要等于0//*************sda_o<=data_r[((SIZE+3)*8-1)];elsesda_o<=sda_o;endASK :beginif(cunt_1==CUNT_MAX-1)sda_o<=1'b0; //给0才可以 因为busy中的保持导致给1会在结束位sda也是一个脉冲1elsesda_o<=1'bz;endERROR:sda_o<=1'b1;STOP :beginif(cunt_5<CUNT_MAX/2)sda_o<=1'b0;elsesda_o<=1'b1;enddefault: sda_o<=1'b1;endcase
end
endmodule
仿真
`timescale 1ns / 1psmodule tb_icc_tx();
reg clk ;///
reg rst_n;///
wire sda ;
wire scl ;
reg valid;///
reg [15:0] data ;///
wire led ;
wire a ;
reg [15:0] addr ;
initial beginclk =1;rst_n<=0;valid<=0;data <=0;#100rst_n<=1;#100valid<=1;data <=16'b1111_0000_0000_1111; addr <=16'b1111_0000_0000_0000;#20valid<=0;data <=0;
endassign sda= (a==1)?1'b0:1'bz;//从机发的
always #10 clk=~clk;
icc_tx#(/*parameter */. SIZE (2 ),/*parameter */. CLK_DIV(50_000_000 ),/*parameter */. SPEED (100_000 ),/*parameter */. LED (50 )
)u_icc_tx( /*input wire */ .clk (clk ),//系统层/*input wire */ .rst_n(rst_n),/*inout wire */ .sda (sda ),//物理侧/*output wire */ .scl (scl ),/*input wire */ .valid(valid),//用户侧/*input wire [8*SIZE-1:0] */ .data (data ),/*output wire */ .led (led ),/*input wire [15:0] */ .addr (addr ) ,/*output wire */ .a (a ) //ASK状态 1的时候就是该状态否则不是该状态
);
endmodule
相关文章:
IIC 随机写+多次写 可以控制写几次
verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…...
controller中的参数注解@Param @RequestParam和@RequestBody的不同
现在controller中有个方法:(LoginUserRequest是一个用户类对象) PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…...
手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程
“Men pass away, but their deeds abide.” 人终有一死,但是他们的业绩将永存。 ——奥古斯坦-路易柯西 目录 前言 简单函数求极值 复杂函数梯度法求极值 泰勒展开 梯度,Nabla算子 Cauchy-Schwarz不等式 梯度下降算法 算法流程 梯度下降法…...
多目标优化算法——多目标粒子群优化算法(MOPSO)
Handling Multiple Objectives With Particle Swarm Optimization(多目标粒子群优化算法) 一、摘要: 本文提出了一种将帕累托优势引入粒子群优化算法的方法,使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...
Swift——自动引用计数ARC
ARC ARC是swift使用的一种管理应用程序内存的机制,对于C语言我们知道,当我们申请一块空间,通常需要手动释放,不然会造成空间浪费,而有了ARC机制,你无需考虑内存的管理,因为ARC会在类的实例不再…...
【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)
Quarkus 基于CDI和拦截器实现AOP功能(进阶版) 拦截器的属性成员拦截器的重复使用基于属性成员和重复使用的拦截器的发消息案例 本节来了解一下拦截器高级特性(拦截器的重复使用和属性成员),官网说明:https:…...
【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
前言 在日常开发和运维中,为了提高服务器登录的安全性,我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而,在配置 SSH 公钥登录的过程中,可能会遇到各种坑和 Bug。本文将从零开始,手把手教你如何在 Ubuntu…...
insmod一个ko提供基础函数供后insmod的ko使用的方法
一、背景 在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些…...
七、传统循环神经网络(RNN)
传统循环神经网络 RNN 前言一、RNN 是什么?1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…...
LeetCode:19.删除链表倒数第N个节点
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:19.删除链表倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表…...
【RISC-V CPU debug 专栏 2 -- Debug Module (DM), non-ISA】
文章目录 调试模块(DM)功能必须支持的功能可选支持的功能兼容性要求规模限制Debug Module Interface (DMI)总线类型地址与操作地址空间控制机制Debug Module Interface Signals请求信号响应信号信号流程Reset Control复位控制方法全局复位 (`ndmreset`)Hart 复位 (`hartreset…...
单片机学习笔记 11. 外部中断
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
基于stm32的智能教室管理系统/智能家居系统
基于stm32的智能教室管理系统/智能家居系统 持续更新,欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前,物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起,实现管理的智能化…...
基于 Qt 和 GStreamer 的环境中构建播放器
一、功能与需求分析 功能描述 播放本地视频文件(如 MP4、MKV)。 支持基本控制功能(播放、暂停、停止、跳转)。 提供音量调节功能。 在 Windows 环境下使用 Visual Studio 2022 编译。 技术选型 Qt:用于构建用户界面。 GStreamer:负责视频解码和播放。 Visual Studio 202…...
windows docker 入门
这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步:安装Docker Desktop for Windows 系统要求: Windows 10 64位版本(专业版、企业版或教育版)。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...
baomidou Mabatis plus引入异常
1 主要异常信息 Error creating bean with name dataSource 但是有个重要提示 dynamic-datasource Please check the setting of primary 解决方法: <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring…...
深度学习中的正则化模型是什么意思?
一、定义 在深度学习中,正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好,但在新的、未见过的数据(测试数据)上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度…...
修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题
之前很多配置都是放在nacos里面,然后这次同事有个配置写在application.properties中,这个配置含有中文,启动之后发现拿到的中文值会乱码,然后就帮忙看了一下问题。 排查问题 经过不停的百度、排查发现,spring读取app…...
Flink 热存储维表 使用 Guava Cache 减轻访问压力
目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中,Flink 应用中…...
深入探索SenseVoiceSmall:高效多语言语音识别与处理模型
引言 随着人工智能技术的飞速发展,语音识别技术已经广泛应用于智能助手、客户服务、智能家居等多个领域。然而,现有的语音识别模型往往存在资源消耗大、多语言支持不足等问题。今天,我们要介绍的是来自ModelScope平台的SenseVoiceSmall模型&…...
Flink--API 之Transformation-转换算子的使用解析
目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …...
每日十题八股-2024年11月27日
1.类型互转会出现什么问题吗? 2.为什么用bigDecimal 不用double ? 3.装箱和拆箱是什么? 4.Java为什么要有Integer? 5.Integer相比int有什么优点? 6.那为什么还要保留int类型? 7.说一下 integer的缓存 8.怎么…...
OpenCV截取指定图片区域
import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…...
Java部分新特性
模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...
【SpringBoot】28 API接口防刷(Redis + 拦截器)
Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括:防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等,以确保接口的安全性。 常见措施 1)防火墙 防火墙是网络安全中最基本的安全设备之一,…...
IT运维专家给年轻人一些职业上的建议
运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...
Django基础之路由
一.前言 前面我们说了django的安装于基础配置,基础知识点我就细分下来,每天和大家讲一点,今天就要和大家说django的基础知识点了,我们今天先来讲路由,内容不多,希望大家记住 二.传统路由 路由就是前面一个…...
Python实例化中默认值的行为及应用
Python实例化中默认值的行为及应用 适合初学者阅读 本文要点 使用可变对象作为默认参数会导致所有实例共享同一对象,引发意外的数据修改。不可变对象作为默认参数时,每次实例化都会创建新的对象,不会共享数据。推荐使用None作为默认值&…...
【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R
【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…...
ShenNiusModularity项目源码学习(4:身份认证)
ShenNiusModularity项目有两套启动方式,一种是ShenNius.Admin.Mvc项目启动,该项目为MVC模式,带前台页面,也有后台服务,另一种是ShenNius.Admin.Hosting,该项目启动后仅提供后台服务,供其它前台项…...
360网站怎么建设/搜索引擎入口大全
一 应用场景描述现在我需要向50数量的服务器分发Logstash新版本的rpm包,大概220MB左右,直接使用Ansible的copy命令进行传输,命令如下:ansible all -m copy -a "src/opt/software/logstash/logstash-agent-2.3.3-fb.centos6.…...
网页与网站的区别与联系/重庆的seo服务公司
word生成pdf保留书签设置 点击“另存为”选项: 在另存为界面选择保存为pdf,如下,会出现“选项”设置项,点击进入: 在选项中,设置需要的设置,若要将pdf保留word中的标题作为书签,则…...
国外 网站 欣赏/公司网站建设流程
写在前面 很多小伙伴留言说让我写一些工作过程中的真实案例,写些啥呢?想来想去,写一篇我在以前公司从零开始到用户超千万的数据库架构升级演变的过程吧。 本文记录了我之前初到一家创业公司,从零开始到用户超千万,系统…...
网站建设要注意哪些事情/优秀的软文广告欣赏
数据结构(C语言版)实现链栈的创建,赋值随机数,进栈,出栈,取栈顶元素,输出 1.链表(链式存储结构): 运算时受限的单链表,只能在链表头部进行操作,故没有必要附加头结点,栈…...
网站注册管理策划方案/艾滋病阻断药
一、连接查询[连表查询、多表查询]当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回mysql支持三种类型的连接查询,分别为:内连接查询(inner join)查询的结果为两个表匹配到的数据使用内连接&am…...
app软件制作网站/搜索引擎营销简称seo
【实例简介】更新至2018-05-30 增加不支持IE8的页面提示 修复页面链接和表单提交默认在新窗口中打开的问题 更新suggest插件,修复错位问题 升级bootstrap版本到3.3.6版本 升级layer到2.1版本 升级echarts到2.2.7版本 升级webuploader到0.1.5版本 修复网络条件不好情…...