計算DCDC、LDO環路阻抗

目錄

數據準備

電阻率

銅厚

PCB數據

IPC-D-356數據分析

網絡別名

net走線信息

編程實現自動化


了保證電源穩定性,一些電源廠家提出了對電源環路阻抗的要求,而常規仿真非常耗時,其實大多情況下可以採用近似公式進行估算,如果餘量較小再進行常規嚴格的仿真。

R=ρL/W/h,即電阻正比於長度,反比於寬度和厚度。

數據準備

電阻率

電阻率溫度對應表
溫度/℃ 電阻率/(Ω/mm)
0 16.5
10 17.2
20 17.8
30 18.5
40 19.2
50 20
60

20.6

 

 

 

 

 

 

 

 

銅厚

厚度信息可以PCB層疊中得到,以此建立層數與厚度的對應關係表。

thick_layer_pair = {
    "L1":0.025,
    "L2":0.02,
    "L3":0.02,
    "L4":0.025
    }

PCB數據

從PCB文件中導出IPC-D-356格式數據。

IPC-D-356數據分析

網絡別名

IPC-D-356定義超過14個字符的網絡名(net)需要使用別名,在"P IMAGE PANEL"分段中,以“NNNAME”爲行首。

net走線信息

以“333”爲行首的信息記錄了網絡所連接器件引腳及其位置信息,line[4:18]爲網絡名稱,位置座標分別以X,Y開始,公制單位下爲微米。

以“378”爲行首的信息記錄了走線所在層,走線寬度以及路徑上各點的位置座標,以“078”爲行首的信息爲上一行的繼續。

編程實現自動化

  1. 首先,建立表格列出所需計算電阻的網絡,及其起始器件引腳和結束器件引腳,csv爲文本文件處理方便,建議以csv文件提供;
    Net Name Start Part Start PIN End Part End PIN Info
    Net1 U01 1 C10 1  
    Net2 U01 3 C05 2  
  2. 導入IPC-D-356數據,獲取net-name變換對;
    net_name_pair = {
        "IPC001":"VREG_S1A_S2A_S3A_APC1",
        "IPC002":"VREG_S1E_S2E_S3E_MODEM"
        }

     

  3. 以net-name和IPC-D-356行首3字符爲依據,獲取各net所連接引腳信息和連線信息;
    def get_position(pin_s,pcb_data):
        position = ["",""]
        pin = pin_s[0] + " -" + pin_s[1]
        for line in pcb_data:
            if pin in line:
                x = line.split("X")[1].split("Y")[0]
                y = line.split("Y")[1].split("CD")[0].split("OW")[0]
                position[0] = str(int(x))
                position[1] = str(int(y))
        return position
    
    def wires(pcb_data):
        wires = {}
        for line in pcb_data:
            if line[:3] == "378":
                wire = line.split()[3:]
                width = int(line.split()[2][2:])
                if width not in wires.keys():
                    wires[width] = []
                points = []
                for point in wire:
                    if "*" in point:
                        points = points + point.split("*")
                    elif point.count("X") > 1:
                        points.append("X" + point.split("X")[1])
                        wires[width].append(points)
                        points = ["X" + point.split("X")[2]]
                    else:
                        points.append(point)
                wires[width].append(points)
            elif line[:3] == "078":
                wire = line.split()[1:]
                points = []
                for point in wire:
                    if "*" in point:
                        points = points + point.split("*")
                    elif point.count("X") > 1:
                        points.append("X" + point.split("X")[1])
                        wires[width].append(points)
                        points = ["X" + point.split("X")[2]]
                    else:
                        points.append(point)
                wires[width][-1] = wires[width][-1] + points
        return wires

     

  4. 依據連線信息,整理point-point線段,計算出L/W/h,並彙總成有權重的無向圖;
    def graph(wires):
        graph = {}
        for width in wires.keys():
            for wire in wires[width]:
                for i in range(len(wire)-2):
                    point = wire[i]
                    point1 = wire[i+1]
                    if point not in graph.keys():
                        graph[point] = []
                    pos_point = [int(point.split("Y")[0][1:]),int(point.split("Y")[1])]
                    pos_point1 = [int(point1.split("Y")[0][1:]),int(point1.split("Y")[1])]
                    length_by_width = ((pos_point[0] - pos_point1[0]) ** 2 + (pos_point[1] - pos_point1[1]) ** 2) ** 0.5 / width
                    graph[point].append([point1,length_by_width])
        return graph

     

  5. 依據現有的最短路徑算法,計算起始器件引腳和結束器件引腳最小L/W/h加權;
  6. 根據電阻率等信息,將網絡與估算電阻值列表輸出,注意單位的換算
    網絡名 電阻率(Ω/mm) L/W/h(mm) 電阻(mΩ)
    Net1 1.78e-8 1.5e-6 26.7
    Net2 1.78e-8 1.9e-6 33.82

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章