اطلاعیه

Collapse
No announcement yet.

پردازش تصویر با FPGA از صفر تا انتها

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : پردازش تصویر با FPGA از صفر تا انتها

    تفات عمده پورت VGA با سایر پورت های ویدویی نظیر HDMI آنالوگ بودن اونه. پورت HDMI از آن جهت که دیجیتالی است در نتیجه وضوح تصویرش نسبت به VGA خیلی بیشتره. حالا چطوری می شه رنگ های مختلف رو بر روی پورت VGA نمایش داد؟
    کلا سه تا پایه برای رنگ در VGA وجود داره. هر کدوم رو که یک کنین یعنی ماکزیمم مقدار ولتاژ رو روش انداختین که معادل بیشترین مقدار رنگ هست. مثلا اگر سیگنال R رو یک کنین (بیشترین مقدار ولتاژ) پر رنگ ترین قرمزی که در مانیتور امکان داره نمایش داده می شه. حالا با این سه تا سیگنال رنگی و صفر و یک کردن هر کدوم می شه هشت تا رنگ رو تولید کرد. سوالی که این جاست اینه که اگر بخواهیم قرمز کمرنگ درست کنیم چی کار کنیم؟ :biggrin:
    کافیه یه خورده سطح ولتاژ سیگنال R رو کم کنیم. ولی به چه مقدار کم کنیم و از کجا بفهیم همون مقداری رو که ما مد نظرمون هست رو نمایش می ده؟ این موضوعی است که به صورت استاندارد تعیین شده و در بسیاری از نقشه ها و دیتاشیت های مربوطه وجود داره. معمولا سه یا چهار مقاومت رو با هم موازی می کنن و به پایه قرمز و سبز و آبی وصل می کنن. به این ترتیب یه تقسیم مقاومتی به وجود می آد که سطح ولتاژ سیگنال R رو می شه تغییر داد. حالا سر آزاد هر یک از مقاومت اگه یک یا صفر بشه ترکیب تقسیم مقاومتی باعث تغییر سطح ولتاژ پایه مشترک مقاومت ها می شه و طیف های مختلف رنگ قرمز ساخته می شه.



    حالا می مونه سیگنال ها و زمانبدی هاش که به طور مفصل توضیح دادم. اگه بخواهیم خیلی دقیق تر روش کار کنیم باید کد رو بنویسم و خط به خط توضیح بدم. البته همین هدف رو هم دارم ها ولی یه خورده دیگه باید صبر کنی. برای پرهیز از به هم ریختگی روند فعلی توضیح کد رو گذاشتم برای زمان های بعدی. ولی برای این که شما و دوستان دیگه مشکلتون در زمان حال حل بشه پیشنهاد می کنم کدهاشو دانلود کنین، منبع برای VGA و کدهای مربوط هم به زبان VHDL و هم Verilog خیلی هست البته اولی بیشتر هست. تبدیلشون به هم هم کاری نداره. اگه هم بوردی از FPGA دارین قطعا توی سی دی همراهش یه مثال برای VGA هست.

    پیروز و سربلند باشید

    اضافه شده در تاریخ :
    دیگه یواش یواش وقتشه که یه بوردی هم طراحی کنیم و سفارش بدیم. روی این بورد حداقل های مورد نیاز برای پیاده سازی پردازش تصویر رو قرار می دهیم. مثلا یه دوربین از هر نوعی یا همین مدلی که در موردش حرف زدیم. یه ال سی دی و یه پورت VGA. حالا می تونین رم و غیره هم بذارین.
    پایه های ماژول ها رو هم به هر ترتیبی که خواستین می تونین وصل کنین. وقتی توی کدها در مورد پایه ای می خواهم صحبت کنم، اشاره به نامش توی اون ماژول می کنم که هر کسی هر پایه ای از FPGA رو خواست استفاده کنه متکی به این بحث و این تاپیک نباشه و دلخواه عمل کنه.
    پایه های دوربین رو به یه سمت FPGA و پایه های ال سی دی رو به یه سمت دیگه وصل کنین. البته می تونین مستقیم پایه های دوربین رو به ال سی دی هم وصل کنین و این وسط یه سری پایه های کنترلی دوربین رو به FPGA بدین ولی خوب این کار خوب نیست چون می خواهیم روی تصویری که دریافت می کنیم کارهای پردازشی انجام بدیم.
    من طراحی بورد رو شروع کردم به زودی سفارش می دم تا وقتی قراره کد نویسی کنیم بوردمون آماده باشه. شما هم کم کم شروع کنین. به زودی در مورد راه اندازی ال سی دی گرافیکی صحبت می کنیم.

    اضافه شده در تاریخ :
    حالا وقتشه که بریم سراع ال سی دی گرافیکی 3.2 اینچی. روی این ال سی دی ها یه ماژول مبدل آنالوگ به SPI هست معمولا که برای تاچ به کار می ره. البته در برخی دیگه خروجی آنالوگ روی پایه های ال سی دی قرار دادن. اگه این ماژول روش نبود برای راه اندازی ال سی دی با FPGA باید یه مبدل آنالوگ به دیجیتال براش انتخاب کنیم.
    یکی دیگه از تفاوت های ال سی دی های رنگی درایور اوناست. مساله ای که هست اینه که من با هر ال سی دی رنگی که کار کردم هر کدوم یه درایور خاص خودش رو داشت ولی اصول کار کردن با همه آن ها یکی بود. برای این که به کار کردن با این اصول اولیه آشنا بشیم یکی از این درایور ها رو انتخاب می کنم روی همون بحث می کنیم.
    درایور ال سی دی که قصد دارم تا باهاش کار کنم 8999 هست.


    اضافه شده در تاریخ :
    اولین قدم راه اندازی اولیه ال سی دی هست. توی چند مرحله انجام می شه. از این تاپیک راه اندازی اولیه رو شروع می کنیم تا جایی که بهتون بگم که مراحل راه اندازی اولیه تموم شد. بعدش می ریم سراغ مرحله های بعدی.
    اولین کاری که می کنیم اینه که هفت تا از پایه های ال سی دی رو یک می کنیم. پایه های:
    EN-LE-DIR-CS-RS-WR-RD
    به اندازه 50 میلی ثانیه صبر می کنیم.
    سوالی که مطرحه اینه که از کجا بفهمیم درایوری که داریم ازش استفاده می کنیم چیه؟ چند تا راه داره. ممکنه توی دیتاشیت ال سی دی نوشته باشه، یا ممکنه نوع درایور قابل رویت باشه. ولی جدای از همه این ها یه راهی هست که از همه سختره. ولی یادگیریش بسیار مفید خواهد بود. با استفاده از کد نویسی می شه مدل درایور ال سی دی رو پیدا کرد. خوبیه این موضوع در چند نکته هست. نخست این که یاد می گیری چطوری با FPGA رجیسترهای یه درایور رو بخونیم. چون مدل درایور توی خونه صفر رجیستر نوشته شده. دو این که فرض کنین دو نوع ال سی دی دارید. می خواهید گاهی از این و گاهی از اون یکی استفاده کنین :icon_razz: می تونین کدی بنویسد که در ابتدا خونه صفر رجیستر درایور رو بخونه. اگه مثلا 8999 بود تنظیمات مربوط به همین درایور رو فراخونی کنه اگر مثلا 8989 بود تنظیمات مربوط به اون رو فراخونی کنه. این دو تا درایور خیلی شبیه هم هستند و خیلی هم پرکاربرد. پس قدم اول شد خواندن خانه صفر رجیستر درایور. اول باید پروتکل برقراری ارتباط با درایور ال سی دی رو یاد بگیریم.

    اضافه شده در تاریخ :
    برای راه اندازی ال سی دی باید با پروتکل SSP آشنایی داشته باشیم. اگر آشنایی ندارید ایرادی نداره به زودی سیگنال های این پروتکل رو با هم مورد بررسی قرار می دهیم.

    اضافه شده در تاریخ :
    قبل از این که به ادامه بررسی سیگنال ها بپردازیم خدمت شما بگم که یه بورد حداقل برای انجام کارهای پردازش تصویر طراحی کردم و سفارش دادم شما هم اگه علاقه مند به ادامه بحث هستین اگر دوست دارین می تونین یه بوردی طراحی کنین و سفارش بدین که باقی راه رو با هم پیش بریم
    من در یکی از تاپیک ها کار یکی از دوستانم در زمینه پردازش تصویر رو قرار دادم. این دوست خوبمون یه بوردی طراحی کرده بودند که می تونین اون رو مبنا قرار بدین البته چند نکته در داخل بورد هست که چون متوجه نمی شم برای همین نمی گم که اشتباهی در طراحی بورد رخ داده فقط می گم که بهش توجه کنین. دوست خوبمون فرموده بودند که از ماژول دوربین و ال سی دی داخل سایت استفاده کرده اند، احساس می کنم ماژول دوربین و ال سی دی مزبور در زمان طراحی ایشون، پایه هایی متفاوت با ماژول های حال حاضر سایت دارند در حالی که مدل هاشون با هم یکی هست. از این جهت وقتی بوردی بدین منظور طراحی می کنین و بورد دوست خوبمون رو هم مبنای کار قرار می دهید این نکته رو مد نظر قرار بدهید ال سی دی و دوربینی که می خواهید ازش استفاده کنین حتما موجود باشه و پایه های اون مطابق دیتاشیت رعایت شده باشه.
    من از یه ال سی دی 3.2 اینچی استفاده می کنم که قبلا خریده بودم و بعدش متوجه شدم دیگه توی بازار نیست و وقتی خواستم با یه ال سی دی دیگه جایزگزینش کنم دیدم که پایه هاش به هم نمی خوره. البته می تونستم یه بورد دیگه ای طراحی کنم که این دو تا پایه رو به هم مرتبط کنه یا اصلا رو هوا سیم کشی کنم :icon_razz: ولی خدا رو شکر هنوز یکی ازش دارم. شما حواستون به این نکته باشه

    اضافه شده در تاریخ :
    اول از هر چیزی باید یه سری تنظیم های اولیه برای ال سی دی انجام بدیم. روند کلی کار به این صورت هست که برای راه اندازی اولیه ال سی دی باید بر روی برخی از رجیسترهای آن بنویسم. برای نوشتن بر روی رجیسترهای ال سی دی باید به این ترتیب عمل کنیم که:
    1- پایه cs رو صفر می کنیم
    2- آدرس رجیستر مورد نظر رو ارسال می کنیم
    3- داده ای که می خواهیم بر روی ال سی دی بنویسم رو ارسال می کنیم
    4- پایه cs رو یک می کنیم

    هنگام نوشتن بر روی یک رجیستر، یک مقداری توسط ال سی دی بر می گرده که در موردش در ادامه خواهیم گفت. حالا بریم سراغ ارسال آدرس رجیستری دلخواه به ال سی دی.

    اضافه شده در تاریخ :
    برای ارسال آدرس رجیستر مورد نظر به ال سی دی باید مقدمات زیر فراهم شود:
    1- پایه RS یک شود
    2- پایه RD یک شود
    3- آدرس رجیستر ارسال شود
    4- پایه WR صفر شود
    5- مقداری صبر
    6- پایه WR یک شود

    مرحله سه که ارسال آدرس رجیستر باشه بدین شرحه:
    1- پایه DIR ال سی دی یک شود
    2- پایه EN ال سی دی صفر شود
    3- آدرسی که قصد ارسال آن را داریم رو به صورت موازی به پایه های D0 تا D7 ال سی دی ارسال می کنیم. یعنی بیت پر ارزش آدرس متناظر با بیت پر ارزش پایه های D0 تا D7 و الی آخر
    4- پایه LE ال سی دی یک شود
    5- چند لحظه کوتاه بعد پایه LE صفر شود
    6- آدرس رجیستر هشت بیت به سمت راست شیفت داده شود و به صورت موازی به پایه های D8 تا D15 ارسال شود
    7- پایه DIR ال سی دی یک شود.

    دلیل این که دوبار آدرس رجیستر رو ارسال می کنیم اینه که ممکنه یه آدرسی بیش از دو بایت باشه. در این صورت اول بایت پایین و بعدش بایت بالای اون رو ارسال می کنیم.
    پس ازا ین به بعد هر بار که گفتیم آدرس رجیستر رو به ال سی دی ارسال می کنیم این مراحلی که از تاپیک قبل آغاز شد رو انجام می دهیم.

    اضافه شده در تاریخ :
    برای ارسال داده به رجیستر مورد نظر، بعد از ارسال آدرس رجیستر، باید مقدمات زیر را به ترتیب فراهم کنیم.
    1- پایه RS یک شود
    2- پایه RD یک شود
    3- مقدار مورد نظر ارسال شود
    4- پایه WR صفر شود
    5- مقداری صبر
    6- پایه WR یک شود

    ارسال مقدار به رجیستر ال سی دی، همانند ارسال آدرس رجیستر هست و از نظر زمان بندی سیگنال و ترتیب آن هیچ تفاونی با هم ندارند.
    تا این جا بر روی آدرس یک رجیستر دلخواه یک مقدار دلخواهی رو نوشتیم. پس از این به بعد هر بار که گفتیم بر روی رجیستر a مقدار b را بنویسید تمام مراحل این تاپیک و چند تاپیک قبل رو باید رعایت کنید.
    آدمی از عالم خاکی نمی آید بدست

    عالمی دیگر بباید ساخت و از نو آدمی
    پردازش تصویر با FPGA از صفر تا انتها
    http://www.eca.ir/forum2/index.php?topic=74299.0

    دیدگاه


      #17
      پاسخ : پردازش تصویر با FPGA از صفر تا انتها

      تا الان مقدمات راه اندازی اولیه ال سی دی رو انجام دادیم. حالا وقتشه که ال سی دی رو با نوشتن برخی مقادیر بر روی برخی رجیسترها مقدار دهی اولیه کنیم.
      اولین کاری که باید بکنیم اینه که رجیستر مربوط به oscillator ال سی دی رو روشن کنیم. آدرس این رجیستر صفر هست. این رجیستر هم خواندنی است و هم نوشتنی. اگر بخواهید مقدار آن را بخوانید، آی تراشه رو بر می گردونه و اگر بخواهید روی آن بنویسید oscillator ال سی دی رو روشن می کنه. برای روشن کردن oscillator ال سی دی بیت کم ارزش این رجیستر رو یک می کنیم و برای خاموش کردن آن مقدار صفر رو ارسال می کنیم. مقدار پیش فرض رجیستر صفر، صفر هست.
      از آن جهت که از ال سی دی استفاده می کنیم که مدل آن 8989 هست، پس اگر مقدار رجیستر صفر را بخوانیم باید مقدار 0X8989 را بر گردونه.

      پس برای راه اندازی اولیه ال سی دی بر روی رجیستر صفر آن عدد یک را بنویسید یا به عبارتی oscillator ال سی دی را روشن کنین.

      اضافه شده در تاریخ :
      رجیستر بعدی Power control 1 با آدرس صفر هست که مقدار پیش فرض 0x6664 رو داره. این رجیستر فقط نوشتنی است. به خاطر داشته باشین بین هر دو مقدار دهی رجیستر به اندازه 5 کلاک صبر کنین.
      در داخل دیتاشیت درایور ال سی دی جدولی به منظور تنظیم پارامترهای مختلف این رجیستر اومده که با مراجعه به اون می توانین پارامترهای مختلف رو تنظیم کنین. مقدار این رجیستر رو 0xA8A4 قرار دهید.
      رجیستر بعدی Power Control 2 با آدرس 0x0C هست که مقدار پیش فرض آن 0x0004 هست. شما مقدار 0 رو روی اون بنویسید. روی درایور ال سی دی یه پایه ای به اسم VCIX2 وجود داره که یه ولتاژ قابل تنظیم تولید می کنه. مقدار پیش فرضش 5.5 ولن هست ولی ما مقدارش رو روی 5.1 ولت قرار می دهیم. توی این رجیستر فقط سه تابیت کم ارزش اون قابل تنظیم هست، باقی بیت ها استفاده نمی شود.
      رجیستر بعدی Power Control 3 با آدرس 0x0D که مقدار پیش فرض اون 0x0009 هست که می تونین با توجه به دیتاشیت اون مقادیر مورد نظر رو محاسبه و اعمال کنین.


      اضافه شده در تاریخ :
      بحث رجیسترها رو همین جا متوقف می کنیم. چون روال ادامه کار به همین ترتیب هست که می تونین از داخل دیتاشیت مطالعه بفرمایید. تا این جا راه اندازی اولیه ال سی دی رو متوجه شدین. از این به بعد هر درایور ال سی دی دیگه ای هم داشته باشین می دونین چطوری باید راه اندازی اولیه کنین.
      می خواهیم به عنوان اولین قدم بعد از راه اندازی ال سی دی صفحه نمایش ال سی دی رو یه بار پاک کنیم. در ادامه ببینیم باید به چه ترتیبی عمل کنیم.

      اضافه شده در تاریخ :
      نخستین کاری که باید انجام بدیم اینه که ابعاد صفحه نمایش رو مشخص کنیم. چون درایورها که ثابتند چیزی که ممکن است در پروژه های مختلف تغییر کنه ابعاد صفحه نمایش هست. مثلا شاید بخواهیم در یه پروژه از نمایشگر 3.2 اینچی استفاده کنیم یا در یه پروژه دیگه 2.8 اینچی. برای همین باید ابعاد نمایشگر رو برای درایور مشخص کنیم. درایوری که از ابتدای بحث در موردش صحبت می کنیم رجیستری به نام Horizontal RAM address position داره که آدرسش 0x44 هست. در نمایشگرها یه نقطه شروع تصویر وجود داره یه نقطه پایان. هم در بعد افقی هم در بعد عمودی. پس چهار نقطه وجود داره که باید تعیین بشه.
      برای تعیین نقطه شروع تصویر در نمایشگر در بعد افقی به آدرس 44 عدد صفر را ارسال می کنیم. سپس برای تعیین نقطه پایان تصویر در نمایشگر در بعد افقی عدد 239 رو با هشت شیفت به سمت چپ به همان رجیستر یعنی 44 ارسال می کنیم. حالا چرا 239 و چرا هشت شیفت به سمت چپ؟
      طول صفحه نمایشی که می خواهیم ازش استفاده کنیم 240 در 320 هست. پس اگر نقطه شروع رو از صفر در نظر بگیریم نقطه پایان می شه 239. این رجیستر دو بایتی هست. بایت بالا برای نقطه پایان و بایت پایین برای نقطه شروع. برای همین باید هشت بیت به سمت چپ شیفت بدیم.

      اضافه شده در تاریخ :
      نکته که در مورد رجیستر 44 وجود داره اینه که این رجیستر دوبایتی فقط خواندی هست و همانطور که گفته شد مربوط به تعیین نقاط شروع و پایان تصویر در بعد افقی است. برای تعیین نقاط شروع و پایان از رجیسترهای 45 و 46 استفاده می کنیم. که 45 برای نقطه شروع و 46 بری نقطه پایان است. هر هشت بیت کم ارزش رجیسترهای 45 و 46 مربوط به تعیین ابعاد هستند و هشت بیت بالایی آن به صورت پیش فرض صفر هست. یعنی دیگه لازم نیست برای تعیین قسمت پایانی تصویر یک بار مقدار آن را به سمت چپ شیفت بدیم.
      پس مقدار صفر رو مستقیم به 45 برای تعیین نقطه شروع تصویر در بعد عمودی می دیم و مقدار 319 رو بدون شیفت و مستقیم به رجیستر 46 می دیم.

      اضافه شده در تاریخ :
      خوب حالا بریم صفحه نمایش رو پاک کنیم.
      در اصل کاری که انجام می دیم پاک کردن صفحه نمایش نیست. پر کردن صفحه نمایش با یه رنگ دلخواه مثل سفید یا آبی هست. برای این که در قسمت های مختلف ال سی دی پیکسلی رو ست کنیم یا به عبارت ساده تر مطلبی بنویسم یا نمایش بدیم یه آدرسی داره. درایور ال سی دی ها یه رجیستری دارند که فقط کافیه نقطه شروع حافظه رو بهش بدیم. تا مادامی که داده رو بهش ارسال می کنیم آدرس رم رو یک واحد افزایش می ده. به عبارتی یه شمارنده آدرس هست که دیگه نیاز نیست مدام به درایور آدرس حافظه ای که می خواهیم توش بنویسم رو بدیم. یک بار ابتدای آدرس رو مشخص می کنیم تا آخرین بایت داده، آدرس دونه دونه زیاد می شه.
      آدرس این رجیسترها در درایوری که داریم روش بحث می کنیم 4E-4F هستند. نامشون RAM address set هست. نام رجیسترها رو به این خاطر ذکر می کنم که در درایورهای بعدی اگر خواستین دنبال مطلب مشابه بگردین به راحتی بتونین اون رو پیدا کنین.
      خوب برای شروع پاک کردن صفحه نمایش هر دو رجیستر رو صفر می کنیم. یکی برای بعد افقی هست یکی عمودی. توی دیتاشیت با x و y مشخص کرده. اگر هم مشخص نکرده بود می شد از روی سایز رجیستر متوجه شد. تعداد پارامترهایی که برای مقدار دهی بعد افقی وجود داره از بعد عمودی بیشتر هست. چون آدرس های بیشتری رو باید در بعد افقی پیمایش کنه.
      بدین ترتیب یه نکته ای رو در مورد درایور می شه متوجه شد. همانطور که می دونین رجیسترهای 44 و 45 برای تعیین ابعاد تصویر در بعد افقی هست. این رجیستر هشت بیت قابل تنظیم داره. یعنی نهایت اندازه ای که در بعد افقی می شه براش تعیین کرد 256 هست. برای عمودی 512 هست. یعنی ابعاد نمایشگری که می شه با این درایور راه اندازی کرد 256 در 512 هست.

      اضافه شده در تاریخ :
      برای تکمیل فرآیند پاک کردن صفحه نمایش :
      1- پایه CS یک شود
      2- پایه RS صفر شود
      3- پایه RD یک شود
      4- مقدار 0x22 ارسال شود
      5- پایه WR صفر شود
      6- مقداری صبر و سپس پایه WR یک شود
      7- پایه RS یک شود (با این کار به ال سی دی می گیم که نوشتن داده آغاز شده)
      8- مقدار 0xFFFF ارسال شود و به مرحله بعدی رجوع شود
      9- پایه WR صفر شود و به مرحله بعدی رجوع شود
      10- مقداری صبر و سپس پایه WR یک شود و به مرحله بعد روجوع شود
      11 - روجوع به مرحله هشت تا پایان پیمایش کامل صفحه نمایش
      12- پایه CS یک شود

      مقدار 0xFFFF در حقیقت مقدار هگز رنگ سفید هست که بعد از هر بار ارسال این مقدار به صفحه نمایش پایه WR باید ابتدا صفر و بعد از لحظاتی یک شود.
      خلاصه روند کار به این صورت هست که بعد از ارسال آدرس صفر و صفر به ال سی دی، نمایشگر منتظر دریافت اطلاعات رنگ می شود چون در حال حاضر بر روی مختصات صفر و صفر ایستاده است. بعد از ارسال داده، شمارشگر آدرس رم یک واحد افزایش پیدا می کند و به مختصات x=1 و y=0 می رود و دوباره منتظر دریافت اطلاعات رنگ می شود. وقتی به انتهای سطر می رسد با توجه به این که ابعاد تصویر رو از قبل مشخص کردیم خود به خود مقدار y=1 و مقدار x=0 می شود تا کل صفحه نمایش پیمایش شود.



      اضافه شده در تاریخ :
      حالا بریم یه تصویر روی ال سی دی نمایش بدیم. تصویری که قراره نمایش بدیم یه عکس 320 در 240 هست. البته بستگی به ال سی دی داره که دارین ازش استفاده می کنین. اولین کاری که باید بکنیم اینه که تصویر رو تبدیل کنیم به یه سری داده دو بایتی که حاوی اطلاعات رنگی هستند به این ترتیب که سه بیت برای رنگ سبز، پنج بیت هم برای آبی. این شد بایت اول. بایت دوم می شه سه بیت برای سبز و پنج بیت برای قرمز.
      چون تبدیل کردن این فرمت از عکس کار سختیه باید یه برنامه براش بنویسید. یه برنامه با سی شارپ نوشتم که عکس رو در اندازه های مختلف بهش می دیم و تبدیل مذکور رو به عنوان خروجی ذخیره می کنه.
      حالا این تبدیل رو باید به ال سی دی منتقل کنیم.
      قبل از انتقال تصویر بر روی ال سی دی باید ابعاد صفحه نمایش رو به همراه مختصات شروع تصویر به درایور ال سی دی اعلام کنیم. بنابراین نقطه شروع عمودی تصویر رو به رجیستر 0x44 و نقطه پایان رو به بایت بالای همین رجیستر، نقطه شروع محور افقی رو به 45 و پایان رو به 46 ارسال کنین. بعدشم اون مختصاتی که ال سی دی باید منتظر بمونه تا داده رو دریافت کنه و از اون جا شروع کنه برای محور افقی به 4E و عمودی به 4F ارسال کنین. حالا آماده ایم که عکس رو ارسال کنیم.
      ابتدا پایه CS رو صفر کنین
      عدد 0x22 رو ارسال کنین
      پایه RS یک شود
      بایت ها رو دونه دونه ارسال کنین. در این جا لازم نیست آدرس رم ال سی دی رو یکی یکی افزایش بدیم. هربار که داده ای رو ارسال می کنیم خودش یه واحد افزایش پبدا می کنه
      در انتهای پایه CS یک شود
      برای ارسال داده های رنگی هم بایت به بایت ارسال می کنین بدین ترتیب که:
      اول داده رو ارسال می کنین
      WR رو صفر می کنین
      یه مقداری صبر
      پایه WR رو یک می کنین


      اضافه شده در تاریخ :
      تا این جا یاد گرفتیم که چطوری یه تصویر رو از دوربین بگیریم و چطوری پارمتر های دوربین رو تنظیم کنیم. همچنین یاد گرفتیم چطوری یه تصویر رو به VGA انتقال بدیم. در آخر هم یاد گرفتیم چطوری ال سی دی گرافیکی رو برای انتقال تصویر بر روی آن راه اندازی کنیم.

      الان دیگه باید خیلی راحت بتونین داده ای رو از دوربین بگیرین و بر روی ال سی دی منتقل کنین. فقط بحثی که می مونه اینه که سرعت خواندن داده ها از روی دوربین شاید اونقدر نباشه که بشه همزمان تصویر رو روی ال سی دی نمایش بدین. البته شاید یه دوربین و ال سی دی انتخاب کنین که بشه این کار رو کرد. به هر حال اگر سرعتشون با هم برابر نبود یادتون باشه که بر روی بورد حتما یه رم هم بذارین که داده ها رو از دوربین بخونین و بریزید توی رم و بعدش که تمام شد از رم بخونین بریزید روی ال سی دی.

      دیگی چیزی برای آموزش دادن توی بخش تئوری باقی نمونده. باقیش مربوط می شه به بخش عملی کار. تا این جا بخش تئوری تمام شد. حالا می ریم سراغ بخش عملی.
      کار رو این طوری ادامه می دیم که من یه مدتی غیبت می کنم برای این که از کارکرد بوردی که زدم مطمئن بشم. بعدش میام و در مورد نقشه ها و موارد طراحی و غیره با هم صحبت می کنیم. بعدشم که آموزش زبان برنامه نویسی سخت افزاری رو با هم پیگیری می کنیم و سعی می کنیم در وهله نخست یه تصویر بر روی ال سی دی نمایش بدیم. بعدش می ریم در مورد الگوریتم های پردازش تصویر صحبت می کنیم و در انتها یکی از الگوریتم های پردازش تصویر رو پیاده سازی می کنیم.

      در مورد برنامه نویسی یه نکته وجود داره. داشتم فکر می کردم اگر از اول و از مباحث پایه بگم ممکنه افراد حرفه ای قدری بحث براشون کسل کننده بشه. اگر هم قرار باشه حرفه ای بگم افراد علاقه مند مبتدی ممکنه لطمه بخورند و دلسرد بشن. برای همین تصمیم گرفتم درست از وسط ماجرا بگم :icon_razz: بدین ترتیب که یه کار رو به چند بخش تقسیم می کنیم یه بخش رو شروع می کنم به گفتن. مثلا می گم که بخش خواندن رجیستر ها رو پیاده سازی کنیم. بعدش حین گفتن این بخش مباحث اولیه و ابتداییش رو هم می گم. در ضمن به هر دو زبان Verilog و VHDL می گم که هرکس هر کدوم رو خواست بتونه پیاده سازی کنه. البته زبان های دیگه هم هستند مثل SystemC که انصافا بلد نیستم وگرنه اون رو هم می گفتم. حالا ایراد نداره بعدا اون رو هم یاد می گیرم بهتون می گم.


      پیروز و سربلند باشید :bye

      ادامه دارد ...
      آدمی از عالم خاکی نمی آید بدست

      عالمی دیگر بباید ساخت و از نو آدمی
      پردازش تصویر با FPGA از صفر تا انتها
      http://www.eca.ir/forum2/index.php?topic=74299.0

      دیدگاه


        #18
        پاسخ : پردازش تصویر با FPGA از صفر تا انتها

        پویا جان خسته نباشی.از بابت اینکه وقت میذاریو انقد باحوصله و دقیق و بدون چشمداشت چیزایی که یاد گرفتیو در اختیار بقیه قرار میدی ممنون.آدمایی مثله شما برا جامعه نعمتن.من از طرف خودمو همه بچه ها ازت تشکر میکنم،ایشاله همیشه موفقو پیروز باشی.
        منتظر ادامه آموزشاتون هستیم استاد. :nerd:

        دیدگاه


          #19
          پاسخ : پردازش تصویر با FPGA از صفر تا انتها

          پویا خان ممنون بابت زحماتت و یه سوال

          با این قدرت پردازش میشه جاده و ترافیک توش رو تشخیص داد؟ تا چقدر قدرت دارن این FPGA ها ( فقط میدونم همش گیت منتقی هستن)

          دیدگاه


            #20
            پاسخ : پردازش تصویر با FPGA از صفر تا انتها

            نوشته اصلی توسط arvinfx
            پویا خان ممنون بابت زحماتت و یه سوال

            با این قدرت پردازش میشه جاده و ترافیک توش رو تشخیص داد؟ تا چقدر قدرت دارن این FPGA ها ( فقط میدونم همش گیت منتقی هستن)
            بله بستگی خیلی زیادی به معماری پیاده سازی شده و کلاک سیستم داره. برای سرعت پردازشش یه مثال می زنم که شاید جالب باشه. من یه ویدویی رو خیلی وقت پیش نگاه می کردم. یه بنده خدایی اومده بود عکس یه سنجاب رو پرینت گرفته بود و وصل کرده بود به پره های یه پنکه. یه دوربین هم گذاشته بود رو به روش و روی FPGA کد زده بود و تصویر پردازش شده رو روی مانیتور نمایش می داد. کاری که کرده بود این بود که پنکه رو روشن کرده بود تا عکس سنجاب هم با سرعت زیاد باهاش بچرخه. وظیفه کدی که زده بود این بود که عکس رو تشخیص بده و در هر لحظه طوری دوارن بده که چرخش اون با پره های پنکه مشخص نشه یعنی تصویری که می دیدی یه سنجاب بود که ثابت در مرکز تصویر ایستاده و پشتش پره های پنکه در حال چرخش با سرعت زیاد هست. البته نوسان هم داشت گاهی، گاهی هم خطا داشت ولی نتیجه نهایی قدرت پردازش و سرعت FPGA رو در پیاده سازی پردازش بلادرنگ تصاویر نمایش می داد.

            پیروز و سربلند باشید
            آدمی از عالم خاکی نمی آید بدست

            عالمی دیگر بباید ساخت و از نو آدمی
            پردازش تصویر با FPGA از صفر تا انتها
            http://www.eca.ir/forum2/index.php?topic=74299.0

            دیدگاه


              #21
              پاسخ : پردازش تصویر با FPGA از صفر تا انتها

              سلام پویا جان دیگه ادامه نمیدی؟
              ما منتظر ادامه اموزشهات هستیم؟
              یه لیست از قطعاتی که برا پردازش تصویر با FPGA لازمه رو میخواستم.کسی هست جواب بده؟
              این مداری که یکی از دوستان ساخته بود قسمت دوربین و ال سی دیش رو میشه خرید، بقیه مدارش روچی؟ منظورم قسمت مدار FPGAهستش؟
              پطوری میشه تهیه کرد؟
              کسی شماتیکی از این مدار نداره؟
              نمونه برنامه ای که بشه با توسعش دوتا تصویر رو از دوربین گرفت بعد با تفریق تصویر بشه تغییرات ایجاد شده را تشخیص داد؟

              دیدگاه


                #22
                پاسخ : پردازش تصویر با FPGA از صفر تا انتها

                ممنون مهندس جان
                نوشته اصلی توسط پویا
                سلام
                قصد دارم در آبنده به اتفاق هم به پیاده سازی پردازش تصویر بر روی FPGA بپردازم.
                قرار هست در ابتدا تصویر رو از یک دوربین دریافت کنیم و سپس اون رو برای نمایش به یک مانیتور یا LCD بفرستیم. FPGA که قرار هست باهاش کار کنیم از خانواده Xilinx هست و قراره که بوردشو خودمون طراحی کنیم. همچنین از دوربین OV7670 استفاده خواهیم کرد که در فروشگاه همین سایت هم موجوده. برای LCD هم از LCD2.8 اینچی که اون هم در فروشگاه سایت موجود هست استفاده می کنیم. برای ارتباط با مانیتور هم یک سوکت VGA بر روی بورد در نظر می گیریم. من قبلا همین دوربین رو با آرم راه انداختم، می دونم که قطعا در این زمینه خیلی بیشتر از من تجربه دارید. همچنین پیش از این برای ال سی دی مذکور هم درایور نوشتم که در این زمینه هم مطلب توی همین سایت زیاد هست هم از من واردتر هستین. اتصال FPGA به مانیتور و نمایش یک گرافیک ساده کاری نداره. پیش از این تجربه اش رو داشتم. ولی انتقال تصویر دوربین به مانیتور قطعا کمی کار داره و مقداری سخته.
                برای شروع سیگنال های دوربین و ال سی دی و غیره رو با هم بررسی می کنیم. در مورد پردازش تصویر و مبانی اون برای پیاده سازی در FPGA هم قدری با هم صحبت می کنیم.

                پیروز و سربلند باشید.

                اضافه شده در تاریخ :
                معمولا هدف از اتصال یک دوربین به FPGA انجام پردازش تصویر هست. البته دوربین های مختلفی وجود دارند که می شه اون ها رو به FPGA وصل کرد. مثلا CMUCAM که هم می شه از طریق پورت سریال بهش دسترسی داشت هم این که می شه مستقیم به پایه هاش دسترسی داشت و دیتا رد و بدل کرد.
                موضوعی که توی این پروژه مد نظرم هست اینه که به طور مستقیم به دوربین دسترسی داشته باشیم نه با واسط دلیلش استفاده از حداکثر سرعت دسترسی هست. می دونم دوربینی که قصد استفاده ازش رو دارم شاید خیلی خیلی خوب نباشه ولی دلیل انتخابش سهولت در تهیه هم از نظر قیمت و هم از نظر دسترسی است همچنین سورس های خوبی هم توی اینترنت در موردش هم با آرم و هم با AVR وجود داره.
                البته بگم که قبلا این دوربین رو با آرم پیاده سازی کردم. ولی موقع پیاده سازی اونقدر به ریز جزییات دقت نکردم که مثلا در زمان فلان سیگنال فلان ارسال می شه و غیره...
                حالا وقتشه که به دقت همه موارد بررسی بشن.


                اضافه شده در تاریخ :
                می خواهم یه دوربین نسبتا خوبی رو هم بهتون معرفی کنم. این دوربین رو با آرم راه انداختم قبلا. اگه بورد های آموزشی FriendlyArm رو داشته باشین برای این دوربین جا در نظر گرفته شده. وقتی وصلش می کنین توی اندروید یا هر OS دیگه ای می تونین تصویر رو بدون هیچ دغدغه ای ببینید. علاوه بر اون می تونین توی همون OS کدی برای پردازش تصویر بزنین بدون این که دغدغه راه اندازی دوربین رو داشته باشین.
                در تصویر زیر نمایی از ماژول دوربین رو مشاهده می کنید. به این ماژول CAM130 می گن.



                نام پایه هاش رو در زیر مشاهده می کنید.



                این دوربین 1.3 مگا پیگسل با رزولوشن 640 در 480 سی فریمی با چیپ OV9650 هست. البته یه جا نوشته 640X480/1280X1024 و 30/15 fps. حالا منظورش نمی دونم نوع دیگه از این دوربین با قابلیت بهتر هست یا این که منظورش این بود که همین دوربین قابلیت سوییچ بین دو حالت کاری رو داره. مطمئن نیستم باید بیشتر بگردم. می دونم اون موقعی که با آرم راهش انداختم توی حالت 640 در 480 ازش استفاده کردم. اون موقع اصلا به این توجه نکردم که حالت دیگه ای هم داره یا نه. می بینم قضیه چیه می گم براتون.
                اول توکل
                دوم پشتکار
                سوم مشورت
                چهارم عمل
                -----------------------------------------------------------------------------------------------------------------
                نرم افزار برای دانلود نامحدود از rapideshare: http://k12student.persiangig.com/other ------- تشکر یادتون نره. موفق باشید.

                دیدگاه


                  #23
                  پاسخ : پردازش تصویر با FPGA از صفر تا انتها

                  تشکر برای تاپیک خوبتان......خواهشا ادامه بدید...خدا خیرتان دهد

                  دیدگاه


                    #24
                    پاسخ : پردازش تصویر با FPGA از صفر تا انتها

                    سلام دوستان من میخواستم یه دوربین با خروجی AV را با fpga بخونم و بتونم روی حافظه ذخیره کنم کسی میتونه کمک کنه حتی اگر هزینه بخواد هم در حد توانم در خدمتم

                    دلیل: ادغام دو پست برای جلوگیری از اسپم

                    سلام دوستان من میخواستم یه دوربین با خروجی AV را با fpga بخونم و بتونم روی حافظه ذخیره کنم کسی میتونه کمک کنه حتی اگر هزینه بخواد هم در حد توانم در خدمتم

                    دیدگاه


                      #25
                      پاسخ : پردازش تصویر با FPGA از صفر تا انتها

                      سلام خسته نباشید تویه vhdl چطور میتوانم شرطی قرار دهم وقتی ورودی i1=0 شد خروجی هامون که بر رویه LCD نمایش داده پاک شود یا 0 ؟؟؟؟؟؟

                      دیدگاه

                      لطفا صبر کنید...
                      X