সহযোগিতা
কলা
সৌন্দর্য এবং সুস্থতা
ক্রাফট
সংস্কৃতি ও ইতিহাস
বিনোদন
পরিবেশ
খাদ্য ও পানীয়
রিভার্স ইঞ্জিনিয়ারিং
বিজ্ঞান
খেলাধুলা
টেকনোলজি
পরিধানযোগ্য
বringup: আপনার নিজের চিপের প্রথম ঘণ্টা, একটি ESP32 দ্বারা পরীক্ষিত
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

তৈরি করেছেন

Ed

29. সেপ্টেম্বর 2026FI
৪৩
০
০
০
০

বringup: আপনার নিজের চিপের প্রথম ঘণ্টা, একটি ESP32 দ্বারা পরীক্ষিত

ব্রিং-আপ হলো নতুন সিলিকনের প্রথমবার পাওয়ার-অন করার প্রক্রিয়া, এবং এর ক্রম যেকোনো একক পরীক্ষার চেয়েও বেশি গুরুত্বপূর্ণ। পাওয়ার দেওয়ার আগে দেখুন, ঘড়ি (clock) দেওয়ার আগে পাওয়ার দিন, এবং অন্য কিছু করার আগে কারেন্ট সীমিত করুন, কারণ একটি শর্ট সার্কিট যা কারেন্ট লিমিট এক সেকেন্ডে ধরে ফেলত, তা আপনার একমাত্র চিপগুলো নষ্ট করে দিতে পারে। এই ধাপটি আগের ধাপগুলোর PWM ডিমারের ব্রিং-আপ পরিকল্পনা, রung ২-এর ব্রেকআউট বোর্ডে। একটি ESP32 একটি ল্যাবের কাজ করে: এটি চিপের ক্লক তৈরি করে, রিসেট ধরে রাখে, আটটি প্যাডে ডিউটি সেট করে এবং ফিরে আসা PWM সময় মাপে, তারপর প্রতিটি ডিউটির জন্য PASS বা FAIL প্রিন্ট করে। একটি নোটবুক ব্যর্থতাকে সেই প্যাডের নামে রূপান্তর করে যার তার ভুল। সৎভাবে বলতে গেলে: এখনও কোনো চিপ নেই। স্কেচটি এই ব্লুপ্রিন্টের জন্য কম্পাইল করা হয়েছে এবং প্রত্যাশিত সংখ্যাগুলো আগের ধাপগুলোর সিমুলেশন থেকে এসেছে; প্রথম বাস্তব রান আপনার।
উন্নত
চিপ আসার পর এক বিকেল

নির্দেশাবলি

1

যা আশা করা যায় সেই সংখ্যাগুলো, এবং কীভাবে একটি ব্যর্থতা পড়তে হয়

Jupyter নোটবুক লোড হচ্ছে…
2

আপনি যে চিপটি চালু করছেন

এমবেডেড ব্লুপ্রিন্টটি প্রতিটি ইনপুটে পুল-ডাউন বসায়, তাই একটি আনপ্লাগড চিপ নিষ্ক্রিয় অবস্থায় থাকে। এই পরিকল্পনাটি মূলত এটিই পরীক্ষা করে।
3

কোনো বিদ্যুৎ সংযোগের আগে

কিছুই সংযুক্ত না রেখে, লুপের নিচে ব্রেকআউটের উপর বসানো চিপ-অন-বোর্ডটি দেখুন: চিপটি সমানভাবে বসানো, কোনো সোল্ডার ব্রিজ নেই, কিছুই ঢিলে নেই। এরপর মাল্টিমিটার দিয়ে ব্রেকআউটের একটি VDD IO প্যাড এবং একটি GND IO প্যাডের মধ্যে রোধ পরিমাপ করুন, উভয় পোলারিটিতে, এবং দুটি সংখ্যাই লিখে রাখুন। শূন্যের কাছাকাছি পাঠ মানে শর্ট সার্কিট: সেখানেই থামুন। রান-1 প্যাড টেবিলে উল্লেখ করা আছে কোন ব্রেকআউট প্যাডগুলো VDD IO এবং GND IO; আপনার রানের টেবিল ব্যবহার করুন, কারণ wafer.space বলে যে রানের মধ্যে পিনআউট পরিবর্তিত হয়। একইভাবে পরীক্ষা করুন যে কোনো ডেটা প্যাড তার পাশের প্যাড বা গ্রাউন্ডের সাথে শর্ট হয়নি।

এই ধাপের উপকরণ:

কাস্টম ASIC ডাইকাস্টম ASIC ডাই1 টুকরা
মুদ্রিত বর্তনী বোর্ডমুদ্রিত বর্তনী বোর্ড1 টুকরা

প্রয়োজনীয় সরঞ্জাম:

মাল্টিমিটারমাল্টিমিটার
4

কম সীমায় বিদ্যুৎ

বেঞ্চ সাপ্লাইকে আপনার চিপের সাপ্লাই ভোল্টেজে সেট করুন, সংযোগ দেওয়ার আগে। সেই ভোল্টেজ নির্ভর করে আপনার চিপ যে লাইব্রেরি দিয়ে তৈরি হয়েছে তার উপর: টেমপ্লেটের ডিফল্ট লাইব্রেরি 5 V, এবং এটি 3.3 V লাইব্রেরি দিয়েও বিল্ড হতে পারে। সঠিক মান আপনার রানের ডকুমেন্টেশন থেকে নিন; run-1 প্যাড টেবিলে পাওয়ার প্যাডের নাম আছে কিন্তু তাদের ভোল্টেজ নেই। সাপ্লাই রেগুলেট করতে পারে এমন সর্বনিম্ন সেটিংয়ে কারেন্ট লিমিট সেট করুন, VDD IO এবং GND IO সংযুক্ত করুন, এবং ESP32 এখনও সংযুক্ত না রেখে চালু করুন। কোনো ক্লক না থাকলে এবং প্রতিটি ইনপুট নিচে টানা থাকলে চিপটি স্থির থাকা উচিত। কারেন্ট লিখে রাখুন। যদি সাপ্লাই সরাসরি কারেন্ট লিমিটিংয়ে চলে যায়, বন্ধ করুন: কোথাও শর্ট আছে। পরে আরও দুইবার কারেন্ট রেকর্ড করুন, ক্লক চলার সময় রিসেটে এবং একটি প্যাটার্ন চালানোর সময়। এই তিনটি সংখ্যা আপনার চিপের নিজস্ব স্বাক্ষর; যে বোর্ড পরে আজকের চেয়ে অনেক বেশি কারেন্ট টানে, তাতে ত্রুটি আছে।

প্রয়োজনীয় সরঞ্জাম:

বেঞ্চ বিদ্যুৎ-সরবরাহবেঞ্চ বিদ্যুৎ-সরবরাহ
মাল্টিমিটারমাল্টিমিটার
5

ESP32 তার সংযুক্ত করুন

বারোটি তার, ছবি এবং স্কেচের শিরোনামে যেমন আছে: ঘড়ির প্যাডে GPIO 27, rst_n-এ 26, ইনপুট 0-এ (enable) 32, দ্বিমুখী প্যাড 0 থেকে 7 পর্যন্ত 13, 14, 18, 19, 21, 22, 23 ও 25, এবং দ্বিমুখী প্যাড 8 ফিরিয়ে GPIO 34-এ, সাথে একটি সাধারণ গ্রাউন্ড। GPIO 34 হল ESP32-এর একটি শুধুমাত্র-ইনপুট পিন, তাই এটি কখনও চিপের আউটপুটের সাথে সংঘর্ষ করতে পারে না। ESP32 একটি 3.3 V অংশ এবং এর ইনপুটগুলি 5 V সহনশীল নয়। যদি আপনার চিপের I/O 3.3 V না হয়, তবে বারোটি লাইনের সবগুলিতে লেভেল কনভার্টার বসান: তিনটি চার-চ্যানেল বোর্ড। সাধারণ ধরনটিতে উভয় পাশে পুল-আপ রেসিস্টর থাকে, যা ESP32 তার পিনগুলি চালনা না করা পর্যন্ত চিপের দুর্বল পুল-ডাউনগুলিকে ওভাররাইড করতে পারে; স্কেচটি শুরু হওয়ার সাথে সাথেই ঘড়ি চলার আগে রিসেট ও enable কম রাখে।

এই ধাপের উপকরণ:

লজিক স্তর রূপান্তরকলজিক স্তর রূপান্তরক3 টুকরা
জাম্পার তারজাম্পার তার1 টুকরা

প্রয়োজনীয় সরঞ্জাম:

ব্রেডবোর্ডব্রেডবোর্ড
6

The test sketch

bringup.ino. It starts the chip's clock with the ESP32's LED PWM peripheral at 100 kHz, with 1-bit resolution for a plain square wave; holds reset low for 1,000 chip clocks; checks that the output stays low while enable is off; then sets seven duty values and measures the high time with pulseIn, averaged over eight periods, against 10 microseconds per step, within 3 microseconds. It compiles for the ESP32 with the Arduino ESP32 core 3.3.12; it has not been run, because the chip does not exist yet.
bringup.inocpp
// SPDX-License-Identifier: Apache-2.0
// First-light test for the PWM dimmer chip (Youblob silicon rungs 3 and 6), run from an ESP32.
// The ESP32 is the whole lab: it makes the chip's clock, holds its reset, sets the duty on eight
// pads, and times the PWM that comes back, then prints PASS or FAIL for each duty value.
//
// Wiring, through a logic level converter if your chip's I/O is not 3.3 V (see the blueprint):
//   CLK      GPIO 27  -> clk pad         RST_N  GPIO 26 -> rst_n pad   (both clear of the boot strapping pins)
//   EN       GPIO 32  -> input[0]        D0..D7 GPIO 13,14,18,19,21,22,23,25 -> bidir[0..7]
//   PWM_IN   GPIO 34  <- bidir[8]        (GPIO 34 is input-only on the ESP32: it cannot fight the chip)
//   and a common ground.

const int PIN_CLK = 27, PIN_RST = 26, PIN_EN = 32, PIN_PWM = 34;
const int DATA_PINS[8] = {13, 14, 18, 19, 21, 22, 23, 25};

// 100 kHz: slow enough for a level converter's pull-up edges, and one chip clock is 10 us,
// so pulseIn's 1 us resolution sees a tenth of a clock.
const uint32_t CHIP_CLK_HZ = 100000;
const float US_PER_CLK = 1e6f / CHIP_CLK_HZ;
const float PERIOD_US = 256 * US_PER_CLK;          // one PWM period: 256 chip clocks = 2560 us
const float TOL_US = 3.0f;                         // allowed error, about a third of a clock

void setDuty(uint8_t d) {
  for (int b = 0; b < 8; b++) digitalWrite(DATA_PINS[b], (d >> b) & 1);
}

// Average high time over n periods; returns -1 if the pin never went high (pulseIn timed out).
float meanHighUs(int n) {
  float sum = 0;
  for (int i = 0; i < n; i++) {
    unsigned long t = pulseIn(PIN_PWM, HIGH, 3 * (unsigned long)PERIOD_US);
    if (t == 0) return -1;
    sum += t;
  }
  return sum / n;
}

bool alwaysLow(unsigned long ms) {
  unsigned long t0 = millis();
  while (millis() - t0 < ms)
    if (digitalRead(PIN_PWM)) return false;
  return true;
}

void setup() {
  Serial.begin(115200);
  delay(500);
  for (int b = 0; b < 8; b++) pinMode(DATA_PINS[b], OUTPUT);
  pinMode(PIN_RST, OUTPUT);
  pinMode(PIN_EN, OUTPUT);
  pinMode(PIN_PWM, INPUT);

  // Reset low BEFORE the clock starts, then give the chip some clocks in reset.
  digitalWrite(PIN_RST, LOW);
  digitalWrite(PIN_EN, LOW);
  setDuty(0);
  if (!ledcAttach(PIN_CLK, CHIP_CLK_HZ, 1)) {      // 1-bit resolution: a plain square wave
    Serial.println("FAIL: could not start the clock on GPIO 27");
    return;
  }
  ledcWrite(PIN_CLK, 1);                           // 1 of 2 steps high = 50 % duty
  delay(10);                                       // 1,000 chip clocks in reset
  digitalWrite(PIN_RST, HIGH);

  Serial.printf("# chip clock %lu Hz, PWM period %.0f us\n", (unsigned long)CHIP_CLK_HZ, PERIOD_US);
  Serial.println("duty,expected_us,measured_us,result");
  int fails = 0;

  // Disabled: the output must stay low whatever the duty.
  setDuty(200);
  bool low = alwaysLow(20);
  Serial.printf("disabled,0,%s,%s\n", low ? "0" : "high seen", low ? "PASS" : "FAIL");
  fails += !low;

  digitalWrite(PIN_EN, HIGH);
  const uint8_t duties[] = {0, 1, 16, 64, 128, 200, 254};
  for (uint8_t d : duties) {
    setDuty(d);
    delay(10);                                     // let a few periods pass with the new value
    float expected = d * US_PER_CLK;
    float got;
    bool ok;
    if (d == 0) {
      ok = alwaysLow(20);
      got = ok ? 0 : meanHighUs(8);                // a pad stuck high shows up here as a duty above 0
    } else {
      got = meanHighUs(8);
      ok = got >= 0 && fabsf(got - expected) <= TOL_US;
    }
    Serial.printf("%u,%.1f,%.1f,%s\n", d, expected, got, ok ? "PASS" : "FAIL");
    fails += !ok;
  }
  Serial.printf("# %d failure(s)\n", fails);
}

void loop() {}

প্রয়োজনীয় সরঞ্জাম:

ESP32 উন্নয়ন বোর্ডESP32 উন্নয়ন বোর্ড
ডেস্কটপ কম্পিউটারডেস্কটপ কম্পিউটার
7

একটি ভালো চিপ কী প্রিন্ট করে

115200 বড রেটে সিরিয়াল মনিটর খুলুন। একটি কার্যকর চিপ প্রতি লাইনে ডিউটি, প্রত্যাশিত ও পরিমাপিত হাই টাইম (মাইক্রোসেকেন্ডে) এবং ফলাফল প্রিন্ট করে: # চিপ ক্লক 100000 Hz, PWM পিরিয়ড 2560 us duty,expected_us,measured_us,result disabled,0,0,PASS 0,0.0,0.0,PASS 1,10.0,10.0,PASS ... 254,2540.0,2540.0,PASS # 0 failure(s) এরপর এই ক্লকে একটি পিরিয়ড 2,560 মাইক্রোসেকেন্ড হওয়া উচিত, পরিষ্কার এজসহ, তা দেখতে অসিলোস্কোপ দিয়ে পিন 8-ও পরীক্ষা করুন। স্কেচ সময় পরিমাপ করে; স্কোপ আকৃতি দেখায়, আর লেভেল কনভার্টারের মধ্য দিয়ে ধীর বা রিংিং এজ শুধু সেখানেই দৃশ্যমান হয়।

প্রয়োজনীয় সরঞ্জাম:

ডিজিটাল অসিলোস্কোপডিজিটাল অসিলোস্কোপ
8

একটি চিপ যা চালু হয় না

বring-up সমস্যা সমাধান।

Flow

Loading...
9

উৎস এবং সৎ সীমাবদ্ধতা

**উৎস**, ২৯ সেপ্টেম্বর ২০২৬ তারিখে পড়া: wafer-space/chip-on-board-wire-bonded-pcbs, run-1/README.md (যে প্যাড টেবিলে VDD IO এবং GND IO প্যাডের নাম দেওয়া আছে, এবং উল্লেখ আছে যে রানভেদে পিনআউট পরিবর্তিত হয়); wafer-space/gf180mcu-project-template, README.md এবং Makefile (৫ V ডিফল্ট এবং ৩.৩ V লাইব্রেরি বিকল্প); উচ্চ সময়ের প্রত্যাশিত মানের জন্য পূর্ববর্তী ধাপগুলোর সিমুলেশন। **সৎ সীমাবদ্ধতা।** এখনো কোনো চিপ নেই: এই পরিকল্পনা ও এর স্কেচ সিলিকনে চালানো হয়নি। সরবরাহ ভোল্টেজ ও কারেন্ট এখানে উল্লেখ করা হয়নি, কারণ এই লেখার সময় উপলব্ধ রান ডকুমেন্টেশনে তা বলা নেই। পুল-ডাউনের উপর লেভেল কনভার্টারের প্রভাব আপনি যে বোর্ড ব্যবহার করেন তার উপর নির্ভর করে।

উপকরণ

4

প্রয়োজনীয় সরঞ্জাম

6

CC0 পাবলিক ডোমেন

এই ব্লুপ্রিন্ট CC0-এর অধীনে প্রকাশিত। আপনি অনুমতি ছাড়াই যেকোনো উদ্দেশ্যে এটি অনুলিপি, পরিবর্তন, বিতরণ ও ব্যবহার করতে পারেন।

মেকারের ব্লুপ্রিন্টের মাধ্যমে পণ্য কিনে তাঁকে সমর্থন করুন, যেখানে তিনি আয় করেন মেকার কমিশন বিক্রেতাদের নির্ধারিত, অথবা এই ব্লুপ্রিন্টের একটি নতুন সংস্করণ তৈরি করে নিজের ব্লুপ্রিন্টে সংযোগ হিসেবে যুক্ত করে আয় ভাগ করুন।

আলোচনা

(0)

লগ ইন করুন আলোচনায় যোগ দিতে

মন্তব্য লোড হচ্ছে...