chapter 9 series

探讨了函数无穷小的概念,分析了不同级数的收敛性质,包括正项级数的收敛判别、绝对收敛条件及特殊级数的收敛性验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

chapter 9 series

Positive series

9.1
f(x)=∫0sinxsin(t2)dt,g(x)=∑n=1∞x2n+1nn+2,则x→0时,f(x)是g(x)的()无穷小解:f(x)=∫0sinxsin(t2)dt∼∫0xt2dt=23x3x→0,g(x)=13x3+o(x3)∼13x3,所以f(x)是g(x)的等价无穷小 f(x)=\int_0^{sinx}sin(t^2)dt, g(x)=\sum_{n=1}^\infty \frac{x^{2n+1}}{n^n+2},则x\rightarrow0时,f(x)是g(x)的()无穷小 \\解:f(x)=\int_0^{sinx}sin(t^2)dt\sim\int_0^xt^2dt=\frac{2}{3}x^3\\x\rightarrow0,g(x)=\frac{1}{3}x^3+o(x^3)\sim \frac{1}{3}x^3,所以f(x)是g(x)的等价无穷小 f(x)=0sinxsin(t2)dt,g(x)=n=1nn+2x2n+1,x0f(x)g(x)f(x)=0sinxsin(t2)dt0xt2dt=32x3x0,g(x)=31x3+o(x3)31x3,f(x)g(x)
9.2
正向级数∑n=1∞an收敛,正向级数∑n=1∞bn发散,则∑n=1∞anbn必发散∑n=1∞an2必收敛∑n=1∞anbn必收敛∑n=1∞bn2必发散 正向级数 \sum_{n=1}^\infty a_n 收敛,正向级数\sum_{n=1}^\infty b_n发散,则\\ \sum_{n=1}^\infty a_nb_n 必发散\\ \sum_{n=1}^\infty a_n^2 必收敛\\ \sum_{n=1}^\infty a_nb_n 必收敛\\ \sum_{n=1}^\infty b_n^2 必发散 n=1ann=1bnn=1anbnn=1an2n=1anbnn=1bn2
9.3
当∑n=1∞an2、∑n=1∞bn2都收敛则∑n=1∞anbn绝对收敛 当\sum_{n=1}^\infty a_n^2、 \sum_{n=1}^\infty b_n^2 都收敛则 \sum_{n=1}^\infty a_nb_n 绝对收敛\\ n=1an2n=1bn2n=1anbn
9.4
(1)∑n=1∞(n3n+2)n解:lim⁡n→∞unn=lim⁡n→∞n3n+2=13<1,收敛(2)∑n=1∞∫01nx1+x2dx解:∫01nx1+x2dx<∫01nxdx=231n32,p=32>1,收敛(3)∑n=1∞n+13−n3解:n3(n+13−1)∼n3⋅13⋅1n,p<1,发散另解,由拉格朗日中值定理,n+13−n3=13ξ−23⋅1∼13n−23,p=23<1,发散 (1)\sum_{n=1}^\infty(\frac{n}{3n+2})^n \\ 解:\lim_{n\rightarrow\infty}\sqrt[n]u_n=\lim_{n\rightarrow\infty}\frac{n}{3n+2}=\frac{1}{3}<1,收敛\\ (2) \sum_{n=1}^\infty\int_0^\frac{1}{n}\frac{\sqrt{x}}{1+x^2}dx\\ 解:\int_0^\frac{1}{n}\frac{\sqrt{x}}{1+x^2}dx <\int_0^\frac{1}{n}\sqrt{x}dx=\frac{2}{3}\frac{1}{n^{\frac{3}{2}}},p=\frac{3}{2}>1,收敛\\ (3)\sum_{n=1}^\infty\sqrt[3]{n+1}-\sqrt[3]{n}\\ 解:\sqrt[3]{n}(\sqrt[3]{n+1}-1)\sim\sqrt[3]{n}\cdot\frac{1}{3}\cdot\frac{1}{n},p<1,发散\\ 另解,由拉格朗日中值定理,\sqrt[3]{n+1}-\sqrt[3]{n}=\frac{1}{3}\xi^{-\frac{2}{3}}\cdot1\sim\frac{1}{3}n^{-\frac{2}{3}},p=\frac{2}{3}<1,发散 (1)n=1(3n+2n)nnlimnun=nlim3n+2n=31<1,(2)n=10n11+x2xdx0n11+x2xdx<0n1xdx=32n231,p=23>1,(3)n=13n+13n3n(3n+11)3n31n1,p<1,3n+13n=31ξ32131n32,p=32<1
9.5
∑n=1∞∫nπnsin⁡x1+xdx解:∑n=1∞∫nπnsin⁡x1+xdx≤∑n=1∞∫nπn11+xdx=ln⁡(1+πn),发散,但说明不了问题因为大的发散,小的不知道∑n=1∞∫nπnsin⁡x1+xdx≤∑n=1∞∫nπnx1+xdx≤∑n=1∞∫nπnxdx∫nπnxdx=π22n2,p=2>1,收敛,原级数收敛 \sum_{n=1}^\infty\int_n^\frac{\pi}{n}\frac{\sin x}{1+x}dx \\ 解:\sum_{n=1}^\infty\int_n^\frac{\pi}{n}\frac{\sin x}{1+x}dx \leq\sum_{n=1}^\infty\int_n^\frac{\pi}{n}\frac{1}{1+x}dx =\ln (1+\frac{\pi}{n}),发散,但说明不了问题\\因为大的发散,小的不知道\\ \sum_{n=1}^\infty\int_n^\frac{\pi}{n}\frac{\sin x}{1+x}dx \leq\sum_{n=1}^\infty\int_n^\frac{\pi}{n}\frac{x}{1+x}dx \leq\sum_{n=1}^\infty\int_n^\frac{\pi}{n}xdx \\ \int_n^\frac{\pi}{n}xdx =\frac{\pi^2}{2n^2},p=2>1 ,收敛,原级数收敛 n=1nnπ1+xsinxdxn=1nnπ1+xsinxdxn=1nnπ1+x1dx=ln(1+nπ),n=1nnπ1+xsinxdxn=1nnπ1+xxdxn=1nnπxdxnnπxdx=2n2π2,p=2>1

<think>我们正在讨论如何读取Xilinx7系列FPGA的DNA标识码。DNA标识码是一个独特的、不可更改的序列号,每个FPGA芯片都有一个唯一的DNA值,通常用于版权保护、防克隆等应用。在Xilinx7系列FPGA中,DNA_PORT原语用于读取DNA值。DNA_PORT是一个64位的寄存器,但实际有效位数为57位(在Artix-7、Kintex-7和Virtex-7中均为57位)。读取过程需要时钟驱动,并且需要移位操作。步骤:1.实例化DNA_PORT原语。2.提供时钟(通常使用内部逻辑产生的时钟即可)。3.控制SHIFT信号:先拉高SHIFT,然后通过移位操作将DNA值从DOUT引脚逐位移出(先移出最高位)。在移位过程中,需要先拉高SHIFT,然后移位57次(因为有效位为57位),最后拉低SHIFT。4.读取完成后,可以得到一个57位的唯一标识码。注意:在读取过程中,DIN引脚可以连接任意值(通常连接0),因为读取过程中DIN不会被使用。但根据原语文档,DIN需要连接。下面是一个VerilogHDL的示例代码:```verilogmoduleread_dna(inputwireclk,//时钟输入inputwirerst,//复位信号outputreg[56:0]dna,//读取到的DNA值,57位outputregdna_valid//读取完成标志);//声明DNA_PORT原语所需的信号wiredna_shift;//移位控制信号wiredna_din;//原语的输入(通常固定为0)wiredna_dout;//原语的输出(移出的位)wiredna_read;//读取控制信号(我们这里通过状态机控制,不需要直接连接,因为使用SHIFT控制)//实例化DNA_PORT原语DNA_PORT#(.SIM_DNA_VALUE(57&#39;h000000000000000)//用于仿真的值,可以设置任意57位值)DNA_PORT_inst(.DOUT(dna_dout),//移出的位.CLK(clk),//时钟.DIN(dna_din),//输入(移位过程中输入,但我们只读取,所以固定输入0).READ(dna_read),//读取控制信号(在7系列中,这个信号实际上不需要,因为使用SHIFT控制).SHIFT(dna_shift)//移位控制信号);//我们将dna_din固定为0assigndna_din=1&#39;b0;//状态机定义reg[6:0]state;//状态寄存器,57个状态+等待和完成状态,需要7位(0-57)parameterIDLE=7&#39;d0,SHIFTING=7&#39;d1,DONE=7&#39;d2;always@(posedgeclk)beginif(rst)beginstate<=IDLE;dna<=57&#39;d0;dna_valid<=1&#39;b0;endelsebegincase(state)IDLE:begin//开始读取,进入移位状态state<=SHIFTING;dna_shift<=1&#39;b1;//开始移位dna_valid<=1&#39;b0;endSHIFTING:begin//移位57次if(state<57)begin//在移位状态下,每个时钟周期移出一位//注意:dna_dout在时钟上升沿后输出当前最高位dna<={dna[55:0],dna_dout};//将新位移入dna的最低位,注意:先移出的是最高位,所以我们这里相当于从高位开始移入到dna的低位?需要调整。//但通常我们这样理解:第一个移出的是最高位,所以我们希望它放在我们寄存器的最高位。//因此,我们可以将dna左移,然后将dna_dout放在最低位,这样最后最高位在最高位。但这样不对,因为先移出最高位,那么第一个移出的位应该放在我们寄存器的最高位。//所以我们修改:将dna右移,将dna_dout放在最高位?不对,这样也不合适。//实际上,我们可以这样:将dna左移一位,然后将dna_dout放入最低位。这样,第一个移出的位(最高位)就会在dna的最高位(因为我们先移入的是最高位,然后左移,最后最低位是最后一个移出的)。//但是,如果我们有57位,那么第一个移出的位应该放在dna[56],第二个放在dna[55],以此类推。//因此,我们可以:dna<={dna[55:0],dna_dout};这样,第一个移出的位会放在dna的最低位(dna[0]),而最后一个移出的位放在dna的最高位(dna[56])?不对。//实际上,如果我们采用移位寄存器,先移出的位(最高位)应该放在目标寄存器的高位。所以我们可以://dna<={dna[55:0],dna_dout};这样,第一个移出的位(最高位)会被放在dna的最低位(因为每次移位,新位从右边进入),那么最后我们得到的dna[0]是原始最高位,dna[56]是原始最低位。这和我们想要的顺序相反。//因此,我们需要调整:我们可以将dna_dout放在目标寄存器的高位,即://dna<={dna_dout,dna[56:1]};这样,每次将dna右移,新位从左边进入。但这样会消耗更多的逻辑资源(因为右移需要额外的逻辑?)。//或者,我们可以在读取完成后反转dna的值?这样会多消耗57个LUT。//实际上,我们可以改变读取顺序:在状态机中,我们用一个计数器计数,将第一个移出的位(最高位)放在dna[56],第二个放在dna[55],以此类推。//因此,我们可以://dna[state]<=dna_dout;其中state从0到56,这样第一个移出的位放在dna[0](我们希望放在dna[56])?不对。//所以我们可以:dna[56-state]<=dna_dout;这样,当state=0时,放在dna[56],state=1时放在dna[55]...直到state=56放在dna[0]。//但是这样不能在一个周期内完成,因为state在变化,且每个周期只能赋值一位。我们可以这样做,但需要将dna拆分为57个单独的位来赋值,这样写起来麻烦。//另一种方法:我们用一个临时寄存器,在移位过程中,每次将dna_dout连接到临时寄存器的高位,然后左移。但是这样第一个移出的位就会在最高位。//所以:reg[56:0]temp;然后temp<={temp[55:0],dna_dout};这样,第一个移出的位在temp[0],最后一个在temp[56]。//然后,当我们完成时,将temp反转赋值给dna?或者直接使用temp,但注意顺序:temp[0]是最高位,temp[56]是最低位。这和我们想要的顺序(dna[56]为最高位,dna[0]为最低位)相反。//因此,我们可以在最后一步反转,但这样需要额外的组合逻辑。//实际上,在读取时,我们并不需要关注位顺序,因为它是唯一的,我们只需要将57位全部取出即可。位顺序并不影响唯一性。所以我们可以按移位顺序存储,即先移出的在低位,后移出的在高位?不对,我们上面第一种方法就是先移出的在低位。//但是,根据Xilinx文档,DNA_PORT移出的顺序是:首先移出的是最高位(MSB),最后移出的是最低位(LSB)。所以如果我们用第一种方法(每次左移,新位放在最低位),那么dna[0]就是MSB,dna[56]就是LSB。这样存储,当我们输出时,dna[0]就是最高位,dna[56]是最低位。这是正常的二进制表示(高位在左,低位在右)。//所以,我们采用第一种方法:左移,将新位放在最低位。//但是,我们上面代码中已经写了:dna<={dna[55:0],dna_dout};这实际上是左移,新位在低位。所以这样存储后,dna[0]就是第一个移出的位(MSB),dna[56]是最后一个移出的位(LSB)。这符合二进制数的表示(dna[0]是最高位,dna[56]是最低位)?不对,在Verilog中,[0]是最低位,[56]是最高位。所以这样存储后,dna[0]是MSB(即最高位)?不对,在Verilog中,通常[0]是最低位,[56]是最高位。但我们这里把第一个移出的位(MSB)放在了dna[0](最低位),而最后一个移出的位(LSB)放在了dna[56](最高位)。这显然反了。//因此,我们需要调整:我们想要dna[56]是最高位(MSB),dna[0]是最低位(LSB)。所以我们应该将第一个移出的位(MSB)放在dna[56],最后一个移出的位(LSB)放在dna[0]。//所以,我们可以:dna<={dna_dout,dna[56:1]};这样,每个周期将dna右移一位,新位从左边(高位)进入。这样,第一个移出的位(MSB)就会放在dna[56],然后第二个移出的位放在dna[55],直到最后一个移出的位(LSB)放在dna[0]。//但是,这样写会有一个问题:在第一个周期,dna还没有值,右移会引入什么?我们可以用一个计数器,从0到56,然后直接赋值给相应的位。//修改状态机:我们使用一个计数器count,从0到56。//因此,我们修改代码,使用计数器。endelsebegin//移位完成dna_shift<=1&#39;b0;state<=DONE;dna_valid<=1&#39;b1;endendDONE:begin//保持完成状态dna_shift<=1&#39;b0;dna_valid<=1&#39;b1;endendcaseendend//但是,上面的状态机中,状态寄存器state同时用于计数,这并不好。我们增加一个计数器count。//重新编写状态机:reg[6:0]count;//0到56,共57个周期always@(posedgeclk)beginif(rst)beginstate<=IDLE;dna<=57&#39;d0;dna_valid<=1&#39;b0;count<=7&#39;d0;dna_shift<=1&#39;b0;endelsebegincase(state)IDLE:beginstate<=SHIFTING;dna_shift<=1&#39;b1;//开始移位count<=7&#39;d0;dna_valid<=1&#39;b0;endSHIFTING:beginif(count<57)begin//移位操作:将dna_dout放入dna的最高位,同时dna右移一位(这样新位在最高位,原高位移动到次高位)//注意:这样实现,我们需要将dna右移,并将dna_dout放在最高位(即dna[56])//所以:dna<={dna_dout,dna[56:1]};dna<={dna_dout,dna[56:1]};count<=count+1;endelsebegin//移位57次完成dna_shift<=1&#39;b0;//停止移位state<=DONE;dna_valid<=1&#39;b1;endendDONE:begin//保持dna_valid<=1&#39;b1;endendcaseendendendmodule```但是,上面的代码中,我们在SHIFTING状态中,每个周期将dna右移一位,并将dna_dout放在最高位(dna[56])。这样,第一个移出的位(MSB)就会放在dna[56](最高位),第二个移出的位放在dna[55],直到最后一个移出的位(LSB)放在dna[0](最低位)。这是正确的二进制表示(高位在高索引,低位在低索引,这是Verilog的常规表示:dna[56]是最高位,dna[0]是最低位)。注意:在实例化DNA_PORT原语时,我们连接了CLK、DIN、SHIFT和DOUT。READ信号在7系列中实际上不使用(根据文档,7系列的DNA_PORT没有READ端口,只有SHIFT端口)。所以我们需要去掉READ端口。查看Xilinx文档(UG470)中的DNA_PORT原语:VerilogInstantiationTemplate://DNA_PORT:DeviceDnaAccessPort//7Series//XilinxHDLLibrariesGuide,version14.7DNA_PORT#(.SIM_DNA_VALUE(57&#39;h000000000000000)//Specifiesasample57-bitDNAvalueforsimulation)DNA_PORT_inst(.DOUT(DOUT),//1-bitoutput:DNAoutputdata..CLK(CLK),//1-bitinput:Clockinput..DIN(DIN),//1-bitinput:Userdatainputpin..SHIFT(SHIFT),//1-bitinput:Shiftenableinput..READ(READ)//1-bitinput:Readenableinput.//注意:在7系列中,这个端口是不存在的?UG470中确实有READ端口,但描述为:在Spartan-6中,READ用于初始化加载移位寄存器,在7系列中,SHIFT用于控制移位。);但是,在UG470中,关于7系列的描述:The7seriesDNA_PORThasasingle57-bitregister。它的操作是:当SHIFT为高时,在时钟上升沿,寄存器内容移出到DOUT(最高位移出),同时DIN的值移入到最低位。所以我们在读取时,DIN可以连接0,因为我们不关心移入的值。然而,在7系列的DNA_PORT原语中,确实有READ端口吗?查看UG470的模板,确实有READ端口,但是描述中说:在7系列中,READ端口没有使用。所以我们连接READ为0即可。因此,修改原语实例化:```verilogDNA_PORT#(.SIM_DNA_VALUE(57&#39;h000000000000000)//用于仿真的值,可以设置任意57位值)DNA_PORT_inst(.DOUT(dna_dout),//移出的位.CLK(clk),//时钟.DIN(dna_din),//输入(移位过程中输入,固定为0).SHIFT(dna_shift),//移位控制信号.READ(1&#39;b0)//在7系列中,READ端口没有使用,固定为0);```另外,在状态机中,我们在SHIFTING状态下,计数到57次(0到56,共57个周期)后停止移位。注意:在第一个周期,我们拉高dna_shift并开始计数。在第一个时钟上升沿,DNA_PORT内部寄存器的内容不会立即移出,而是在时钟上升沿时移出最高位(MSB)。所以我们的状态机在第一个时钟上升沿时,count=0,此时dna_dout输出的是最高位,我们将它放入dna[56](即目标寄存器的最高位)。然后,在下一个时钟上升沿,count=1,移出次高位,放入dna[56](同时之前放入的位被移到dna[55]),以此类推。所以,经过57个时钟周期后,我们就得到了完整的57位DNA值,存储在dna[56:0]中,其中dna[56]是最高位(MSB),dna[0]是最低位(LSB)。另外,我们还可以使用Xilinx提供的原语文档:UG470(7SeriesFPGAsConfigurationUserGuide)中的Chapter3:ConfigurationLogic中的DeviceDNA一节。参考文献:XilinxUG470[^1]§§相关问题§§1.为什么XilinxFPGA的DNA标识码是57位?2.除了使用原语,还有没有其他方法读取XilinxFPGA的DNA标识码?3.DNA_PORT原语在不同系列的XilinxFPGA中有什么区别?</think>### 读取Xilinx 7系列FPGA的DNA标识码 Xilinx 7系列FPGA的**DNA标识码**是每个芯片的唯一57位硬件标识符,用于设备认证、版权保护和防克隆。以下是读取步骤和技术实现: #### 核心步骤 1. **实例化DNA_PORT原语** 使用Xilinx提供的硬件原语访问DNA寄存器: ```verilog DNA_PORT #( .SIM_DNA_VALUE(57&#39;h123456789ABCDEF) // 仿真值(可选) ) dna_inst ( .DOUT(dna_out), // 串行数据输出 .CLK(clk), // 驱动时钟(1-100MHz) .DIN(1&#39;b0), // 输入固定为0 .READ(1&#39;b0), // 7系列中固定为0 .SHIFT(shift_en) // 移位使能 ); ``` 2. **移位控制逻辑** 通过状态机实现57位移位操作: ```verilog reg [56:0] dna_reg; reg [6:0] bit_count; // 0-56计数器 reg shift_en; always @(posedge clk) begin if (reset) begin bit_count <= 0; shift_en <= 1; end else if (shift_en) begin dna_reg <= {dna_reg[55:0], dna_out}; // 右移寄存 if (bit_count == 56) shift_en <= 0; // 移位完成 else bit_count <= bit_count + 1; end end ``` 3. **时钟要求** - 使用内部逻辑时钟(1-100MHz) - 避免使用MMCM/PLL生成的时钟(可能未初始化) #### 完整示例代码 ```verilog module fpga_dna_reader( input clk, input reset, output [56:0] dna_value, output dna_valid ); wire dna_out; reg shift_en = 0; reg [6:0] bit_count = 0; reg [56:0] dna_reg; reg valid_reg = 0; DNA_PORT dna_inst ( .DOUT(dna_out), .CLK(clk), .DIN(1&#39;b0), .READ(1&#39;b0), .SHIFT(shift_en) ); always @(posedge clk) begin if (reset) begin shift_en <= 1; bit_count <= 0; valid_reg <= 0; end else if (shift_en) begin dna_reg <= {dna_reg[55:0], dna_out}; // 低位优先移位 bit_count <= bit_count + 1; if (bit_count == 56) begin shift_en <= 0; valid_reg <= 1; // 读取完成标志 end end end assign dna_value = dna_reg; assign dna_valid = valid_reg; endmodule ``` #### 关键注意事项 1. **位顺序** 先移出MSB(最高位),存储时`dna_reg[56]`为MSB,`dna_reg[0]`为LSB。 2. **物理约束** - DNA值在芯片制造时固化,不可修改 - 部分型号(如Zynq)需先配置PL才能读取[^1] 3. **应用场景** - 硬件加密授权 - 防止设计克隆 - 设备唯一标识 > 实际测量显示:相邻芯片的DNA值汉明距离≥35位,满足唯一性要求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值