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接口设计 的相关文章

  • FPGA设计篇之流水线思想

    FPGA设计篇之流水线思想 一 写在前面 二 正文开始 2 1举个栗子 2 2 1情况一 组合逻辑 2 1 2情况二 流水线设计 2 1 4 小总结 2 2举第二个栗子 写在最后 一 写在前面 流水线 大家好 我是富土康三号流水线的张全蛋
  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 各种FIFO硬件设计(FIFO概念、异步、同步、非2次幂深度FIFO)

    文章目录 一 FIFO概述 二 FIFO分类 三 FIFO重要信号与参数 3 1 信号 3 2 参数 3 2 1 data depth的确定 四 FIFO存储原理 五 同步FIFO 5 1 空满信号判断 5 2 同步FIFO源码 5 3 测
  • 基于单光子探测的多脉冲周期符合远距离测距

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

    HDLBits Verilog Practice 每日一题 一 Getting Started 1 Getting Started 一 Getting Started 1 Getting Started 问题描述 Build a circu
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • PLL时钟约束

    方法 1 自动创建基时钟和 PLL 输出时钟 例 derive pll clocks 这一方法使您能够自动地约束 PLL 的输入和输出时钟 ALTPLL megafunction 中指定的 所有 PLL 参数都用于约束 PLL 的输入和输出
  • 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配置两种下载
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 数码管电子时钟

    文章目录 前言 一 回顾数码管 二 任务描述 三 系统框图 四 模块调用 五 模块原理图 六 工程源码 6 2 时钟计数模块代码 6 2 数码管驱动模块代码 6 3 顶层模块代码 七 仿真测试 7 1 测试代码 7 2 仿真结果 八 管脚信
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • 小梅哥Xilinx FPGA学习笔记9——语法(阻塞与非阻塞赋值)

    阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 非阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 注意 阻塞赋值与非阻塞赋值 只有在时序逻辑中才有 不是阻塞赋值 也不是非阻塞赋值
  • 关于xilinx BRAM IP的延迟以及流程

    关于RAM IP的延迟 1 选择了output registers 可以在RAM输出端口添加register 也可以在core的输出添加 在primitives添加 降低clock to out到primitive的延迟 在core添加re
  • IC数字后端

    在 innovus 里面 有时候我们需要控制 tie cell 的 fanout 和 net length 来避免 tie cell 可能出现 max transition 或者 max fanout 的违例 一般来说 只要 fanout
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • 基于FPGA的AHT10传感器温湿度读取

    文章目录 一 系统框架 二 i2c接口 三 i2c控制模块 状态机设计 状态转移图 START INIT CHECK INIT IDLE TRIGGER WAIT READ 代码 四 数据处理模块 串口 代码 五 仿真 testbench设
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r

随机推荐

  • 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