Finalproject
Finalproject
پروژه پایانی
استاد درس
دکتر صفدرخانی
فصل اول :آشنایی با فشرده سازی اطالعات و کد گذاری منبع و انواع روش های
فشرده سازی اطالعات
فشردهسازی دادهها
منظور از فشرده سازی اطالعات کاستن از حجم آن به نحوی است که محتوای آن دچار تغییر نامناسبی نشود .در علوم کامپیوتر و نظریه
اطالعات ،فشردهسازی داده ها ،در واقع فرایند کدکردن اطالعات با استفاده از تعداد بیتهایی کمتر از همان اطالعاتِ کدنَشده ،و با
بهکارگرفتن روشهای ویژۀ کُدکردن است.
ارسال و دریافت اطالعات فشردهشده ،تنها زمانی کار میکند که هم فرستنده و هم گیرنده اطالعات ،روش کدکردن را بدانند .به
همین ترتیب ،داده فشردهسازی شده تنها زمانی مفهوم است که گیرنده روش کدگشایی (دیکُدکردنِ ،عکس عمل کدکردن) آن را
بداند .فشردهسازی به این دلیل مهم است که کمک میکند مصرف منابع باارزش ،مانند فضای هارددیسک یا پهنای باند ارسال ،را
کاهش دهد ،که این نکته در کاهش هزینه و جلوگیری از اتالف وقت کمک میکند .البته از طرفی دیگر ،اطالعات فشردهسازی شده
برای اینکه مورد استفاده قرار بگیرند باید از حالت فشرده خارج شوند و این فرایند اضافه ممکن است برای بعضی از برنامههای کاربردی
زیانبار باشد.
فشردهسازی بیاتالف اطالعات دستهای از الگوریتمهای فشردهسازی اطالعات است که به داده اصلی اجازه میدهد از داده فشردهشده
دقیقاً بازنویسی شود .واژه بیاتالف در تقابل با فشردهسازی بااتالف اطالعات است که در آن داده نوسازیشده ،نزدیک به داده اصلی
است و این کار به خاطر فشردهتر شدن دادهها صورت میگیرد.
فشردهسازی بیاتالف اطالعات در بسیاری از برنامهها کاربرد دارد .برای نمونه ،در گونه فایل zipاز این روش فشردهسازی استفاده
میشود.
فشردهسازی بیاتالف زمانی کاربردی میشود که همسانبودن داده اصلی و داده بازسازی شده از نسخه فشرده شده آن ،اهمیت داشته
باشد.
فصل دوم :آشنایی با الگوریتم chain codeو معرفی ساختار و مدل رفتاری الگوریتم
یک کد زنجیره ای ( ) chain codeیک الگوریتم فشرده سازی بی اتالف برای تصاویر تک رنگ است .اصل اساسی کارکرد کدهای
زنجیره ای ،این است که به طور جداگانه هر یک از تصاویر بهم متصل شده یا به اصطالح "لکه" را در تصویر کد می کند.
برای هر یک از این لکه ها ،یک نقطه در مرز انتخاب شده و مختصات آن منتقل می شود .سپس رمزگذار در طول مرز منطقه حرکت
می کند و در هر مرحله یک نماد را نشان می دهد که جهت این حرکت است.
این فرآیند تا زمانی ادامه می یابد که رمزگذار به موقعیت اولیه بازگردد ،در آن نقطه لکه به طور کامل شرح داده شده است و
رمزگذاری با لبه بعدی در تصویر ادامه می یابد.
این روش رمزگذاری مخصوصا برای تصاویری که شامل تعداد قابل قبولی از اجزای بزرگ متصل به هم می باشد ،مؤثر است.
در این پروژه ،هدف پیاده سازی کدینگ زنجیره ای فریمن هشت جهته ( )FCCE1میباشد.
در پردازش تصویر بنا به دالیلی که در فصل اول گفته شد ،گاه الزم است که تصاویر را کد کنیم .الگوریتم های کد کردن تصویر با
استفاده از بخش بندی تصویر تالش می کنند تا خصوصیات بخش های مهم و شناخته شده تصویر را به گونه ای مؤثر و به نحوی که
بازسازی مجدد تصویر با دقت کافی امکان پذیر باشد ،توصیف کنند .الگوریتم های متعددی برای کد کردن تصویر وجود دارد .الگوریتم
chain codeیکی از الگوریتمهای کد کردن تصویر می باشد .در این الگوریتم که برای کد کردن لبه های یک شیء استفاده می
1
Freeman Chain Code of Eight Directions
شود ،هریک از پیکسل های لبه شیء با یکی از ۸بردار جهت نشان داده شده در شکل 1بیان می شوند .به این ترتیب با تخصیص
کد به هریک از این بردارهای جهت می توان لبه یک شیء را کدگذاری کرد .از طرف دیگر ،با استفاده از chain codeمیتوان
ویژگیهای آماری متعددی از شیء از قبیل طول ،عرض ،محیط و مساحت را محاسبه نمود .از این پارامترها میتوان در مراحل نهایی
پردازش تصویر برای شناسایی و تصمیم گیری در مورد تصویر و همچنین مقایسه میان اشیاء مختلف موجود در تصاویر استفاده کرد.
در ضمن باید به این نکته توجه داشت که الگوریتم chain codeتنها بر روی تصاویر باینری قابل پیاده سازی است.
عملکرد الگوریتم به این صورت است که پس از یافتن اولین پیکسل لبه شیء موجود در تصویر ،جهت حرکت به سمت پیکسل بعدی
روی لبه شیء در جهت ( یا خالف جهت عقربه های ساعت با توجه به یکی از ۸جهت موجود تعیین گردیده و ذخیره می گردد .پس
از آن با اجرای الگوریتم روی پیکسل بعدی ،جهت حرکت به سمت پیکسل بعد از آن تعیین می گردد .این کار آنقدر ادامه می یابد
تا مجددا به پیکسل ابتدایی باز گردیم.
در ادامه و شکلهای زیر مثالهایی از نوع استاندارد الگوریتم فشرده سازی chain codeبرای فهم بهتر آورده شده است( .با توجه
به جمع آوری مثال ها از منابع مختلف کد مرتبط با جهت ها ممکن است متفاوت باشد ولی روش یکسان است).
مثال : 1
مثال : 2
مثال : 3
مثال : 4
مثال : 5
مثال : 6
فصل سوم :پیاده سازی الگوریتم chain codeبر روی مدارات منطقی قابل برنامه
ریزی FPGA
با مشاهده محیط یک شیء توپر ،می توان مالحظه کرد که خصوصیات chain codeیک ناحیه بسته در صورتی که نقطه شروع آن
در نظر گرفته نشود ،منحصر به فرد است و کد حاصل از الگوریتم برای یک پیکسل ،تنها به همان پیکسل و ۸پیکسل همسایه آن
بستگی دارد .با توجه به این امر ،برای پیاده سازی الگوریتم chain codeبر روی ،FPGAکافی است که روشی برای یافتن جهت
حرکتبه سمت پیکسل بعدی به دست آوریم .به این ترتیب برای یافتن کد (جهت حرکت) بعدی ،کافی است که جهت کد فعلی را
دنبال کرده تا به پیکسل بعدی لبه برسیم.
در ابتدا خاطر نشان می شود که فرض ما برای طراحی الگوریتم ، chain codeتوپر بودن شیء است و همچنین فرض می کنیم
که تنها یک شیء در داخل تصویر وجود دارد .ضمنا جهت حرکت روی لبه برای یافتن chain codeرا نیز در خالف جهت
عقربه های ساعت در نظر می گیریم .همچنین به جهت حرکت صحیح بر روی اشکال اولویت حرکت همواره با انتخاب ابتدا
راست ترین پیکسل روشن و سپس حرکت به سمت خالف جهت عقربه های ساعت خواهد بود.
. 3در تمامی اشکال فرض بر این است که جسم کامال توپر بوده و هیچ فضای خالی در داخل جسم بوسیله پیکسل های روشن احاطه
نشده است.
در بخش قبل الگوریتم chain codeبه گونه ای مناسب برای پیاده سازی روی FPGAطراحی گردید .می توان الگوریتم فوق را
ابتدا با استفاده از زبان verilogتوصیف سخت افزاری کرده و سپس برنامه مذکور را روی FPGAپیاده سازی کرد .در این بخش به
بررسی الگوریتم برنامه نوشته شده توسط زبان توصیف سخت افزار verilogمی پردازیم.
این سخت افزار به صورت State Machineعمل می کند ،لذا انجام هر کاری در آن وابسته به لبه های باال رونده ورودی CLKاست.
به این ترتیب سرعت پردازش کدها نیز با سرعت CLKورودی متناسب است .این ماشین حالت سه وضعیت دارد که در stateاول،
مقدار دهی اولیه انجام می گیرد ( .)ST1در stateدوم یافتن اولین پیکسل روشن در لبه یا اولین لبه شیء انجام می شود ( )ST2و
در سومین stateکدهای مربوط به پیکسل های لبه شیء تا بازگشت به اولین پیکسل لبه تولید می شود.
( .)ST3در این سخت افزار از یک بیت خروجی به نام Error _ Flagبرای نشان دادن هرگونه خطا در دیتای ورودی استفاده می
شود .در صورتی که مقدار آن ' '1باشد ،نشان دهنده وقوع خطا در تصویر می باشد.
این سخت افزار کل تصویر را در خود ذخیره خواهد کرد ،باید در هنگام وارد کردن اطالعات مربوط به همسایه های پیکسل جاری
به این نکته توجه کرد که اگر پیکسل جار ی جزء کناره تصویر می باشد و پیکسل های همسایه در خارج از تصویر قرار می گیرند،
آنها را ' '0در نظر می گیریم.
عملکرد برنامه به شرح زیر است:
در ابتدا باید ورودی Startرا 1کرد تا وضعیت برنامه به ST1منتقل شود .در صورتی که Startغیرفعال شده باشد ،در لبه باال رونده
بعدی ، CLKماژول استارت نشده و همچنان در stateاول باقی میماند .با 1شده استارت و آماده شدن داده ورودی ،وضعیت مدار
به stateدوم تغییر پیدا میکند .در وضعیت ، ST2آدرس اولین پیکسلی که باید ابتدا توسط دانشجو به عنوان اولین لبه تشخیص
داده شده وارد شود .در این صورت وضعیت برنامه به ST3تغییر می کند.
اگر پس از وارد کردن دیتای کلیه پیکسل ها با توجه به ابعاد تصویر ،هیچ پیکسل با مقدار 'ا' پیدا نشود Error _ Flag ،به نشانه خطا
در تصویر ' '1می گردد .همچنین اگر در هر یک از مراحل حرکت بر روی لبه تصویر مشکلی در حرکت بوجود بیاید مجددا این بیت
به نشانه خطا در کد کردن لبه تصویر 1خواهد شد.
برنامه در وضعیت ، ST3پس از دریافت پیکسل جاری ' '1به همراه همسایه های آن ،کد متناظر با آن را تولید می کند .با توجه به
کد تولید شده ،جهت حرکت روی لبه شیء مشخص می شود و به این ترتیب ،برنامه لبه را شناسایی کرده و به کار خود ادامه می
دهد .این کار تا هنگامی که برنامه دوباره به اول ین پیکسل شیء برسد ادامه می یابد .در هر مرحله از کار که دیتای اشتباهی وارد
گردد و یا چینش دیتای ورودی به نحوی باشد که آدرس پیکسل ها از محدوده مجاز خود خارج شود Error - Flag ،به نشانه وجود
خطا ' '1می گردد.
در هنگام تولید کد مربوط به پیکسل جاری ،کد تولید شده در خروجی به کاربر نشان داده می شود .البته امکان ذخیره کدها در یک
حافظه خارجی وجود دارد .در صورت نیاز به ذخیره کدها ،می بایست از یک متغیر شمارنده برای شمارش کدها در برنامه استفاده
کرد که با تولید هر کد جدید ،این کد به عنوان ورودی دیتای حافظه با توجه به مقدار شمارنده در آدرس مربوطه در حافظه ذخیره
گردد.
برای این که وارد کردن دیتای هر پیکسل به صورت دستی انجام نگیرد نیز بایستی از یک حافظه استفاده نمود .در یک روش
پیشنهادی می توان کلیه مقادیر مورد نیاز برای دیتای هر پیکسل را از قبل در خانه های حافظه جای داد .در این روش به عنوان
مثال ،در آدرس 1از حافظه ،مقادیر پیکسل 1تصویر به همراه پیکسل های همسایه آن قرار می گیرند و به همین ترتیب برای پیکسل
های دیگر خانه های بعدی حافظه پر می شوند .حال به جای اینکه برنامه در هر لحظه آدرس سطر و ستون پیکسل جاری را بدهد،
با اعمال تغیی راتی ،برنامه در هر لحظه آدرس پیکسل مورد نیاز از حافظه را در خروجی خود ظاهر می سازد که به این ترتیب با اتصال
این خروجی به خط آدرس حافظه ،می توان مقادیر پیکسل جاری و پیکسل های همسایه را از حافظه دریافت کرده و کد متناظر با
آن را تولید کرد.
پس از اتمام کار تولید کدها با رسیدن به پیکسل ابتدایی ،محیط و مساحت شیء محاسبه و در خروجی نشان داده می شود .در ضمن
آدرس موجود در خروجی نیز در انتهای کار ،نشان دهنده اولین پیکسل شیء هستند که این آدرس می تواند برای بازیابی مجدد
شیء از chain codeموجود ،مفید باشد.
فصل چهارم :نکات مهم در تحویل پروژه
الف) ضمن آشنایی با الگوریتم فشرده سازی chain codeو مدل کالسیک ( )F8معرفی شده ،سخت افزاری طراحی کنید که بر
مبنای Top_Moduleزیر رفتار کند:
code
reset done
CLK error
start Chain code perimeter
encoder area
Start pixel_X
Start pixel_Y
: Startبرای شروع کار ماژول کد گذار بر روی تصویری که از قبل در blk memoryقرار گرفته است.
ب ) خروجی ها:
: Codeکد خروجی تولید شده توسط ماژول کد گذار بعد از اتمام عملیات که به صورت UARTبه بیرون ارسال میگردد.
: Doneفرمان اتمام عملیات کد گذاری که پس از اتمام کد گذاری 1خواهد شد.
: Errorاعالم وجود یا عدم وجود مشکل و خطایی در هر یک از عملیات های پردازش تصویر که در صورت وقوع خطا 1خواهد شد.
: Perimeterمحیط تعیین شده برای تصویر داده شده بر اساس اندازه لبه هر پیکسل
: Areaمساحت تصویر داده شده (تعداد پیکسل های روشن تصویر)
: Start pixelمختصات پیکسلی که به عنوان اولین لبه تصویر توسط ماژول تشخیص داده شده است.
تصاویر نمونه برای تشخیص صحت سخت افزار توصیف شده به شرح زیر میباشد.
تصویر شماره : 1
تصویر باینری داده شده بایستی ابتدا توسط نرم افزار و زبان های برنامه نویسی های مربوطه (مانند نرم افزار متلب و یا هر زبان برنامه
نویسی دلخواه) به مقادیر پیکسلی ( )raw formatتبدیل گردد.
مقادیر پیکسلی تصویر میبایست ابتدا در یک فایل (طبق فرمت خاص) قرار گرفته و به هنگام توصیف سخت افزار همگی در یک
ipcoreاز نوع ramقرار بگیرند .لذا رعایت ترتیب ذخیره سازی پیکسل ها به هنگام خواندن از ipcoreمهم خواهد بود.
داده های ورودی ماژول کد گذار نیز در هر لحظه با توجه به نیاز از ipcoreخوانده میشوند.
در ابتدا ماژول کد گذ ار میبایست به تشخیص اولین پیکسل روشن ( اولین لبه تصویر) بپردازد و عملیات کد گذاری را از آنجا آغاز
کند.
جهت کد گذاری همانند مدل کالسیک ۸جهته با رعایت اولویت گفته شده و در خالف جهت عقربه های ساعت خواهد بود.
پس از پایان عملیات کدگذاری میبایست کد خروجی در قالب ارتباط سریال از نوع UARTبه سمت گیرنده ارسال گردد .مشخصات
مورد نیاز برای ارتباط سریال از نوع UARTبه شرح زیر خواهد بود:
Clock frequency : 50 Mhz
Baud rate : 9600 Bps
تصویر ورودی 46×46پیکسل بوده و انتخاب تمامی عرض بیت های مورد نیاز ورودی و خروجی ماژول و نوع ipcoreانتخاب شده
از جنس حافظه و عرض بیت های آن بر عهده دانشجو میباشد.
بهتر است توصیف سخت افزاری با توجه به رعایت ماشین حالت انجام شود با این حال تمامی توصیف های سخت افزاری صحیح بغیر
از ماشین حالت نیز نمره کامل را خواهند گرفت.
ب ) ضمن آشنایی با الگوریتم فشرده سازی chain codeو مدل کالسیک معرفی شده آن و طراحی سخت افزاری کد گذار آن ،
سخت افزاری طراحی کنید که بر مبنای top_moduleزیر رفتار کند:
code pixels
reset done
CLK error
start
Chain code
perimeter
decoder
area
Start pixel_X
Start pixel-Y
جزئیات پورت های ورودی و خروجی به شرح زیر است:
الف ) ورودی ها :
chain code : codeبرای وارد کردن
: Resetبرای ریست کردن ماژول کد گشا
: CLKکالک اصلی سخت افزار
: Startبرای شروع کار ماژول کد گشا بعد از آماده شدن کد و یا شروع مجدد ماژول کد گشا
: Perimeterمحیط تعیین شده برای تصویر داده شده بر اساس اندازه لبه هر پیکسل
: Areaمساحت تصویر داده شده (تعداد پیکسل های روشن تصویر)
: Start pixelمختصات پیکسلی که به عنوان اولین لبه تصویر توسط ماژول تشخیص داده شده است.
ب ) خروجی ها:
: pixelsرسم تصویر اولیه از طریق 1کردن پیکسل هایی که روشن هستند (دو بعدی)
: Doneفرمان اتمام عملیات کد گشایی که پس از اتمام کد گزاری 1خواهد شد.
: Errorاعالم وجود یا عدم وجود مشکل و خطایی در هر یک از عملیات های پردازش تصویر که در صورت وقوع خطا 1خواهد شد.
-5تصویر خروجی 46×46پیکسل بوده و انتخاب تمامی عرض بیت های مورد نیاز ورودی و خروجی ماژول و نوع ipcoreانتخاب
شده از جنس حافظه و عرض بیت های آن بر عهده دانشجو میباشد.
بهتر است توصیف سخت افزاری با توجه به رعایت ماشین حالت انجام شود با این حال تمامی توصیف های سخت افزاری صحیح بغیر
از ماشین حالت نیز نمره کامل را خواهند گرفت.
نکات مهم در مورد گزارش پروژه :
-1با توجه به ساختار ، Top Down Designتمامی زیر ماژول های مناسب را پیاده سازی کنید
-۲زیر ماژول های تعریف شده را تک تک طراحی کنید و صحت کار آن را از طریق شبیه سازی تست کنید.
-3با استفاده از زیر ماژول ها پروژه کلی را پیاده سازی و شبیه سازی کنید.
موفق باشید.