FPGA基础知识点

2023-11-16

FPGA知识点

Verilog基础语法

基础知识

逻辑值
  • 逻辑0:表示低电平,也就是对应电路GND

  • 逻辑1:表示高电平,也就是对应电路VCC

  • 逻辑X:表示未知,有可能是高电平也有可能是低电平

  • 逻辑Z:表示高阻态,外部没有激励信号,是一个悬空状态

数字进制格式

Verilog数字进制格式包括二进制(b)八进制(o)十进制(d)十六进制(h)

一般常用的为二进制、十进制和十六进制。

二进制表示如下:

4b’0101表示4位二进制数字0101

十进制表示如下:

4’d2表示4位十进制数字2(二进制0010)

十六进制B表示如下:

4’ha表示4位十六进制数字a(二进制1010)

可以增加下划线来增加可读性

16’b1001_1010_1010=16’h9AA9

标识符

标识符(identifier)用于定义模块名端口名信号名等。

标识符可以是任意一组字母数字$符号和**_(下划线)符号**的组合;

但标识符的第一个字符必须字母或者下划线

标识符是区分大小写的。

标识符推荐写法:

  • 不建议大小写混合使用

  • 普通内部信号建议全部小写

  • 信号命名最好体现信号的含义,简洁、清晰、易懂;

以下是一些推荐的写法:

  • 用有意义的有效名字如sum、cpu、addr等

  • 用下划线区分词,如cpu_addr

  • 采用一些前缀或者后缀,比如时钟采用clk前缀:clk_50,clk_cpu

数据类型

在Verilog语言中,主要有三大类数据类型:

寄存器数据类型线网数据类型参数数据类型

真正在数字电路中起作用的数据类型应该是寄存器数据类型线网数据类型

寄存器类型

寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器储存的值

寄存器数据类型的关键字是reg,reg类型数据的默认初始值为不定值X

//reg define
.reg [31:0] delay_cnt;  //延时计数(表示这是一个32位寄存器,高位在前,低位在后)
Reg key_reg;  //默认位宽为1

reg类型的数据只能在always语句initial语句中被赋值。

  • 如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器

  • 如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线

线网类型

线网数据类型表示结构实体(例如门)之间的物理连线。

线网类型的变量不能储存值,它的值是由驱动它的元件所决定的。

驱动线网类型变量的元件有门、连接赋值语句、assign等。

如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即其值为z。

线网数据类型包括wire型tri型,其中最常用的就是wire类型

//wire define 
wire key_flag;
参数类型

参数其实就是一个常量,在Verilog HDL中用parameter定义常量。

我们可以一次定义多个参数,参数与参数之间需要用逗号隔开。

每个参数定义的右边必须是一个常数表达式。

//parameter define 4.3'RGB LCD
parameter H_SYNC  = 11'd41; //行同步
parameter H_BACK  = 11'd2;  //行显示后沿
parameter H_DISP  = 11'd480 //行有效数据
parameter H_FRONT = 11'd2   //行显示前沿
parameter H_TOTAL = 11'd525 //行扫描周期

参数型数据常用于定义状态机的状态数据位宽延迟大小等。

采用标识符来代表一个常量可以提高程序的可读性可维护性

模块调用时,可通过参数传递来改变被调用模块中已定义的参数。

运算符

Verilog中的操作运算符按照功能可分为以下类型:

  1. 算术运算符

    符号 使用方法 说明
    + a+b a加上b
    - a-b a减去b
    * a*b a乘以b
    / a/b a除以b
    % a%b a模除b
  2. 关系运算符

    符号 使用方法 说明
    > a>b a大于b
    < a<b a小于b
    <= a>=b a大于等于b
    >= a<=b a小于等于b
    == a==b a等于b
    != a!=b a不等于b
  3. 逻辑运算符

    符号 使用方法 说明
    !a a的非,a如果为0,那么a的非是1
    && a&&b a与上b,如果a和b都为1,a&&b结果才为1,表示真
    || a||b a或上b,如果a或者b有一个为1,a ||b结果为1,表示真
  4. 条件运算符

    符号 使用方法 说明
    ?: a?b;c 如果a为真,就选择b,否则选择c
  5. 位运算符

    符号 使用方法 说明
    ~ ~a 将a的每个位进行取反
    & a&b 将a的每个位与b相同的位进行相与
    | a|b 将a的每个位与b的相同位进行相或
    ^ a^b 将a的每个位与b的相同位进行异或

    如果a和b位宽不一致,系统会在较短的位宽的数据前面补0,补到二者位宽一致,再进行位运算

  6. 移位运算符

    符号 使用方法 说明
    << a<<b 将a左移b位
    >> a>>b 将a右移b位

    两种移位运算都用0来填充移出的空位

    左移时,位宽增加;右移时,位宽不变

    4'b1001 << 2 = 6'b100100
    4'b1001 >> 1 = 4'b0100
    
  7. 拼接运算符

    符号 使用方法 说明
    {} {a,b} 将a和b拼接起来,作为一个新信号
    c = {a,b[3:0]}; 
    c[11:0] = {a[7:0],b[3:0]};
    

运算符优先级

在这里插入图片描述

Verilog程序框架

Verilog注释

verilog中有两种注释方式
一、以//开头的语句,它表示以//开头到本行结束都属于注释语句
二、以/*开头,以*/结束,在两个符号之间的语句都是注释语句,因此可以扩展到多行。

Verilog关键字

在这里插入图片描述

常用关键字

Verilog程序框架

Verilog的基本设计单元是”模块“(block)

一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。

module block (a,b,c,d);//定义模块
	input a,b;//输入接口
	output c,d;//输出接口

assign c = a | b;//描述模块的功能
assign d = a & b;

endmodule

每个verilog 程序包括4个主要的部分:

端口定义、IO说明、内部信号声明、功能定义。

module flow_led(
    input sys_clk,         //系统时钟
    input sys_rst_n,      //系统复位,低电平有效
    
    output reg [3:0] led   //4个led灯 四位 reg表示输出端口是一个寄存器类型的端口
);
    //reg define
    reg [23:0] counter;//寄存器型 24位 计数器
    //main code 
    //计数器对系统时钟计数,计时0.2秒
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            counter <= 24'd0;
        else if(counter < 24'd1000_0000)
            counter <= counter + 1'b1;
        else 
            counter <= 24'd0;
    end
    
    //通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态、
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            led <=4'b0001;
        else if(counter == 24'd1000_0000)
            led[3:0] <={led[2:0],led[3]};
        else 
            led <= led;
    end//这两个always模块在执行时是同时执行的,而在里面是顺序执行的
    
endmodule
    

功能定义有三种方法:

  1. assign语句

    描述组合逻辑

  2. always语句

    描述组合/时序逻辑

  3. 实例化元件

    如:and#2 u1(q,a,b)

上述三种逻辑功能是并行

注意:

在always块中,逻辑是顺序执行的。而多个always块之间是并行的。

模块的调用

在模块调用时,信号通过模块端口在模块之间传递。

module seg_led_static_top (
	input sys_clk,         //系统时钟
    input sys_rst_n,       //系统复位信号(低电平有效)
    
    output [5:0] sel,      //数码管位选
    output [7:0] seg_led   //数码管段选
);
    //parameter define
    parameter TIME_SHOW = 25'd2500_0000;//数码管变化的时间间隔0.5s
    
    // wire define 
    wire add_flag;//数码管的通知信号
    
    //main code 
    
    //每隔0.5s产生一个时钟周期的脉冲信号
    time_count #(
        .MAX_NUM (TIME_SHOW) //这里是参数,MAX_NUM 给参数传递一个新值TIME_SHOW
    )   u_time_count(
        .clk (sys_clk),
        .rst_n (sys_rst_n),
        
        .flag (add_flag)//输出信号连接到上层的wire类型的变量里面,输出段必须连接到一个wire类型的变量,否则会报错,并且位宽必须保持一致
    );
    module time_count(
    	input clk,
    	input rst_n,
        
        output reg flag
    );
    //parameter define
    parameter MAX_NUM = 5000_0000;
    //reg define
    reg [24:0] cnt;
    //另外一种端口连接方式:
    //每隔0.5s产生一个时钟周期的脉冲信号
        time_count #(
            .MAX_NUM (TIME_SHOW)
        ) u_time_count(
        	sys_clk,
            sys_rst_n,
            
            add_flag
        );

Verilog高级知识点

结构语句

initial和always语句

initial(初始化)语句它在模块中只执行一次。它常用于测试文件地编写,用来产生仿真测试信号(激励信号),或者用于对存储器变量赋初值。

always语句一直在不断地重复活动。

但只有和一定的时间控制结合在一起才有作用。

initial begin
	sys_clk           <=1'b0;
    sys_rsr_n         <=1'b0;
    touch_key         <=1'b0;
    #20 sys_rst_n     <=1'b1; //#20: 延时20个单位时间,20ns
    #10 touch_key     <=1'b1;//#10:相对于上一个sys_rst_n延时的20ns再延时10ns把电位调高
    #30 touch_key     <=1'b0;
    #110 touch_key    <=1'b1;
    #30  touch_key    <=1'b0;
end
//产生50Mhz的时钟,周期为20ns
always #10 sys_clk <= ~sys_clk;//延时10ns取反
    

always的时间控制可以是沿触发,也可以是电平触发

可以是单个信号也可以是多个信号,多个信号中间要用关键字or连接。

always @(posedge sys_clk or negedge sys_rst_n) begin  //posedge上升沿、negedge下降沿
    //按顺序执行
    if(!sys_rst_n)
        counter <= 24'd0;
    else if(counter < 24'd1000_0000)
        counter <= counter + 1'b1;
    else 
        counter <= 24'd0;
end

沿触发的always块常常描述时序逻辑行为

由关键词or连接的多个事件名或信号名组成的列表称为“敏感列表”。

电平触发的always块常描述组合逻辑行为。

always @(a or b or c or d or e or f or g or h or p or m) begin
    out1 = a ? (b+c) : (d+e);
    out2 = f ? (g+h) : (p+m);
end

如果组合逻辑块语句的输入变量很多,那么编写敏感列表会很繁琐并且容易出错,

always @( * ) begin //@( * )表示后面语句块中所有输入变量的变化都是敏感的。
    out1 = a ? (b+c) : (d+e);
    out2 = f ? (g+h) : (p+m);
end

根据逻辑功能的不同特点,可以将数字电路分成两大类:

组合逻辑电路时序逻辑电路

  • 组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关
  • 时序逻辑电路中,任意时刻的输出不仅取决于当时的输入的信号,而且还取决于电路原来的状态。或者说还与以前的输入有关,因此时序逻辑必须具备记忆功能

在这里插入图片描述

赋值语句

Verilog HDL语言中,信号有两种赋值方式

  • 阻塞赋值(blocking),如a = b

    串行执行

    阻塞赋值可以认为只有一个步骤的操作:即计算RHS并更新LHS。

    所谓阻塞的概念是指,在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的。

    always @(posedge clk or negedge rst_n) begin 
        if (!ret_n)begin 
            a = 1;
            b = 2;
            c = 3;
        end
        else begin 
            a = 0;
            b = a;
            c = b;
        end
    end
    

在这里插入图片描述

  • 非阻塞赋值(Non_Blocking),如b <= a;

    并行执行

    非阻塞赋值的操作过程可以看作两个步骤:

    1. 赋值开始的时候,计算RHS;
    2. 赋值结束的时候,更新LHS。

    所谓非阻塞的概念是指,在计算非阻塞赋值的RHS以及更新LHS期间,运行其他的非阻塞赋值语句同时计算RHS和更新LHS。

    always @(posedge clk or negedge rst_n) begin 
        if (!ret_n)begin 
            a <= 1;
            b <= 2;
            c <= 3;
        end
        else begin 
            a <= 0;//右侧同时计算结果但不赋值,此时0还没赋值给a,a还是1
            b <= a;// a = 1
            c <= b;// b = 2
        end
    end
    

    非阻塞赋值只能用于对寄存器类型的变量进行赋值,因此只能用在initial块和always块等过程块中。

在这里插入图片描述

在描述组合逻辑的always块中用阻塞赋值=,综合成组合逻辑的电路结构;

这种电路结构只与输入电平的变化有关系。

在描述时序逻辑的always块中用非阻塞赋值<=,综合成时序逻辑的电路结构;

这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化。

注意:在同一个always块中不要即用非阻塞赋值又用阻塞赋值

不允许在多个always块中对同一个变量进行赋值!

条件语句

if -else语句
	// (1)
	if(a>b)
   		cout= data_1
    //(2)
        if(a>b)
            out = data_1;
		else
            out = data_2;
	//(3)
    if(表达式)
        语句
    else if(表达式)
        语句
    else if(表达式)
        语句
    else 
        语句

条件语句必须在过程块中使用

  • 过程块语句是指由initial和always语句引导的块语句

注意事项:

  1. 允许一定形式的简写,如:

    if(a)等同于if(a==1)

    if(!a)等同于if(a!=1)

  2. if语句对表达式的值进行判断,若为0,x,z则按假处理;若为1,按真处理

  3. if和else后面的操作语句可以用begin和end包含多个语句。

  4. 允许if语句的嵌套。

在这里插入图片描述

case语句(多分支选择语句)
  1. 分支表达式的值互不相同;

  2. 所有表达式的位宽必须相等;

    不能用‘bx来代替n’bx

  3. casez

    比较时,不考虑表达式中的高阻值z

  4. casex

    比较时不考虑高阻值z和不定值x
    在这里插入图片描述

状态机

状态机的概念

在这里插入图片描述

状态机(State Machine)

  • 有限状态机(Finite State Machine,简称FSM)
  • 在有限个状态之间按一定规律转换的时序电路。

状态机模型

在这里插入图片描述

在这里插入图片描述

状态寄存器由一组触发器组成,用来记忆状态机当前所处的状态,状态的改变只发生在时钟的跳变沿。

状态是否改变、如何改变,取决于组合逻辑F的输出,F是当前状态和输入信号的函数。

状态机的输出是由输出组合逻辑G提供的,G也是当前状态和输入信号的函数。

状态机设计

四段论

  • 状态空间定义

    //define state space 
    parameter SLEEP   =   2'b00;
    parameter STUDY   =   2'b01;
    parameter EAT     =   2'b10;
    parameter AMUSE   =   2'b11;
    
    //internal veriable
    reg [1:0] current_state;
    reg [1:0] next_state;
    
    //独热码
    //define state space;
    parameter SLEEP   =  4'b1000;
    parameter STUDY   =  4'b0100;
    parameter EAT     =  4'b0010;
    parameter AMUSE   =  4'b0001;
    
    //internal variable
    reg [3:0] current_state;
    reg [3:0] next_state;
    

    独热码:每个状态只有一个寄存器置位,译码逻辑简单。

  • 状态跳转

    //transition
    always @(posedge clk or negedge rst_n)begin//敏感列表:时钟信号以及复位信号边沿的组合
        if(!rst_n)
            current_state <= SLEEP;
        else
            current_state <= next_state;//时序逻辑里使用非阻塞赋值
    end
    
  • 下个状态判断(组合逻辑)

    //next state decision
    always @(current_state or input_signals)begin//敏感信号表:所有的右边表达式中的变量以及if、case条件中的变量
        case (current_state)//case的状态没给全也会产生锁存器,多余的状态用default
            SLEEP:begin
                if(clock_alarm)
                    next_state = STUDY;//使用阻塞赋值
                else 
                    next_state = SLEEP;
            end
            
            STUDY: begin
                if(lunch_time)
                    next_state = EAT;
                else //if /else 要配对,避免latch(锁存器)的产生,只在组合逻辑中产生
                    next_state = STUDY;
            end
            
            EAT: ...;
            
            AMUSE: ...;
            
            default: ...;
        endcase
    end
    
  • 各个状态下的动作

    //action
    wire read_book;
    assign read_book = (current_state == STUDY) ? 1'b1: 1'b0;
    
    always @(current_state)begin
        if(current_state == STUDY)
            read_book = 1;
        else 
            read_book = 0;
    end
    

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA基础知识点 的相关文章

  • FPGA设计篇之流水线思想

    FPGA设计篇之流水线思想 一 写在前面 二 正文开始 2 1举个栗子 2 2 1情况一 组合逻辑 2 1 2情况二 流水线设计 2 1 4 小总结 2 2举第二个栗子 写在最后 一 写在前面 流水线 大家好 我是富土康三号流水线的张全蛋
  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • DDR3学习总结(一)

    简介 DDR3 SDRAM常 简称 DDR3 是当今较为常见的一种储存器 在计算机及嵌入式产品中得到广泛应用 特别是应用在涉及到大量数据交互的场合 比如电脑的内存条 对DDR3的读写操作大都借助IP核来完成 本次实验将采用 Xilinx公司
  • 在vivado中使用tcl脚本(UG894)

    本文源自UG894 主要介绍如何在vivado中使用tcl脚本 1 vivado中如何获取tcl help vivado中任何自带的命令都可以通过 help 获取帮助信息 也可以直接输入 help 取得vivado命令合集 并通过 help
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • Verilog中forever、repeat、while、for四类循环语句(含Verilog实例)

    当搭建FPGA逻辑时 使用循环语句可以使语句更加简洁易懂 Verilog中存在四类循环语句 如标题 几种循环语句的具体介绍和用法如下 1 forever 连续的执行语句 语法格式 forever
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • 实验1-FPGA编程入门

    文章目录 一 认识全加器 二 输入原理图实现1位加法器 一 半加器原理图输入 二 全加器原理图输入 三 Verilog语言实现全加器 四 总结 五 资料参考 一 认识全加器 一 半加器 1 逻辑分析 如下图所示 半加器只有两个输入和两个输出
  • 小梅哥Xilinx FPGA学习笔记9——语法(阻塞与非阻塞赋值)

    阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 非阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 注意 阻塞赋值与非阻塞赋值 只有在时序逻辑中才有 不是阻塞赋值 也不是非阻塞赋值
  • 握手2倍速率进,一倍速率出[verilog]

    module two to one parameter WORD LEN 33 input clk input arst input 2 WORD LEN 1 0 i din input i din valid output o din r
  • IC数字后端

    在 innovus 里面 有时候我们需要控制 tie cell 的 fanout 和 net length 来避免 tie cell 可能出现 max transition 或者 max fanout 的违例 一般来说 只要 fanout
  • FPGA_时钟显示(时钟可调)

    1 实验说明 在数码管显示数据的基础上 让六位数码管显示数字时钟 并且通过按键可以对时间进行修改 实验目标 六位数码管分别显示时间的时分秒 且通过按键可实现加减调整时间及清零功能 key1 切换键 选择待调整的时间单位 时 分 秒 key2
  • BUCK电路分析(二)

    BUCK电路分析 二 PSIM仿真同步BUCK电路 在上片文章中 初步的分析了BUCK电路的工作原理 本章使用PSIM软件仿真BUCK电路 观察分析BUCK电路器件关键波形 图1是同步BUCK电路图 开关频率设置为200K 固定占空比 在仿
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • 【FPGA多周期时序约束详解】- 解读FPGA多周期时序约束的全过程

    FPGA多周期时序约束详解 解读FPGA多周期时序约束的全过程 FPGA作为数字电路设计的常见工具 其设计中必然会遇到时序约束的问题 而多周期时序约束更是FPGA设计中不可避免的难点之一 本文将详细介绍FPGA多周期时序约束的全过程 并结合
  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • MINI-UTDE 10 BASE-T 集成控制器

    MINI UTDE 10 BASE T 集成控制器 MINI UTDE 10 BASE T 拥有多达三个本地I O板和远程I OS总线通信 为用户提供了一系列生产单元功能的单一控制点 包括诸如夹头 反馈器和辅助机器等外围生产设备 支持所有主
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步

随机推荐

  • qmake source code 解读

    qmake 主要框架流程 qmake的主要功能执行入口在main cpp中的runQMake int argc char argv 中 其主要框架流程如下 runQMake int argc char argv QMakeVfs vfs 初
  • 2023Python该怎么学?我用这14张学习路线图,直观的告诉你

    我知道对于绝大多数的人来说 学习编程的第一目的其实就是想找一份有发展前景 并且薪资待遇还不错的工作 那么肯定是哪个编程语言的就业前景好 就越值得学习 Python作为当下最热的一门编程语言 刚好就符合这个条件 所以对于绝大部分人来说Pyth
  • java基于寄存器_基于栈的指令集与基于寄存器的指令集的区别,JVM指令集实例...

    现代JVM在执行Java代码的时候 通常都会将解释执行与编译执行两者结合起来 所谓解释执行 就是通过解释器来读取字节码 遇到相应的指令就去执行该指令 所谓编译执行 就是通过即时编译器 Just In Time JIT 将字节码转为本地机器码
  • 玩转ChatGPT:Custom instructions (vol. 1)

    一 写在前面 据说GPT 4又被削了 前几天让TA改代码 来来回回好几次才成功 可以看到之前3小时25条的限制 现在改成了3小时50条 可不可以理解为 以前一个指令能完成的任务 现在得两条指令 可能作为补偿 OpenAI对于Plus用户开放
  • 兼容和适配的区别

    兼容测试是app能否在不同品牌的手机上进行安装卸载等测试 适配测试是app能否在不同尺寸 不同分辨率的终端上能否正常显示的测试 转载于 https www cnblogs com bubutianshu p 11263395 html
  • 如何高逼格的写java代码

    记录一些了解的高逼格 好用的java代码 欢迎大家补充 共同学习 1 函数式接口 FunctionalInterface 好处 高逼格 代码收拢 解藕 统一处理 适用范围 具有共性的接口调用代码 举个栗子 在我们平时的微服务开发中 调用其他
  • vue计时器代码和倒计时代码

    计时器
  • Spring MVC拦截器和跨域请求

    一 拦截器简介 SpringMVC的拦截器 Interceptor 也是AOP思想的一种实现方式 它与Servlet的过滤器 Filter 功能类似 主要用于拦截用户的请求并做相应的处理 通常应用在权限验证 记录请求信息的日志 判断用户是否
  • easyui 获取并设置当前时间

    得到当前日期 formatterDate function date type var day date getDate gt 9 date getDate 0 date getDate var month date getMonth 1
  • Java基础复习之类与对象、封装、构造方法、String类

    个人觉得重点的部分会用彩色标出 面向对象思想 1 面向对象思想概述 面向过程思想 遇到一个问题 一步一步的去解决他 强调的是过程 典型代表语言是C语言 面向对象思想 遇到一个问题 找一个可以解决问题的对象 可以是人 也可以是别的 强调是对象
  • Windows7下IPV6设置方法详解

    Windows 7下配置IPV6的方法和Vista基本类似 需要注意的是 鉴于各个校园或其他场所的网络配置环境不同 如果按如下方法配置不成功可以进一步咨询相关网络管理人员 或重新选择连网客户端 下面来看具体的两个设置方法吧 步骤 方法 方法
  • %c与%s的区别与划分

    字符和字符串 c格式对应的是单个字符 s格式对应的是字符串 include
  • Elasticsearch Split和shrink API

    背景 尝试解决如下问题 单分片存在过多文档 超过lucene限制 分析 1 一般为日志数据或者OLAP数据 直接删除索引重建 2 尝试保留索引 生成新索引 数据写入新索引 查询时候包含 old index new index 3 尝试spl
  • 2023年第十四届蓝桥杯大赛python组省赛真题(已更新完)

    本篇更新蓝桥杯省赛真题的后5道 6 试题 F 公因数匹配 时间限制 10 0s 内存限制 512 0MB 本题总分 15 分 问题描述 给定 n 个正整数 Ai 请找出两个数 i j 使得 i lt j 且 Ai 和 Aj 存在大于 1 的
  • 线程(Linux系统实现)

    目录 1 线程概述 2 主线程和子线程 3 创建线程 线程函数 创建线程示例 4 线程退出 线程退出的原理主要包括以下两个方面 5 线程回收 回收子线程数据 6 线程分离 7 线程取消 8 线程 ID 比较 1 线程概述 线程是轻量级的进程
  • SIFT特征简介

    过程 1 尺度空间建立及极值点搜索 初步搜索 2 关键点精确定位 直线拟合使得关键点精确定位 x y sigma 消除边缘响应 初步搜寻特征点后 得到特征点的层数 像素坐标 x y 方向 文中分为18或36个离散方向 1 SIFT算法具的特
  • python dict遍历性能,Python:遍历list vs over dict items效率

    这取决于您使用的是哪个版本的Python 在Python 2中 some dict items 创建一个新的列表 这将占用一些额外的时间并占用更多的内存 另一方面 一旦创建了列表 它就是一个列表 因此在完成列表创建的开销之后 应该具有相同的
  • 用户行为路径数据埋点方案设计案例

    用户行为路径数据埋点方案设计案例 案例背景 业务需要对用户行为进行数据分析 现缺失这部分数据 需要设计采集方案获取数据满足业务分析需求 定义 数据采集方案是为埋点所设计的采集方案 所谓埋点就是在产品 通常是网页 app 中需要提取数据的地方
  • 小程序上传线上地址文件

    web上传的时候可以使用new Blob 但是在小程序中不能使用 当时的文件还是二进制的文件流 小程序上传不能使用线上地址 后来想了很多办法 最后把文件流使用wx saveFile先保存到本地 拿到result savedFilePath的
  • FPGA基础知识点

    FPGA知识点 Verilog基础语法 基础知识 逻辑值 逻辑0 表示低电平 也就是对应电路GND 逻辑1 表示高电平 也就是对应电路VCC 逻辑X 表示未知 有可能是高电平也有可能是低电平 逻辑Z 表示高阻态 外部没有激励信号 是一个悬空