DDR2 IP核调试记录1

一、IP核生成不成功可能原因

1、打开 Quartus II 软件时,请右键选择以管理员方式运行,切记,否则可能导致 IP 生成不成功。
2、创建工程时不要将工程创建在和 Quartus II 安装目录相同的盘符下,否则可能导致生产 IP 失败。
3、如果在生产 IP 界面长时间卡住,无法生成 IP,请关闭掉 Windows 系统的自动更新和防火墙后重新尝试。

二、modelsim仿真时出错可能原因

        IP 请直接创建在 Quartus 的工程根目录下,不要再创建子文件夹,否则仿真的时候会报错。提示找不到文件,实际是因为文件太多,IP 中有些文件路径包含时候处理不好导致的,属于 IP 核设计的小 bug。

三、信号分析

1. 功能

        循环写入255个数后再读出。再在接下来的地址写入、读出。

2. 关于代码中突发长度的几个信号区别

        rd/wr_burst_len=255 ,用户需要读写的数据量;       

        burst_size=2  (=burst_length) ,访问DDR2一次连续访问的数据量,即提供一次地址,能连续读 burst_size长度的数据,然后下次的地址+ burst_size;

        length初始值=rd/wr_burst_len,用于状态的判断。

ip核信号:

        local_address:将访问SDRAM的地址作为输入,无论是读还是写。因此需要在各种状态下,对local_address进行赋值。

3. 程序状态示意图

四、代码

1. IP核封装

/*本模块完成对ddr2 IP的包装,方便后续模块使用,也方便程序的移植,如果更换平台,更新这个文件即可
*/
module mem_burst_v2
#(parameter MEM_DATA_BITS = 32,parameter ADDR_BITS = 24,parameter LOCAL_SIZE_BITS = 3
)
(input rst_n,                                 /*复位*/input mem_clk,                               /*接口时钟*/input rd_burst_req,                          /*读请求*/input wr_burst_req,                          /*写请求*/input[9:0] rd_burst_len,                     /*读数据长度*/input[9:0] wr_burst_len,                     /*写数据长度*/input[ADDR_BITS - 1:0] rd_burst_addr,        /*读首地址*/input[ADDR_BITS - 1:0] wr_burst_addr,        /*写首地址*/output rd_burst_data_valid,                  /*读出数据有效*/output wr_burst_data_req,                    /*写数据信号*/output[MEM_DATA_BITS - 1:0] rd_burst_data,   /*读出的数据*/input[MEM_DATA_BITS - 1:0] wr_burst_data,    /*写入的数据*/output rd_burst_finish,                      /*读完成*/output wr_burst_finish,                      /*写完成*/output burst_finish,                         /*读或写完成*/////*以下是altera ddr2 IP的接口,可参考altera相关文档*/input local_init_done,output ddr_rst_n,input local_ready,output  local_burstbegin,output[MEM_DATA_BITS - 1:0] local_wdata,input local_rdata_valid,input[MEM_DATA_BITS - 1:0] local_rdata,output  local_write_req,output  local_read_req,output reg[23:0] local_address,output[MEM_DATA_BITS/8 - 1:0] local_be,output reg[LOCAL_SIZE_BITS - 1:0] local_size
);
parameter IDLE = 3'd0;
parameter MEM_READ = 3'd1;
parameter MEM_READ_WAIT = 3'd2;
parameter MEM_WRITE  = 3'd3;
parameter MEM_WRITE_BURST_BEGIN = 3'd4;
parameter MEM_WRITE_FIRST = 3'd5;
parameter burst_size = 10'd2;             
reg[2:0] state = 3'd0;
reg[2:0] next_state = 3'd0;	
reg[9:0] rd_addr_cnt = 10'd0;
reg[9:0] rd_data_cnt = 10'd0;reg[9:0] length = 10'd0;
reg[11:0] cnt_timer = 12'd0;
reg[11:0] ddr_reset_timer = 12'd0;
reg ddr_rst_n_reg = 1'b1;reg [LOCAL_SIZE_BITS - 1:0] burst_remain;
reg last_wr_burst_data_req;
reg[9:0] wr_remain_len;/*写入数据请求信号*/
assign wr_burst_data_req = (state == MEM_WRITE_FIRST ) || (((state == MEM_WRITE_BURST_BEGIN) ||  (state == MEM_WRITE)) && local_ready && ~last_wr_burst_data_req);
assign burst_finish = rd_burst_finish | wr_burst_finish;/*local写请求信号*/
assign local_write_req = ((state == MEM_WRITE_BURST_BEGIN) ||  (state == MEM_WRITE));/*初始化计时器, 在本程序没有用到*/
always@(posedge mem_clk or negedge rst_n)
beginif(~rst_n)cnt_timer <= 12'd0;else if(state == IDLE || ~local_init_done)cnt_timer <= 12'd0;elsecnt_timer <= cnt_timer + 12'd1;
end/*DDR读等待计数器, 在本程序没有用到*/
always@(posedge mem_clk or negedge rst_n)
beginif(~rst_n)ddr_reset_timer <= 12'd0;else if(state == MEM_READ_WAIT)ddr_reset_timer <= ddr_reset_timer + 12'd1;elseddr_reset_timer <= 12'd0;	ddr_rst_n_reg <= (ddr_reset_timer !=12'd200);
end
assign ddr_rst_n = ddr_rst_n_reg;/*状态锁存*/
always@(posedge	mem_clk or negedge rst_n)beginif(~rst_n)state <= IDLE;else if(~local_init_done ) //IP核的初始化结束信号state <= IDLE;elsestate <= next_state;end/*burst读写处理程序*/	
always@(*)begincase(state)IDLE:beginif(rd_burst_req && rd_burst_len != 10'd0)         /*接收到burst读请求*/next_state <= MEM_READ;      /*状态转为发burst读命令*/else if(wr_burst_req && wr_burst_len != 10'd0)    /*接收到burst写请求*/next_state <= MEM_WRITE_FIRST;    /*状态转为第一次写*/elsenext_state <= IDLE;endMEM_READ:                         /*burst读命令*/beginif( (rd_addr_cnt + burst_size >= length) && local_read_req && local_ready) /*判断burst读请求的有效的长度*/next_state <= MEM_READ_WAIT;elsenext_state <= MEM_READ;endMEM_READ_WAIT:                   /*等待burst数据读完成*/begin if(rd_data_cnt == length - 10'd1 && local_rdata_valid)     /*判断读出的有效数据长度*/next_state <= IDLE;elsenext_state <= MEM_READ_WAIT;endMEM_WRITE_FIRST:                /*第一次写状态, 用于准备写入的数据*/next_state <= MEM_WRITE_BURST_BEGIN;MEM_WRITE_BURST_BEGIN:         /*产生burst begin信号*/                      beginif(local_ready && wr_remain_len == 10'd1)     /*如果写的剩余数据长度为1, Burst写结束*/next_state <= IDLE;else if(burst_remain == 1 && local_ready)     /*一次local burst写完成, 重新回到burst begin */   next_state <= MEM_WRITE_BURST_BEGIN;else if(local_ready)next_state <= MEM_WRITE;    /*burst begin完成, 转到数据写入*/    elsenext_state <= MEM_WRITE_BURST_BEGIN;endMEM_WRITE:                   beginif(wr_remain_len == 10'd1 && local_ready)     /*如果写的剩余数据长度为1, Burst写结束*/next_state <= IDLE;else if(burst_remain == 1 && local_ready)     /*一次local burst写完成,重新回到burst begin */   next_state <= MEM_WRITE_BURST_BEGIN;else next_state <= MEM_WRITE;enddefault:next_state <= IDLE;endcaseendassign local_burstbegin = ((state == MEM_WRITE_BURST_BEGIN) ||  (state == MEM_READ)); /*产生local burst begin信号*//*计算最后一个burst数据写请求信号*/
always@(posedge	mem_clk)beginif(state == MEM_WRITE_BURST_BEGIN || state == MEM_WRITE)if(wr_remain_len == 10'd2 && local_ready)last_wr_burst_data_req <= 1'b1;elselast_wr_burst_data_req <= last_wr_burst_data_req;elselast_wr_burst_data_req <= 1'b0;end/*计算外部burst写的剩余数据长度*/
always@(posedge	mem_clk)begincase(state)IDLE:if(wr_burst_req)wr_remain_len <= wr_burst_len;  /*wr_remain_len赋初值*/elsewr_remain_len <= wr_remain_len;MEM_WRITE_BURST_BEGIN:      if(local_ready)wr_remain_len <= wr_remain_len - 10'd1;elsewr_remain_len <= wr_remain_len;MEM_WRITE:if(local_ready)wr_remain_len <= wr_remain_len - 10'd1;elsewr_remain_len <= wr_remain_len;default:wr_remain_len <= wr_remain_len;endcaseend/*计算一次local burst的剩余数*/	
always@(posedge	mem_clk)beginif(next_state == MEM_WRITE_BURST_BEGIN)burst_remain <= burst_size;        /*burst size is 2*/else if( ((state == MEM_WRITE_BURST_BEGIN) || (state == MEM_WRITE)) && local_ready)      /*一次数据写入有效*/burst_remain <= burst_remain - 1;elseburst_remain <= burst_remain;end	/*计算local size, 需要判断剩余的数据是否大于burst_size*/	
always@(posedge	mem_clk)beginif(state == IDLE && rd_burst_req)local_size <= (rd_burst_len >= burst_size) ?  burst_size : rd_burst_len ;else if(state == IDLE && wr_burst_req)local_size <= (wr_burst_len >= burst_size) ?  burst_size : wr_burst_len;else if(state == MEM_WRITE && (next_state == MEM_WRITE_BURST_BEGIN))if((wr_remain_len - 1) > burst_size)  /*判断剩余写数据长度是否大于burst_size*/local_size <= burst_size;elselocal_size <= wr_remain_len - 1;else if(state == MEM_WRITE_BURST_BEGIN && (next_state == MEM_WRITE_BURST_BEGIN) && local_ready)if((wr_remain_len - 1) > burst_size)  /*判断剩余写数据长度是否大于burst_size*/local_size <= burst_size;elselocal_size <= wr_remain_len - 1;else if(state == MEM_READ && local_ready )local_size <= (rd_addr_cnt + burst_size > length) ? 1 : burst_size; elselocal_size <= local_size;end/*计算地址local_address*/
always@(posedge	mem_clk)begincase(state)IDLE:beginif(rd_burst_req)     /*读burst请求有效*/beginlocal_address <= rd_burst_addr;rd_addr_cnt <= 10'd0;endelse if(wr_burst_req) /*读burst请求有效*/beginlocal_address <= wr_burst_addr;rd_addr_cnt <= 10'd0;endelsebeginlocal_address <= local_address;rd_addr_cnt <= 10'd0;endendMEM_READ:beginif(local_ready)beginlocal_address <= local_address + {14'd0,burst_size};   /*Bust读,地址加burst_size*/rd_addr_cnt <= rd_addr_cnt + burst_size;endelsebeginlocal_address <= local_address;rd_addr_cnt <= rd_addr_cnt;end		endMEM_WRITE_BURST_BEGIN:beginif(local_ready && (next_state == MEM_WRITE_BURST_BEGIN))beginlocal_address <= local_address + {14'd0,burst_size};  /*Bust begin写,地址加burst_size*/endelsebeginlocal_address <= local_address;end	end	MEM_WRITE: beginif(local_ready && (next_state == MEM_WRITE_BURST_BEGIN))    beginlocal_address <= local_address + {14'd0,burst_size};   /*Bust 写,地址加burst_size*/endelsebeginlocal_address <= local_address;end	enddefault:beginlocal_address <= local_address;rd_addr_cnt <= 10'd0;endendcaseend/*burst读长度*/	
always@(posedge	mem_clk)beginif(state == IDLE && rd_burst_req)length <= rd_burst_len;elselength <= length; end/*统计读数据counter*/
always@(posedge	mem_clk)beginif(state == MEM_READ || state == MEM_READ_WAIT)if(local_rdata_valid)rd_data_cnt <= rd_data_cnt + 10'd1;elserd_data_cnt <= rd_data_cnt;elserd_data_cnt <= 10'd0;end/*输出信号赋值*/
assign rd_burst_data_valid = local_rdata_valid;
assign rd_burst_data = local_rdata;
assign local_wdata = wr_burst_data;
assign local_read_req = (state == MEM_READ);
assign rd_burst_finish = (state == MEM_READ_WAIT) && (next_state == IDLE);
assign wr_burst_finish = (local_ready && wr_remain_len == 10'd1);
assign local_be = {MEM_DATA_BITS/8{1'b1}};
endmodule 

2. 顶层模块

module ddr_test(input  wire  source_clk,        //输入系统时钟50Mhzinput rst_n,output err,                     //led1, 灯亮DDR读写正常, 灯灭DDR读写出错output  [ 14: 0] mem_addr,output  [  2: 0] mem_ba,output           mem_cas_n,output  [  0: 0] mem_cke,inout   [  0: 0] mem_clk,inout   [  0: 0] mem_clk_n,output  [  0: 0] mem_cs_n,output  [  1: 0] mem_dm,inout   [ 15: 0] mem_dq,inout   [  1: 0] mem_dqs,output  [  0: 0] mem_odt,output           mem_ras_n,output           mem_we_n  
);parameter DATA_WIDTH = 32;           //总线数据宽度
parameter ADDR_WIDTH = 25;           //总线地址宽度parameter IDLE = 3'd0;
parameter MEM_READ = 3'd1;
parameter MEM_WRITE  = 3'd2; 
reg[2:0] state;
reg[2:0] next_state;//状态锁存///
always@(posedge	phy_clk)beginif(~local_init_done)          //等待初始化成功state <= IDLE;else	state <= next_state;end//循环产生DDR Burst读,Burst写状态///
always@(*)begin case(state)IDLE:next_state <= MEM_WRITE;  MEM_WRITE:                    //写入数据到DDR2if(wr_burst_finish)          next_state <= MEM_READ;elsenext_state <= MEM_WRITE;MEM_READ:                    //读出数据从DDR2if(rd_burst_finish)next_state <= MEM_WRITE;elsenext_state <= MEM_READ;default:next_state <= IDLE;endcase
endreg  [ADDR_WIDTH - 1:0] wr_burst_addr;
wire [ADDR_WIDTH - 1:0] rd_burst_addr;
wire    wr_burst_data_req;
wire    rd_burst_data_valid;
reg  [9:0] wr_burst_len;
reg  [9:0] rd_burst_len;
reg     wr_burst_req;
reg     rd_burst_req;
reg  [9:0] wr_cnt;
reg  [9:0] rd_cnt;
wire [DATA_WIDTH - 1:0] wr_burst_data;
wire [DATA_WIDTH - 1:0] rd_burst_data;//DDR的读写地址和DDR测试数据//
always@(posedge phy_clk)beginif(state == IDLE && next_state == MEM_WRITE)wr_burst_addr <= {ADDR_WIDTH{1'b0}};     //地址清零else if(state == MEM_READ && next_state == MEM_WRITE)                //一次Burst读写完成wr_burst_addr <= wr_burst_addr + {{(ADDR_WIDTH-8){1'b0}},8'd255}; //地址加burst长度255         elsewr_burst_addr <= wr_burst_addr;           //锁存地址end
assign rd_burst_addr = wr_burst_addr;     
assign wr_burst_data = {(DATA_WIDTH/8){wr_cnt[7:0]}};     //写入DDR的数据//产生burst写请求信号
always@(posedge phy_clk)beginif(next_state == MEM_WRITE && state != MEM_WRITE)beginwr_burst_req <= 1'b1;      //产生ddr burst写请求       wr_burst_len <= 10'd255;wr_cnt <= 10'd0;endelse if(wr_burst_data_req)       //写入burst数据请求 beginwr_burst_req <= 1'b0;wr_burst_len <= 10'd255;wr_cnt <= wr_cnt + 10'd1;  //测试数据(每字节)加1endelsebeginwr_burst_req <= wr_burst_req;wr_burst_len <= 10'd255;wr_cnt <= wr_cnt;endend//产生burst读请求信号	
always@(posedge phy_clk)beginif(next_state == MEM_READ && state != MEM_READ)beginrd_burst_req <= 1'b1;      //产生ddr burst读请求  rd_burst_len <= 10'd255;rd_cnt <= 10'd1;endelse if(rd_burst_data_valid)     //检测到data_valid信号,burst读请求变0beginrd_burst_req <= 1'b0;rd_burst_len <= 10'd255;rd_cnt <= rd_cnt + 10'd1;endelsebeginrd_burst_req <= rd_burst_req;rd_burst_len <= 10'd255;rd_cnt <= rd_cnt;endendassign err = rd_burst_data_valid &(rd_burst_data != {(DATA_WIDTH/8){rd_cnt[7:0]}});       //检查DDR读出的数据是否正确wire	[ADDR_WIDTH - 1:0]	local_address;   
wire		local_write_req;
wire		local_read_req;
wire	[DATA_WIDTH - 1:0]	local_wdata;
wire	[DATA_WIDTH/8 - 1:0]	local_be;   
wire	[2:0]	local_size;
wire		local_ready;
wire	[DATA_WIDTH - 1:0]	local_rdata;
wire		local_rdata_valid;
wire		local_wdata_req;
wire		local_init_done;
wire		phy_clk;
wire		aux_full_rate_clk;
wire		aux_half_rate_clk;
wire     rd_burst_finish;
wire     wr_burst_finish;
//实例化mem_burst_v2
mem_burst_v2
#(.MEM_DATA_BITS(DATA_WIDTH)
)
mem_burst_m0(.rst_n(rst_n),.mem_clk(phy_clk),.rd_burst_req(rd_burst_req),.wr_burst_req(wr_burst_req),.rd_burst_len(rd_burst_len),.wr_burst_len(wr_burst_len),.rd_burst_addr(rd_burst_addr),.wr_burst_addr(wr_burst_addr),.rd_burst_data_valid(rd_burst_data_valid),.wr_burst_data_req(wr_burst_data_req),.rd_burst_data(rd_burst_data),.wr_burst_data(wr_burst_data),.rd_burst_finish(rd_burst_finish),.wr_burst_finish(wr_burst_finish),///.local_init_done(local_init_done),.local_ready(local_ready),.local_burstbegin(local_burstbegin),.local_wdata(local_wdata),.local_rdata_valid(local_rdata_valid),.local_rdata(local_rdata),.local_write_req(local_write_req),.local_read_req(local_read_req),.local_address(local_address),.local_be(local_be),.local_size(local_size)
);//实例化ddr2.v
ddr2 ddr_m0(.local_address(local_address),.local_write_req(local_write_req),.local_read_req(local_read_req),.local_wdata(local_wdata),.local_be(local_be),.local_size(local_size),.global_reset_n(rst_n),//.local_refresh_req(1'b0), //.local_self_rfsh_req(1'b0),.pll_ref_clk(source_clk),.soft_reset_n(1'b1),.local_ready(local_ready),.local_rdata(local_rdata),.local_rdata_valid(local_rdata_valid),.reset_request_n(),.mem_cs_n(mem_cs_n),.mem_cke(mem_cke),.mem_addr(mem_addr),.mem_ba(mem_ba),.mem_ras_n(mem_ras_n),.mem_cas_n(mem_cas_n),.mem_we_n(mem_we_n),.mem_dm(mem_dm),.local_refresh_ack(),.local_burstbegin(local_burstbegin),.local_init_done(local_init_done),.reset_phy_clk_n(),.phy_clk(phy_clk),.aux_full_rate_clk(),.aux_half_rate_clk(),.mem_clk(mem_clk),.mem_clk_n(mem_clk_n),.mem_dq(mem_dq),.mem_dqs(mem_dqs),.mem_odt(mem_odt));endmodule 

3. 测试代码

五、波形分析

 1. 写过程分析

        如下图所示,只有当 local_ready 为高和 local_write_req 信号都为高时,写入的数据才是有效的数据,如果 local_ready 信号为低,local_write_req 和数据需要一直保持,等待local_ready 信号为高才行。 DDR2 的 burst _length 为 2, 所以地址信号 local_address 是每写入 2 个数据就加 2, local_burstbegin 信号为第一个数据写的时候为高,第二个数据写的时候为低。

 2. 读过程分析

        只有当 local_ready 为高和 local_read_req 信号都为高时,burst 读才是有
效的,如果 local_ready 信号为低,local_ read _req 和地址 local_address 需要一直保持,等待 local_ready 信号为高才行。local_read_req 信号请求为高等待一段时间后,local_rddata_valid 信号会变高,才会有有效的读的数据输出。如下面第一张图所示,地址发出后,数据在第二张图片才发出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Virtualenvwrapper 的安装教程

Virtualenvwrapper Virtaulenvwrapper是virtualenv的扩展包&#xff0c;用于更方便管理虚拟环境&#xff0c;它可以做&#xff1a; 将所有虚拟环境整合在一个目录下管理&#xff08;新增&#xff0c;删除&#xff0c;复制&#xff09;虚拟环境快速切换虚拟环境 安装方法 Li…

HTTP协议概述

HTTP 协议定义 HTTP协议&#xff0c;直译为超文本传输协议&#xff0c;是一种用于分布式、协作、超媒体的信息系统的应用协议。HTTP协议是万维网数据通信的基础。HTTP协议在客户端-服务器计算模型中充当请求-响应协议。客户端向服务器提交HTTP请求消息。服务器提供HTML文件和其…

SpringBoot项目在启动后自动关闭

问题描述&#xff1a; 今天搭建了一个SpringBoot项目&#xff0c;但是在启动之后就自行关闭了&#xff0c;就像下面这样&#xff1a; 原因分析&#xff1a;在创建SpringBoot项目的时候&#xff0c;Web的依赖没有导入&#xff0c;默认以普通java项目运行导致的终止。 解决方案…

CData Drivers for SAS xpt Crack

CData Drivers for SAS xpt Crack 使用基于标准的驱动程序&#xff0c;加入数据库、报告工具和自定义程序中的实时SAS xpt(XPORT)数据文件。 与BI分析、报告、ETL工具和自定义解决方案集成。 适用于SAS xpt的CData驱动程序。神奇的功能&#xff1a; BI和分析 我们的驱动程序是将…

aarch64-linux交叉编译libcurl带zlib和openssl

交叉编译libcurl需要依赖zlib和openssl 需要先用aarch64工具链编译zlib和openssl aarch64-linux环境搭建 下载工具链 gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnusysroot是交叉版本的库文件集合 sysroot-glibc-linaro-2.25-2019.12-aarch64-lin…

线性代数的学习和整理17:向量空间的基,自然基,基变换等(未完成)

目录 3 向量空间的基&#xff1a;矩阵的基础/轴 3.1 从颜色RGB说起 3.2 附属知识 3.3 什么样的向量可以做基&#xff1f; 3.4 基的分类 3.1.1 不同空间的基---向量组的数量可能不同 3.1.2 自然基 3.1.3 正交基 3.1.4 标准正交基 3.1.5 基和向量/矩阵 3.1.6 基变换 …

ClickHouse进阶(五):副本与分片-1-副本与分片

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

在发布会签到系统中使用django开发了发布会签到系统&#xff0c; 本文对该系统进行测试。 django.test django.test是Django框架中的一个模块&#xff0c;提供了用于编写和运行测试的工具和类。 django.test模块包含了一些用于测试的类和函数&#xff0c;如&#xff1a; Tes…

【数据结构】带头双向循环链表及其实现

目录 1.带头双向循环链表 2.带头双向循环链表实现 2.1初始化 2.2销毁 2.3头插 2.4链表打印 2.5头删数据 2.6尾插数据 2.7尾删数据 2.8链表判空 2.9查找一个数据 2.10在pos位置前插入数据 2.11删除pos位置 2.12求链表的长度 2.顺序表和链表的比较 1.带头双向循环…

stable diffusion实践操作-CLIP

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、CLIP是什么&#xff1f;1.1 定义&#xff1a;1.2 作用 二、使用步骤2.1 设置使用2.1 跳过层对比图&#xff1a; 三、总结 前言 学习本章之前&#xff0c;先看SD生图原理 stable diffusion实践操作-SD原理…

YOLOv5算法改进(12)— 替换主干网络之Swin Transformer

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Swin Transformer是一种基于Transformer的深度学习模型&#xff0c;它在视觉任务中表现出色。与之前的Vision Transformer&#xff08;ViT&#xff09;不同&#xff0c;Swin Transformer具有高效和精确的特性&#xff0c;并…

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…

Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化

Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持&#xff0c;大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持&#xff0c;因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…

Vue:关于声明式导航中的 跳转、高亮、以及两个类名的定制

声明式导航-导航链接 文章目录 声明式导航-导航链接router-link的两大特点&#xff08;能跳转、能高亮&#xff09;声明式导航-两个类名定制两个高亮类名 实现导航高亮&#xff0c;实现方式其实&#xff0c;css&#xff0c;JavaScript , Vue ,都可以实现。其实关于路由导航&…

【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理&#xff08;11-39--&#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路&#xff0c;想要了解计算机组成的基本原理&#xff0c;还是需要有…

苹果macOS 14开发者预览版Beta 7发布 新增超过100款视频壁纸和屏保

8 月 31 日&#xff0c;苹果向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新&#xff08;内部版本号&#xff1a;23A5337a&#xff09;&#xff0c;本次更新距离上次发布隔了 8 天。 苹果发布 Beta 7 更新的同时&#xff0c;还发布了第 6 个公测版&#xff0c;正式版…

【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】

一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…

IP子网的划分

文章目录 一、子网掩码1. 产生背景2. 定义3. 分类 二、VLSM算法1. 得出下列参数2. 计算划分结果3. 举例子计算 三、常见子网划分对应关系四、练习IP编址题目需求解题1. 192.168.1.100/282. 172.16.0.58/263. 25.83.149.222/254. 100.100.243.18/205. 10.100.100.100/10 首先可以…

代码随想录笔记--栈与队列篇

目录 1--用栈实现队列 2--用队列实现栈 3--有效的括号 4--删除字符串中的所有相邻重复项 5--逆波兰表达式求值 6--滑动窗口的最大值 7--前k个高频元素 1--用栈实现队列 利用两个栈&#xff0c;一个是输入栈&#xff0c;另一个是输出栈&#xff1b; #include <iostrea…