首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C# + WPF 生成半导体晶圆良率图:从数据到像素

C# + WPF 生成半导体晶圆良率图:从数据到像素

原创
作者头像
闪学it点com
发布2026-09-08 13:14:01
发布2026-09-08 13:14:01
210
举报

在半导体制造和芯片测试中,晶圆映射图(Wafer Map) 是最直观的分析工具之一。它把一颗颗晶粒(Die)在圆形晶圆上的位置、测试结果(Pass/Fail)用色块可视化出来。工程师一眼就能看出“中间良率高,边缘良率低”,或者某个区域出现了系统性失效。

本文将带你用 C# + WPF,以极少量代码绘制出一张专业级的半导体晶圆良率分布图,核心逻辑仅需 30 行左右


一、WPF 绘制晶圆的数学核心

晶圆是圆形的,而晶粒是矩阵网格(Row/Column)排列的。判断一个晶粒是否“真实存在”于晶圆上,只需一个经典公式:

点到圆心距离 ≤ 半径(x - cx)² + (y - cy)² ≤ R²

为了更贴近真实半导体晶圆,我们还会在底部添加一个平边(Flat Zone)凹口(Notch)(用于晶圆定位)。为了代码足够精简,我们只实现 “圆形 + 底部平边裁剪”,并随机生成良率数据模拟测试结果。


二、极简 XAML 界面(仅 5 行核心标签)

创建一个 WPF 项目,在 MainWindow.xaml 中放入一个画布和一个按钮:

代码语言:javascript
复制
<Window x:Class="WaferMap.MainWindow"
        Title="半导体晶圆良率图" Height="600" Width="600">
    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        
        <!-- 核心绘制区域 -->
        <Border Grid.Row="0" BorderBrush="Gray" BorderThickness="1" Background="#1e1e1e">
            <Canvas x:Name="WaferCanvas" Background="Transparent" 
                    HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Border>
        
        <!-- 生成按钮 -->
        <Button Grid.Row="1" Content="🚀 随机生成晶圆良率图" 
                Margin="0,15,0,0" Padding="10" Click="GenerateWaferMap_Click"/>
    </Grid>
</Window>

三、核心 C# 绘制逻辑(30 行搞定)

MainWindow.xaml.cs 中,我们编写绘制函数。这里使用 Rectangle 作为晶粒单元,颜色编码:绿色=通过(Pass),红色=失效(Fail),深灰=空白区域。

代码语言:javascript
复制
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WaferMap
{
    public partial class MainWindow : Window
    {
        public MainWindow() => InitializeComponent();

        private void GenerateWaferMap_Click(object sender, RoutedEventArgs e)
        {
            WaferCanvas.Children.Clear();                    // 清空画布
            
            const int dieSize = 12;                           // 每个晶粒像素尺寸
            const int waferDiameter = 400;                   // 晶圆直径(像素)
            int radius = waferDiameter / 2;                  // 圆心 (200, 200)
            var rand = new Random();
            const double yieldRate = 0.82;                   // 假设综合良率82%

            // 循环遍历网格 (行/列)
            for (int row = 0; row < waferDiameter; row += dieSize)
            {
                for (int col = 0; col < waferDiameter; col += dieSize)
                {
                    // 计算晶粒中心点坐标
                    double cx = col + dieSize / 2.0;
                    double cy = row + dieSize / 2.0;

                    // 条件1: 必须在晶圆圆形轮廓内
                    bool isInsideCircle = (Math.Pow(cx - radius, 2) + Math.Pow(cy - radius, 2) 
                                           <= Math.Pow(radius - dieSize/2, 2));
                    
                    // 条件2: 模拟底部平边 (Flat Zone),y > 350 的区域裁剪掉(真实晶圆常见)
                    bool isFlatZone = cy > 350; 

                    if (isInsideCircle && !isFlatZone)
                    {
                        // 生成良率结果 (0~100随机,低于82%标红)
                        bool isGood = rand.NextDouble() < yieldRate;

                        var rect = new Rectangle
                        {
                            Width = dieSize - 1,             // -1 留出网格间隙
                            Height = dieSize - 1,
                            Fill = isGood ? Brushes.LimeGreen : Brushes.OrangeRed
                        };

                        // 定位到画布坐标
                        Canvas.SetLeft(rect, col);
                        Canvas.SetTop(rect, row);
                        WaferCanvas.Children.Add(rect);
                    }
                }
            }

            // 额外绘制晶圆外圈轮廓(增加专业感)
            var circle = new Ellipse
            {
                Width = waferDiameter - dieSize,
                Height = waferDiameter - dieSize,
                Stroke = Brushes.White,
                StrokeThickness = 1.5
            };
            Canvas.SetLeft(circle, dieSize / 2.0);
            Canvas.SetTop(circle, dieSize / 2.0);
            WaferCanvas.Children.Add(circle);
            
            Title = $"✅ 晶圆良率图生成完成 | 模拟良率: {yieldRate * 100}%";
        }
    }
}

四、代码运行效果解析

点击按钮后,你会看到:

  1. 圆形轮廓内铺满了密密麻麻的彩色小方格。
  2. 绿色区域代表测试通过的 Die,红色代表失效 Die。
  3. 底部有一条明显的空白平边(模拟晶圆定位边),这非常符合 8英寸/12英寸晶圆的外观特征。

五、专业级“少量代码”的拓展技巧

如果你希望这段代码真正用于半导体数据分析,只需修改 3 处关键点:

  1. 导入真实测试数据:将 rand.NextDouble() < yieldRate 替换为从 CSV/数据库读取的 List<DieResult>
  2. 多值颜色映射:将 bool isGood 替换为 int bin(如 Bin1~Bin10),用 switch 分配不同颜色(用于失效模式分类)。
  3. 缩放与平移:将 waferDiameter 设为动态属性,并添加 ScrollViewer 包裹画布,轻松适配 300mm 晶圆的高分辨率映射。

如果想添加“凹口(Notch)”替代平边,只需将 bool isFlatZone = cy > 350 改成计算左下角特定角度的圆弧剔除逻辑(例如 Math.Atan2(cx - radius, cy - radius) > 某个角度),但平边已经能覆盖 80% 的实际晶圆形态。


六、结语:用程序员的方式“触摸”半导体

晶圆图是半导体工程师的“仪表盘”。以往我们用 Excel 或专用 EDA 工具生成,流程冗长。而当你用 C# + WPF 写出上面这 30 行核心代码后,相当于自己打造了一个轻量级晶圆 Map 引擎。

这段代码虽然短,却完整包含了:

  • 几何裁剪(圆形 + 平边)
  • 数据可视化(Pass/Fail 映射)
  • 交互界面(一键刷新)

下一步:你可以尝试把 dieSize 调小到 6,把 waferDiameter 增加到 600。你会瞬间得到一个极其精细的“晶圆卫星图”——此时代码性能依然丝滑,因为 WPF 的硬件加速足以驾驭数千个矩形单元。

从这串极简代码出发,你离半导体大数据可视化的门槛,只差一个 using System.Windows.Shapes 的距离。快去跑起来,看看你的第一张“数字晶圆”长什么样吧!🚀

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、WPF 绘制晶圆的数学核心
  • 二、极简 XAML 界面(仅 5 行核心标签)
  • 三、核心 C# 绘制逻辑(30 行搞定)
  • 四、代码运行效果解析
  • 五、专业级“少量代码”的拓展技巧
  • 六、结语:用程序员的方式“触摸”半导体
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档