Verilog IIC AT24C128和LM75
文章目录
- 读LM75温度值
- 读写AT24C256 EEPROM
- IIC时序分析
- 软复位
- 状态跳转图
- LM75寄存器
- verilog实现
- tb
LM75.pdf 下载
AT24C128.pdf 下载
读LM75温度值
上面是UART转IIC,本文只记录IIC接口的实现。
读出温度寄存器为 18C0 = 195*0.125=24.375度和屋内的净化器显示温度差不多。
读写AT24C256 EEPROM
IIC时序分析
a)通过观察IIC的时序图,可以分为4种基本类型:
1. start时序
2. 写入8bit+读1bit从ack时序
3. 读8bit+写1bit主ack时序
4. stop时序
b)原则
6. 过渡时间段:scl=0,sda任意,只要保证在scl上升沿之前,sda是想要的值就可。
7. scl=0,sda才能改变。因为scl=0期间,sda可以任意变化。
c)注意
8. EEPROM有写入的次数限制,写入次数超额会无法写入。
9. 两次写入之间要留空隙时间约5ms
建立时间和保持时间要求(可不用细看)
EEPROM的sda作为输入信号,对FPGA的sda数据要求
sda建立时间:scl上升沿之前至少100ns
sda保持时间:scl下降沿沿之后至少0ns
start下降沿的要求:
sda下降沿距右边scl下降沿至少600ns
sda下降沿距左边scl上升沿至少600ns
stop上升沿的要求:
sda=1至少保持1300ns
sda上升沿距左边scl上升沿至少600ns
1MHz ---- 1000ns
100Khz ---- 10_000ns
写操作
单Byte写的顺序是:开始–设备地址–设备响应–写的地址–设备响应–(写数据–设备响应)…–(写数据–设备响应)–停止。
读操作
多Byte读的顺序是:开始–设备地址–设备响应–读的地址–设备响应–开始–设备地址–设备响应–(读数据–主机响应)…–(读数据–主机不响应)–停止。
软复位
状态跳转图
LM75寄存器
OS pin : Overtemperature Shutdown output; open-drain.
设备地址:7'b1001xxx
温度寄存器地址是8'b0
温度[15:0]只取[15:5],单位是0.125度
verilog实现
//两次写入start与stop之间,最少空闲5ms
`timescale 1ns/1ns
// `define SIM_OPEN 1
module iic_ctrl(input clk ,input rst ,input scl_i ,output reg scl_o ,// _o表示本模块的输出端口output reg scl_is_out=0 ,//1:输出input sda_i ,output reg sda_o ,output reg sda_is_out=0 ,//1:输出input [1:0] ADDR_NUM ,//1-3表示1-3 Byte 0无意义input DATA_NUM ,//0:1Byte 1:2Byteinput [6:0] DEV_ADDR ,//设备地址input req ,output reg ack ,output reg ack_p ,//比ack提前1拍input wr ,input [23:0] addr ,//2GB//先发送高地址MSBinput [7:0] wdata ,output reg[15:0] rdata //1次读2B
);
//以scl为参考,只关注scl的跳变,每次scl跳变计时器开始清0//每个底层状态进入的第一个状态就是WAIT,其作用就是表示是低电平的开始,需要分配低电平的内容。
// 时序参数设置不要卡边,一定要留有时序裕量,因为线路长度不确定。
// 时序图中start时为什么scl是从0开始?因为是restart会有这种情况,正常是从1开始。
//关键是从设备的sda是输入转为输出,主设备需要提前释放。主设备50ns释放总线。
// 从设备sda是输出转输入,主设备需要等待从设备sda释放。手册没找到是多久?parameter tSYSCLK =20 ;//单位ns
// 如果是max 400K,时钟周期是2500ns//隐含关系tLOW+tHIGH=tCLKparameter tCLK =4000/tSYSCLK ;//单位ns//手册最小值600nsparameter tLOW =2000 /tSYSCLK ;//单位ns//手册最小值600nsparameter tHIGH =(tCLK-tLOW);//单位ns//手册最小值1300nsparameter tHDDAT =1000/tSYSCLK ;//单位ns//手册最小值000nsparameter tSUDAT =tLOW-tHDDAT ;//单位ns//手册最小值100ns//cur_state;
parameter DLY = 1;
`ifdef SIM_OPEN
//底层状态
parameter START_SCLL = "START_SCLL";
parameter START_SCLH = "START_SCLH";
parameter START_GACK = "START_GACK";parameter STOP_SCLL = "STOP_WAIT ";
parameter STOP_SCLH = "STOP_DASU ";
parameter STOP_GACK = "STOP_GACK ";parameter W1BY_SCLL = "W1BY_SCLL ";//写数据scl=0
parameter W1BY_SCLH = "W1BY_SCLH ";//写数据scl=1
parameter W1AK_SCLL = "W1AK_SCLL ";//写数据ACK scl=0
parameter W1AK_SCLH = "W1AK_SCLH ";//写数据ACK scl=1
parameter W1BY_GACK = "W1BY_GACK ";//产生ACK parameter R1BY_SCLL = "R1BY_SCLL ";//读数据scl=0
parameter R1BY_SCLH = "R1BY_SCLH ";//读数据scl=1
parameter R1AK_SCLL = "R1AK_SCLL ";//读数据ACK scl=0
parameter R1AK_SCLH = "R1AK_SCLH ";//读数据ACK scl=1
parameter R1BY_GACK = "R1BY_GACK ";//产生ACK //main状态
parameter MAIN_IDLE = "MAIN_IDLE ";
parameter MAIN_STAR = "MAIN_STAR ";
parameter MAIN_DEV0 = "MAIN_DEV0 ";
parameter MAIN_ADDR = "MAIN_ADDR ";
parameter MAIN_REST = "MAIN_REST ";
parameter MAIN_DEV1 = "MAIN_DEV1 ";
parameter MAIN_R8BI = "MAIN_R8BI ";//读设备的内容
parameter MAIN_W8BI = "MAIN_W8BI ";//写从设备的空间
parameter MAIN_STOP = "MAIN_STOP ";
reg[127:0] cur_state,cur_state_1d,per_main_state;//下一个进入的main状态
`else
parameter START_SCLL = 'd0;
parameter START_SCLH = 'd1;
parameter START_GACK = 'd2;
parameter STOP_SCLL = 'd3;
parameter STOP_SCLH = 'd4;
parameter STOP_GACK = 'd5;
parameter W1BY_SCLL = 'd6;//写数据scl=0
parameter W1BY_SCLH = 'd7;//写数据scl=1
parameter W1AK_SCLL = 'd8;//写数据ACK scl=0
parameter W1AK_SCLH = 'd9;//写数据ACK scl=1
parameter W1BY_GACK = 'd10;//产生ACK
parameter R1BY_SCLL = 'd11;//读数据scl=0
parameter R1BY_SCLH = 'd12;//读数据scl=1
parameter R1AK_SCLL = 'd13;//读数据ACK scl=0
parameter R1AK_SCLH = 'd14;//读数据ACK scl=1
parameter R1BY_GACK = 'd15 ;//产生ACK //main状态
parameter MAIN_IDLE = 'd20;
parameter MAIN_STAR = 'd21;
parameter MAIN_DEV0 = 'd22;
parameter MAIN_ADDR = 'd23;
parameter MAIN_REST = 'd24;
parameter MAIN_DEV1 = 'd25;
parameter MAIN_R8BI = 'd26;//读设备的内容
parameter MAIN_W8BI = 'd27;//写从设备的空间
parameter MAIN_STOP = 'd28;
reg[4:0] cur_state,cur_state_1d,per_main_state;
`endif
// 分2部分:
// main状态 流程实现上层的控制。
// 底层状态是控制bit级别。reg [7:0] wdata_reg ;reg [0:0] req_reg ;reg [15:0] delay_cnt ;//1拍=20ns//延时的拍数reg [1:0] addr_cnt ;//Byte 计数reg [1:0] data_cnt ;//Byte 计数 读写个数reg [7:0] bit_cnt ;//bit 计数:已经发送的0开始,1Byte中的bit数reg [7:0] wdata_shft ; //多一位用来弥补第一次左移的问题reg down_ack ;//底层的ackreg err_ack ;//底层的ack是否错误 1:错误wire state_change ;//新状态的sopassign state_change = (cur_state_1d==cur_state)?1'b0:1'b1;//各个底层的req在main流程解除,ack会持续多拍
always@(posedge clk or posedge rst) beginif(rst)begincur_state<= #1 MAIN_IDLE;end else begincase(cur_state)
//MAINMAIN_IDLE:if(req)cur_state<= #1 MAIN_STAR;MAIN_STAR:if(down_ack)cur_state<= #1 MAIN_DEV0;elsecur_state<= #1 START_SCLL;MAIN_DEV0:if(down_ack&err_ack)cur_state<= #1 MAIN_STOP;else if(down_ack&(~err_ack) )cur_state<= #1 MAIN_ADDR;elsecur_state<= #1 W1BY_SCLL;MAIN_ADDR:if(down_ack&err_ack)cur_state<= #1 MAIN_STOP;else if(down_ack&(~err_ack)&(addr_cnt>=ADDR_NUM) )if( ~wr )//读cur_state<= #1 MAIN_REST;else cur_state<= #1 MAIN_W8BI; elsecur_state<= #1 W1BY_SCLL;MAIN_REST:if(down_ack)cur_state<= #1 MAIN_DEV1;elsecur_state<= #1 START_SCLL;MAIN_DEV1:if(down_ack&(~err_ack))if( ~wr )//读cur_state<= #1 MAIN_R8BI;else //写cur_state<= #1 MAIN_W8BI;else if (down_ack&(err_ack))cur_state<= #1 MAIN_STOP;elsecur_state<= #1 W1BY_SCLL;MAIN_R8BI:if(down_ack&&(data_cnt>=DATA_NUM+1) )cur_state<= #1 MAIN_STOP;elsecur_state<= #1 R1BY_SCLL;MAIN_W8BI:if(down_ack&err_ack)cur_state<= #1 MAIN_STOP;else if(down_ack&(~err_ack) )cur_state<= #1 MAIN_STOP;elsecur_state<= #1 W1BY_SCLL;MAIN_STOP:if(down_ack)cur_state<= #1 MAIN_IDLE;elsecur_state<= #1 STOP_SCLL;
//startSTART_SCLL:if(delay_cnt>=tLOW)cur_state<= #1 START_SCLH; START_SCLH:if((delay_cnt>=2*tHIGH)&(~state_change))cur_state<= #1 START_GACK; START_GACK:cur_state<= #1 per_main_state;
//W8BITW1BY_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 W1BY_SCLH;W1BY_SCLH:if((delay_cnt>=tHIGH)&(~state_change))if(bit_cnt>=8)//已经发送了8bit(0-7),下面就是接收ackcur_state<= #1 W1AK_SCLL;//接收ackelse cur_state<= #1 W1BY_SCLL;//继续发送数据W1AK_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 W1AK_SCLH;W1AK_SCLH:if((delay_cnt>=tHIGH)&(~state_change))cur_state<= #1 W1BY_GACK;W1BY_GACK:cur_state<= #1 per_main_state;
//R8BITR1BY_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 R1BY_SCLH;R1BY_SCLH:if((delay_cnt>=tHIGH)&(~state_change))if(bit_cnt>=8)//已经发送了8bit(0-7),下面就是接收ackcur_state<= #1 R1AK_SCLL;//接收ackelse cur_state<= #1 R1BY_SCLL;//继续发送数据R1AK_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 R1AK_SCLH;R1AK_SCLH:if((delay_cnt>=tHIGH)&(~state_change))cur_state<= #1 R1BY_GACK;R1BY_GACK:cur_state<= #1 per_main_state;
//stopSTOP_SCLL:if(delay_cnt>=tLOW)cur_state<= #1 STOP_SCLH; STOP_SCLH:if((delay_cnt>=2*tHIGH)&(~state_change))cur_state<= #1 STOP_GACK; STOP_GACK:cur_state<= #1 per_main_state; default:cur_state<= #1 MAIN_IDLE;endcaseend
end
//状态输出
always@(posedge clk or posedge rst) beginif(rst)begincur_state_1d <= #1 MAIN_IDLE;per_main_state <= #1 MAIN_IDLE;addr_cnt <= #1 0;data_cnt <= #1 0;down_ack <= #1 0;scl_o <= #1 1;scl_is_out <= #1 0;//1:输出sda_o <= #1 1;sda_is_out <= #1 0;//1:输出wdata_shft <= #1 0;//1:输出ack <= #1 0;//1:输出// ack_p <= #1 0;//1:输出end else begincur_state_1d <= #1 cur_state;ack <= #1 ack_p;case(cur_state)
//MAINMAIN_IDLE:begin//per_main_state <= #1 MAIN_IDLE;addr_cnt <= #1 0;data_cnt <= #1 0;down_ack <= #1 0;scl_o <= #1 1;scl_is_out <= #1 0;//1:输出sda_o <= #1 1;sda_is_out <= #1 0;//1:输出wdata_shft <= #1 'b0;bit_cnt <= #1 0;// ack <= #1 0; // ack_p <= #1 0; endMAIN_STAR:begin//per_main_state <= #1 MAIN_STAR;down_ack <= #1 0;endMAIN_DEV1:begin//per_main_state <= #1 MAIN_DEV1;addr_cnt <= #1 0;data_cnt <= #1 0;down_ack <= #1 0;bit_cnt <= #1 0;wdata_shft <= #1 {DEV_ADDR[6:0],(~wr)};//写入设备地址endMAIN_DEV0:begin//per_main_state <= #1 MAIN_DEV0;addr_cnt <= #1 0;data_cnt <= #1 0;down_ack <= #1 0;bit_cnt <= #1 0;wdata_shft <= #1 {DEV_ADDR[6:0],1'b0};//写入设备地址endMAIN_ADDR:begin//per_main_state <= #1 MAIN_ADDR;down_ack <= #1 0;bit_cnt <= #1 0; if(ADDR_NUM==1)//1B 地址wdata_shft <= #1 addr[7:0]; else if(ADDR_NUM==2)//2B 地址if(addr_cnt==0)//已经发送0个addrwdata_shft <= #1 addr[15:8];else//已经发送1个addrwdata_shft <= #1 addr[7:0]; endMAIN_REST:begin//per_main_state <= #1 MAIN_REST;down_ack <= #1 0;bit_cnt <= #1 0; data_cnt <= #1 0;endMAIN_R8BI:begin//per_main_state <= #1 MAIN_R8BI;down_ack <= #1 0;bit_cnt <= #1 0; endMAIN_W8BI:begin//per_main_state <= #1 MAIN_W8BI;down_ack <= #1 0;bit_cnt <= #1 0; wdata_shft <= #1 wdata[7:0]; endMAIN_STOP:begin//per_main_state <= #1 MAIN_STOP;down_ack <= #1 0;bit_cnt <= #1 0; // ack <= #1 1; // ack_p <= #1 0; end//开始信号产生 START_SCLL:begin//if(delay_cnt==0)//scl和sda都设置为输出beginscl_o <= #1 0;scl_is_out <= #1 1;//1:输出// sda_o <= #1 1;sda_is_out <= #1 1;//1:输出endelse if(delay_cnt==tHDDAT)sda_o <= #1 1; end START_SCLH:beginif(delay_cnt==0) scl_o <= #1 1;else if((delay_cnt>=2*tHIGH)&(~state_change))//sda产生下降沿输出scl_o <= #1 0;else if((delay_cnt>=tHIGH)&(~state_change))//sda产生下降沿输出sda_o <= #1 0; end START_GACK:down_ack <= #1 1;
//写8bit时序产生W1BY_SCLL:begin//if(delay_cnt==0)beginscl_o <= #1 0;scl_is_out <= #1 1;//1:输出endelse if(delay_cnt==tHDDAT)beginsda_is_out <= #1 1;//1:输出 sda_o <= #1 wdata_shft[7];wdata_shft[7:0] <= #1 {wdata_shft[6:0],1'b0};endend W1BY_SCLH:if(delay_cnt==0)beginscl_o <= #1 1;bit_cnt <= #1 bit_cnt+1;endelse if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o <= #1 0;W1AK_SCLL:beginif(delay_cnt==tHDDAT)sda_is_out <= #1 0;//1:输出end W1AK_SCLH:if(delay_cnt==0)scl_o <= #1 1;else if( (delay_cnt==tHIGH-3) &(~state_change))//在时钟下降沿之前采样err_ack <= #1 sda_i;else if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o <= #1 0; W1BY_GACK:begindown_ack <= #1 1;addr_cnt <= #1 addr_cnt +1;end
//读8bit时序产生R1BY_SCLL:begin//if(delay_cnt==0)scl_o <= #1 0;else if(delay_cnt==tHDDAT)sda_is_out <= #1 0;//1:输出 end R1BY_SCLH:if(delay_cnt==0)beginscl_o <= #1 1;endelse if((delay_cnt==tHIGH-3) &(~state_change))beginrdata[15:0] <= #1 {rdata[14:0],sda_i};bit_cnt <= #1 bit_cnt+1; endelse if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o <= #1 0;R1AK_SCLL:beginif(delay_cnt==tHDDAT)beginsda_is_out <= #1 1;//1:输出sda_o <= #1 ((data_cnt===DATA_NUM));endend R1AK_SCLH:if(delay_cnt==0)scl_o <= #1 1;else if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o <= #1 0; R1BY_GACK:begindown_ack <= #1 1;data_cnt <= #1 data_cnt +1;end//停止信号产生 STOP_SCLL:begin//if(delay_cnt==0)//scl和sda都设置为输出beginscl_o <= #1 0;scl_is_out <= #1 1;//1:输出sda_is_out <= #1 1;//1:输出endelse if(delay_cnt==tHDDAT)sda_o <= #1 0; end STOP_SCLH:beginif(delay_cnt==0) scl_o <= #1 1;else if((delay_cnt==tSUDAT)&(~state_change))// sda_o <= #1 1; else if((delay_cnt>=tSUDAT + tHIGH)&(~state_change))//释放总线sda_is_out <= #1 0;//1:输出end STOP_GACK:begindown_ack <= #1 1; end endcaseend
end
//delay_cnt
always@(posedge clk or posedge rst)beginif(rst)delay_cnt <= #1 0;else if(state_change)delay_cnt <= #1 0;elsedelay_cnt <= #1 delay_cnt+1;
end always@(posedge clk or posedge rst)beginif(rst)ack_p <= #1 0;else ack_p <= #1 (cur_state== STOP_SCLL) &state_change;
end
always@(posedge clk or posedge rst)if(rst)beginwdata_reg <= #1 0;req_reg <= #1 0;endelse if(req_reg!=req)beginwdata_reg <= #1 wdata;req_reg <= #1 req;endelsereq_reg <= #1 req;
endmodule
tb
`timescale 1ns/100ps
module tb ( );reg clk =0 ;reg rst =1 ;
always clk =#10 ~clk;logic req ;logic ack ;logic wr ;logic [31:0] addr ;//4GBlogic [7:0] wdata ;logic [15:0] rdata ;//1次读2B
//part 2
task send ;// send('d4,'haa)input [31:0] waddr ;input [7:0] send_wdata ;req = 'b0;wr = 'b0;addr = 'b0;wdata = 'b0;@(posedge clk);#1;req = 'b1;wr = 'b1;addr = waddr;wdata = send_wdata;@(posedge ack);@(posedge clk);#1;req = 'b0;wr = 'b0;addr = 'b0;wdata = 'b0;
endtask
task read ;// read('d55);input [31:0] raddr ;req = 'b0;wr = 'b0;addr = 'b0;wdata = 'b0;@(posedge clk);#1;req = 'b1;wr = 'b0;addr = raddr;@(posedge ack);@(posedge clk);#1;req = 'b0;wr = 'b0;addr = 'b0;wdata = 'b0;
endtask
iic_ctrl u0_iic_ctrl(.clk (clk ),//input clk ,.rst (rst ),//input rst ,.scl_i (1 ),//input scl_i ,.scl_o ( ),//output scl_o ,// _o表示本模块的输出端口.scl_is_out ( ),//input scl_dir ,//1:输出.sda_i (0 ),//input sda_i ,.sda_o ( ),//output sda_o ,.sda_is_out ( ),//input sda_dir ,.ADDR_NUM (1 ),//input [1:0] ADDR_NUM ,//1-3表示1-3 Byte 0无意义.DATA_NUM (1 ),//input DATA_NUM ,//0:1Byte 1:2Byte.DEV_ADDR (7'b1001000 ),//input DATA_NUM ,//0:1Byte 1:2Byte.req (req ),//input req ,.ack (ack ),//output reg ack ,.wr (wr ),//input wr ,.addr (addr ),//input [23:0] addr ,//2GB.wdata (wdata ),//input [7:0] wdata ,.rdata ( ) //output reg[15:0] rdata //1次读2B
);
initial beginreq = 'b0;wr = 'b0;addr = 'b0;wdata = 'b0;rst =1; #100; rst =0;//复位#200;read('h765432);#5_000;// send('b10010010_10010010,'haa);// #50_000;$stop();
end
endmodule
Verilog IIC AT24C128和LM75相关推荐
- IIC总线的原理与Verilog实现
IIC总线的原理与Verilog实现 1. 软件平台与硬件平台 2. 原理介绍 2.1 IIC总线的特点: 2.2 IIC总线协议详解: 2.2.1 IIC主机往从机里面写入数据的步骤 2.2.2 I ...
- fpga驱动oled iic显示代码_【接口时序】6、IIC总线的原理与Verilog实现
欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE ...
- IIC通信协议详解 PCF8591应用(Verilog实现FPGA)
IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...
- Verilog实现IIC协议读写EEPROM
在FPGA设计中,IIC协议是一个十分常见的协议,因为几乎所有的EEPROM都是用这个协议进行读写的,此外,一些特殊场合,也会用到此协议.这里我首先给出IIC协议的中文标准文档的下载链接(不要积分), ...
- 基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master
基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master 顶层模块实现master对slave自定义的寄存器读取 带仿真模块 ID:153069768739840 ...
- FPGA:IIC验证镁光EEPROM仿真模型(纯Verilog)
目录 日常·唠嗑 一.程序设计 二.镁光模型仿真验证 三.testbench文件 四.完整工程下载 日常·唠嗑 IIC协议这里就不赘述了,网上很多,这里推荐两个,可以看看[接口时序]6.IIC总线的原 ...
- IIC协议驱动EEPROM的Verilog实现与竞争冒险与下降沿触发、多重驱动
文章目录 一.前言 二.软硬件平台 软件平台 硬件平台 三.IIC与EEPROM IIC简介 1. 写操作大致步骤 2. 读操作大致步骤 3. IIC总线有以下几种状态 1. 空闲状态 2. 起始信号 ...
- IIC通讯 | 基于STM32的LM75模块的使用以及故障排查
开幕先抱怨一下,小小模块没有说明文档,客服一问三不知,原理图也不提供,害人不浅,啊啊啊啊啊. 最初的设计中,LM75模块的电路是设计在了板子上 后来为了测温更加方便准确,选择了外接的方案,于是板子上只 ...
- IIC 总线协议(Verilog)
IIC (Inter - Integrated Circuit BUS) 集成电路总线,它是一种串行通信总线,多使用主从架构.IIC 接口共有两条总线线路,即 SCL(串行时钟线).SDA(串行数据线 ...
最新文章
- python操作word填表_Python 自动化办公—Word 文本操作命令
- HTML5与CSS3基础教程第八版学习笔记16-21章
- TCP三次握手协议和SYN攻击以及DDOS简介
- vc++64位系统下long的长度为4个字节_新来的妹子把几百万数据放入了内存,系统立马爆了...
- 解锁并设置远程登录尝试次数
- 【已解决】Linux下安装JDK
- SAP Cloud for Customer和微信小程序的集成-原型开发示意图
- 华为全球分析师大会:HMS Core全球开发者应用集成的数量加速增长,打造全场景智慧体验...
- 最新中文文本挖掘小例子及程序
- 1004. 成绩排名 (20)
- 关于mysql的表情包_mysql表情包 - mysql微信表情包 - mysqlQQ表情包 - 发表情 fabiaoqing.com...
- 博客网页设计制作 简单静态HTML网页作品 DIV CSS个人网页作业成品 dreamweaver学生个人博客网站模板
- 野火ISO-V2学习
- epoll中的ET和LT模式区别
- 魔域单机服务器显示read,魔域boss点,单机假设相关信息(Demon boss point, single machine assumes relevant information).doc...
- 计算机win文件题型,《计算机应用基础》操作系统应用题型专项练习
- 考PMP真的有用吗?
- threejs中设置物体的贴图+场景的6面贴图 +创建空间
- 让沟通更高效的职场礼物,讯飞智能录音笔SR502值得入手
- D3.js从入门指南
热门文章
- jq向下滑动刷新_jQuery手势控制,下拉刷新
- nuget的原理_NuGet 跨平台插件
- matlab amesim联合仿真,AMESim与MATLAB_Simulink联合仿真接口配置
- 计算机导论ppt创意作品,《计算机导论》全套PPT电子课件教案-第1章 绪论.ppt
- 无源测向与时差定位技术研究matlab,一种基于时差信息的无源多站多目标测向交叉定位方法与流程...
- 查看B站UP开播状态(通过uid查询)
- Python_PyQuery使用
- 相片墙个人相册图片墙HTML源码
- NextJs 学习笔记
- cesiumjs开发实践 (一)