EEPROM读写实验——FPGA学习笔记18

一、EEPROM简介

        Electrically Erasable Progammable Read Only Memory:是指带电可擦可编程只读存储器,是一种常用的非易失性存储器(掉电数据不丢失)

EEPROM发展历史

        我们这次实验所用的AT24C64存储容量为64Kbit,内部分成256页,每页32字节,共有8192个字节,且其读写操作都是以字节为基本单位。可以把AT24C64看作一本书,那么这本书有256页,每页有32行,每行有8个字,总共有256*32*8=65536个字,对应着AT24C6464*1024=65536bit。
        读是从起始读到最大,回到起始; 写是写到一页的结束;

24C02:

片内地址寻址:

读写操作:

二、IIC简介

1、简介

        IIC即Inter-Integrated Circuit(集成电路总线),是由Philips半导体公司(现在的NXP半导体公司)在八十年代初设计出来的一种简单、双向、二线制总线标准。

2、 IIC结构示意

3、IIC协议时序

时钟线为低电平可以变化数据,时钟线为高电平不允许变化数据,只能保持。

 4、器件地址

5、字寄存器地址 (24C64)

6、单次写(字节写)

7、连续写(页写)

8、读当前地址:

9、任意地址单次读(随机读)

10、从xxx地址开始连续读

三、试验任务

        本节的实验任务是先向E2PROMAT24C64)的存储器地址0255分别写入数据0~255;写完之后再读取存储器地址0~255中的数据,若读取的值全部正确则LED灯常亮,否则LED灯闪烁。

四、程序设计

 1、整体框图

2、IIC_my

状态机:

代码:

`timescale 1ns / 1psmodule iic_my#(parameter integer WMEN_LEN = 8'd1   ,   //写长度,以字节为单位,包含器件地址parameter integer RMEN_LEN = 8'd0   ,   //读长度,以字节为单位,不包含器件地址parameter integer CLK_DIV  = 16'd499    //IIC时钟分频系数
)
(
input   wire                            I_clk               ,       //系统时钟输入
input   wire                            I_rstn              ,       //系统复位,低电平有效
output  reg                             O_iic_scl = 1'b0    ,       //I2C时钟SCL
inout   wire                            IO_iic_sda          ,       //I2C 数据总线
input   wire    [WMEN_LEN*8-1'b1:0]     I_wr_data           ,       //写数据寄存器,其中WMEN_LEN设置了最大支持的数据字节数,越大占用的FPGA资源越多
input   wire    [7:0]                   I_wr_cnt            ,       //写数据计数器,代表写了多少个字节
output  reg     [RMEN_LEN*8-1'b1:0]     O_rd_data = 0       ,       //读数据寄存器,其中RMEN_LEN设置了最大支持的数据字节数,越大占用的FPGA资源越多
input   wire    [7:0]                   I_rd_cnt            ,       //读数据计数器
input   wire                            I_iic_req           ,       //I_iic_req == 1 使能I2C传输
input   wire                            I_iic_mode          ,       //I_iic_mode = 1 随机读   I_iic_mode = 0 读当前寄存器或者页读
output  reg                             O_iic_busy = 1'b0   ,       //I2C控制器忙
output  reg                             O_iic_bus_error     ,       //I2C总线,无法读到正确ACK出错
output  reg                             IO_iic_sda_dg               //数据总线上的数据
);localparam IDLE     =    4'd0   ;       //I2C 总线空闲状态
localparam START    =    4'd1   ;       //I2C 总线启动
localparam W_WAIT   =    4'd2   ;       //I2C 总线等待写完成
localparam W_ACK    =    4'd3   ;       //I2C 总线等待写WACK
localparam R_WAIT   =    4'd4   ;       //I2C 总线等待读完成 
localparam R_ACK    =    4'd5   ;       //I2C 总线等待读RACK 
localparam STOP1    =    4'd6   ;       //I2C 总线产生停止位
localparam STOP2    =    4'd7   ;       //I2C 总线产生停止位   localparam SCL_DIV  =   CLK_DIV/2   ;localparam OFFSET   =   SCL_DIV - SCL_DIV/4 ;   //设置I2C总线的SCL时钟的偏移,以满足SCL和SDA的时序要求,外部的SCL延迟内部的半周期的四分之三reg         [2:0 ]  IIC_S   =   4'd0    ;   //I2C 状态机
//generate  scl 
reg         [15:0]  clkdiv  =   16'd0   ;   //I2C 时钟分频寄存器
reg                 scl_r   =   1'b1    ;   //I2C控制器的SCL内部时钟
reg                 sda_o 	=   1'b0    ;   //I2C控制器的SDA
reg                 scl_clk =   1'b0    ;   //I2C控制器内部SCL时钟,与外部时钟存在OFFSET参数设置的相位偏移
reg         [7:0]   sda_r   =   8'd0    ;   //发送寄存器
reg         [7:0]   sda_i_r =   8'd0    ;   //接收寄存器
reg         [7:0]   wcnt    =   8'd0    ;   //发送数据计数器,以byte为单位
reg         [7:0]   rcnt    =   8'd0    ;   //接收数据计数器,以byte为单位
reg         [2:0]   bcnt    =   3'd0    ;   //bit计数器
reg                 rd_req  =   1'b0    ;   //读请求,当判断到需要读数据,内部状态机中设置1
wire                sda_i               ;   //sda 输入
wire                scl_offset          ;   //scl 时钟偏移控制assign  sda_i       = (IO_iic_sda == 1'b0)  ?  1'b0 : 1'b1  ;       //读总线 
assign  IO_iic_sda  = (sda_o == 1'b0)       ?  1'b0 : 1'bz  ;       //写总线,1'bz代表高阻,I2C外部通过上拉电阻,实现总线的高电平PULLUP PULLUP_inst (.O(iic_sda));//仅对仿真有效,仿真设计iic_sda状态为高阻,模拟上拉电阻 //scl 时钟分频器
always@(posedge I_clk)beginif(clkdiv < SCL_DIV)    clkdiv <= clkdiv + 1'b1;else beginclkdiv <= 16'd0; scl_clk <= !scl_clk;end
endassign  scl_offset  =   (clkdiv == OFFSET)    ;   //设置scl_offset的时间参数always @(posedge I_clk)beginO_iic_scl <=  scl_offset ?  scl_r : O_iic_scl; //O_iic_scl延迟scl_offset时间的scl_r
end//当IIC_S状态机处于,同时空闲状态,设置SCL为高电平,同时也是空闲,停止状态,用于产生起始位和停止位时序,否则寄存scl_clk时钟
always @(*) beginif(IIC_S == IDLE || IIC_S == STOP1 || IIC_S == STOP2)scl_r <= 1'b1;else scl_r <= scl_clk;
end//当进入IIC_S状态为启动、停止设置sda=0,结合scl产生起始位,或者(IIC_S == R_ACK && (rcnt != I_rd_cnt) sda=0,用于产生读操作的ACK
always @(*) beginif(IIC_S == START || IIC_S == STOP1 || (IIC_S == R_ACK && (rcnt != I_rd_cnt)))beginsda_o <= 1'b0;endelse if(IIC_S == W_WAIT)beginsda_o <= sda_r[7]; endelse beginsda_o <= 1'b1;                          //否则其他状态都为1,当(IIC_S == R_ACK && (rcnt == I_rd_cnt) 产生一个NACK end
end//I2C数据发送模块,所有的写数据都通过此模块发送
always @(posedge scl_clk) beginif(IIC_S == W_ACK || IIC_S == START)begin   //IIC_S=START和W_ACK,把需要发送的数据,寄存到sda_rsda_r <= I_wr_data[(wcnt*8) +: 8];      //寄存需要发发送的数据到sda_rif( rd_req ) beginsda_r <= {I_wr_data[7:1],1'b1};     //对于读操作,rd_req由内部代码产生,当写完第一个数据(器件地址),后通过判断I_rd_cnt,确认是否数据需要读endendelse if(IIC_S == W_WAIT)begin               //当W_WAT状态,通过移位操作,把数据发送到数据总线sda_r <= {sda_r[6:0],1'b1};             //移位操作endelse beginsda_r <= sda_r;end
end//I2C数据接收模块,I2C读期间,把数据通过移位操作,移入O_rd_data
always @(negedge scl_clk)beginif(IIC_S == R_WAIT ) begin                  //当IIC_S == R_WAIT ||IIC_S == W_ACK(如果读操作,第1个BIT是W_ACK这个状态读)启动移位操作sda_i_r <= {sda_i_r[6:0],sda_i};endelse if(IIC_S == R_ACK) begin               //当IIC_S == R_ACK,完成一个BYTE读,把数据保存到O_rd_dataO_rd_data[((rcnt-1'b1)*8) +: 8] <= sda_i_r[7:0];endelse if(IIC_S == IDLE)begin                 //空闲状态,重置sda_i_rsda_i_r <= 8'd0;end
end//总线忙状态
always @(posedge scl_clk or negedge I_rstn )beginif(I_rstn == 1'b0)beginO_iic_busy <= 1'b0; endelse beginif((I_iic_req == 1'b1 || rd_req == 1'b1 || O_iic_bus_error))begin//I_iic_req == 1'b1 || rd_req == 1'b1总线进入忙状态O_iic_busy <= 1'b1; endelse if(IIC_S == IDLE)beginO_iic_busy <= 1'b0;endend 		
end//总线错误状态
always @(negedge scl_clk or negedge I_rstn )beginif(I_rstn == 1'b0)beginO_iic_bus_error <= 1'b0;end  	else beginif(IIC_S  == W_ACK && sda_i == 1'b1)begin//I_iic_req == 1'b1 || rd_req == 1'b1总线进入忙状态O_iic_bus_error <= 1'b1; endelse if(I_iic_req == 0)beginO_iic_bus_error <= 1'b0;endend 		
end//状态机
always @(posedge scl_clk or negedge I_rstn) beginif (!I_rstn) beginwcnt    <=  8'd0    ;rcnt    <=  8'd0    ;rd_req  <=  1'd0    ;IIC_S   <=  IDLE    ;end else begincase (IIC_S)                        //sda = 1   scl = 1IDLE:beginif ((I_iic_req == 1'b1)||(rd_req == 1'b1) )begin    //当I_iic_req == 1'b1代表启动传输 当 rd_req == 1'b1 代表读操作需要产生repeated start 重复启动  IIC_S <= START;         //进入总线启动end else beginwcnt <= 8'd0;rcnt <= 8'd0;endend START:begin                     //这个状态,前面的代码,先设置sda = 0,scl_offset参数设置了scl_clk时钟的偏移,之后 scl_clk =0 即scl =0 产生起始位或者重复起始位bcnt <= 3'd7;               //设置bcnt的初值IIC_S <= W_WAIT;            //进入发送等待end         W_WAIT:begin                    //等待发送完成,这里发送8bits 数据,写器件地址,写寄存器地址,写数据,都在这个状态完成if (bcnt > 3'd0) begin      //如果8bits没发送完,直到发送完bcnt <= bcnt - 1'b1;    //bcnt计数器,每发送1bit减1end else begin                  //8bits发送完毕wcnt <= wcnt + 1'b1;    //wcnt计数器,用于记录已经写了多少字节IIC_S <= W_ACK;         //进入W_ACK状态endend W_ACK:begin                     //等待WACK,此阶段,也判断是否有读操作if (wcnt < I_wr_cnt) begin  //判断是否所有数据发送(写)完成bcnt <= 3'd7;           //如果没有写完,重置bcntIIC_S <= W_WAIT;        //继续回到W_WAIT等待数据发送(写)完成end else if(I_rd_cnt > 3'd0)beginif ((rd_req == 1'b0) && (I_iic_mode == 1'b1)) beginrd_req  <=  1'b1  ;     //请求读操作IIC_S   <=  IDLE  ;     //设置状态进入IDLE,根据rd_req的值会重新产生一次为读操作进行的repeated重复startend else beginIIC_S   <=  R_WAIT  ;   //进入读等待bcnt    <=  3'd7    ;   endendelse beginIIC_S <= STOP1;             //如果所有的发送完成,也没数据需要读,进入停止状态endend R_WAIT:beginrd_req  <=  1'b0        ;       //重置读请求 bcnt    <=  bcnt - 1'b1 ;if (bcnt == 3'd0) beginrcnt    <=  ( rcnt < I_rd_cnt ) ? ( rcnt + 1'b1 ) : rcnt ; //判断是否还有数据需要读IIC_S   <=  R_ACK ;endend R_ACK:beginbcnt    <=  3'd7 ;                                             //重置读请求bcnt计数器IIC_S   <=  ( rcnt < I_rd_cnt ) ? R_WAIT : STOP1    ;           //如果所有数据读完,进入停止状态 end STOP1:begin //产生停止位 sda = 0 scl = 1rd_req  <=  1'b0    ;   IIC_S   <=  STOP2   ;   end STOP2:begin //产生停止位  sda = 1 scl = 1IIC_S <= IDLE;end default:begin                 IIC_S <= IDLE;endendcaseend
endendmodule

3、

状态机:

代码

`timescale 1ns / 1psmodule eeprom_rt
(input   wire            I_sysclk    ,   //系统时钟输入output  wire            O_iic_scl   ,   // I2C SCL时钟inout   wire            IO_iic_sda  ,   //I2C SDA数据总线output  wire    [3:0]   test_led    ,   //测试LEDoutput  wire            led             //error LED
);localparam  SYSCLKHZ    =   100_000_000;
localparam  T500MS_CNT  =   (SYSCLKHZ / 2 - 1) ;reg     [8 :0] 	    rst_cnt   	 = 9'd0     ;   //延迟复位计数器
reg     [25:0]      t500ms_cnt	 = 26'd0    ;   //500ms计数器
reg     [19:0]      delay_cnt 	 = 20'd0    ;   //eeprom每次读写完后,延迟操作计数器
reg     [2 :0]	    TS_S 	  	 = 2'd0     ;   // 读写EEPROM状态机
reg     		    iic_req 	 = 1'b0     ;   //i2c总线,读/写请求信号
reg     [31:0]	    wr_data   	 = 32'd0    ;   //写数据寄存器
reg     [7 :0]	    wr_cnt 	  	 = 8'd0     ;   //写数据计数器
reg     [7 :0]	    rd_cnt 	  	 = 8'd0     ;   //读数据计数器
wire     		    iic_busy                ;   // i2c总线忙信号标志
wire    [31:0]      rd_data                 ;   // i2c读数据
wire    		    t500ms_en               ;   // 500ms延迟到使能wire                IO_iic_sda_dg           ;
wire                iic_bus_error           ;   //i2c总线错误
reg                 iic_error = 1'b0        ;   //i2c 读出数据有错误assign  test_led    =   rd_data[3:0]            ;//测试LED输出
assign  led         =   iic_error               ;//通过LED显示错误标志
assign  t500ms_en   =   (t500ms_cnt==T500MS_CNT);//500ms 使能信号//系统复位计数器
always @(posedge I_sysclk ) beginif (!rst_cnt[8]) beginrst_cnt <= rst_cnt + 1'b1;end
end//I2C总线延迟间隔操作,该时间约不能低于500us,否则会导致EEPROM操作失败
always@(posedge I_sysclk) beginif(!rst_cnt[8])begindelay_cnt <= 0;endelse if((TS_S == 3'd0 || TS_S == 3'd2 )) begindelay_cnt <= delay_cnt + 1'b1;endelse begin delay_cnt <= 0;end
end//每间隔500ms状态机运行一次
always@(posedge I_sysclk) beginif(!rst_cnt[8])begint500ms_cnt <= 0;endelse if(t500ms_cnt == T500MS_CNT) begint500ms_cnt <= 0;endelse begin t500ms_cnt <= t500ms_cnt + 1'b1;end
end//状态机实现每次写1字节到EEPROM然后再读1字节
always @(posedge I_sysclk ) beginif (!rst_cnt[8]) beginiic_req     <=  1'b0    ;wr_data     <=  32'd0   ;rd_cnt      <=  8'd0    ;wr_cnt      <=  8'd0    ;iic_error   <=  1'b0    ;TS_S        <=  3'd0    ;end else begincase (TS_S)0:begin     if (!iic_busy) begin        //当总线不忙,可以开启一次IIC数据操作iic_req <=  1'b1    ;   //请求发送数据//数据寄存器中8'b10100000代表需要写的器件地址,第一个wr_data[15:8]代表了EEPROM内存地址,第二个wr_data[15:8]代表了写入数据   wr_data <= {8'hfe,wr_data[15:8],wr_data[15:8],8'b10100000}; rd_cnt  <=  8'd0    ;   //不需要读数据wr_cnt  <=  8'd3    ;   //需要写入3个BYTES数据,包含一个器件地址,1个EEPROM寄存器地址,一个数据TS_S    <=  3'd1    ;        endend1:beginif (iic_busy == 1'b1) beginiic_req <=  1'b0    ;TS_S    <=  3'd2    ;end end2:beginif ((!iic_busy) && (delay_cnt[19] == 1'b1)) begin//当总线非忙,可以开始一次I2C数据操作,该时间约不能低于500us,否则会导致EEPROM操作失败iic_req <=  1'b1    ;   //请求接收数据rd_cnt  <=  8'd1    ;   //需要读取一个字节wr_cnt  <=  8'd2    ;   //需要写两个byte  一个器件地址8’d1010_0000 一个寄存器地址 wr_data[15:8] (I2C控制器会自定设置读写标志位)TS_S    <=  3'd3    ;    end end3:beginif (iic_busy == 1'b1) beginiic_req <=  1'b0    ;TS_S    <=  3'd4    ;endend4:beginif (!iic_busy) begin        //当总线非忙,代表前面读数据完成       if (wr_data[23:16] != rd_data[7:0]) begin   //对比数据是否正确iic_error   <=  1'b1    ;end else beginiic_error   <=  1'b0    ;endwr_data[15:8]   <=  wr_data[15:8] + 1'b1    ;   //地址和数据都加1TS_S            <=  3'd5    ;endend5:beginif(t500ms_en == 1'b1)beginTS_S    <=  3'd0;endenddefault: TS_S   <=  3'd0;endcaseend
end// 以下代码为在线逻辑分析仪观察调试部分
reg scl_r = 1'b0;
always @(posedge I_sysclk)begin //对O_iic_scl寄存1次scl_r <= O_iic_scl; 
end//产生一个触发时钟,这个时钟是系统时钟的512倍分频,这样抓取总线的时候,可以看到更多I2C的有效信号
reg [8:0] dg_clk_cnt;
wire dg_clk = (dg_clk_cnt==0);//用scl_dg即O_iic_scl的跳变沿作为触发信号
always@(posedge I_sysclk) begindg_clk_cnt <= dg_clk_cnt+ 1'b1;
endila_0 ila_debug (.clk(I_sysclk),//在线逻辑分析仪的时钟.probe0({rd_data[7:0],wr_data[23:0],TS_S,iic_error,iic_req,scl_r,IO_iic_sda_dg,iic_bus_error,dg_clk,t500ms_en}) // 需要观察的调试信号
);//例化I2C控制模块
iic_my#
(
.WMEN_LEN   (4              )   ,   //最大支持一次写入4BYTE(包含器件地址)
.RMEN_LEN   (4              )   ,   //最大支持一次读出4BYTE(包含器件地址)
.CLK_DIV    (SYSCLKHZ/100000)       //100KHZ I2C总线时钟
)
u_iic_my
(.I_clk              (I_sysclk       )   ,   //系统时钟.I_rstn             (rst_cnt[8]     )   ,   //系统复位.O_iic_scl          (O_iic_scl      )   ,   //I2C SCL总线时钟.IO_iic_sda         (IO_iic_sda     )   ,   //I2C SDA数据总线.I_wr_data          (wr_data        )   ,   //写数据寄存器.I_wr_cnt           (wr_cnt         )   ,   //需要写的数据BYTES.O_rd_data          (rd_data        )   ,    //读数据寄存器.I_rd_cnt           (rd_cnt         )   ,   //需要读的数据BYTES.I_iic_req          (iic_req        )   ,   //I2C控制器请求.I_iic_mode         (1'b1           )   ,   //读模式.O_iic_busy         (iic_busy       )   ,   //I2C控制器忙.O_iic_bus_error    (iic_bus_error  )   ,   //总线错误信号标志.IO_iic_sda_dg      (IO_iic_sda_dg  )       //debug IO_iic_sda
); endmodule

五、仿真验证

发送器件地址:

发送片内地址:

随机读:

六、上板验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555277.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

成都睿明智科技有限公司真实可靠吗?

在这个日新月异的电商时代&#xff0c;抖音作为短视频与直播电商的佼佼者&#xff0c;正以前所未有的速度重塑着消费者的购物习惯。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司以其独到的眼光和专业的服务&#xff0c;成为了众多商家信赖的合作伙伴。今…

《python语言程序设计》2018版第8章19题几何Rectangle2D类(中)-同志们我要起飞了

前言 昨天的原始绘制两个矩形的代码段draw_rec2原始draw_rec2运行结果我们不是上面往右转90.我怎么往左转90不对吗??? ☺️结果利用已建立完的Rectangle2D类来实现Rectangle2D类的代码可以找上集看,今天是锻炼的一天好几个倒立体式解锁了.祝大家愉快 经过昨天晚上的努力我终…

97. UE5 GAS RPG 实现闪电链技能(二)

书接上回&#xff0c;如果没有查看上一篇文章的同学推荐先看上一章&#xff0c;我们接着实现闪电链技能。 在上一章最后&#xff0c;我们实现了闪电链的第一条链&#xff0c;能够正确显示特效&#xff0c;接下来&#xff0c;我们先实现它的音效和一些bug修复。 我们在多端网络里…

cnn突破四(生成卷积核与固定核对比)

cnn突破三中生成四个卷积核&#xff0c;训练6万次&#xff0c;91分&#xff0c;再训练6万次&#xff0c;95分&#xff0c;不是很满意&#xff0c;但又找不到问题点&#xff0c;所以就想了个办法&#xff0c;使用三个固定核&#xff0c;加上三层bpnet神经网络&#xff0c;看看效…

双十一狂欢派对 五款市面上获得好评的好物

一年一度的双十一购物狂欢派对即将到来&#xff0c;这一天不仅是广大消费者的福利日&#xff0c;也是各大品牌展示实力的战场。随着市场的不断发展与消费者需求的多样化&#xff0c;双十一已经不仅仅是降价促销的代名词&#xff0c;更是品质与创新的竞技场。在琳琅满目的商品中…

产品经理产出的原型设计 - 需求文档应该怎么制作?

需求文档&#xff0c;产品经理最终产出的文档&#xff0c;也是产品设计最终的表述形式。本次分享呢&#xff0c;就是介绍如何写好一份需求文档。 所有元件均可复用&#xff0c;可作为管理端原型设计模板&#xff0c;按照实际项目需求进行功能拓展。有需要的话可分享源文件。 …

ChatGPT Canvas:交互式对话编辑器

自两年前 ChatGPT 发布以来&#xff0c;主流 AI 均以对话形式进行交互。传统的对话式界面可以直观看到反馈结果&#xff0c;但在需要深度编辑和协作的项目中就略显局限。为了解决此问题&#xff0c;几个月前 Claude 就发布过 Artifacts 功能&#xff0c;用来拓展原有对话。而现…

django华业社区电子政务管理系统-计算机毕业设计源码33448

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

【Java】Java面试题笔试

[赠送]面试视频指导简历面试题 Java面试笔试题题库华为 java笔试面试题2014.files 就业相关java 面试题 面试题库 视频笔记 java笔试题大集合及答案 java面试书籍源码 java算法大全源码包8张图解 java.docx25个经典的Spring面试问答.docx 25个经典的Spring面试问答.docx 100家大…

【hot100-java】【删除链表的倒数第 N 个结点】

链表篇 思路&#xff1a; 先走一遍记录链表长度 再走到对应的点&#xff0c;然后删除 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode…

【LLM】OpenAI o1模型和相关技术

Note OpenAI o1 模型中推理过程的工作原理 1、o1模型引入了reasoning tokens。这些token用于"思考"&#xff0c;帮助模型分解对提示的理解&#xff0c;并考虑生成回应的多种方法。2、在生成推理token后&#xff0c;模型会产生一个可见的完成token作为答案&#xff0…

Redis:zset类型

Redis&#xff1a;zset类型 zset命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合间操作ZINRERSTOREZUNIONSTORE 内部编码ziplistskiplist 在Redis中&…

【AIGC】ChatGPT提示词Prompt助力自媒体内容创作升级

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效仿写专家级文章提示词使用方法 &#x1f4af;CSDN博主账号分析提示词使用方法 &#x1f4af;自媒体爆款文案优化助手提示词使用方法 &#x1f4af;小结 &#x1f4af…

02基础篇:667的大题题型与应对策略

通过本节&#xff0c;你将学习到&#xff1a; 667分析题的考查方向与基本题型667分析题的两种解决策略 667分析题的三大基本题型 首先&#xff0c;通过回顾667科目分析题的真题&#xff08;2021-2024年&#xff09;&#xff0c;我根据题目特点将其归纳为三个主要类别。这样的…

【JavaWeb】javaweb目录结构简介【转】

以上图说明&#xff1a; bbs目录代表一个web应用bbs目录下的html,jsp文件可以直接被浏览器访问WEB-INF目录下的资源是不能直接被浏览器访问的web.xml文件是web程序的主要配置文件所有的classes文件都放在classes目录下jar文件放在lib目录下

Linux Cent7 已安装MySQL5.7.X,再安装MYSQL8.4.2

一、 下载安装 检查Linux系统的glibc版本rpm -qa | grep glibc结果&#xff1a;glibc-common-2.17-260.el7_6.6.x86_64 glibc-2.17-260.el7_6.6.x86_64 glibc-headers-2.17-260.el7_6.6.x86_64 glibc-devel-2.17-260.el7_6.6.x86_64访问MySQL官网&#xff0c;下载对应版本数据…

华为 HCIP-Datacom H12-821 题库 (32)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.当一个运行 MSTP 协议的交换设备端口收到一个配置BPDU 时&#xff0c;会与设备保存的全局配…

CF D. Minimize the Difference

原题链接&#xff1a;Problem - D - Codeforces 题意&#xff1a;给你长度为n的数组&#xff0c;可以无限次的让i位置的数-1&#xff0c;让i1的位置的数1。问最大值-最小值的最小值是多少&#xff1f; 思路&#xff1a;可以观察出&#xff0c;操作的真正意义是让i位置的数减少…

数字乡村智慧乡镇整体规划设计解决方案

1. 数字乡村的重要性 数字乡镇作为乡村振兴战略的一部分&#xff0c;通过信息化手段提高农业农村现代化水平&#xff0c;是建设数字中国的重要内容&#xff0c;对保障扶贫成果、促进乡村治理体系和治理能力现代化具有基础支撑作用。 2. 乡镇政府和农户面临的问题 乡镇政府和…

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

安装软件、GCC编译器、Linux 操作系统基础 学习任务&#xff1a; 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…