CRC算法并行运算Verilog实现

2023-11-11

        因为CRC循环冗余校验码的算法和硬件电路结构比较简单,所以CRC是一种在工程中常用的数据校验方法。尽管CRC简单,但在工程应用中还是有些问题会对工程师产生困惑。这篇文章将介绍一下CRC,希望对大家有所帮助。

一、CRC算法介绍

        CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

     【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如100101除以1110,结果得到商为11,余数为1,如左图所示。如11×11=101,如右图所示。

         具体来说,CRC校验原理就是以下几个步骤:

        (1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

        (2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。

        (3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端;最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

        通过以上介绍,大家一定可以理解CRC校验的原理,并且不再认为很复杂吧。

        从上面可以看出,CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”,如在IBM的SDLC(同步数据链路控制)规程中使用的CRC-16(也就是这个除数一共是17位)生成多项式g(x)= x16 + x15 + x2 +1(对应二进制比特串为:11000000000000101);而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g(x)= x16 + x15 + x5 +1(对应二进制比特串为:11000000000100001)。

        由以上分析可知,既然除数是随机,或者按标准选定的,所以CRC校验的关键是如何求出余数,也就是校验码(CRC校验码)。

    下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:

         (1)首先把生成多项式转换成二进制数,由G(X) = X4 + X3 + 1可以知道(,它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001。

        (2)因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的余数(即CRC码)为0100,如图5-10所示。注意参考前面介绍的“模2除法”运算法则。

       

         (3)把上步计算得到的CRC校验0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。

        (4)当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。

    通过以上CRC校验原理的剖析和CRC校验码的计算示例的介绍,大家应该对这种看似很复杂的CRC校验原理和计算方法应该比较清楚了。 

二、CRC算法并行实现

1、实现流程

        (1) 用N表示数据宽度,M表示CRC宽度。例如,如果我们想为4位数据路径生成并行USB CRC5,N=4,M=5。

        (2) 使用给定的多项式或十六进制表示法实现串行CRC生成器例程。

         (3) 并行CRC实现是N位数据输入和M位当前状态CRC的函数,如下图所示。我们将构建两个矩阵:当N=0时,作为Min(当前状态CRC)函数的Mout(下一状态CRC)和当M=0时,作为Nin的函数的Mout。

         (4) 当Min=0时,使用(2)中的例程计算N个值的CRC。每个值都是one-hot的,也就是说只有一个位为1。对于N=4,值为0x1、0x2、0x4、0x8。Mout=F(Nin,Min=0)

        (5) 构建NxM矩阵,每一行包含按递增顺序来自(3)的结果。例如,第1行包含输入=0x1的结果,第2行为输入=0x2等。输出为M位宽,即所需的CRC宽度。以下是N=4的USB CRC5的矩阵。

         (6) 这个矩阵中的每一列,表示输出位Mout[i]作为Nin的函数。

        (7) 当Nin=0时,使用(3)中的例程计算M个值的CRC。每个值都是一个one-hot的,也就是说只有一个位为1。对于M=5,值为0x1、0x2、0x4、0x8、0x10。Mout=F(Nin=0,最小值)

        (8) 构建MxM矩阵,每一行包含按递增顺序来自(7)的结果。以下是N=4的USB CRC5的矩阵:

         (9) 现在,为每个Mout[i]位建立一个等式:列[i]中的所有Nin[j]和Min[k]位都参与该等式。参与的输入被异或在一起。

        Mout[0] = Min[1]^Min[4]^Nin[0]^Nin[3]

        Mout[1] = Min[2]^Nin[1]

        Mout[2] = Min[1]^Min[3]^Min[4]^Nin[0]^Nin[2]^Nin[3]

        Mout[3] = Min[2]^Min[4]^Nin[1]^Nin[3]

        Mout[4] = Min[0]^Min[3]^Nin[2]

        这就是并行CRC的输出。

2、实例及代码

        我们以CRC8举例,多项式G(x)=X8 +X7 +X6 +X4 +X2 +1 ,则其串行CRC代码如下:

//G(x)=X^8 +X^7 +X^6 +X^4 +X^2 + X^0
//input bit number = 1
// 
module CRC8_1BIT(
DATA,
CRC_OUT,
RESET,
ENABLE,
CLK);
input DATA;
input RESET;
input ENABLE;
input CLK;
output [7:0] CRC_OUT;
wire DATA
wire RESET;
wire ENABLE
wire CLK
reg [7:0] CRC_OUT;

wire LFSR_N
reg [7:0] LFSR_S;

assign LFSR_N=CRC_OUT[7]^DATA;

always@(*) begin
    LFSR_S[0] = LFSR_S[7] ;
    LFSR_S[1] = LFSR_S[0] ;
    LFSR_S[2] = LFSR_S[1]^LFSR_N ;
    LFSR_S[3] = LFSR_S[2] ;
    LFSR_S[4] = LFSR_S[3]^LFSR_N ;
    LFSR_S[5] = LFSR_S[4] ;
    LFSR_S[6] = LFSR_S[5]^LFSR_N ;
    LFSR_S[7] = LFSR_S[6]^LFSR_N ;
end

always@ (posedge CLK or posedge RESET) begin
    if(RESET) begin
        CRC_OUT <= 8’ hff;
    else if (ENABLE) begin
        CRC_OUT <= LFSR_S;
    end
end

endnodule

        然后根据这个LFSR迭代得到矩阵:

module crc8_paralle( 
input [7:0] data_in, 
output reg[7:0] crc8, 
input rst,
input cik
);
// LFSR for crc8 
function [7:0] crc8_serial; 
input [7:0] crc;
input data; 
begin 
    crc8_serial[0] = data^crc[7] ;
    crc8_serial[1] = crc[0] ;
    crc8_serial[2] = data^crc[7]^crc[1] ;
    crc8_serial[3] = crc[2] ;
    crc8_serial[4] = data^crc[7]^crc[3] ;
    crc8_serial[5] = crc[4] ;
    crc8_serial[6] = data^crc[7]^crc[5] ;
    crc8_serial[7] = data^crc[7]^crc[6] ;
end
endfunction

// 8 iterations of crc8 LFSR 
function [7:0] crc_iteration 
input [7:0] crc;
input [7:0] data integer i;
begin
crc_iteration = crc; 
for( i=0 ; i<8 ; i=i+1)
    crc_iteration = crc8_serial(crc_iteration, data[7-i]); 
end
endfunction

always@( posedge clk or posedge rst) begin 
    if(rst) begin
        crc8 <= 8'hff; 
    end
    else begin
        crc8 <= crc_iteration(crc8,data_in) ;
    end
end

endmodule

        输入data_in 的是8‘b00000001,得到crc8的值,就是H1的第一行8’hd5;输入data_in 的是8‘b00000010,得到crc8的值,就是H1的第二行8’h7f;以此类推。计算出上面矩阵H1=[]NxM。计算H2=[]MxM的方法和H1是一样的。经过上面计算得到矩阵:

// G (x) = X^8 +X^7 +X^6 +X^4 +X^2 +X^0
//input bit number 8
Nin[O]  1  1  0  1  0  1  0  1  
Nin[1]  0  1  1  1  1  1  1  1
Nin[2]  1  1  1  1  1  1  1  0
Nin[3]  0  0  1  0  1  0  0  1   H1
Nin[4]  0  1  0  1  0  0  1  0
Nin[5]  1  0  1  0  0  1  0  0
Nin[6]  1  0  0  1  1  1  0  1
Nin[7]  1  1  1  0  1  1  1  1
----------------------------------
Min[O]  1  1  0  1  0  1  0  1  
Min[1]  0  1  1  1  1  1  1  1
Min[2]  1  1  1  1  1  1  1  0
Min[3]  0  0  1  0  1  0  0  1   H2
Min[4]  0  1  0  1  0  0  1  0
Min[5]  1  0  1  0  0  1  0  0
Min[6]  1  0  0  1  1  1  0  1
Min[7]  1  1  1  0  1  1  1  1
----------------------------------
nxt_crc 7  6  5  4  3  2  1  0

           此时,我们可以写出并行CRC的Verilog程序:

//G(x)=X^8 +X^7 +X^6 +X^4 +X^2 + X^0
//input bit number = 1 
module CRC8_8BIT(
DATA,
CRC_OUT,
RESET,
ENABLE,
CLK);
input [7:0]DATA;
input RESET;
input ENABLE;
input CLK;
output [7:0] CRC_OUT;
wire [7:0]DATA
wire RESET;
wire ENABLE
wire CLK
wire [7:0] CRC_OUT;

assign CRC_OUT = LFSR_N;

reg [7:0] LFSR_N
reg [7:0] LFSR_S;

always@(*) begin
    LFSR_S[0] = DATA[0]^DATA[1]^DATA[3]^DATA[6]^DATA[7]^LFSR_N[0]^ LFSR_N[1]^LFSR_N[3]^LFSR_N[6]^LFSR_N[7];
    LFSR_S[1] = DATA[1]^DATA[2]^DATA[4]^DATA[7]^LFSR_N[1]^ LFSR_N[2]^LFSR_N[4]^LFSR_N[7];
    LFSR_S[2] = DATA[0]^DATA[1]^DATA[2]^DATA[5]^DATA[6]^DATA[7]^LFSR_N[0]^ LFSR_N[1]^LFSR_N[2]^LFSR_N[5]^LFSR_N[6]^LFSR_N[7];
    LFSR_S[3] = =DATA[1]^DATA[2]^DATA[3]^DATA[6]^DATA[7]^ LFSR_N[1]^LFSR_N[2]^LFSR_N[3]^LFSR_N[6]^LFSR_N[7];
    LFSR_S[4] = DATA[0]^DATA[1]^DATA[2]^DATA[4]^DATA[6]^LFSR_N[0]^ LFSR_N[1]^LFSR_N[2]^LFSR_N[4]^LFSR_N[6];
    LFSR_S[5] = DATA[1]^DATA[2]^DATA[3]^DATA[5]^DATA[7]^ LFSR_N[1]^LFSR_N[2]^LFSR_N[3]^LFSR_N[5]^LFSR_N[7];
    LFSR_S[6] = DATA[0]^DATA[1]^DATA[2]^DATA[4]^DATA[7]^LFSR_N[0]^ LFSR_N[1]^LFSR_N[2]^LFSR_N[4]^LFSR_N[7];
    LFSR_S[7] = DATA[0]^DATA[2]^DATA[5]^DATA[6]^DATA[7]^LFSR_N[0]^ LFSR_N[2]^LFSR_N[5]^LFSR_N[6]^LFSR_N[7];
end

always@ (posedge CLK or posedge RESET) begin
    if(RESET) begin
        LFSR_N <= 8’ hff;
    else if (ENABLE) begin
        LFSR_N <= LFSR_S;
    end
end

endnodule

3、自动生成器

        上面推导其实较为麻烦,不过上面的方法其实可写成一个脚本,实现任意多项式任意位宽输入的并行CRC硬件电路。

        http://www.OutputLogic.com 有自动生成器,大家可以试试。

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

CRC算法并行运算Verilog实现 的相关文章

  • CRC校验详解(附代码示例)

    目录 1 CRC校验原理 2 生成多项式 3 以CRC 16校验为例讲解编程实现 3 3 1 完全按照CRC原理实现校验 3 3 2 工程中常用CRC校验过程 3 3 3 改进的CRC校验过程 4 以CRC 8校验为例讲解查表法 5 以CR
  • 【HDLBits 刷题 5】Circuits(1)Combinational Logic

    目录 写在前面 Combinational Logic Basic Gates Wire GND NOR Another gate Two gates More logic gates 7420 chips Truth table Two
  • 【HDLBits 刷题 13】Buliding Larger Circuits

    目录 写在前面 Buliding Larger Circuits count1k shiftcount fsm seq fsmshift fsm fancytimer fsm onehot 写在前面 以下的解题方法不一定为最佳解决方案 有更
  • 【HDLBits 刷题 15】Verification Writing Testbenches

    目录 写在前面 Verification Writing Testbenches clock Tb tb1 Tb and Tb tb2 Tb tff 写在前面 以下的解题方法不一定为最佳解决方案 有更好的方法欢迎提出 共同学习 共同进步 终
  • APB总线详解及手撕代码

    本文的参考资料为官方文档AMBA 3 APB Protocol specification 文档下载地址 https pan baidu com s 1Vsj4RdyCLan6jE quAsEuw pwd w5bi 提取码 w5bi APB
  • 【EDA Tools】Spyglass 检查 Verilog 和 SystemVerilog 混合语言及 Lint 检查

    目录 写在前面 读入设计 发现问题并解决 Lint 检查 写在前面 Spyglass可以用于检查混合设计中的语言互操作性和一致性问题 对于设计中包含多种硬件描述语言的情况 Spyglass 能够识别并解析其中的模块及其互连 并对其进行验证
  • 组合逻辑毛刺消除(竞争冒险)

    一 毛刺产生的原因 信号在 IC FPGA 器件中通过逻辑单元连线时 是存在延时的 延时的大小不仅和连线的长短和逻辑单元的数目有关 而且也和器件的制造工艺 工作环境等有关 因此 信号在器件中传输的时候 所需要的时间是不能精确估计的 当多路信
  • CRC校验(二)

    CRC校验 二 参考 https blog csdn net liyuanbhu article details 7882789 https www cnblogs com esestt archive 2007 08 09 848856
  • CRC校验关键点说明(内附C语言CRC校验库)

    文章目录 目的 CRC校验关键点 参数模型 计算方式 CRC校验库 源文件 使用测试 总结 目的 CRC即循环冗余校验码 Cyclic Redundancy Check 是数据通信领域中最常用的一种查错校验码 其特征是信息字段和校验字段的长
  • CRC 和哈希方法(MD5、SHA1)的区别

    CRC和散列方法都可以用来验证原始数据的完整性 为什么现在大多数系统都使用哈希方法 CRC 旨在防止传输错误 而不是恶意操作 因此 它不耐碰撞 特别是 CRC 码的线性特性甚至允许攻击者以保持校验值不变的方式修改消息
  • 需要帮助纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题

    我们正在尝试在 Javascript 上编写 GPS 设备侦听器代码 在此过程中 我们无法开发正确的 CRC ITU 错误检查脚本 协议文档生成crc码的解释如下 终端或服务器可以使用校验码来区分 接收到的信息是否有误 为了防止错误 数据传
  • 检查 CRC 多项式的错误检测能力

    我试图找出如何计算任意 CRC 多项式的错误检测能力 我知道有多种错误检测功能可能 或可能不适用于 任意多项式 检测单个比特错误 所有 CRC 都可以执行此操作 因为这只需要 CRC 宽度 gt 1 突发错误检测 所有 CRC 都可以检测大
  • 为对象图生成安全哈希码

    我正在从文件 xls csv xml 导入一些数据 这将产生一个复杂的内存中对象图 现在我需要知道该图自导出以来是否已被修改 检查这个的安全方法是什么 我想我会导出文件的哈希码 如果是这样的话生成对象哈希码的标准方法 https stack
  • 如何在python3中计算ANSI CRC16多项式(0x8005)?

    我尝试使用此代码计算 ANSI CRC16 多项式 0x8005 import crcmod crc16 crcmod mkCrcFun 0x8005 0xffff True 但我收到此错误消息 ValueError 多项式的次数必须为 8
  • 如何在 C#.net 中计算文件的 CRC 值?

    我想在 C net 中使用 32 位算法计算文件的 CRC 值 Algorithm is straightforward rewritten from c class Crc32 public static uint CountCrc by
  • 算法 CRC-12

    我正在尝试对 12 位 CRC 和算法执行 crc table 但总是得到错误的结果 你能帮助我吗 要创建 crc 表 我尝试 void crcInit void unsigned short remainder int dividend
  • 计算 HDLC 帧的 FCS(CRC)

    我有以下框架 7e 01 00 00 01 00 18 ef 00 00 00 b5 20 c1 05 10 02 71 2e 1a c2 05 10 01 71 00 6e 87 02 00 01 42 71 2e 1a 01 96 27
  • 如何计算 CRC 中使用的 XOR 余数?

    我试图记住如何计算循环冗余检查中的 XOR 算法的剩余部分以验证网络消息的剩余位 我不应该扔掉那本教科书 这在代码中很容易完成 但是如何手动计算出来呢 我知道它看起来像标准除法算法 但我不记得从那里去哪里获得余数 1010 10110100
  • 将 CRC8 从 C 翻译为 Java

    我收到一段 C 代码 它计算字节数组的 CRC8 值 我需要将其翻译成Java 这里的C Code CRC POLYNOM 0x9c CRC PRESET 0xFF unsigned int CRC CRC PRESET for i 0 i
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的

随机推荐

  • Java的内存机制

    1 Java的内存机制 Java 把内存划分成两种 一种是栈内存 另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配 当在一段代码块定义一个变量时 Java 就在栈中为这个变量分配内存空间 当超过变量的
  • 虚拟化一、虚拟化技术基础原理

    一 虚拟化 虚拟化 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机可运行不同的操作系统 并且应用程序都可以在相互独立的空间内运行而互不影响 从而显著提高计算机的工作效率 虚拟化使用软
  • java字符串转json

    针对不同jar包 一 import org json JSONObject JSONObject jo new JSONObject new String 需要转换的字符串 二 import com alibaba fastjson JSO
  • 巧用机器学习定位云服务器故障

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由roganhuang 发表于云 社区专栏 导语 随着腾讯云业务的扩大 母机数量越来越多 为减少人力并实现母机故障的自动化定位 本文尝试利用机器学习算法 通过对历史故障母机的日志
  • 在钉钉上怎么手写_钉钉群上课入门和独家进阶功能(图文)

    钉钉群上课入门和独家快速进阶 在钉钉上有两种视频连接方式 直播和视频会议 两者各有利弊 前者合适人数较多 超过两百人 的时候进行 后者适合一个班级进行上课 下面就两者之间的具体操作说明 文中图片皆可点击放大 一 直播 手机 只有手机怎么直播
  • mysql的连接路径_Mysql 连接路径 url 参数解析

    1 mysql url 参数解析 url jdbc mysql 127 0 0 1 3306 user useUnicode true characterEncoding utf8 useUnicode characterEncoding
  • Webpack构建多页应用Mpa(三):文件结构和自动化打包

    本系列教程整体完成后 会完成一个可用的MPA应用 教程实际就是整个MPA的实现过程的记录 如果是想了解单项功能的实现 请继续往下看 如果是想了解整个MPA的开发和思考过程 建议从 Webpack构建多页应用Mpa 一 阐述设计概要 教程开始
  • 方法:sorttable.js用法

    转至 用sorttable js对表格进行排序 对表格进行排序的实现步骤 第一 下载sorttable js 链接 http www kryogenix org code browser sorttable 不需要jquery js 第二
  • castep 编译安装说明

    科学计算软件编译安装方法说明 castep 篇 提供免费TEST QQ 178068275 1 什么是 castep CASTEP Cambridge Sequential Total Energy Package 的缩写 是一个基于密度泛
  • CNN,RNN,LSTM,GRU的前后向传播算法(梯度是怎么更新的)

    目录 1 简单的梯度计算 2 进阶的梯度计算 3 CNN前向后向算法 4 RNN前向后向算法
  • JavaFx中的Image和ImageView

    image 要转换成ImageView 对象才可以添加到结点中 Override public void start Stage stage stage setTitle 测试窗口 Pane pane new Pane Scene scen
  • 打表法经典2题:小于n的质数和第k个丑数

    1 求小于n的所有质数 1 开一个大小为n的bool数组A 下标代表整数 值true代表被mark过 有因子 非素数 2 i 从 2开始到n 1 如果A i 没被mark A i 就是质数 然后mark有A i 因子的数 2 A i 3 A
  • sed命令详解

    http www cnblogs com edwardlost archive 2010 09 17 1829145 htm 1 简介 sed是非交互式的编辑器 它不会修改文件 除非使用shell重定向来保存结果 默认情况下 所有的输出行都
  • MongoDB的基本使用

    基本操作 mongod f mongodb conf 启动mongodb mongo 进入到mongodb控制台 db shutdownServer 关闭服务 user admin db createUser user root pwd r
  • 怎么区分静态网页和动态网页

    在建设网站时 会经常听到静态网页和动态网页 但是他们真正的区别是什么 接下来仔细分析下二者的区别 静态网页是网站建设的基础 静态网页和动态网页之间也并不矛盾 为了网站适应搜索引擎检索的需要 即使采用动态网站技术 也可以将网页内容转化为静态网
  • Response.setContentType对应的类型大全

    Response setContentType MIME 的作用是时客户端的浏览器区分不同种类的数据 并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据 MIME的作用 由于MIME类型与文档的后缀相关 因此服务器使用文档的
  • MySQl心得4--5--数据库视图

    1 修改 查询 删除记录时都会提示多少条记录被影响 但建表不会提示 当表的数据修改后反映到视图 修改 查询 删除视图的命令跟建表时的一样 视图是从一个或多个表 或视图 导出的表 视图是数据库的用户使用数据库的观点 可以根据他们的不同需求 在
  • Jmeter做接口测试-面试题

    一 请说明你用Jmeter做接口测试的整体过程 用Jmeter做接口测试 至少要经过以下几步 1 根据开发提供的接口文档 编写接口测试用例 2 利用JMeter做接口测试 添加线程组和HTTP请求 在HTTP请求中 添加对应的ip地址 端口
  • http连接处理(下)(四)

    1 结合代码分析请求报文响应 下面我们将介绍服务器如何响应请求报文 并将该报文发送给浏览器端 首先介绍一些基础API 然后结合流程图和代码对服务器响应请求报文进行详解 基础API部分 介绍stat mmap iovec writev 流程图
  • CRC算法并行运算Verilog实现

    因为CRC循环冗余校验码的算法和硬件电路结构比较简单 所以CRC是一种在工程中常用的数据校验方法 尽管CRC简单 但在工程应用中还是有些问题会对工程师产生困惑 这篇文章将介绍一下CRC 希望对大家有所帮助 一 CRC算法介绍 CRC校验原理