PCB设计中的信号反射与集总参数解析

2 下载量 117 浏览量 更新于2024-09-02 收藏 416KB PDF 举报
"PCB设计中关于反射的那些事儿(2)——集总的世界" 在PCB(印制电路板)设计中,了解信号反射是非常重要的,因为反射会直接影响信号的质量和系统的稳定性。当信号在传输线中遇到阻抗不连续性时,如不同材料界面或元器件接口,信号会产生反射。反射的强度取决于阻抗不连续性的程度,例如在开路或短路情况下,反射几乎与入射信号等幅。 反射导致传输线中存在多个相位不一致的谐波,这些谐波之间的相互干扰可能导致信号失真。若两个信号的相位差小于λ/20,它们的叠加影响可以忽略。在这种情况下,通常采用集总参数模型来分析电路,即假设传输线长度小于λ/20,电路的行为类似于直流电路。 λ是电磁波的一个关键参数,代表波长,它等于速度v乘以周期T,或频率f的倒数。在PCB设计中,理解λ的实际意义至关重要。以1GHz的信号为例,对应的波长约6000mil,而在FR4材质的PCB上,信号看起来并不是像在时间轴上那样连续,而是呈现出在空间上的分布。因此,传输线实际上可能表现为电压沿线路的渐变,而不是单一的电压值。 集总参数模型假设电压和电流的变化非常缓慢,以至于可以近似为直流,此时传输线的电容和电感效应不显著,信号在传输过程中几乎不受影响,即传输线是“透明”的。这意味着在集总参数模型下,接收端接收到的信号与信号的传播路径无关。 然而,并非所有频率的信号都适用于集总参数模型。对于低频信号(如10MHz),其λ/20远大于高频信号,因此在某些模拟信号设计中,控制阻抗可能不是必需的。这也解释了为什么早期的PCB设计和部分现代模拟电路不需要严格控制阻抗。 在实际设计中,有一些经验公式可以帮助计算和控制反射,比如计算所需的传输线长度、阻抗匹配网络的设计等。这些公式和方法对于确保信号完整性至关重要,从而保证PCB设计的高效和可靠性。 理解信号反射和集总参数模型是PCB设计中的基础,它们影响着信号的质量和系统性能。通过精确控制阻抗和合理设计,设计师可以有效地减少反射,提高电路的稳定性和效率。

简析代码:void FCFS(PCB pro[], int num) { int time,done_time; int i,count,tt,pronum; float sum_T_time,sum_QT_time; PCB *curpro,*temp_PCB; printf("\n\t\t\t\t\t先来先服务算法进程调度模拟\n\n"); printf("\t————————————————————————————————————————————————\n"); count=0; PCB pro2[100]; sortWithEnterTime(pro, num); PCBQueue* queue = (PCBQueue*)malloc(sizeof(PCBQueue)); Queueinit(queue); EnterQueue(queue, &pro[0]); time = pro[0].arrivetime; pronum = 1; sum_T_time = 0, sum_QT_time = 0; while (queue->size > 0) { curpro = poll(queue); if (time < curpro->arrivetime){ time = curpro->arrivetime; } done_time = time + curpro->running_time; curpro->start_time=time; curpro->done_time=done_time; curpro->zztime = done_time - curpro->arrivetime; curpro->dqzztime = curpro->zztime / curpro->running_time; sum_T_time += curpro->zztime; sum_QT_time += curpro->dqzztime; for (tt = time; tt <= done_time && pronum < num; tt++) { if (tt >= pro[pronum].arrivetime) { EnterQueue(queue, &pro[pronum]); pronum++; } } CopyProgram(&pro2[count],curpro); PrintRunningprogram(&pro2[count]); count++; if(queue->size!=0) { printf("\t就绪队列:\n"); printf("\t————————————————————————————————————————————————\n"); printf("\t进程 到达时间 服务时间 优先级\n"); temp_PCB=queue->firstProg->next; for(i=queue->size; i>0; i--) { printf("\t%s\t%d\t%d\t%d\n",temp_PCB->name,temp_PCB->arrivetime,temp_PCB->running_time,temp_PCB->priority); temp_PCB=temp_PCB->next; } printf("\t————————————————————————————————————————————————\n"); printf("\n\n\n"); } else { printf("\t无进程处于就绪状态!\n"); printf("\t————————————————————————————————————————————————\n\n\n"); } time += curpro->running_time; if (queue->siz

2023-06-09 上传