16位片内地址的I2C SLAVE接口设计

2023-11-03

8位片内地址的I2C SLAVE在OPENCORS.org上面有,但是我没有找到16位的,我打算用B210的接EEPROM的I2C总线实现跟FPGA通讯就对照24C256的数据手册写了一个。

以下代码2022-6-6更新已经实际运行通过。

 
 
 
  
 
 
 /*
i2c_slave # ( .I2C_ADR( 7'b1010_000 ) )
i2c_slave (
clk,
rst,
scl_i,
sda_i,
sda_oen,  
addr ,
wr,
rd,
dout ,
din ,
st  ,
inr
);
*/ 
 
 
module i2c_slave # ( parameter I2C_ADR = 7'b1010_000 ) (
input clk,rst,
 
input scl_i,sda_i,
output reg sda_oen, 
 
output reg  [15:0] addr ,
output reg wr,rd,
output reg [7:0] dout ,
input [7:0] din ,
output  reg [7:0 ] st  ,
output reg [6:0 ] inr
 
);
 
reg [7:0] dinr, doutr ;
reg [2:0] sdar; always @ (posedge clk) sdar<= { sdar[1:0] , sda_i };
reg [2:0] sclr; always @ (posedge clk) sclr<= { sclr[1:0] , scl_i };
 
 
wire  sda_rise =  sdar[2:1]==2'b01 ;
wire  sda_fall =  sdar[2:1]==2'b10 ;
 
wire  scl_rise =  sclr[2:1]==2'b01 ;
wire  scl_fall =  sclr[2:1]==2'b10 ;
 
wire  start_con_w =  sclr[1] & sda_fall ;
wire  stop_con_w  =  sclr[1] & sda_rise ;  
reg rd1wr0; 

 /*
wire[35:0] CONTROL0 ;
reg  [31:0]  bus32 ; 
 
always @ (posedge clk)  bus32[7:0] <= st   ;
always @ (posedge clk)  bus32[9:8] <= {wr,rd} ;
always @ (posedge clk)  bus32[31:16] <= addr;
always @ (posedge clk)  bus32[15:14] <= {sdar,sclr} ;//dout[5:0];


   chipscope_ila_32 chipscope_ila_32_0 (
				      .CONTROL(CONTROL0), // INOUT BUS [35:0]
				      .CLK(clk), // IN
				      .TRIG0({bus32 }) // IN BUS [31:0]
				      );
						
   chipscope_icon chipscope_icon_i0
     (
      .CONTROL0(CONTROL0) // INOUT BUS [35:0]
      );
		

reg [7:0]d ;always @(posedge clk) case (st) 112,80,168:d<=d+1;default d<=0; endcase 
 
always @ (posedge clk)  bus32[7:0] <= st   ;
always @ (posedge clk)  bus32[9:8] <= {wr,rd} ;
always @ (posedge clk)  bus32[31:16] <= addr;
always @ (posedge clk)  bus32[15:14] <= {sdar,sclr} ;//dout[5:0];
		*/
	 
	 
always @ (posedge clk) if (rst) st<=0;else if (start_con_w)st<=20; else case (st)
0  : st <= 10 ;
10 : begin sda_oen<=1; wr<=0; if (start_con_w) st <= 20 ;end 
20 : begin inr[6]<=sdar[1];if (scl_rise)st<=st+1;end
21 : begin inr[5]<=sdar[1];if (scl_rise)st<=st+1;end
22 : begin inr[4]<=sdar[1];if (scl_rise)st<=st+1;end
23 : begin inr[3]<=sdar[1];if (scl_rise)st<=st+1;end
24 : begin inr[2]<=sdar[1];if (scl_rise)st<=st+1;end
25 : begin inr[1]<=sdar[1];if (scl_rise)st<=st+1;end
26 : begin inr[0]<=sdar[1];if (scl_rise)st<=st+1;end
27 : begin rd1wr0<=sdar[1];if (scl_rise)st<=st+1;end   
28 : if ( inr[6:0] == I2C_ADR ) st<=30;else st<=10;

30 : if (sclr[1]==0) begin  st<=st+1 ;end //you are visiting my device ,ack it now .
31 : begin sda_oen <= 0; if (scl_rise) st<=st+1; end // master read back this ack .
32 : if (sclr[1]==0) begin st<=st+1 ;end 
33 : begin sda_oen  <= 1  ;if (rd1wr0==0) st <= 50 ; 
else st <= 150 ; // read out 
end  
50 : begin addr[15]<=sdar[1];if (scl_rise)st<=st+1;end
51 : begin addr[14]<=sdar[1];if (scl_rise)st<=st+1;end
52 : begin addr[13]<=sdar[1];if (scl_rise)st<=st+1;end
53 : begin addr[12]<=sdar[1];if (scl_rise)st<=st+1;end
54 : begin addr[11]<=sdar[1];if (scl_rise)st<=st+1;end
55 : begin addr[10]<=sdar[1];if (scl_rise)st<=st+1;end
56 : begin addr[9 ]<=sdar[1];if (scl_rise)st<=st+1;end
57 : begin addr[8 ]<=sdar[1];if (scl_rise)st<=st+1;end    
58 : if (sclr[1]==0) begin sda_oen  <= 0 ;st<=st+1;end 
59 : if (scl_rise) st<=st+1;
60 : if (sclr[1]==0) begin sda_oen  <=1  ;st<=70 ;end

70 : begin addr[7]<=sdar[1];if (scl_rise)st<=st+1;end
71 : begin addr[6]<=sdar[1];if (scl_rise)st<=st+1;end
72 : begin addr[5]<=sdar[1];if (scl_rise)st<=st+1;end
73 : begin addr[4]<=sdar[1];if (scl_rise)st<=st+1;end
74 : begin addr[3]<=sdar[1];if (scl_rise)st<=st+1;end
75 : begin addr[2]<=sdar[1];if (scl_rise)st<=st+1;end
76 : begin addr[1]<=sdar[1];if (scl_rise)st<=st+1;end
77 : begin addr[0]<=sdar[1];if (scl_rise)st<=st+1;end    
78 : if (sclr[1]==0) begin sda_oen <= 0 ;st<=st+1 ;end 
79 : if (scl_rise) begin  st<=st+1;end 
80 : if (sclr[1]==0)begin  sda_oen <=1 ;st<=st+1;end //ack this address 
81 : begin doutr[7]<=sdar[1]; if (scl_rise) st<=82;end  
82 :  if (start_con_w)  st<=20;
else if (sclr[1]==0)   st<=101  ; // master write me data  

150 :  begin st <= st+1;end  // set read current addr 
151 :  begin st <= st+1; dinr<= din ; addr <= addr+1;end  //latch in dinr 
152 :  begin sda_oen<= ~dinr[7]; if (scl_rise)st<=st+1;end  153 :  if(sclr[1]==0) st<=st+1;
154 :  begin sda_oen<= ~dinr[6]; if (scl_rise)st<=st+1;end  155 :  if(sclr[1]==0) st<=st+1;
156 :  begin sda_oen<= ~dinr[5]; if (scl_rise)st<=st+1;end  157 :  if(sclr[1]==0) st<=st+1;
158 :  begin sda_oen<= ~dinr[4]; if (scl_rise)st<=st+1;end  159 :  if(sclr[1]==0) st<=st+1;
160 :  begin sda_oen<= ~dinr[3]; if (scl_rise)st<=st+1;end  161 :  if(sclr[1]==0) st<=st+1;
162 :  begin sda_oen<= ~dinr[2]; if (scl_rise)st<=st+1;end  163 :  if(sclr[1]==0) st<=st+1;
164 :  begin sda_oen<= ~dinr[1]; if (scl_rise)st<=st+1;end  165 :  if(sclr[1]==0) st<=st+1;
166 :  begin sda_oen<= ~dinr[0]; if (scl_rise)st<=st+1;end  167 :  if(sclr[1]==0) st<=st+1;
168 :  st<=169;
169 :  begin sda_oen<= 1;if (scl_rise)st<=st+1 ;end  
170 :  if (sdar[1]==0)  st<=180;//ACK : burst read;
       else st<=st+1;//NACK		
	   180: if (sclr[1] == 0 ) st<=150;//wait next reading 
171 :  if (stop_con_w) st<=10 ; //stop now  
//now in write state 
100 : begin doutr[7] <= sdar[1] ; if (scl_rise)st<=st+1;end
101 : begin doutr[6] <= sdar[1] ; if (scl_rise)st<=st+1;end //checked ok
102 : begin doutr[5] <= sdar[1] ; if (scl_rise)st<=st+1;end
103 : begin doutr[4] <= sdar[1] ; if (scl_rise)st<=st+1;end
104 : begin doutr[3] <= sdar[1] ; if (scl_rise)st<=st+1;end
105 : begin doutr[2] <= sdar[1] ; if (scl_rise)st<=st+1;end
106 : begin doutr[1] <= sdar[1] ; if (scl_rise)st<=st+1;end
107 : begin doutr[0] <= sdar[1] ; if (scl_rise)st<=st+1;end  
108 : begin dout<=doutr ; wr<=1 ; st<=st+1; end
109 : begin addr<=addr+1; wr<=0; st<=st+1; end
110 : if (sclr[1]==0) st<=st+1; 
111 : begin sda_oen<=0;if (scl_rise)st<=st+1;end 
112 : if (sclr[1]==0) st<=st+1; //send ACK
113 : begin sda_oen <=1;doutr[7] <= sdar[1];if (scl_rise)st<=st+1;end
114 : if (stop_con_w) st<=20; else if (sclr[1]==0) st<=101;   
 
default st<=0;
endcase
always @ (*) rd = st == 150 ;
endmodule 















代码风格还是我用的本办法。

看图说话:

这里要注意以下几点:

1,SCL高电平期间SDA的输出保持不变。

2,SCL==0 时候,并且满足建立保持时间后,SDA允许数据变化。

3,SCL==1S时候如果SDA由高变低(下降沿)定义为START信号。

4,SCL==1S时候如果SDA由低变高(上升沿)定义为STOP信号。

5,当SLAVE(本代码)发送ACK后,在SCL的上升边缘被MASTER所采集到,并且MASTER要发送STOP信号,或者另外一个START信号,这时候需要考究一下SLAVE何时释放SDA输出是能信号SDA_OEN。数据手册里面描述的此时间最小是100ns。我们可以认为MASTER用SCL的上升边沿采集SLAVE发出的SDA,其保持时间只要不小于100ns就可以满足。(MASTER实际需要的保持时间应该更短),我们这里设置100ns多一些即便是和master的STOP或者START发生两输出冲突,及短也不会有什么损坏器件的影响。

6,I2C总线建立时间是说SCL上升边沿到来之前,SDA要保持的最短时间。

7,I2C总线的建立时间是说SCL下降边沿到来之后,SDA要保持的最短时间。

上述代码简单写好了,框架和思路没有问题,但是还没有调试,细节方面应该是有点问题,明天继续看看。

===========================以下内容2022-6-6添加============================

1,ACK或者NACK是都是独立的一个BIT,没有和STOP和START混合在一起。

2,读的过程首先是设置地址,这个过程伪写,就是将地址写入内部寄存器。之后不STO而立即START,开始读出数据。每个数据之后MASTER给一个ACK,最后一个字节MASTER给一个NACK之后下个BIT发送STOP命令结束总线对话。最后一个字节虽然发送的是NACK实际上MASTER也收到了正确数据,只是为了告诉SLAVE接下来不要传输了,就发送了NACK。

3,PAGE是连续操作的字节个数,的在24C256数据手册里面看到写的是16字节,实际进行读操作时候发现读操作不受PAGE字节数限制,可以一次读出所有的字节。

4,地址是一个默认参数,每次读写操作都会使得地址寄存器加1。

5,写的操作都必须携带地址,而读的操作实际是包含了设置地址和真正读操作。这两个操作序列可以在一次I2C会话中实现,也可以分开来。

6,SCL=0期间允许数据表换,SCL上升边沿SDA的数据被采集,

SCL=1期间如果SDA由高变低被认为是I2C总线会话的开始,

SCL=1期间如果SDA由低变高认为是I2C总线会话的结束。

 

===========================以下内容2022-6-7添加============================

1,在case之前加一个对起始位的判断,只要有起始位到来,就认为是新的会会话开始。这样的目的是为了防止状态机进入未知状态而死机。

2,一个传输开始之后,首先是固定的发送dev_addr+读写请求,如果这时候器件允许读,则就发送ACK,否则不发送任何内容会被认为是NACK。

3,发送ACK相应了器件寻址之后,就会进入都或者写的模式。

4,进入写的模式,首先必须是写操作地址,写完操作地址后,实际又有两种情况,一种是直接继续传输写入内容,另外一种MASTER从新发送START开始新的会话(这种情况下,之前的写操作实际就是之写了地址寄存器)。

5,对4的分析,我们在处理写命令的时候,首先将前两个数据作为地址保存好,之后继续进入收取I2C写来的内容并进行实际写的状态,如果I2C主控要实际进行写,会继续往下进行写操作,如果I2C主控只是为了读而设置地址寄存器,主控会从新发出START命令,被我们检测到以后从新进入判断读写状态。

6,上述4,5说的都是写的情况,读的情况只有一种:在7位的器件地址后面紧接一位是1,说明是读,之后I2C的从设备从之前已经写好的地址寄存器里面获取地址,取数并每个字节发送到I2C的MASTER,并将地址寄存器递增加1。主机收到一个字节后就ACK一下,让I2C从设备再次发送下一个字节,如果主机不打算再接受就发送NACK,之后接着下位发送一个STOP,终止这次传输。

===================2022-6-7添加的关于I2C总线硬件接口的分析==============

1,首先有一个很重要的概念叫做“线与”,这里的“与”就是对应逻辑and,我们知道逻辑and,多个说如进行and逻辑操作,只要有一个是0,则结果是0。

2,我们看下面的总线:

 我们看到红色框内只能将I2C的两个线进行拉低,这样在I2C总线上电平是0,而红色框内那个MOS管的接入方式叫做OPEN DRAIN 或者说“开漏”方式,只能吸收电流拉低为0,而无法实现输出1。I2C总线要输出1则要依靠外部的上拉电阻RP。

3,在2的图中,我们只看SDA,同种任意一个外设的拉低总线都会导致总线上电平表现为0.这就是实现了1中所讲到的“线与”。

4,我们进一步分析图中MOS管的控制,当MOS管处于导通状态,实际输出0,当MOS管处理截至状态,是没有输出的,可以认为是输入状态,由于上拉电阻拉到高电平也可以认为是输出1。

5,既然输出1是上拉,因此不存在多个I2C设备同时输出不一样的电平造成的电流冲突,这方面真是精髓。

6,由于上述5这条实现了多个输出发生碰撞不会冲突,所以I2C可以允许总线上不但可以有多个从设备外还可以有多个主设备。

7,还有一个几乎是俗成的约定,就是对器件进行寻址的时候,如果从设备不此时不具备响应条件(比如正在执行上一个写操作发下来的命令对数据正在烧写到实际存储区域),直到具备相应条件才进行相应。这实际就是要求在读写前确保器件不忙,可以在

A,每次操作后反复进行写操作寻址的寻址,如果得到ACK后就退出,这就保证实际的操作起作用,并且了下次操作直接进行;

B,或者是在每次操作之前进行器件寻址等到回应ACK后才继续下一步。

我实际推荐A方式,确保生效后再退出。

8,上述7.A提到每次设置后要等待生效,下面的逻辑分析仪的抓图就是例证:

 由于图片大小限制只能抓部分图片,大家可以看到执行完写操作后,反复寻址器件,而器件一直NACK,知道器件回复ACK,I2C的主设备才停止询问,认为一次写操作完成。

9,I2C接口要用到三态输入,最好将三态门实例化在TOP层。这写实现细节可能在之后FPGA具体实现中讲到。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

16位片内地址的I2C SLAVE接口设计 的相关文章

  • 在vivado中使用tcl脚本(UG894)

    本文源自UG894 主要介绍如何在vivado中使用tcl脚本 1 vivado中如何获取tcl help vivado中任何自带的命令都可以通过 help 获取帮助信息 也可以直接输入 help 取得vivado命令合集 并通过 help
  • 数字IC手撕代码-兆易创新笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • Verilog:【1】时钟分频电路(clk_divider.sv)

    碎碎念 作为Basic Verilog的第一个学习笔记 打算用这种命名方式来对博客进行命名 应该有助于检索 简单阅览了部分工程的代码 发现里面有很多嵌套关系 因此决定先从基础模块开始 也是为了整个博客内容的流畅性 读者朋友有问题的话 也可以
  • Verilog的奇技淫巧[更新中]

    1 Verilog常用的数据选择语句vect a b 或vect a b 转载自 MDY常用的数据选择语句Verilog明德扬论坛 Powered by Discuz vect为变量名字 a为起始位置 加号或者减号代表着升序或者降序 b是进
  • 基于单光子探测的多脉冲周期符合远距离测距

    激光测距技术通过发射主动激光信号对目标进行探测 接收由目标漫反射回来的回波信号并进行统计 处理及换算 从而得到目标的距离 速度信息 实现对目标距离信息的探测 凭借其系统简单 操作灵活 高精度等特点 被广泛运用于民用 科研及军事等各类场合 基
  • DDR的VTT有源端接和无源端接(slua886a笔记)

    DDR的VTT有源端接和无源端接 slua886a笔记 背景 对于DDR的VTT端接 一直有说法是有源端接可降低功耗 之前一直没仔细理解其中原因 现在找了些相关的资料来介绍和对比有源和无源端接 理解有源端接的优点和降低功耗的原理 主要基于读
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • J-Link仿真器与JTAG和SWD下载与接线

    目录 1 JTAG 1 1JTAG今天被用来主要的三大功能 1 2JTAG引脚 1 3可选引脚 2 SWD 2 1 SWD引脚 2 2 可选择引脚 2 3 JTag和SWD模式引脚定义 3 J Link仿真器 4 IAR与MDK配置两种下载
  • 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

    Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具 主要用于验证数字电路设计是否正确 紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真 这里作简要的介绍 添加仿真库 方法一 打开 Pang
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • FPGA零基础学习之Vivado-UART驱动教程

    FPGA零基础学习之Vivado UART驱动教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者
  • 手把手教你Modelsim仿真【2020.4版本】

    首先新建一个文件夹 test5 打开Modelsim 依次选择 File gt Change Directory 把目录选择到创建的 test5 文件夹 创建库 依次选择 File gt New gt Library 一般我们选择第三个 库
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • Verilog HDL——Modelsim仿真

    常用testbench语法 finish 和 stop finish任务用于终止仿真并跳出仿真器 stop任务则用于中止仿真 timescale time unit time precision time unit指定计时和延时的测量单位
  • BUCK电路分析(二)

    BUCK电路分析 二 PSIM仿真同步BUCK电路 在上片文章中 初步的分析了BUCK电路的工作原理 本章使用PSIM软件仿真BUCK电路 观察分析BUCK电路器件关键波形 图1是同步BUCK电路图 开关频率设置为200K 固定占空比 在仿
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573

随机推荐

  • CSS基础语法

    CSS简介 CSS的主要使用场景就是美化网页 布局页面的 HTML的局限性 HTML只关注内容的语义 比如 h1 表明这是一个大标题 p 表明这是一个段落 img 表明这有一张图片 a 表示此处有链接 很早的时候 世界上的网站虽然很多 但是
  • 区块链技术,正面临哪些难题与挑战?

    2018年对区块链来说 是关键的一年 在这一年 区块链出现在了大众视野 成为人工智能之后的下一个科技风口 区块链新技术的来临 正在融入多个领域并催生一批创业公司 从理论上讲 区块链技术的应用范畴 可以涵盖货币 金融 经济 社会的诸多领域 但
  • emqx增加用户认证功能

    1 关闭匿名登录 首先 关闭匿名登录 编辑配置文件 emqx conf 修改为 allow anonymous改为 false 即修改后是 allow anonymous false vim emqx etc emqx conf 操作演示
  • Windows下使用zsh——WSL(Debian)方法

    转载自我的个人博客 建议直接跳转个人博客查看 这个复制过来居然没有图 陈狗说windows下命令行太难用可以换成zsh 根据网上教程 GPT4的提示搞着玩 记录一下过程 我使用了WSL zsh的方法 也可以使用Git Bash zsh 1
  • 超详细超全超好理解的KMP算法

    定义 KMP算法是一种字符串匹配算法 用于在一个主串中查找一个模式串的出现位置 先看这个视频 再看下边的代码实现 油管阿三哥讲KMP查找算法 中英文字幕 人工翻译 简单易懂 https www bilibili com video BV18
  • Qt标准对话框按钮显示中文解决方案(原创)

    从网上搜了一堆解决方法 大多是考来考去 也没有解决我的问题 基本的方法是 在窗口实例化之前 加载和安装QTranslator 加载的qm文件从qt源文件中的ts文件中发布而来 例如 C Qt Qt5 13 0 5 13 0 Src qttr
  • 3D游戏编程作业四

    基本操作演练 首先是去unity商店下载一个skybox的资源包 然后创建一个materia 点击shader选择skybox并选择6sided 然后将相应位置的图片拖进去 点击add component 选择rendering 添加sky
  • VSCODE同步插件以及代码片段

    利用 share code 插件同步代码片段 利用 Settings Sync可以同步 VS code 配置 但它只能同步插件 利用 Settings Sync 再配合 share code 插件可以同步自定义代码片段 可以把 VS cod
  • BatchConfigTool批量配置工具

    海康批量配置工具BatchConfigTool是一款支持设备在线搜索 批量配置参数 批量升级等功能的软件 支持对大批量设备同时进行各参数的配置 极大的简化了操作过程 软件功能 1 对在线设备进行搜索 激活 修改设备的网络参数等 2 批量对设
  • hadoop 运行java 清洗数据 报错Failed to set permissions of path: \tmp\...

    清洗数据写好代码后 运行报错 ERROR org apache hadoop mapred TaskTracker Can not start task tracker because java io IOException Failed
  • 转载的关于 二级制的反码,补码,原码等,筛选过的.

    一 机器数和真值 在学习原码 反码和补码之前 需要先了解机器数和真值的概念 1 机器数 一个数在计算机中的二进制表示形式 叫做这个数的机器数 机器数是带符号的 在计算机用一个数的最高位存放符号 正数为0 负数为1 比如 十进制中的数 3 计
  • 关系数据库范式(1NF,2NF,3NF,BCNF,4NF,5NF)全解析

    1 范式的基本概念 设计关系数据库时 遵从不同的规范要求 设计出合理的关系型数据库 这些不同的规范要求被称为不同的范式 各种范式呈递次规范 越高的范式数据库冗余越小 没有冗余的数据库未必是最好的数据库 有时为了提高运行效率 就必须降低范式标
  • 【VHDL】分频器设计要求:25分频,占空比为50%

    VHDL 分频器设计要求 25分频 占空比为50 程序 LIBRARY IEEE USE IEEE STD LOGIC 1164 all entity DIV 25 IS PORT CLK IN STD LOGIC S1 S2 BUFFER
  • java引入包的关键字_java 包和导包关键字import

    包的概念 相当于 文件夹 person java package com jd public class person 注意该处为public 这样才能被访问 String name int age public person String
  • 用代码生成Glitch Art风格的抖音字体

    最近看到不少文章教大家用 photoshop 实现抖音的 logo 跟字体 我也非常喜欢这种风格的字体 于是趁着晚上的时间 动手用代码实现了下此类风格的字体特效 顺便开发了个小工具 地址见文末 本文主要是从 艺术手法 和 JS 前端 实现
  • UVA1347 Tour

    2021 5 22 刷题的时候突然看到手机推送 袁隆平院士逝世 心中一颤 后来得到辟谣 心情稍微放松几分 正在刷着辟谣的文章时 央视新闻发文 13点07分 袁隆平院士逝世 没过多久又看到吴孟超院士逝世的新闻 心情难以平复 特在本文的开头 向
  • 【华为OD机试】求满足条件的最长子串的长度(C++ Python Java)2023 B卷

    题目描述 给定一个字符串 只包含字母和数字 按要求找出字符串中的最长 连续 子串的长度 字符串本身是其最长的子串 子串要求 1 只包含1个字母 a z A Z 其余必须是数字 2 字母可以在子串中的任意位置 如果找不到满足要求的子串 如全是
  • 力扣17电话号码的字母组合(c++)

    力扣17电话号码的字母组合 c 力扣题目链接 思路 阅读完本题题目要求后 要解决如下3个问题 1 数字和字母如何映射 2 两个字母就两个for循环 三个字符我就三个for循环 以此类推 然后发现代码根本写不出来 3 输入1 按键等等异常情况
  • 从零开始搭建kafka开发环境

    Part1前言 最近选用kafka作为消息缓存 来低于大流量的数据 Kafka是一种高吞吐量的分布式发布订阅消息系统 有如下特性 通过O 1 的磁盘数据结构提供消息的持久化 这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能 高吞
  • 16位片内地址的I2C SLAVE接口设计

    8位片内地址的I2C SLAVE在OPENCORS org上面有 但是我没有找到16位的 我打算用B210的接EEPROM的I2C总线实现跟FPGA通讯就对照24C256的数据手册写了一个 以下代码2022 6 6更新已经实际运行通过 i2