DRP问题集结(一)-Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory...

本文分享了在使用Tomcat过程中遇到的三个常见问题及解决方案,包括无法启动、初始化失败等,并提供了具体的操作步骤。

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

             问题一:  Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory


          问题二:【Error】JavaWeb: 严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"]


          问题三:The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path


       最近一直在做DRP,也是我进入Java学习第一次以项目来实践,遇到过很多问题,但总的来说与.net对照来看,它其他和C#非常相似,从开始java开始,对于语言的胆怯没有了,真正有了一种一通百通的赶脚~~,虽然换了一个IDE,但是也仅仅如此,与.net相比,java是开源的,这大大的方便了我们的开发和学习,原来我们学习.net,它自身封装的东西我们是看不到的,但是java不但可以看到,而且可以在原有封装基础对其进行重写等等,对于一个java学习者,通过对java自身源码的学习也是对自身的一种提升,言归正传,下面说下我在做这个项目中的一些错误积累,它会以系列形式出现,希望对大家有所帮助。。。。       

            Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

     这个问题,我想也有很多人遇到过,报这个错,说明:在你的Tomcat下面的bin中有个tomcat-juli.jar,如图:

      

     需要将这个jar文件添加到path中,如图:

     

       然后我们重新启动tomcat。

<think>我们已知:-线速率=6.25 Gbps-参考时钟 =156.25MHz-编码方式 =64B/66B(即每64位数据添加2位同步头,编码效率为64/66)我们需要计算:1.数据位宽(即用户接口的数据位宽)2. DRP时钟频率(通常是个独立于数据路径的配置时钟,按照惯例设置为100MHz左右)步骤1:计算数据位宽在64B/66B编码下,有效数据传输效率为64/66,因此有效数据速率(即用户数据速率)为:用户数据速率=线速率× (64/66)=6.25 ×(64/66) Gbps计算:6.25 ×(64/66) =6.25× (32/33)≈6.25 ×0.9697≈6.0606Gbps用户数据速率需要满足:用户数据速率 =用户时钟频率×数据位宽同时,用户时钟频率由参考时钟通过PLL倍频得到,且必须满足整数倍关系:用户时钟频率 =N ×参考时钟频率(N为正整数)因此:用户时钟频率 ×数据位宽=6.0606Gbps即:N×156.25 MHz×数据位宽 =6.0606 ×10^9bps将上述等式两边同时除以10^6,得到:N ×156.25×数据位宽 =6060.6所以:数据位宽=6060.6/ (N ×156.25)计算6060.6除以156.25:156.25×38.8 =156.25×38+156.25×0.8 =5937.5 +125=6062.5(接近6060.6,但略大)6060.6 ÷156.25≈38.78816因此:数据位宽=38.78816/ N由于数据位宽必须是整数(通常为2的幂,如32、64、128等),我们需要选择合适的N使得数据位宽为整数。尝试N值:N=1:数据位宽≈38.78816->非整数,且不是2的幂,不可行。N=2:数据位宽≈19.39408->非整数,不可行。N=4:数据位宽≈9.69704->非整数,不可行。N=8:数据位宽≈4.84852->非整数,不可行。我们注意到,64B/66B编码通常与Gearbox机制配合使用,允许将多个小位宽数据组合成64位数据块。因此,实际用户接口位宽可以是64的倍数(如64、128等)或分数关系,但通常选择64位或128位。重新审视:在64B/66B编码中,每66位编码块包含64位数据。因此,用户接口通常以64位为单位进行处理。但为了匹配时钟,我们需要调整用户时钟频率。理想情况下,我们希望用户接口位宽为64位(这是64B/66B编码的自然宽度)。那么:用户数据速率 =用户时钟频率×64 =6.0606 Gbps用户时钟频率=6.0606e9/64 ≈94.71MHz但是,这个用户时钟频率(94.71MHz)必须由参考时钟(156.25MHz)通过PLL生成,即需要满足:94.71 MHz= N×156.25 MHz/M(其中M为分频系数,N为倍频系数,实际上PLL输出频率为 (N/M) ×参考时钟频率)然而,94.71与156.25之间没有简单的整数分频/倍频关系(94.71/156.25≈0.606,无法用整数分频实现)。因此,我们需要重新考虑。另种思路:使用多个通道(Lane)并行传输。但问题中未提及多通道,我们假设单通道。再考虑:在SerDes中,用户时钟通常由收发器内部PLL产生,PLL的输入是参考时钟,输出频率为线速率除以串行化因子(SerializationFactor)。串行化因子等于串行数据与并行数据的宽度比,即数据位宽(用户接口)的2倍(因为DDR)?实际上,在Xilinx的GTH/GTY中,串行化因子是固定的,由数据位宽决定,但数据位宽的选择必须满足:线速率 =用户时钟频率× (串行化因子)注意:在64B/66B编码中,发送端的工作流程是:将用户数据(64位)加上2位同步头(构成66位)然后进行发送。因此,实际串行发送的位宽是66位,但用户接口是64位。那么,串行化因子如何定义?实际上,SerDes内部有个并串转换的串行化因子,这个因子通常与用户接口位宽有关,但64B/66B编码器会改变实际发送的位数。因此,我们需要区分:-用户接口位宽(W):用户数据位宽-编码后位宽:对于64B/66B,每64位用户数据变成66位编码数据。-串行化因子(S):指并串转换时,并行数据的宽度。注意:并串转换是在编码之后进行的,所以并串转换的并行数据宽度应该是66的整数倍?实际上,为了匹配时钟,通常将66位拆分成更小的并行宽度(例如33位,然后使用双倍时钟)或者使用多个66位块。在Xilinx的GTH/GTY中,对于64B/66B编码,通常使用两个时钟沿(DDR)来传输数据,因此实际并串转换的并行数据宽度可以是33位(因为66位数据,用两个时钟沿传输,每个时钟沿传输33位?)。但用户接口通常配置为64位,此时用户时钟频率为线速率的1/(66)?不对。重新梳理Xilinx文档中的关系:线速率=用户时钟频率 ×(编码后每时钟周期传输的比特数)对于64B/66B编码,每66个编码比特对应64个用户数据比特,因此:线速率 =用户时钟频率 ×(66/64) ×用户接口位宽即:用户接口位宽×用户时钟频率 ×(66/64) =线速率所以:用户时钟频率= (线速率×64)/ (66 ×用户接口位宽)同时,用户时钟频率必须是参考时钟的整数倍(或通过PLL的N/M关系得到)。我们希望用户接口位宽为64位(自然匹配64B/66B),则:用户时钟频率= (6.25e9 ×64) /(66×64)=6.25e9 /66≈94.69697MHz现在,需要检查94.69697MHz是否可由156.25MHz通过PLL生成。即是否存在整数N和M使得:94.69697= (N/M) ×156.25计算:94.69697/156.25 ≈0.60606,即需要N/M≈0.60606,尝试寻找整数解:0.60606≈60606/100000 =30303/50000,但这不是小整数比。因此,使用64位用户接口位宽时,用户时钟频率94.69697MHz无法由156.25MHz直接分频/倍频得到(需要非常复杂的分数关系,而PLL通常只能实现有限精度的分数分频,且可能引入抖动)。考虑其他位宽:根据公式:用户时钟频率 =(6.25e9×64)/ (66 ×W)(其中W为用户接口位宽)同时,用户时钟频率 =N ×156.25e6(N为整数)所以:(6.25e9×64)/ (66 ×W)= N×156.25e6化简:(400e9)/ (66 ×W)= N×156.25e6400e9= N×156.25e6×66 ×W400e9= N× W×156.25e6 ×66W ×N =400e9 /(156.25e6×66)计算分母:156.25e6×66 =156.25×66×10^6 =10312.5×10^6 =1.03125e10所以:W ×N =400e9/1.03125e10=400/10.3125 ≈38.7879因此,W和N的乘积需要接近38.7879。由于W必须是整数(通常为2的幂,如32,64,128)且N为整数,我们尝试:W=32->则N≈38.7879/32≈1.212,不是整数。W=64->则N≈38.7879/64≈0.606,不是整数。W=128->则N≈0.303,不是整数。看起来都不行。那么,我们是否必须使用64B/66B编码的自然位宽64?实际上,在Xilinx的SerDes中,用户接口位宽可以是32位(对应64B/66B编码)?我们参考引用[3]中的配置:引用[3]中:选择外部数据位宽32bit的8b/10b编解码但注意,64B/66B编码通常与32位用户接口位宽如何对应?实际上,64B/66B编码的数据块是64位,但用户接口可以分两次传输(每次32位)?这样用户时钟频率就需要是线速率对应时钟的2倍?实际上,在Xilinx的GTX/GTH中,对于64B/66B编码,用户接口位宽通常配置为40位、64位、80位等,但32位也是常见的(通过内部Gearbox将64位拆分成两个32位,在较高时钟下传输)。重新考虑:用户接口位宽为32位(W=32),则:用户时钟频率 =(线速率 ×64) /(66×32)= (6.25e9 ×64) /(66×32) =(6.25e9×2) /66=12.5e9 /66≈189.3939MHz然后,189.3939 MHz需要是参考时钟156.25MHz的整数倍?计算189.3939/156.25≈1.212,不是整数。尝试W=40(非2的幂,但Xilinx支持):用户时钟频率 =(6.25e9×64)/(66×40) =(400e9)/(2640e6)=400/2.64≈151.5152MHz151.5152 /156.25≈0.9697,不是整数。尝试W=128:用户时钟频率= (6.25e9×64)/(66×128)= (400e9)/(8448e6) ≈47.3485MHz47.3485/156.25≈0.303,不是整数。尝试W=16:用户时钟频率= (6.25e9×64)/(66×16)=400e9/(1056e6) ≈378.7879 MHz378.7879/156.25≈2.424,不是整数。我们注意到,引用[1]中提到:64位的数据端口的时钟频率为156.25MHz,而32位数据位宽的时钟频率为312.5MHz但这是在8B/10B编码下。对于64B/66B,我们需要重新计算。另种思路:使用参考时钟的整数倍作为用户时钟,然后反算用户接口位宽。设用户时钟频率= N×156.25 MHz(N=1,2,3,...)则:W =(6.25e9×64)/ (66 ×用户时钟频率) =(400e9) /(66× N×156.25e6)=400e9 /(1.03125e10 ×N)=38.7879/ N因此,W必须是整数,所以N必须是38.7879的约数?但38.7879不是整数,所以我们需要找个接近的整数解。取N=39,则W=38.7879/39≈0.9946,不是整数,且远小于1,不可行。取N=38,则W=38.7879/38≈1.0207,也不是整数。我们发现,没有整数N使得W为整数。因此,我们需要考虑PLL的分数分频能力。实际上,Xilinx的PLL(如MMCM)支持分数分频。因此,我们可以使用分数关系来生成所需的用户时钟频率。例如,对于W=64,用户时钟频率=94.69697MHz,我们可以用参考时钟156.25MHz通过MMCM生成:输出频率 =输入频率 ×(N/M)(其中N和M是整数,且有限制)94.69697 =156.25× (N/M)=> N/M =94.69697/156.25 ≈0.606060.60606 ≈60606/100000=30303/50000但MMCM的N和M的取值范围有限(例如M通常在1~64之间),因此我们可以寻找个分数近似值,例如:0.60606≈20/33 ≈0.60606(20/33≈0.60606,非常接近)所以,我们可以设置:N=20,M=33这样,输出频率 =156.25×(20/33) ≈156.25×0.60606 ≈94.69697MHz,满足要求。因此,用户接口位宽=64位,用户时钟频率≈94.7MHz(由参考时钟156.25MHz经过MMCM分数分频得到)。步骤2:DRP时钟设置DRP时钟(DRPCLK)是个独立的配置时钟,通常设置为50-100MHz。按照惯例和引用[3]中的实践,我们可以设置为100MHz(或参考时钟156.25MHz也可以,但需要确保满足时序要求)。通常,100MHz是个安全且易于实现的选择。总结:编码方式:64B/66B数据位宽:64位用户时钟频率:94.69697MHz(由156.25MHz通过MMCM分数分频20/33得到)DRP时钟:100MHz(独立设置)注意:在实际工程中,用户时钟频率的生成可能会引入定的抖动,但MMCM的分数分频在Xilinx FPGA中是可行的。另外,也可以考虑使用其他位宽(如128位)来降低时钟频率,但128位在这里计算得到的时钟频率更低(47.35MHz),同样需要分数分频,且位宽增大可能增加布线难度。因此,64位是自然匹配64B/66B编码的宽度,推荐使用。验证:用户数据速率=用户时钟频率×数据位宽 =94.69697e6 ×64≈6.0606 Gbps线速率 =用户数据速率× (66/64)=6.0606e9× (66/64)=6.25 Gbps,符合。因此,配置为:数据位宽=64位DRP时钟 =100MHz引用[3]中也提到使用32位数据位宽(但那是8B/10B编码),对于64B/66B,64位是更自然的选择。同时,引用[1]中提到64位数据端口可以降低时钟频率(虽然这里时钟频率94.7MHz比参考时钟156.25MHz低,但这是由编码效率决定的)。另外,引用[2]和[4]提到时钟校正和64B/66B的同步机制,这些在IP核配置中需要启用,但不影响数据位宽和时钟的计算。最终答案:数据位宽:64位DRP时钟:100 MHz(常规设置)</think>### 解答:基于6.25Gbps线速率、156.25MHz参考时钟和64B/66B编码的配置方案 #### 1. **数据位宽计算** 当SerDes采用**64B/66B编码**时,编码效率为64/66(≈97%),用户数据速率与线速率的关系为: $$ \text{用户数据速率} = \text{线速率} \times \frac{64}{66} = 6.25 \times \frac{32}{33} \approx 6.0606 \text{ Gbps} $$ 用户时钟频率需满足: $$ \text{用户时钟} = \frac{\text{用户数据速率}}{\text{数据位宽}} = \frac{6.0606 \times 10^9}{\text{数据位宽}} $$ 同时,用户时钟由参考时钟通过PLL生成,需满足: $$ \text{用户时钟} = N \times 156.25 \text{ MHz} \quad (N \in \mathbb{Z}^+) $$ 代入公式: $$ \frac{6.0606 \times 10^9}{\text{数据位宽}} = N \times 156.25 \times 10^6 $$ $$ \text{数据位宽} = \frac{6.0606 \times 10^9}{N \times 156.25 \times 10^6} = \frac{38.79}{N} $$ **可行配置方案**: | N值 | 数据位宽 | 用户时钟 | 验证 | 适用性 | |-----|----------|------------|-------------------------------|----------------------| | 1 | 39位 | 156.25 MHz | 156.25M × 39 ≈ 6.094 Gbps | 非标准位宽,不推荐 | | 2 | 19.4位 | 312.5 MHz | 非整数位宽,不可行 | ✗ | | **分数分频** | **64位** | **94.7 MHz** | 94.7M × 64 = **6.0608 Gbps** | **推荐方案** | **结论**: - **首选配置**:**64位数据位宽**(用户时钟≈94.7MHz),通过PLL分数分频实现(156.25MHz × 20/33 ≈94.7MHz)[^3]。 - 优势:自然匹配64B/66B编码块,简化Gearbox设计[^4]。 - 备选方案:128位数据位宽(用户时钟≈47.35MHz),但需更高逻辑资源。 #### 2. **DRP时钟设置** DRP时钟(DRPCLK)独立于数据路径,根据Xilinx规范: - **频率范围**:50-200 MHz(7系列FPGA) - **推荐值**:**100 MHz** - 理由:平衡时序裕量和配置效率,易于从系统时钟分频生成(如156.25MHz→100MHz需分频器)[^3]。 **配置示例**(Vivado约束): ```tcl create_clock -name drp_clk -period 10.0 [get_ports DRPCLK] ; # 100MHz ``` #### 3. **关键配置要点** | 模块 | 配置项 | 值 | 说明 | |------------|----------------|-----------------|---------------------------------------| | **编码** | TX/RX Encoding | 64B/66B | 启用同步头检测(K28.5)[^3] | | **时钟校正**| Clock Correction| 使能 | 设置RX弹性缓冲和匹配序列[^2] | | **参考时钟**| MGTREFCLK0 | 156.25 MHz | 输入QPLL/CPLL[^1][^3] | | **PLL设置**| 分数分频比 | 20/33 | 生成94.7MHz用户时钟 | | **数据路径**| 数据位宽 | 64位 | 匹配64B/66B块大小[^4] | | **DRP接口**| DRPCLK | 100 MHz | 独立配置时钟,需约束时序[^3] | > **设计提示**: > 1. 在IP核中启用**时钟校正**(设置RX弹性缓冲范围和匹配序列),补偿时钟频偏[^2][^3]。 > 2. 使用Gearbox模块处理64B/66B块同步(如`gtwizard_0_block_sync_sm`)[^4]。 > 3. 对于6.25Gbps速率,优先选择**QPLL**(更低抖动),参考时钟直接接入专用Bank[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值