过孔技术详解:PCI与PCIE硬件与软件设计指南

需积分: 48 250 下载量 5 浏览量 更新于2024-08-06 收藏 14.95MB PDF 举报
在《EDA工具手册》中,关于“添加过孔和替换过孔”的章节属于硬件设计部分,特别是针对PCB (Printed Circuit Board) 设计的细节。在Cadence Allegro SPB V15.2这款广泛使用的电子设计自动化工具中,过孔操作是一项关键步骤,特别是在处理多层板设计时。过孔,即在PCB的铜箔之间穿过的孔,用于实现电气连接、信号传输和散热等目的。 在设计过程中,首先理解过孔的类型很重要。这里提到的是“添加过孔”(Adding via)操作,通常是在原理图设计阶段完成。用户需要进入Setup > constraints > physical rule sets > set rules界面,从Available padstacks列表中选择一个预定义或自定义的过孔名称(确保该过孔在焊盘库中有对应的设计),然后点击ADD按钮将其添加到设计布局中。添加过孔时需要考虑的因素包括孔径大小、位置精度以及与周围导体的连接方式。 过孔添加后,可能还需要进行规则设置,比如设置过孔的电气属性、走线规则等,以确保电路设计的电气完整性。这涉及到物理规则集的管理,它在保证PCB设计符合电气、机械和制造标准方面起着至关重要的作用。 在实际操作中,过孔的替换(Replacing vias)可能涉及到更改设计或修复错误,例如当发现原有过孔不适合新的设计需求,或者为了优化信号路径时,设计师可能会选择替换过孔。这通常涉及到编辑设计,调整过孔的位置、尺寸或连接方式,然后更新设计规则和约束。 整个过程需要熟练掌握Cadence Allegro的工具,包括原理图设计、PCB布局、自动布线和约束管理,以便确保设计的高效性和准确性。此外,了解公司的PCB设计规范和行业最佳实践对于正确实施过孔操作同样重要。通过《EDA工具手册》的学习,新进员工可以逐渐熟悉并掌握这些技能,从而在硬件设计中游刃有余。

优化代码void QQuickPrint::CalcCleanSprayInk(int nCleanSprayTime, int nCleanSprayStartTime, int nCleanSprayEndTime) { if (nCleanSprayTime <= 0) return; _CLEANSPRAY_INKINFO *stuCleanSprayInkInfo = new _CLEANSPRAY_INKINFO; stuCleanSprayInkInfo->nCostTime = nCleanSprayTime; stuCleanSprayInkInfo->nStartTime = static_cast<uint>(nCleanSprayStartTime); stuCleanSprayInkInfo->nEndTime = static_cast<uint>(nCleanSprayEndTime); stuCleanSprayInkInfo->nType = CLEANSPRAY_INK_CALCULATE; int nCntOfChannel = m_qPrintParam->GetCntOfChannel(); int nFrameSize = m_qPrintParam->GetFrameSize(); //喷头孔数 int nCleanDropSize = m_qPrintParam->GetCleanFireDropSize(); double dDropSizeCost = CLEANSPRAYDROPSIZE[nCleanDropSize];//清喷小点、中点、大点对应的耗墨量 int nCleanFireTimes = m_qPrintParam->GetCleanFireTimes(); int nCleanFireInterval = m_qPrintParam->GetCleanFireInterval(); int nCleanTotalTimes = (nCleanSprayTime / nCleanFireInterval) + 1;//清喷动作执行次数 = (清喷时间 / 清喷间隔) + 1,+1的原因是开启清喷时会立即执行1次清喷动作 //单通道清喷动作耗墨量 = 喷头孔数 * 清喷大小 * 单次清喷动作的清喷次数 * 清喷动作执行次数 double dColorCost = PL2ML(nFrameSize * dDropSizeCost * nCleanFireTimes * nCleanTotalTimes); memset(stuCleanSprayInkInfo->dInkCost, 0.00, sizeof(double) * MAXCOLORS); //获取各通道对应的颜色,计算各通道清喷耗墨量 for (int iC = 0; iC != nCntOfChannel; ++iC) { int nColorsCnt = m_qPrintParam->GetCntOfColors(); int nColorIndex = m_qPrintParam->GetRIPDataOfPiece(iC); if (PRN_CMYKOrRBLk == nColorsCnt) //8色模式,通道依次接RIP图的第7 6 1 3 0 2 5 4个位置 { //判断清喷通道接的RIP图位置对应哪个颜色 for (int nIndex = 0; nIndex != PRN_CMYKOrRBLk; ++nIndex) { if (g_nColorIndexOfCMYKOrRBLk[nIndex] == nColorIndex) { stuCleanSprayInkInfo->dInkCost[nIndex] += dColorCost; } } } else //其它颜色模式 { stuCleanSprayInkInfo->dInkCost[nColorIndex] += dColorCost; } } //清喷信息上报到MES stuCleanSprayInfo *pCleanSprayInfo = new stuCleanSprayInfo; pCleanSprayInfo->nRunTime = nCleanSprayTime; pCleanSprayInfo->strStartTime = QDateTime::fromTime_t(stuCleanSprayInkInfo->nStartTime).toString("yyyy-MM-dd hh:mm:ss"); pCleanSprayInfo->strEndTime = QDateTime::fromTime_t(stuCleanSprayInkInfo->nEndTime).toString("yyyy-MM-dd hh:mm:ss"); memcpy((char*)pCleanSprayInfo->dInkCost, (char*)stuCleanSprayInkInfo->dInkCost, sizeof(double) * MAXCOLORS); emit(signal_SendMes(MES_MSG_CLEANSPRAY, pCleanSprayInfo)); emit(signal_AddInkInfo(CLEANSPRAY_INK_CALCULATE, stuCleanSprayInkInfo)); }

2023-05-31 上传