最近,写了好几个关于通信的,只要原理理解对了,你按照时序要求,写就好了。可是有些时候,我们对通讯的时序会理解的不对。这个时候多写几个通讯时序,就慢慢熟悉了。

你的DQ数据线要设置为:inout,千万别忘记了

写程序之前,还是先介绍一下ds18b20的时序图:

ds18b20的经典通讯过程如下:

我们就可以按照这个通讯方式去写程序:只要按照这个步骤,一步一步的写就可以了:

首先任何的通讯都需要一个初始化,就是互相告诉彼此,我们要准备通讯了,要准备传输数据了,ds18b20也不例外,

下面是初始化的时序过程:

主机先发送480—960us的低电平信号(你可以给个600us的低电平就可以),然后释放主机总线,交给从机,从机会响应60—240左右的低电平信号,之后,从机会把总线拉高。

然后就是写命令给ds18b20,写数据时,低位先传,然后是高位,写数据也分写0和写1

比如你写0,主机只要拉低总线60us以上就ok了,从机会在15us---60us之间,采集总线上的信号,这时采集的信号正好是0,这样就写完了一个数据,

比如你写1,这个稍微过程麻烦一下,首先主机要先拉低总线1us以上,然后在15us以内释放总线(包括之前的那个拉低1us的时间),从机会在15us---60us,采集总线上的数据,由于主机已经释放了总线,现在总线属于高电平,这时,从机就把1写进去了。

注意:写0和写1时间要大于60us以上,两次写的间隙,主机要释放总线1us以上

,现在,数据可以写入ds18b20中了,那如何从ds18b20中读取温度的值呢,

首先,我们要先发送读暂存器命令(BE),告诉从机要开始发送数据了,这时,我们要开始准备接受从机发过的数据,从机先发BYTE0,然后是BYTE1,....BYTE0先发低位,然后是高位。千万别搞错了。

如何读从机发来的数据呢,看看下面的时序图:

主机先拉低1us以上,然后释放总线、这个时候,从机就发送数据过来,从机会在15us,以内拉低总线(发送0),或者拉高总线(发送1)我们就要在15us以内的这段时间(包括之前的拉低1us),读这个值,我们可以在大概10us的时候读这个值,但是我们也要在15us以内释放总线。

下面是别人介绍的关于读写0,1,可以参考一下。

代码:每个人写的代码都不同,只要你原理懂了,用代码实现就可以了

按键按下,启动温度转换,下面输出的数据data就是温度值,按键和led是做测试的用的。要多用sigaltap去调试代码,看看自己错在那个步骤

module ds18b20_dri(//module clockinput              clk        ,         // 时钟信号(50MHz)input              rst_n      ,         // 复位信号input   [1:0]      key,output  reg [1:0]  led,inout              dq         ,         // DS18B20的DQ引脚数据output reg [19:0]  data                 // 转换后得到的温度值
);reg  [15:0] temp_data;
reg   sign;
reg  [10:0] data1;
wire [19:0] data2;//状态机
parameter  IDLE                     = 5'b00000; //空闲状态
parameter  RST_PULSE                = 5'b00001; //主机复位脉冲
parameter  DS18B20_WAIT             = 5'b00010; //从机等待15--60us
parameter  ANSWER_PULSE             = 5'b00011; //从机应答
parameter  SKIP_ROM_DATA            = 5'b00100; //跳过ROM(CC)
parameter  CONVERT_TEMP_DATA        = 5'b00101; //温度转换(44)
parameter  WAITING_500MS            = 5'b00110; //等待温度转换500ms
parameter  AGAIN_RST_PULSE          = 5'b00111; //第二次主机再次复位
parameter  DS18B20_WAIT1            = 5'b01000; //第二次从机等待15--60us
parameter  AGAIN_ANSWER_PULSE       = 5'b01001; //第二次从机应答
parameter  AGAIN_SKIP_ROM_DATA      = 5'b01010; //第二次跳过ROM(CC)
parameter  READ_TEMP_DATA           = 5'b01011; //读高速缓存器的值(BE)
parameter  READ_DATA                = 5'b01100; //读16位数据reg [4:0] state_c;
reg [4:0] state_n;   wire idl2rst_pulse_start ;                //空闲到复位脉冲
wire rst_pulse2ds18b20_wait_start;        //复位脉冲到DS18B20从机等待
wire ds18b20_wait2answer_pluse_start;     //DS18B20从机等待到应答信号
wire answer_pulse2skip_rom_start;         //应答信号到跳过ROM
wire skip_rom2conv_temp_start;            //跳过ROM到温度转换
wire conv_temp2wait_500ms_start;          //温度转换到等待500ms
wire wait_500ms2again_rst_start;          //500ms到再次复位
wire again_rst2ds18b20_wait_start ;       //复位脉冲到DS18B20从机等待
wire ds18b20_wait2again_answer_start ;    //从机等待到应答
wire again_answer2again_skip_rom_start;   //应答信号到跳过rom
wire again_skip_rom2again_conv_temp_start;//跳过rom到读暂存器
wire again_conv_temp2read_data_start;     //读暂存器到读数据
wire read_data2idle_start;                //读16位数据到空闲 //parameter define
localparam  ROM_SKIP_CMD = 8'hcc;           // 跳过 ROM 命令  1100 1100
localparam  CONVERT_CMD  = 8'h44;           // 温度转换命令   0100 0100
localparam  READ_TEMP    = 8'hbe;           // 读 DS1820 温度暂存器命令 1011 1110parameter  TIME_500MS = 28'd3000_0000;    //500ms
parameter  TIME_600US = 28'd30000;    //600us
parameter  TIME_240US = 28'd12000;    //240us
parameter  TIME_72US  = 28'd3600;    //72us
parameter  TIME_70US  = 28'd3500;    //72us
parameter  TIME_60US  = 28'd3000;    //60us
parameter  TIME_10US  = 28'd500;     //2us
parameter  TIME_3US   = 28'd150;     //2us
parameter  TIME_2US   = 28'd100;     //2us
parameter  TIME_1US   = 28'd50;      //1us//600ms 50*1000*600=3000_0000
//计数器,计算时间
reg   [27:0] cnt;
reg   flag_cnt;
wire  add_cnt;
wire  end_cnt;
reg   [27:0] Time;//计算器,计算吧第几个发送出去,一共8个
reg [3:0] cnt1;
wire  add_cnt1;
wire  end_cnt1;
reg write_flag;//计算器,计算吧第几个读出去,一共16个
reg [4:0] cnt2;
wire  add_cnt2;
wire  end_cnt2;
reg  read_flag;//按键
wire  neg_key_in1;
wire  neg_key_in2;
reg   key_in1_d0,key_in1_d1;
reg   key_in2_d0,key_in2_d1;
reg   start_flag1,start_flag2;reg            dq_dir     ;  // DQ数据(SDA)方向控制
reg            dq_out     ;  // DQ输出信号
wire           dq_in      ;  // DQ输入信号 wire  pos_dq_in,neg_dq_in;
reg   dq_in_d0,dq_in_d1;
//计时
reg  [15:0]  neg_cnt,pos_cnt;//检测DQ的下降沿和上升沿
assign  pos_dq_in = (~dq_in_d1) & dq_in_d0;    //上升沿检测,如果检测到上升沿,有0到1,之后下个周期为0
assign  neg_dq_in =  dq_in_d1 & (~dq_in_d0);   //下降沿always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begindq_in_d0<=1'b0;dq_in_d1<=1'b0;endelse  begindq_in_d0<=dq_in;dq_in_d1<=dq_in_d0;end
end//下降沿来了,开始计数,这个方法很好用,专门检测低电平的时间
//当低电平来了,低电平neg_cnt清零并开始自己计数,当上升沿来的那刻,去读neg_cnt这个值,就是低电平的时间
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginneg_cnt<=0;   endelse beginif(neg_dq_in) //重新清零neg_cnt<=0; else neg_cnt<=neg_cnt+1; end
end//上升沿来了,开始计数,
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginpos_cnt<=0;   endelse beginif(pos_dq_in) //重新清零pos_cnt<=0; else pos_cnt<=pos_cnt+1; end
end
assign  dq     = dq_dir ?  dq_out : 1'bz;  // DQ数据输出或高阻
assign  dq_in  = dq ;                      // DQ数据输入//状态机
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginstate_c <= IDLE;endelse beginstate_c <= state_n;end
end//第二段:组合逻辑always模块,描述状态转移条件判断
always@(*)begincase(state_c)IDLE:beginif(idl2rst_pulse_start)beginstate_n = RST_PULSE;endelse beginstate_n = state_c;endendRST_PULSE:beginif(rst_pulse2ds18b20_wait_start)beginstate_n = DS18B20_WAIT;endelse beginstate_n = state_c;endendDS18B20_WAIT:beginif(ds18b20_wait2answer_pluse_start)beginstate_n = ANSWER_PULSE;endelse beginstate_n = state_c;endendANSWER_PULSE:beginif(answer_pulse2skip_rom_start)beginstate_n = SKIP_ROM_DATA;endelse beginstate_n = state_c;endendSKIP_ROM_DATA:beginif(skip_rom2conv_temp_start)beginstate_n = CONVERT_TEMP_DATA;endelse beginstate_n = state_c;endendCONVERT_TEMP_DATA:beginif(conv_temp2wait_500ms_start)beginstate_n = WAITING_500MS;endelse beginstate_n = state_c;endendWAITING_500MS:beginif(wait_500ms2again_rst_start)beginstate_n = AGAIN_RST_PULSE;endelse beginstate_n = state_c;endendAGAIN_RST_PULSE:beginif(again_rst2ds18b20_wait_start)beginstate_n = DS18B20_WAIT1;endelse beginstate_n = state_c;endendDS18B20_WAIT1:beginif(ds18b20_wait2again_answer_start)beginstate_n = AGAIN_ANSWER_PULSE;endelse beginstate_n = state_c;endendAGAIN_ANSWER_PULSE:beginif(again_answer2again_skip_rom_start)beginstate_n = AGAIN_SKIP_ROM_DATA;endelse beginstate_n = state_c;endendAGAIN_SKIP_ROM_DATA:beginif(again_skip_rom2again_conv_temp_start)beginstate_n = READ_TEMP_DATA;endelse beginstate_n = state_c;endendREAD_TEMP_DATA:beginif(again_conv_temp2read_data_start)beginstate_n = READ_DATA;endelse beginstate_n = state_c;endendREAD_DATA:beginif(read_data2idle_start)beginstate_n = IDLE;endelse beginstate_n = state_c;endenddefault:beginstate_n = IDLE;endendcase
end//第三段:设计转移条件
assign idl2rst_pulse_start                   = state_c==IDLE                    && end_cnt;
assign rst_pulse2ds18b20_wait_start          = state_c==RST_PULSE               && end_cnt;
assign ds18b20_wait2answer_pluse_start       = state_c==DS18B20_WAIT            && end_cnt;
assign answer_pulse2skip_rom_start           = state_c==ANSWER_PULSE            && (pos_dq_in&&neg_cnt>TIME_60US&&neg_cnt<TIME_240US);
assign skip_rom2conv_temp_start              = state_c==SKIP_ROM_DATA           && end_cnt1;
assign conv_temp2wait_500ms_start            = state_c==CONVERT_TEMP_DATA       && end_cnt1;
assign wait_500ms2again_rst_start            = state_c==WAITING_500MS           && end_cnt;
assign again_rst2ds18b20_wait_start          = state_c==AGAIN_RST_PULSE         && end_cnt;
assign ds18b20_wait2again_answer_start       = state_c==DS18B20_WAIT1           && end_cnt;
assign again_answer2again_skip_rom_start     = state_c==AGAIN_ANSWER_PULSE      && (pos_dq_in&&neg_cnt>TIME_60US&&neg_cnt<TIME_240US);
assign again_skip_rom2again_conv_temp_start  = state_c==AGAIN_SKIP_ROM_DATA     && end_cnt1;
assign again_conv_temp2read_data_start       = state_c==READ_TEMP_DATA          && end_cnt1;
assign read_data2idle_start                  = state_c==READ_DATA               && end_cnt2;//初始化过程
always @(posedge clk or negedge rst_n) begin//复位初始化if(rst_n == 1'b0) begindq_dir<=1;  //设置DQ为输出dq_out<=1;  //设置DQ输出高电平flag_cnt<=0;Time<=1;temp_data<=0;endelse if(start_flag1)begin  //当按键按下时,温度开始转换case(state_c)IDLE:begin         //空闲先拉高1us,自己理解的dq_dir<=1;  dq_out<=1;  Time<=TIME_1US;flag_cnt<=1;   endRST_PULSE:begin      //主机拉低600us发送复位脉冲dq_dir<=1;    dq_out<=0;    Time<=TIME_600US;flag_cnt<=1;  endDS18B20_WAIT:begin   //释放总线,等着15-60us之后,从机把总线拉低dq_dir<=0;    Time<=TIME_10US;flag_cnt<=1;  endANSWER_PULSE:begin //从机把总线拉低60--240us,之后,从机又把总线拉高,结束应答信号dq_dir<=0;     flag_cnt<=0;   endSKIP_ROM_DATA:begin    if(ROM_SKIP_CMD[cnt1]==0) begin //判断第一位是0还是1if(cnt<TIME_1US) begindq_dir<=1;       //拉高dq_out<=1;       endelse if(cnt<TIME_70US)begindq_dir<=1;      dq_out<=0;        endelse  begindq_dir<=0;       //释放总线2us,保证在两次写间隙时间大于1usendTime<=TIME_72US;  //设置每个写间隙时间为70us,释放总线的时间2us,数据手册上:写间隙大于60usflag_cnt<=1;      endelse begin              //判断第一位是0还是1if(cnt<TIME_1US) begindq_dir<=1;     dq_out<=1;       endelse if(cnt<TIME_3US)begin //拉低总线1us以上,在15us之内释放总线,我是拉低2us左右,释放总线dq_dir<=1;      dq_out<=0;        endelse  begindq_dir<=0;       //包括释放总线endTime<=TIME_72US; flag_cnt<=1;      end            endCONVERT_TEMP_DATA:begin   if(CONVERT_CMD[cnt1]==0) beginif(cnt<TIME_1US) begindq_dir<=1;     dq_out<=1;       endelse if(cnt<TIME_70US)begindq_dir<=1;    dq_out<=0;        endelse  begindq_dir<=0;       endTime<=TIME_72US; flag_cnt<=1;      endelse beginif(cnt<TIME_1US) begindq_dir<=1;     dq_out<=1;       endelse if(cnt<TIME_3US)begindq_dir<=1;    dq_out<=0;        endelse  begindq_dir<=0;      endTime<=TIME_72US; flag_cnt<=1;      end           endWAITING_500MS:begindq_dir<=1;       dq_out<=1;          Time<=TIME_500MS; flag_cnt<=1;    endAGAIN_RST_PULSE:begindq_dir<=1;   dq_out<=0;   Time<=TIME_600US;flag_cnt<=1; endDS18B20_WAIT1:begindq_dir<=0;  Time<=TIME_10US;flag_cnt<=1; endAGAIN_ANSWER_PULSE:begindq_dir<=0;    flag_cnt<=0;  endAGAIN_SKIP_ROM_DATA:begin   if(ROM_SKIP_CMD[cnt1]==0) beginif(cnt<TIME_1US) begindq_dir<=1;     dq_out<=1;       endelse if(cnt<TIME_70US)begindq_dir<=1;   dq_out<=0;        endelse  begindq_dir<=0;  //释放总线,2us    endTime<=TIME_72US; flag_cnt<=1;      endelse beginif(cnt<TIME_1US) begindq_dir<=1;      dq_out<=1;       endelse if(cnt<TIME_3US)begindq_dir<=1;    dq_out<=0;        endelse  begindq_dir<=0;       //释放总线,2usendTime<=TIME_72US; flag_cnt<=1;      end             endREAD_TEMP_DATA:begin  if(READ_TEMP[cnt1]==0) beginif(cnt<TIME_1US) begindq_dir<=1;     dq_out<=1;       endelse if(cnt<TIME_70US)begindq_dir<=1;      dq_out<=0;        endelse  begindq_dir<=0;      endTime<=TIME_72US; flag_cnt<=1;      endelse beginif(cnt<TIME_1US) begindq_dir<=1;       dq_out<=1;       endelse if(cnt<TIME_3US)begindq_dir<=1;      dq_out<=0;        endelse  begindq_dir<=0;       endTime<=TIME_72US; flag_cnt<=1;      end           endREAD_DATA:begin       if(cnt<TIME_70US) beginif(cnt<TIME_2US) begin dq_dir<=1;         dq_out<=1;         endelse if(cnt<TIME_3US) begin  //拉低最少1usdq_dir<=1;         dq_out<=0;        endelse begindq_dir<=0;       //释放总线if(cnt==TIME_10US) begin  //在15us以内读取数据,我是在10us的时刻,读取从机发过来的数据temp_data[cnt2]<=dq_in;endendendelse  begindq_dir<=0;       //释放总线2usendTime<=TIME_72US;   flag_cnt<=1;            enddefault:; endcaseend
end    //计算时间
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt <= 0;endelse if(add_cnt)beginif(end_cnt)cnt <= 0;elsecnt <= cnt + 1;end
end
assign add_cnt = flag_cnt;
assign end_cnt = add_cnt && cnt==Time-1;   //计算器
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)cnt1 <= 0;elsecnt1 <= cnt1 + 1;end
endassign add_cnt1 = end_cnt  && write_flag ;
assign end_cnt1 = add_cnt1 && cnt1==8-1 ;  //八个数据,发送出去了,结束标志 //计数器,
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt2 <= 0;endelse if(add_cnt2)beginif(end_cnt2)cnt2 <= 0;elsecnt2 <= cnt2 + 1;end
endassign add_cnt2 = end_cnt  && read_flag;
assign end_cnt2 = add_cnt2 && cnt2==16-1 ; //16个数据读进来,结束标志  //写8位数据的标志位
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginwrite_flag<=0;endelse  if(state_c==SKIP_ROM_DATA||state_c==CONVERT_TEMP_DATA||state_c==AGAIN_SKIP_ROM_DATA||state_c==READ_TEMP_DATA)   beginwrite_flag<=1;   endelse beginwrite_flag<=0;   end
end//读8位数据的标志
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginread_flag<=0;endelse if(state_c==READ_DATA) beginread_flag<=1;endelse beginread_flag<=0;end
end//数据转换
//判断符号位
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginsign  <=  1'b0;data1 <= 11'b0;endelse if(temp_data[15] == 1'b0) beginsign  <= 1'b0;data1 <= temp_data[10:0];endelse if(temp_data[15] == 1'b1) beginsign  <= 1'b1;data1 <= ~temp_data[10:0] + 1'b1;end
end//对采集到的温度进行转换
assign data2 = (data1 * 11'd625)/ 7'd100;always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begindata<=123;endelse begindata<=data2;  //将读出的值显示到数码管上end
end//测试
assign  neg_key_in1 =  key_in1_d1 & (~key_in1_d0);
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginkey_in1_d0<=1'b0;key_in1_d1<=1'b0;endelse  beginkey_in1_d0<=key[0];key_in1_d1<=key_in1_d0;end
endassign  neg_key_in2 =  key_in2_d1 & (~key_in2_d0);  always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginkey_in2_d0<=1'b0;key_in2_d1<=1'b0;endelse  beginkey_in2_d0<=key[1];key_in2_d1<=key_in2_d0;end
end//测试
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginstart_flag1<=0;endelse if(neg_key_in1) beginstart_flag1<=1;end
end//测试
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginstart_flag2<=0;endelse if(neg_key_in2) beginstart_flag2<=1;end
end//测试
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled[0]<=1;endelse if(start_flag1) beginled[0]<=0;end
end//测试
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled[1]<=1;endelse if(start_flag2) beginled[1]<=0;end
endendmodule

DS18B20 FPGA相关推荐

  1. 基于FPGA的DS18B20温度测量以及数码管显示

    这是我在CSDN的第一篇文章,如果文章排版不好或者存在其它的一些问题,希望大家海涵. FPGA与各器件的连接如图所示: dq为DS18B20的单总线 dtube_cs_n为数码管的4位 dtube_d ...

  2. 【正点原子FPGA连载】第二十七章DS18B20数字温度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 基于 FPGA 使用 Verilog 实现 DS18B20 温度采集以及数码管显示项目源码【免费——互相学习】

    https://github.com/zcj-debug/temperature_ds18b20 工程内的 doc 文件有整个项目的设计文档以及板上验证视频 ds18b20 的原理网上都有 硬件只需要 ...

  4. 基于FPGA的ds18b20温度传感器使用

    文章目录 一.传感器介绍 1.特点 2.内部结构 3.ds18b20管脚 4.ds18b20内部高速暂存存储器 5.ds18b20工作时序 6.ds18b20单线通信 二.FPGA代码实现 1.状态图 ...

  5. 基于FPGA的 DS18B20多功能温度显示

    基于FPGA的 DS18B20多功能温度显示 实现功能: 1.实时温度显示在数码管上,更新速率1-2s一次 2.按下按键显示最近30s内的最高温和最低温 不包含板子, 3.按下按键可以存储当前温度,最 ...

  6. DS18B20温度传感器FPGA实现

    一. 简介 通过原理图可以看出,DS18B20温度传感器只有一条总线,可想而知,其结构的简单化,导致了其操作的复杂化. 更多关于该传感器的一些特性参数,以及性能指标,可以详细阅读官网提供的数据手册. ...

  7. FPGA DS18B20温度传感器的开发

    verilog代码: module DS18B20(Clk,nRst,En,Data,DQ);input Clk; //输入时钟50MHzinput nRst; //输入复位input En; // ...

  8. fpga供电电压偏低会怎样_正点原子【FPGA-开拓者】第三章 硬件资源详解

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章,我们将向大家详细介绍ALIENTEK开拓者FPGA ...

  9. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析

    本文为明德扬原创文章,转载请注明出处! 很多朋友在学习FPGA的时候会发现模块划分很令人头大,今天我就通过明德扬温度检测工程来与大家分享一下本人的划分思路. 明德扬温度检测工程是基于FPGA的一个实用 ...

最新文章

  1. SQL Server 2008 修改安装路径后安装出错的解决方法
  2. js 调用服务器端方法总结
  3. 信息学奥赛一本通 2073:【例2.16 】三角形面积
  4. Maven 每次update之后自动修改jdk问题
  5. hadoop streaming怎么设置key
  6. java图片转换pdf_Java实现图片转换PDF文件的示例代码
  7. 正则表达式确实是一种考验
  8. 明天就是第四周的实训开始的时间
  9. 企业机房升温-谁之过?
  10. 06.SpringBoot的webjars和静态资源映射
  11. 计算机图形学期刊影响因子,计算机图形学 | CCF推荐期刊专刊信息2条
  12. torch tensor去掉1维_代数拓扑笔记(1) —— 胞腔复形
  13. R语言进行主成分分析PCA和探索性因子分析EFA的常用步骤:准备资料、选择因子模型、提取多少主成分/因子、提取主成分或者因子、旋转主成分或者因子、数据结果解读、计算主成分或因子得分(或者系数)
  14. Pytorch unfold和fold
  15. Source Insight 4.0.0086 Patched
  16. 分子生物学中常用数据库
  17. Python——实现防止微信撤回消息
  18. java中整数的整数次方_数值的整数次方
  19. 对链特异性建库的理解
  20. 思考如何概括“技术美术”(Technical Artist)的职责

热门文章

  1. 手机照片删除后如何恢复
  2. python决策树剪枝_决策树剪枝的方法与必要性
  3. char和varchar有哪些区别?varchar最大长度是多少?
  4. C#操作INI文件(我的处女作啊)
  5. 音视频进阶教程|如何实现游戏中的实时语音
  6. 直播教育平台源码中的人人分销是什么?如何实现?
  7. javascript获取焦点对象ID
  8. 认证密钥协商(Authentication key agreement)的安全目标
  9. 关于8259中断控制器
  10. 基于android的旅客管理系统,基于Android的铁路旅客运输管理子系统的设计与实现...