当前位置: 首页 > news >正文

数字IC前端学习笔记:FIFO的Verilog实现(二)

 相关文章

数字IC前端学习笔记:LSFR(线性反馈移位寄存器)

数字IC前端学习笔记:跨时钟域信号同步

数字IC前端学习笔记:信号同步和边沿检测

数字IC前端学习笔记:锁存器Latch的综合

数字IC前端学习笔记:格雷码(含Verilog实现的二进制格雷码转换器)

数字IC前端学习笔记:FIFO的Verilog实现(一)


目录

4.异步FIFO原理

5.异步FIFO的Verilog实现


4.异步FIFO原理

        在之前,我们讨论了了同步FIFO,因为其具有单一的时钟,因此应用范围有限。在实际的引用中,我们经常遇到多个时钟域的情况,此时数据需要在两个时钟域之间实现传送,并且不能出现毛刺和亚稳态。我们以PCIe插槽上的以太网适配器板卡为例加以说明。该板卡从局域网(LAN)或以太网接收数据包,然后将数据传送给系统存储器。反过来,它从系统存储器接受数据包,然后传送给网络。板卡的一侧和网络通信,用以太网本地处理相关操作。板卡的另一侧与PCEe接口交互,以板卡自身的时钟工作。这两个时钟不仅频率不同,而且是异步的(频率不是倍数关系,如果石是倍数关系,可以认为这是同步时钟,因为相位差恒定)。此时需要使用异步FIFO将数据从一个时钟域传送到另一个时钟域。

        尽管异步FIFO的操作原理与同步FIFO类似,但由于前者与两个时钟有关,电路的复杂度也会增加。对异步FIFO进行数据写入和读出操作的方式与同步FIFO极其相似,写入与读出操作也有自己的信号集,其复杂度主要体现于产生FIFO_full、FIFO_empty、room_avaliable、data_avaliable等标识。异步FIFO中产生这些标识的方法比同步FIFO中要复杂得多。

        在这里我们不能使用计数器根据读取或存储信号保存FIFO中的数据量,因为他们是两个时钟域的信号,不能用两个时钟对同一个reg赋值。我们知道,当FIFO为满或空时,写入指针和读取指针是相等的。但这是不够的,我们需要另外的条件将“空”和“满”进行区分。前面介绍过,FIFO工作时,写入指针在前,读出指针跟随写入指针。当FIFO为满时,写入指针的状态是到达顶部后返回底部最后和读取指针相同,即超越读取指针一轮(FIFO深度),如果我们在指针最高位增加一个辅助位给写入和读取指针,则可以用来指示当这两个指针相同(不包括辅助位)时,是没有超越的相同,还是超越一轮的相同。

        我们以一个深度为4的FIFO为例说明。此时,计数器需要两位表示,计数序列为00→01

10→11→00,在最高位增加一位辅助位后,计数序列为000→001→010→011→100→101→110

→111。正如我们所看到的,除了最高位(辅助位),其他位将循环两次,通过比较辅助位,我们就可以判断FIFO状态是满还是空。

        虽然解决了空满状态的标识,但仍然存在问题,即读指针和写指针分别产生于各自时钟域,不能互相比较,否则会因时序问题产生亚稳态。解决这个问题的办法是将指针从一个时钟域传递到另一个时钟域,然后做比较。而且我们要注意,传递的是多位信号而不是一位信号,此时需要使用格雷码编码和译码电路将指针进行跨时钟域安全传送。在格雷码编码方案中,相邻编码中只有一位发生变化,该特性被用于跨时钟域矢量传递(还有其他方法,可见数字IC前端学习笔记:跨时钟域信号同步一文)。我们将所有这些零散的知识放在一个图中以便于浏览和理解具体的操作方法,如下图所示。

        写指针被转换为格雷码编码,并经过触发器保存,然后经过两级寄存器同步到读时钟域并解码为二进制编码,最后与读指针比教产生fifo_empty信号。读指针的行为类似,在写时钟域产生fifo_full信号。

        需要注意的是,当读指针被传送到写入时钟域时,相对于读时钟域的读指针来说,可能会存在3到4个周期的延时,也就是说,可能出现读指针已经增加,而在写时钟域看来并未增加,这会导致fifo在仍有空位时给出fifo_full信号,这是异步FIFO保守的一面,如此可以确保不产生数据上溢。

写指针也有类似问题,会出现FIFO仍有数据而FIFO给出fifo_empty信号的情况。这些不会影响FIFO的正确操作,在停止写入和读出后几个周期时,就可以给出正确的fifo_emty和fifo_full信号。

5.异步FIFO的Verilog实现

module asynch_fifo #(parameter FIFO_PTR=4,FIFO_WIDTH=32)(wrclk, rstb_wrclk,write_en, write_data,snapshot_wrptr, rollback_wrptr,reset_wrptr,rdclk, rstb_rdclk,read_en, read_data,snapshot_rdptr, rollback_rdptr,reset_rdptr,fifo_full, fifo_empty,room_avail, data_avail);input wrclk;input rstb_wrclk;input write_en;input [FIFO_WIDTH-1:0] write_data;input snapshot_wrptr; //记录写指针快照input rollback_wrptr; //恢复写指针快照input reset_wrptr; //写指针重置为0input rdclk;input rstb_rdclk;input read_en;output [FIFO_WIDTH-1:0] read_data;input snapshot_rdptr; //记录读指针快照input rollback_rdptr; //恢复读指针快照input reset_rdptr; //读指针重置为0output reg fifo_full, fifo_empty;output reg [FIFO_PTR:0] room_avail, data_avail;localparam FIFO_DEPTH = 1 << FIFO_PTR //2^FIFO_PTRlocalparam FIFO_TWICEDEPTH_MINUS1 = 2*FIFO_DEPTH - 1reg [FIFO_PTR:0] wr_ptr_wab, wr_ptr_wab_nxt;//有辅助位的写指针wire [FIFO_PTR:0] room_avail_nxt, data_avail_nxt; reg [FIFO_PTR:0] wr_ptr_snapshot_value;wire [FIFO_PTR:0] wr_ptr_snapshot_value_nxt;wire fifo_full_nxt, fifo_empty_nxt;reg [FIFO_PTR:0] rd_ptr_snapshot_value;wire [FIFO_PTR:0] rd_ptr_snapshot_value_nxt;       wire [FIFO_PTR-1:0] wr_ptr,rd_ptr;reg [FIFO_PTR:0] rd_ptr_wab, rd_ptr_wab_nxt;//有辅助位的读指针      //写指针控制逻辑  //*********************************************always@(*) beginwr_ptr_wab_nxt=wr_ptr_wab;if(reset_wrptr)wr_ptr_wab_nxt = 0;else if(rollback_wrptr)wr_ptr_wab_nxt = wr_ptr_snapshot_value;else if(write_en && (wr_ptr_wab == FIFO_TWICEDEPTH_MINUS1))wr_ptr_wab_nxt = 0;else if(write_en)wr_ptr_wab_nxt = wr_ptr_wab + 1;end//写指针快照//*********************************************assign wr_ptr_snapshot_value_nxt = snapshot_wrptr ? wr_ptr_wab : wr_ptr_snapshot_value;//寄存器操作//*********************************************always@(posedge wrclk or negedge rstb_wrclk) beginif(!rstb_wrclk)beginwr_ptr_wab <= 0;wr_ptr_snapshot_value <= 0;end    else beginwr_ptr_wab <= wr_ptr_wab_nxt;wr_ptr_snapshot_value <= wr_ptr_snapshot_value_nxt;endend//写指针二进制转格雷码//*********************************************reg [FIFO_PTR:0] wr_ptr_wab_gray;wire [FIFO_PTR:0] wr_ptr_wab_gray_nxt;//实例化转码模块(在之前的文章中已设计)binary_to_gray #(.PTR(FIFO_PTR)) binary_to_gray_wr(.binary (wr_ptr_wab_nxt),.gray_value (wr_ptr_wab_gray_nxt));always@(posedge wrclk or negedge rstb_wrclk)beginif(!rst_wrclk)wr_ptr_wab_gray <= 0;else wr_ptr_wab_gray <= wr_ptr_wab_gray_nxt;end//写指针同步到读时钟域//*********************************************reg [FIFO_PTR:0] wr_ptr_wab_gray_sync1;reg [FIFO_PTR:0] wr_ptr_wab_gray_sync2;always@(posedge rdclk or negedge rstb_rdclk) beginif(!rstb_rdclk) beginwr_ptr_wab_gray_sync1 <= 0;wr_ptr_wab_gray_sync2 <= 0;elsewr_ptr_wab_gray_sync1 <= wr_ptr_wab_gray;wr_ptr_wab_gray_sync2 <= wr_ptr_wab_gray_sync1;endend//格雷码写指针转二进制//*********************************************reg [FIFO_PTR:0] wr_ptr_wab_rdclk;wire [FIFO_PTR:0] wr_ptr_wab_rdclk_nxt;gray_to_binary #(.PTR(FIFO_PTR)) gray_to_binary_wr(.gray_value(wr_ptr_wab_gray_sync2),.binary(wr_ptr_wab_rdclk_nxt));always@(posedge rdclk or negedge rstb_rdclk) beginif(!rstb_rdclk) beginwr_ptr_wab_rdclk <= 0;elsewr_ptr_wab_rdclk <= wr_ptr_wab_rdclk_nxt;endend//读指针控制逻辑  //*********************************************always@(*) beginrd_ptr_wab_nxt=rd_ptr_wab;if(reset_rdptr)rd_ptr_wab_nxt = 0;else if(rollback_rdptr)rd_ptr_wab_nxt = rd_ptr_snapshot_value;else if(read_en && (rd_ptr_wab == FIFO_TWICEDEPTH_MINUS1))rd_ptr_wab_nxt = 0;else if(read_en)rd_ptr_wab_nxt = rd_ptr_wab + 1;end//读指针快照//*********************************************assign rd_ptr_snapshot_value_nxt = snapshot_rdptr ? rd_ptr_wab : rd_ptr_snapshot_value;//寄存器操作//*********************************************always@(posedge rdclk or negedge rstb_rdclk) beginif(!rstb_rdclk)beginrd_ptr_wab <= 0;rd_ptr_snapshot_value <= 0;end    else beginrd_ptr_wab <= rd_ptr_wab_nxt;rd_ptr_snapshot_value <= rd_ptr_snapshot_value_nxt;endend/读指针二进制转格雷码//*********************************************reg [FIFO_PTR:0] rd_ptr_wab_gray;wire [FIFO_PTR:0] rd_ptr_wab_gray_nxt;//实例化转码模块(在之前的文章中已设计)binary_to_gray #(.PTR(FIFO_PTR)) binary_to_gray_rd(.binary (rd_ptr_wab_nxt),.gray_value (rd_ptr_wab_gray_nxt));always@(posedge rdclk or negedge rstb_rdclk)beginif(!rst_rdclk)rd_ptr_wab_gray <= 0;else rd_ptr_wab_gray <= rd_ptr_wab_gray_nxt;end//读指针同步到写时钟域//*********************************************reg [FIFO_PTR:0] rd_ptr_wab_gray_sync1;reg [FIFO_PTR:0] rd_ptr_wab_gray_sync2;always@(posedge wrclk or negedge rstb_wrclk) beginif(!rstb_wrclk) beginrd_ptr_wab_gray_sync1 <= 0;rd_ptr_wab_gray_sync2 <= 0;elserd_ptr_wab_gray_sync1 <= rd_ptr_wab_gray;rd_ptr_wab_gray_sync2 <= rd_ptr_wab_gray_sync1;endend//格雷码读指针转二进制//*********************************************reg [FIFO_PTR:0] rd_ptr_wab_rdclk;wire [FIFO_PTR:0] rd_ptr_wab_rdclk_nxt;gray_to_binary #(.PTR(FIFO_PTR)) gray_to_binary_rd(.gray_value(rd_ptr_wab_gray_sync2),.binary(rd_ptr_wab_rdclk_nxt));always@(posedge wrclk or negedge rstb_wrclk) beginif(!rstb_wrclk) rd_ptr_wab_rdclk <= 0;elserd_ptr_wab_rdclk <= rd_ptr_wab_wrclk_nxt;endassign wr_ptr = wr_ptr_wab[FIFO_PTR-1:0];assign rd_ptr = rd_ptr_wab[FIFO_PTR-1:0];//SRAM 存储器实例化//*********************************************sram #(.FIFO_PTR(FIFO_PTR),.FIFO_WIDTH(FIFO_WIDTH)) sram_0(.wrclk(wrclk),.wren(write_en),.wrptr(wr_ptr),.wrdata(write_data),.rdclk(rdclk),.rden(read_en),.rdptr(rd_ptr),.rddata(read_data));//fifo_full和room_avail信号产生//*********************************************assign fifo_full_nxt = (wr_ptr_wab_nxt[FIFO_PTR] != rd_ptr_wab_wrclk_nxt[FIFO_PTR])&&(wr_ptr_wab_nxt[FIFO_PTR-1:0] == rd_ptr_wab_wrclk_nxt[FIFO_PTR-1:0]);assign room_avail_nxt = (wr_ptr_wab_nxt[FIFO_PTR] == rd_ptr_wab_wrclk_nxt[FIFO_PTR])?(FIFO_DEPTH-(wr_ptr_wab_nxt[FIFO_PTR-1:0] - rd_ptr_wab_wrclk_nxt[FIFO_PTR-1:0])):(rd_ptr_wab_wrclk_nxt[FIFO_PTR-1:0] - wr_ptr_wab_nxt[FIFO_PTR-1:0]);  always@(posedge wrclk or negedge rstb_wrclk) beginif(!rstb_wrclk) beginfifo_full <= 0;room_avail <= 0;end        else beginfifo_full <= fifo_full_nxt;room_avail <= room_avail_nxt;endend //如果两者没有差一轮,则指针相减代表着FIFO内数据量,用深度减去数据量则为剩余空间,否则直接相减(不包括辅助位)就可得到剩余空间//fifo_empty和room_empty信号产生//*********************************************assign fifo_empty_nxt = (rd_ptr_wab_nxt[FIFO_PTR] != wr_ptr_wab_rdclk_nxt[FIFO_PTR])&&(rd_ptr_wab_nxt[FIFO_PTR-1:0] == wr_ptr_wab_dclk_nxt[FIFO_PTR-1:0]);assign data_avail_nxt = (rd_ptr_wab_nxt[FIFO_PTR] == wr_ptr_wab_rdclk_nxt[FIFO_PTR])?(FIFO_DEPTH-(rd_ptr_wab_nxt[FIFO_PTR-1:0] - wr_ptr_wab_rdclk_nxt[FIFO_PTR-1:0])):(wr_ptr_wab_rdclk_nxt[FIFO_PTR-1:0] - rd_ptr_wab_nxt[FIFO_PTR-1:0]);   always@(posedge rdclk or negedge rstb_rdclk) beginif(!rstb_rdclk) beginfifo_empty <= 0;data_avail <= 0;end        else beginfifo_empty <= fifo_empty_nxt;data_avail <= data_avail_nxt;endend 
endmodule

以上内容来源于《Verilog高级数字系统设计技术和实例分析》

相关文章:

数字IC前端学习笔记:FIFO的Verilog实现(二)

相关文章 数字IC前端学习笔记&#xff1a;LSFR&#xff08;线性反馈移位寄存器&#xff09; 数字IC前端学习笔记&#xff1a;跨时钟域信号同步 数字IC前端学习笔记&#xff1a;信号同步和边沿检测 数字IC前端学习笔记&#xff1a;锁存器Latch的综合 数字IC前端学习笔记&am…...

2.2 搭建Spark开发环境

一、Spark开发环境准备工作 由于Spark仅仅是一种计算框架&#xff0c;不负责数据的存储和管理&#xff0c;因此&#xff0c;通常都会将Spark和Hadoop进行统一部署&#xff0c;由Hadoop中的HDFS、HBase等组件负责数据的存储管理&#xff0c;Spark负责数据计算。 安装Spark集群前…...

webpack指定输出资源的路径和名称

如图&#xff0c;在前面的章节我们打包后的文件默认都输出到了dist目录下&#xff0c;无论是图片、还是js都在同一级别目录&#xff0c;这里目前处理的资源比较少&#xff0c;如果资源一多&#xff0c;所有的资源都在同一级目录&#xff0c;看起来很费劲。 那么这节就介绍一下…...

Spring事务四

spring 事务的隔离级别 当多个事务同时访问数据库中的同一数据时&#xff0c;可能会出现数据不一致的情况&#xff0c;为了避免这种情况发生&#xff0c;就需要使用事务隔离机制。Spring框架中定义了5种事务隔离级别&#xff0c;分别为&#xff1a; DEFAULT&#xff08;默认隔…...

项目管理专业人员能力评价等级证书(CSPM)的级别介绍

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…...

设计模式-创建型模式(单例、工厂、建造、原型)

Concept-概念前置 设计模式&#xff1a;软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;所提出的解决方案。 面向对象三大特性&#xff1a;封装、继承、多态。 面向对象设计的SOLID原则&#xff1a; &#xff08;1&#xff09;开放封闭原则&#…...

用饭店来形象比喻线程池的工作原理

一、线程池解决的问题&#xff1f; 使用线程池主要解决在程序中频繁创建和销毁线程导致的资源浪费&#xff0c;线程池可以维护一定量的线程来执行所需要的任务&#xff0c;维护的线程也可以重复使用。 二、用形象的饭店来解释工作原理 线程池就相当于一家饭店&#xff0c; 任…...

GO学习笔记之表达式

GO学习笔记之表达式 保留字运算符优先级二元运算符位运算符自增指针 保留字 Go语言仅25个保留关键字&#xff08;keyword&#xff09;&#xff0c;这是最常见的宣传语&#xff0c;虽不是主流语言中最少的&#xff0c;但也确实体现了Go语法规则的简洁性。保留关键字不能用作常量…...

005Mybatis返回值(ResultMap 一对多,多对多)

属性 id 应该总是指定一个或多个可以唯一标识结果的属性。 虽然&#xff0c;即使不指定这个属性&#xff0c;MyBatis 仍然可以工作&#xff0c;但是会产生严重的性能问题。 只需要指定可以唯一标识结果的最少属性。显然&#xff0c;你可以选择主键&#xff08;复合主键也可以…...

把玩数据在内存中的存储

前言&#xff1a;时光如梭&#x1f4a6;&#xff0c;今天到了C语言进阶啦&#x1f60e;&#xff0c;基础知识我们已经有了初步认识&#xff0c; 是时候该拔高拔高自己了&#x1f63c;。 目标&#xff1a;掌握浮点数在内存的存储&#xff0c;整形在内存的存储。 鸡汤&#xff1a…...

Nginx运行原理与基本配置文件讲解

文章目录 Nginx基本运行原理Nginx的基本配置文件serverlocationroot 与 alias 的区别server 和 location 中的 rootnginx欢迎页 本文参考文章Nginx相关文章 Nginx基本运行原理 Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后&#xff0c;会有一个master进程和多个…...

openGauss5 企业版之SQL语法和数据结构

文章目录 1.openGauss SQL 语法2. 数据类型2.1数值类型2.2 布尔类型2.3 字符类型2.4 二进制类型2.5日期/时间类型2.6 几何类型2.7 网络地址类型2.8 位串类型2.9 文本搜索类型2.10 UUID数据类型2.11 JSON/JSONB类型2.11 HLL数据类型2.12 范围类型2.13 索引2.14 对象标识符类型2.…...

TClientDataSet 模拟 EXCEL表

日常处理数据时&#xff0c;经常需要&#xff0c;从EXCEL表格中&#xff0c;批量导入数据&#xff0c;通过 XLSReadWriteII编程&#xff0c;会很快导入。 但是&#xff0c;客户提供的EXCEL表的字段&#xff0c;数据格式&#xff0c;字段的排序&#xff0c;有很大的区别。因此&a…...

Hazel游戏引擎(012)GLFW窗口事件

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言如何确定GLFW窗口事件的回调函数参数Application接收事件回调流程原项目流程(12345)自己写的简单Demo与流程(123) 前言 此节目的 为了完成008计划窗口事件的接收glfw窗口事件以及回调部分 此节要完成 使用glfw函数…...

Nenu算法复习第六章

目录 补充知识点 1160: 6001 第几天&#xff1f; 1161: 6002 时间格式转换 1162: 6003 星期几&#xff1f; 1163: 6004 18岁生日、 补充知识点 闰年的判断方法&#xff1a; 能被四整除但是不能一百整除或者能被400整除 例题: 题目描述 经常会有人问你怎么判断闰年&…...

知识付费社群:最好的知识传播方式

知识付费是一种网络内容付费方式&#xff0c;它让知识传播者通过网络以付费的方式向社会大众或特定平台传递知识、技能和智力资源。 知识付费传播的成功离不开用户&#xff0c;他们是核心节点&#xff0c;也是受众和粉丝的重要组成部分。用户不仅可以生产和传播知识&#xff0…...

局域网内不同网段的设备互相连接设置

目录 介绍1、打开网络连接&#xff0c;找到本地网络->属性->ipv4->属性->高级&#xff1a;2、在高级设置页面&#xff0c;我们添加一个IP&#xff0c;这个IP和板子在一个网段&#xff0c;我这里设置的是192.168.253.101&#xff1a;3、设置完成即可生效&#xff0c…...

LVS+Keepalived 群集

目录 一、keepalived概述 1.keepalived工作原理 2.keepalived体系主要模块及其作用 3.判断服务器主备&#xff0c;及如何配置浮动IP 二、keepalived的抢占与非抢占模式 三、部署LVSkeepalived 1.配置负载调度器&#xff08;主备相同&#xff09; 1.1配置keepalived&…...

windows系统cmd命令设置别名,并添加到环境变量

众所周知&#xff0c;Linux 命令很强大&#xff0c;使用起来也很方便&#xff0c;但是想在 windows 系统上使用 Linux 命令有些困难&#xff0c;要么下载第三方终端工具&#xff0c;要么就是安装一系列命令环境。 作为一个前端开发&#xff0c;其实可以全局安装一下 npm 命令行…...

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…...

java方法

文章目录 一、java方法总结 一、java方法 在前面几个章节中我们经常使用到 System.out.println()&#xff0c;那么它是什么呢&#xff1f; println() 是一个方法。 System 是系统类。 out 是标准输出对象。这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 pr…...

LabVIEW与Space Wire配合开发

LabVIEW与Space Wire配合开发 Space Wire是欧洲航天局开发的一种高速、点对点、全双工的串行总线网络&#xff0c;以IEEE1355-1995和LVDS 两个商业标准为基础&#xff0c;汲取了1394技术、ATM技术、以太网技术的优点&#xff0c;同时考虑了空间应用的特点&#xff0c;在故障检…...

开始使用chat-gpt4

目录 一、说明 二、安装步骤 三、测试效果咋样 &#xff08;1&#xff09;写代码能力 &#xff08;2&#xff09;回答问题能力 &#xff08;3&#xff09;写作能力 一、说明 参考&#xff08;非常感谢这位博主的分享&#xff09;&#xff1a;http://t.csdn.cn/qypw9 注意&…...

算法之贪心算法

定义 总是做出当前最好的选择&#xff0c;期望通过局部最优选择得到全局最优的解决方案。 适用标准 贪心选择性质。 原问题的整体最优解可以通过一系列局部最优的选择得到。这种选择依赖于已做出的选择&#xff0c;不依赖于未做出的选择。贪心算法解决的问题&#xff0c;在程…...

Maven 基础

博文目录 文章目录 Maven基础概念生命周期 - Build Lifecycle阶段 - Build Phase目标 - Plugin goals默认目标绑定Clean 生命周期Default 生命周期Site 生命周期 插件 - Plugin POM&#xff08;Project Object Model&#xff09;Super POM项目继承 - Project Inheritance项目聚…...

算法刷题-哈希表-两数之和

两数之和 1. 两数之和思路总结其他语言版本 1. 两数之和 力扣题目链接 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中…...

kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun&#xff08;方法 / 函数&#xff09;函数参数默认值…...

【Linux】Docker部署镜像环境 (持续更新ing)

防火墙 1、查看防火墙状态 sudo systemctl status ufw 2、开启防火墙 sudo systemctl start ufw 3、关闭防火墙 sudo systemctl stop ufw 4、开机禁止开启防火墙 sudo systemctl disabled ufw 5、开启自启防火墙 sudo systemctl enabled ufw Elasticsearch 1、安装指定版本 比…...

Jtti:如何打开云服务器的8082端口

如何打开云服务器的8082端口? 第一步&#xff1a;登录云服务器 首先&#xff0c;我们需要登录到我们的云服务器。可以使用SSH、控制台等方式进行登录。登录成功后&#xff0c;我们可以在终端上看到服务器的控制台。 第二步&#xff1a;编辑防火墙规则 打开终端后&#xff0c;我…...

有关 string 类的练习(下)

目录 一、反转字符串 II 二、反转字符串中的单词 III 三、找出字符串中第一个只出现一次的字符 四、字符串相乘 五、把字符串转换成整数 一、反转字符串 II 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转…...

网站健设推广产品多少钱/山东百搜科技有限公司

0、首先得理解MP3格式文件的结构 简单的就是 MP3 文件大体分为三部分&#xff1a;TAG_V2(ID3V2)&#xff0c;音频数据&#xff0c;TAG_V1(ID3V1) 参考此博客&#xff1a;点击打开链接 ID3V1的结构是&#xff1a; 表1&#xff1a;ID3V1结构 ------------------------------…...

在线设计logo图案免费/seo网络优化教程

# SQL拼接小技巧&#xff08;一&#xff09; # 2018/6/21 18:54:36 ---------- **关键字: SQL , 1 1 &#xff0c;1 2** ---------- 如下代码中SQL拼接使用了11和12防止请求参数中条件为空或SQL注入的方式猜测表名&#xff0c;字段名 public DomainPage<…...

wordpress+翻页函数/电商网站搭建

神目智能迎宾系统是通过人脸识别&#xff0c;对访客进行欢迎/告警的智能系统&#xff0c;该系统分为两部分&#xff0c;前端部分可进行访客人脸检测、欢迎界面呈现、智能语音播报欢迎词&#xff1b;后台部分可接入神目弼马温管理平台&#xff0c;对数据进行多样化分类管理&…...

做网站注册的商标类别/深圳网络推广案例

2019独角兽企业重金招聘Python工程师标准>>> 你英语四级过了吗&#xff1f;功夫熊猫2看了吗&#xff1f;去除停用词后&#xff0c;功夫熊猫2使用了816个英语单词&#xff0c;你会说很简单吧&#xff0c;别急&#xff0c;我给你分析一下&#xff0c;这些单词中有125个…...

网站建设方案书网络部署方案/关键词优化骗局

快递包装捐赠系统 此项目为Android课程设计&#xff0c;用户使用Android端&#xff0c;SpringBoot是为管理员使用的&#xff0c;用来管理用户&#xff0c;商品的信息。 后台管理访问地址&#xff1a;点我访问 管理员登录&#xff1a; 账号&#xff1a;root密码&#xff1a;…...

做网站来钱快/医院线上预约

#include #include #include #include //#include /*屏幕操作函数*/#define MAX 50//#define NULL 0typedef struct node1{int school; /*学校编号*/int record; /*项目成绩*/struct node1 *next; /*链域*/}Schools;typedef struct {int item; /*项目编号*/Schools *firstschoo…...