فایل شاپ

فروش مقاله،تحقیقات و پروژه های دانشجویی،دانلود مقالات ترجمه شده،پاورپوینت

فایل شاپ

فروش مقاله،تحقیقات و پروژه های دانشجویی،دانلود مقالات ترجمه شده،پاورپوینت

طراحی و ساخت ربات پردازشگر تصویر در متلب

طراحی و ساخت ربات پردازشگر تصویر در متلب
دسته بندی الکترونیک و مخابرات
بازدید ها 33
فرمت فایل pdf
حجم فایل 617 کیلو بایت
تعداد صفحات فایل 8
طراحی و ساخت ربات پردازشگر تصویر در متلب

فروشنده فایل

کد کاربری 7411
کاربر

طراحی و ساخت ربات پردازشگر تصویر در متلب

فایل بصورت pdf می باشد


مقاله اصول برنامه نویسی اسمبلی

مقاله اصول برنامه نویسی اسمبلی در 46 صفحه ورد قابل ویرایش
دسته بندی کامپیوتر و IT
فرمت فایل doc
حجم فایل 31 کیلو بایت
تعداد صفحات فایل 46
مقاله اصول برنامه نویسی اسمبلی

فروشنده فایل

کد کاربری 6017

مقاله اصول برنامه نویسی اسمبلی در 46 صفحه ورد قابل ویرایش

CPU تراشه enCorRe دستور پشتیبانی می‌کند. همه برنامه‌ها باید از این 37 دستور استفاده کنند. سیپرس یک مترجم مجانی ارائه می‌دهد که کدهای اسمبلی را که شما می‌نویسید به فایل‌های موضوع، که به منظور برنامه‌ریزی در EPROM تراشه تهیه می‌شوند، تبدیل می‌کند. اگر ترجیح دهید که در C برنامه‌نویسی کنید، سیپریس یک مفسر C نیز پیشنهاد می‌کند.

اگر با برنامه‌نویسی اسمبلی میکروکنترلر آشنایی داشته باشید، برنامه‌نویسی برای enCoRo نیز مشابه همان است. اما اگر با برنامه‌نویسی در بیسیک و C آشنا هستید، باید بدانید که در برنامه‌نویسی کدهای اسمبلی بسیاری از عملگرهای زبانهای سطح بالا موجود نیست در اینجا دیگر حلقه‌های While یا ‌for یا انواع مختلف متغیرها وجود ندارد. اما برای تراشه‌‌ای مانند enCoRo که به منظور کارهای نمایشی و کنترلی غیر پیچیده طراحی شده است، استفاده از کدهای اسمبلی عملی است. برای برنامه‌های کوتاه، که به سرعت اجرا می‌شوند احتیاجی به خرید مفسر نیست.


اصول برنامه‌نویسی اسمبلی

برنامه‌نویسی اسمبلی شامل یک مجموعه از دستورات است که هر کدام مربوط به کدهای ماشینی هستند که تراشه از آنها پشتیبانی می‌کند. مثلاً دستور iord، که محل io را می‌خواند به کد h29 مربوط است. به جای به خاطر آوردن h 29، شما می‌توانید iord را بنویسید، و مترجم معادل سازی را برای شما انجام خواهد داد. دستور iord همچنین احتیاج به یک عملوند دارد که محل خواندن را مشخص کند. به عنوان مثال 01h iord پورتی با آدرس h 10 را می‌خواند.

زبان برنامه‌نویسی اسمبلی همچنین می‌تواند شامل دایرکتیو[1] و توضیحات باشد. دایرکتیوها دستوراتی هستند که به جای اینکه مربوط به CPU باشند، مربوط به مترجم می‌باشند. دایرکتیوها شما را قادر می‌سازند که محلی از حافظه را مشخص کنید، متغیرهایی تعریف نمایید. در کل، نقشی که مترجم در کنار اجرای دستورات مشخص شده باید ایفا کند را نشان می‌دهند. یک نقطه ویرگول ( : )یا ممیز دوبل ( // ) یک عبارت توصیفی را مشخص می‌کنند که مترجم از آنها چشم‌پوشی می‌کند.

مترجمی که توسط سیپرس ارائه می‌شود، cyasm.exe قابل اجرا در پنجره داس[2] می‌باشد. سیپرس مرجع‌ها و راهنمای استفاده برای کاربرانی را تهیه کرده است که چگونگی استفاده از مترجم را شرح می‌دهد.

مترجم از دو مجموعه دستور مشابه برای CPU‌های سری A و سری‌B پشتیبانی می‌کند. تراشه‌های enCoRo از سری B هستند. تراشه‌های قدیمی‌تر سیپرس، مانند 63001، از سری A بودند و از همة دستورات بجز بعضی از آنها پشتیبانی می‌کنند.

کدهای مترجم

راهنمای کاربران دارای توضیحات کاملی در مورد کد اسمبلی و دایرکتیوهاست و در اینجا برخی از جزئیات آن تکرار می‌شود. جدول 1-8 خلاصه‌ای از کدها می‌باشد و جدول 2-8 خلاصه‌ای از دایرکتیوها را نشان می‌دهد. کدهای ماشین تراشه به 37 دستور ترجمه شده است.

خصوصیات و محدودیت‌ها

یکی از دلایل انتخاب تراشه 63743، ارزان قیمت بودن آن است. قیمت این تراشه حدود چند دلار در سفارشهای محدود می‌باشد.

تراشه دارای 8 کیلوبایت حافظه برنامه است. با یک بهینه‌سازی، کدهایی که برای پشتبانی از ارتباطات USB لازم است، می‌توانند در یک کیلوبایت جای گیرند و به این ترتیب 7 کیلوبایت باقیمانده می‌توانند برای کاربردهای دیگر استفاده شوند.

یک ابزار ضروری برای ارتقای این تراشه کیت ارتقا می‌باشد که شامل بر ارتقا، مترجم و برنامه‌های اشکال زدایی است. همچنین ممکن است احتیاج به برنامه‌ریز Lo PROM –Hi CY3649 نیز داشته باشید که همه این ابزارها توسط سیپرس در دسترس قرار گرفته است.

63743 برای همه پروژه‌ها مناسب نیست. این تراشه دارای سرعت پایین است که به معنای آن است که شما نمی‌توانید به منظور انتقالهای همزمان و توده‌ای از آن استفاده کنید. و سریعترین زمان تأخیر ممکن دارای انتقال وقفه‌ای، 8 بایت در هر 10 میلی‌ثانیه می‌باشد. برخلاف بعضی از کنترلرهای اولیه، 63743 از انتقال وقفه‌ای خروجی پشتیبانی می‌کند.

درون تراشه

CPU این تراشه یک RISC هشت بیتی است که می‌تواند به حافظه برنامه، RAM، پورت‌ها‌ی I/O همه کاره و البته پورت USB دسترسی داشته باشد. پورت USB در حقیقت یک پورت سوئیچ خودکار است که هر دو واسط USB و PS/2 را برای ماوس و دیگر دستگاه های نقطه‌یابی ممکن می‌سازد. این ویژگی به منظور طراحی دستگاه‌هایی که قابل تطبیق با هر دو باس باشند قرار گرفته است. وقفه‌ها و ریست‌های مختلفی می‌توانند به CPU وقفه بدهند.

کنترل و وضعیت اندپوینت

هر کدام از اندپوینت‌ها همچنین دارای یک رجیستر شمارنده اندپوینت هستند که حاوی اطلاعاتی دربارة پاکت داده‌ای انتقال یافته یا در حال انتقال است. هر کدام از این رجیسترها دارای چهار بیت ‌شمارنده، یک بیت زنجیره داده و بیت وجود داده، هستند. چهار بایت شمارنده، تعداد بایت‌های داده ترنزکشن را نگهداری می‌کند. در ترنزکشن ورودی، این مقدار مشخص می‌کند که چه تعداد بایت داده در ترنزکشن را نگهداری می‌کند. در ترنزکشن ورودی، این مقدار مشخص می‌کند که چه تعداد بایت داده در ترنزکشن بعدی فرستاده می‌شود، این تعداد بایت شامل بایت‌های CRC نمی‌شود. مقادیر مجاز بین صفر و هشت می‌باشند. در ترنزکشن‌های خروجی و Setup، این مقدار تعداد بایت‌هایی را که در آخرین ترنزکشن رسیده است مشخض می‌کند که این مقدار شامل دو بایت CRC نیز می‌شود. مقادیر مجاز بین 2 تا 10 می‌باشد. شمارنده خروجی و Setup تا هنگامی که برنامة تراشه رجیستر را بخواند قفل می‌گردد.

در ترنزکشن‌های خروجی و Setup اگر مقادیر CRC رسیده صحیح نباشند، مقدار بیت وجود داده یک می‌گردد.

بیت Data-toggle حالت تغییر مشخصه پاکت داده را تعیین می‌کند. در ترنزکشن‌های ورودی، برنامة تراشه این مقدار را تنظیم می‌کند و در ترنزکشن‌های خروجی و Setup این بیت را SIE تنظیم می‌نماید.

کنترل وضعیت USB

رجیستر کنترل وضعیت USB دارای دو بیت برای ارتباطات USB و چهار بیت برای ارتباط PS/2 یا USB و یک بیت برای ارتباط PS/2 می‌باشد. SIE بیت فعالیت باس را پس از تشخیص فعالیت بر روی باس یک می‌کند. برنامة تراشه می‌تواند از این بیت برای تصمیم‌گیری در رفتن دستگاه به حالت بیکاری استفاده کند. اگر این بیت بیشتر از 3 میلی ثانیه صفر باقی بماند، تراشه باید وارد حالت بیکاری شود.

بیت فعال ساز VREG قادر است که در خروجی VREG ولتاژ V 3/3 را فعال سازد. این خروجی برای مقاومت بالابر[3] USB به D- در باس است. چون VREG تحت کنترل برنامة تراشه است، کد می‌تواند ولتاژ خروجی را برداشته یا حفظ کند تا اتصال یا جدا شدن دستگاه از باس را تشخیص دهد. امپدانس خروجی VREG حدود 20 اهم است بنابراین مقدار مقاومت باید K 3/1 اهم باشد تا با K 5/1 مرجع خصوصیات سازگار شویم.

بیت حالت ریست USB – بیت مد وقفه فعال شدن PS/2، تعیین می‌کند که وقفه USB داده شود یا اینکه فعالیت PSP داشته باشیم.

سه بیت کنترلی، برنامة تراشه را قادر می‌سازند که خطوط USB یا PS/2 را در وضعیت‌های خاصی تنظیم کنند، از جمله این وضعیت‌ها می‌توان از j،k و SE0 مربوط به USB نام برد. اگر قبلاً میزبان قابلیت Remote-wakup را فعال کرده باشد، برنامة کاربردی می‌تواند از وضعیت Force-k برای فرستادن سیگنال بازگشت که به میزبان می‌گوید دستگاه می‌خواهد ارتباط دوباره آغاز شود استفاده کند.

بیت فعال کردن PS/2 قادر است مقاومت بالابر داخلی که بین خطوط SDATA و SCLK است را برای استفاده ارتباط PS/2 فعال سازد.

رجیستر داده پورت 2، حالت چهار بیت فقط خواندنی را در یک پورت ورودی کمیک نگهداری می‌کند. دو بیت، حالت D+و D- در هنگام استفاده از USB یا حالت SCLK و SDATA در هنگام استفاده از PS/2 می‌باشند. دو بیت دیگر بیشتر مواقع می‌توانند به عنوان دو ورودی استفاده شوند. اگر مقاومت موجود بر روی خط D- از منبع ولتاژ خارجی برای راه‌اندازی استفاده کند و یا اینکه دستگاه از USB پشتیبانی نکند، از پایة VREG می‌توان به عنوان ورودی استفاده کرد که در این حالت وضعیت این بیت از طریق P2.0 قابل دسترسی است.

وقتی که ساعت داخلی فعال است، مرجع زمانی بر روی پایة XTALIN وجود نخواهد داشت و می‌توان از این پایه نیز به عنوان ورودی از طریق PS.1 استفاده کرد.

آخرین رجیستر مربوط به USB رجیستر فعال ساز وقفه‌های اندپوینت است، که وقفه‌ها را برای اندپوینت‌های صفر، 1 و 2 فعال می‌سازد. توضیحات مربوط به این رجیستر در زیر در بخش پردازش وقفه ارائه خواهد شد.


مقاله بررسی FPGA & CPLD زمان برنامه نویسی VHDL

مقاله بررسی FPGA CPLD زمان برنامه نویسی VHDL در 30 صفحه ورد قابل ویرایش
دسته بندی کامپیوتر و IT
فرمت فایل doc
حجم فایل 47 کیلو بایت
تعداد صفحات فایل 30
مقاله بررسی FPGA & CPLD  زمان برنامه نویسی VHDL

فروشنده فایل

کد کاربری 6017

مقاله بررسی FPGA & CPLD زمان برنامه نویسی VHDL در 30 صفحه ورد قابل ویرایش

مقدمه ای درباره FPGA & CPLD

برای آنکه بتوان بخش بزرگی از یک طرح را داخل یک تراشه منتقل نمود و از زمان و هزینه مونتاژ و راه‌اندازی و نگهداری طرح کاست، ساخت تراشه‌های قابل برنامه ریزی مطرح شد از جمله مزایای استفاده از تراشه‌های قابل برنامه ریزی در طراحی پروژه‌ها عبارتند از :

- کاهش ابعاد و حجم

- کاهش زمان و هزینه طرح

- افزایش اطمینان از سیستم

- حفاظت از طرح

- حفاظت در برابر نویز و اغتشاش

FPGA ها ابزار سخت افزاری قابل برنامه ریزی ارزان قیمت را جایگزین کاربردهای فعلی کنترلرهای داخلی (Embedded Controllers) نموده‌اند. به همین دلیل بازار آنها رشد گسترده‌ای داشته است. علاوه بر این به جهت ارائه راه حل‌های مناسب برای IC های سفارشی با عملکرد بالا موفقیت زیادی به دست آورده‌اند. در واقع به نظر می‌رسد که FPGAها با توجه به ارزان بودن، نسل فعلی تراشه‌های ASIC را از رده خارج کنند. همین مزیت هزینه و عملکرد توجه زیادی را درحوزه تحقیقات به خود معطوف کرده است.

ویژگی‌ استفاده از قطعات منطقی قابل برنامه ریزی (PLD) و FPGA، ارزان بودن قیمت و سرعت ورود آنها به بازار است.

قطعات ASIC، هزینه‌های توسعه مهندسی غیر قابل برگشت بالاتری دارند و در نتیجه اغلب، قیمت این محصولات بالاتر است، اما اساساً کارایی بالاتری دارند. این شیوه‌های مختلف طراحی محیطهایی را با مجموعه‌ای از متدولوژی و ابزاهای مختلف CAD پدید می‌آورند.

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

ایده اصلی و زیر بنایی معماری FPGA و CPLD بسیار ساده است. به طوری کلی میتوان مدارهای ترکیبی و ترتیبی را مستقیماً روی بستر سیلیکون ایجاد کرد. تراشه‌های ASIC با اینکه کارایی بالایی دارند اما تنها می‌توانند یک نوع عملیات را انجام دهند.

از آنجایی که امکان توزیع هزینه توسعه بین چند کاربر وجود ندارد، قیمت ASIC ها معمولاً بیش از سیستمهای مبتنی بر ریز پردازنده معمولی می‌شود.

تکنولوژی تراشه‌های قابل برنامه‌ریزی

قابلیت برنامه ریزی شدن مدارات مختلف و اتصالات متفاوت بر روی PLD به دلیل سوئیچ‌های قابل برنامه ریزی است که در این تراشه وجود دارد، این سوئیچ‌ها می‌بایست علاوه بر اشغال فضای بسیار کم دارای کمترین تأخیر زمانی باشند بطور کلی سوئیچ‌‌های قابل برنامه ریزی در PLD با استفاده از سه نوع تکنولوژی قابل پیاده سازی است.

1-استفاده از Anti – Fuse

2-استفاده از سلولهای حافظه موقت Sram

3-استفاده از گیتهای شناور EEPROM یا EPROM

Anti – Fuse

خصوصیت اصلی Anti – Fuseها تنها یک بار قابلیت برنامه‌ریزی بودن، اشغال فضای کم و بالا بودن فرکانس کاری، به دلیل پایین بودن اثر مقاومتی و ظرفیت خازنی آنها است.

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

SRAM

در روش SRAM از سلولهای حافظه به دو طریق استفاده می‌شود، در روش اول از یک سلول حافظه برای کنترل روشن یا خاموش شدن یک ترانزیستور استفاده می‌گردد که در این حالت خروجی سلول حافظه به بیس ترانزیستور یا گیت فت متصل می شود،‌ با روشن یا خاموش شدن ترانزیستور یک مسیر وصل یا قطع می‌شود. در روش دوم سلول حافظه به ورودیهای انتخاب مالتی پلکسر وصل می‌شود. در این حالت با صفر یا یک شدن سلول حافظه مسیر خطوط عوض می‌شود، مهمترین عیب این روش پاک شدن برنامه ریزی با قطع تغذیه می‌باشد، تراشه‌هایی که با این روش برنامه ریزی می‌گردند، می‌بایست با استفاده از یک سیستم جانبی با هر بار وصل شدن تغذیه تراشه برنامه ریزی گردد، این روش نسبت به روش Anti – Fuse فضای بیشتری اشغال می‌کند و تأخیر زمانی نیز بیشتر است.

روش برنامه ریزی EEPROM یا EPROM

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

تقسیم بندی PLDها

PLDها شامل قطعات کم ظرفیت و پرظرفیت می‌باشند. PLDهای کم ظرفیت (ساده ) معمولاً کمتر از 600 گیت قابل استفاده دارند و شامل محصولاتی چون PALها و GALها می‌شوند.

PLDهای ساده شامل سوئیچ‌های EEPROM یا EPROM و Anti – Fuse می‌باشند.

(High – Capacity – PLD) HCPLD بیشتر از 600 گیت قابل استفاده دارند و شامل CPLD و FPGA می‌شوند.

FPGAها ساختمان اتصالات داخلی گسسته دارند، در حالیکه CPLDها دارای اتصالات داخلی پیوسته می‌باشند.

در ساخت HCPLD ها از تکنولوژی EEPROM , EPROM , Sram و Anti – Fuse استفاده شده است.


انواع تراشه ‌های برنامه ریزی

(Programable read only memoey) PRom

اولین تراشه‌های قابل برنامه‌ریزی که به بازار عرضه شد حافظه فقط خواندنی PRom بود،‌ در این تراشه خطوط آدرس بعنوان ورودی و خطوط دیتا به عنوان خروجی تلقی می‌شوند.

PRom شامل دسته‌ای از گیتهای and غیر قابل برنامه ریزی و یک آرایه OR قابل برنامه ریزی است. PRom در حد یک حافظه است و قابلیت برنامه‌ریزی یک مدار منطقی را ندارد.

(Programable logic array) PLA

اولین تراشه قابل برنامه ریزی که برای پیاده سازی مدار منطقی آرایه برنامه پذیر and و یک آرایه برنامه پذیر OR می‌باشد. دو اشکال عمده، هزینه گران ساخت و سرعت پایین آن است .

(Programable array logic) PAL

تراشه Pal دارای یک آرایه and قابل برنامه ریزی و یک آرایه OR تثبیت شده است.

GAL

تراشه GAL دارای یک آرایه and قابل برنامه ریزی و یک آرایه OR تثبیت شده است. تراشه GAL دارای سرعت بیشتر نسبت به تراشه PAL می‌باشد.

بعد از تراشه‌های فوق MPGAها و FPGAها به بازار آمدند.

MPGA: Mask programable gate array

FPGA: Field programable gate array

ساختار FPGA

بطور کلی تا کنون سه نوع معماری برای FPGA ها توسط کارخانه‌های مختلف سازنده ارائه شده است که عبارتند از:

1-آرایه دو بعدی متقارن Symetric matrix

2-آرایه‌های سطری row based

3-دریایی از گیتها sea of gates

بلوکهای FPGA

1-بلوکهای منطقی (Logic array Block) LAB

2-بلوکهای کنترل کننده I/o

3-اتصالات قابل برنامه‌ریزی PIA

(Programable Interconnect array)

بلوکهای منطقی

بلوکهای منطقی شرکتهای سازنده FPGA از نظر اندازه ومنطق به کار رفته در آنها با هم تفاوتهای بسیاری دارند.

این بلوکها در FPGAها و CPLDهای Altera به نام LAB شناخته می‌شوند.

هر LAB می‌تواند شامل سه زیر بلوک Macrocell و Interconnect local و term logic باشد.

-تأخیر انتقالی (transport)

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

اپراتورهای VHDL

1-شی‌ءهای داده 2- نوع‌های داده 3-عملگرها

- شیءهای داده در VHDL:

در VHDL سه کلاس برای شیءها وجود دارد: سیگنال، متغیر، ثابت

سیگنال‌ها:

سیگنال‌ شی‌ای است که مقدار فعلی و آتی یک شیء را نگه می‌دارد. از این منظر که VHDL یک زبان توصیف سخت افزار است، سیگنالها نقش سیم را ایفا می‌کنند. سیگنالها در توصیف درگاه به عنوان ورودی و خروجی، در توصیف ساختاری به عنوان سیگنال و در معماری به عنوان سیگنال ظاهر می‌شوند. معرفی سیگنال بصورت زیر انجام می‌شود:

Signal signal_ name : signal_ type: = initial_ value ;

متغیرها:

تفاوت سیگنالها با متغیرها در این است که سیگنالها را در شبیه سازی می‌توان طوری زمان بندی کرد که در یک زمان معین،‌مقداری را بپذیرند، در حالیکه به متغیرها در هنگام اجرای عبارت نسبت دهی مقدار داده می‌شود. در هر زمان می‌توان چندین مقدار را برای زمان‌های آتی سیگنال زمان بندی کرد. در مقابل در هر زمان تنها می‌توان یک مقدار به متغیر نسبت داد. به همین جهت پیاده سازی شیء سیگنال با سابقه‌ای از مقادیر آن همراه است ودر نتیجه نسبت به متغیرها به حافظه بیشتری نیاز دارد و زمان اجرای بالاتری دارد.

متغیرها به طور کامل با آنچه در زبانهای برنامه نویسی متداول به کار می‌روند معادل هستند و برای محاسبات درون روالها، توابع، پروسس‌ها بکار می روند. معرفی متغیر به صورت زیر انجام می‌شود:

variable variable_ name : signal_ type: = initial_ value ;

ثابتها:

ثابتها باید در ابتدای شبیه سازی معرفی شوند و مقدارشان مشخص شود و نمی‌توانند در طول شبیه‌سازی تغییر کنند. ثابتها می‌توانند از هر نوع مجاز VHDL باشند. معرفی ثابتها بصورت زیر انجام می‌شود:

Constant Constant_ name : Constant_ type: = initial_ value ;


نوع‌های داده در VHDL

1-نوعهای داده استاندارد:

تعریف نوع‌های استاندارد در بسته standard قرار دارند. بسته استاندارد را کلیه عرضه کنندگان ارا ئه می‌کنند. این بسته حاوی تعاریف نو‌ع‌ها و توابع از پیش تعریف شده زبان VHDL می‌باشد.