ZPU (پردازنده)

**ZPU** یک ریزپردازنده از نوع ماشین پشته‌ای است که توسط شرکت نروژی Zylin AS طراحی شده است تا کد نظارتی را در سیستم‌های الکترونیکی که شامل یک مدار مجتمع دیجیتال برنامه‌پذیر (FPGA) هستند، اجرا کند.

ZPU یک ماشین پشته‌ای نسبتاً جدید است که جایگاه اقتصادی کوچکی دارد و تعداد کاربران و پیاده‌سازی‌های آن در حال رشد است. این پردازنده به‌گونه‌ای طراحی شده که به مقادیر بسیار کمی از منطق الکترونیکی نیاز دارد، که این امر باعث می‌شود منطق الکترونیکی بیشتری برای سایر مقاصد در FPGA در دسترس باشد. برای سهولت استفاده، یک نسخه از مجموعه کامپایلر GNU برای آن فراهم شده است. این ویژگی باعث می‌شود استفاده از آن نسبت به پردازنده‌هایی که فاقد کامپایلر هستند، بسیار ساده‌تر باشد. با فدا کردن سرعت در ازای اندازه کوچک‌تر، نتایج میانی محاسبات در حافظه و در یک پشته قرار می‌گیرند، نه در ثبات‌ها.

شرکت Zylin Corp. در سال ۲۰۰۸ پردازنده ZPU را به‌طور متن‌باز منتشر کرد.

## استفاده
بسیاری از پروژه‌های الکترونیکی شامل منطق الکترونیکی در FPGA هستند. استفاده از یک ریزپردازنده به‌طور هم‌زمان در این پروژه‌ها هدر دادن منابع است، بنابراین معمولاً پردازنده‌ای به منطق الکترونیکی اضافه می‌شود. اغلب می‌توان از یک FPGA کوچکتر و ارزان‌تر استفاده کرد، اگر فقط پردازنده منابع کمتری مصرف کند. این دقیقاً همان مشکلی است که پردازنده ZPU برای حل آن طراحی شده است.

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

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

برخی از پروژه‌ها نیاز دارند که کد آن‌ها کوچک باشد، اما باید روی پردازنده‌ای اجرا شوند که ذاتاً کد بزرگ‌تری دارد. به‌طور متناوب، یک پروژه ممکن است از تنوع وسیع کدها، کامپایلرها و ابزارهای دیباگ موجود برای مجموعه کامپایلر GNU بهره‌مند شود. در این موارد، می‌توان یک شبیه‌ساز نوشت تا مجموعه دستورالعمل‌های ZPU را بر روی پردازنده هدف پیاده‌سازی کند و از کامپایلرهای ZPU برای تولید کد استفاده شود. سیستم حاصل کند است، اما کد را در حافظه‌ای کمتر از بسیاری از پردازنده‌ها فشرده می‌کند و به پروژه این امکان را می‌دهد که از انواع مختلف کامپایلرها و کدها استفاده کند.
## ویژگی های طراحی
ZPU به‌طور خاص برای کاهش میزان منطق الکترونیکی طراحی شده است. این پردازنده مجموعه دستورالعمل حداقلی دارد، اما می‌تواند برای مجموعه کامپایلر GNU کدگذاری شود. همچنین تعداد ثبات‌هایی که باید در FPGA وجود داشته باشد را به حداقل می‌رساند و تعداد فلیپ‌فلاپ‌ها را کاهش می‌دهد. به جای استفاده از ثبات‌ها، نتایج میانی در پشته و حافظه ذخیره می‌شوند.

این پردازنده همچنین کد کوچکی دارد که باعث صرفه‌جویی در حافظه می‌شود. دستورالعمل‌های ماشین پشته‌ای نیازی به شامل کردن شناسه‌های ثبات ندارند، بنابراین کد ZPU کوچکتر از دیگر پردازنده‌های RISC است و گفته می‌شود که تنها حدود ۸۰٪ فضای مورد نیاز ARM Holdings Thumb2 را مصرف می‌کند. به‌عنوان مثال، عدد فوری با علامت (immediate signed) کمک می‌کند که ZPU یک مقدار ۳۲ بیتی را در حداکثر ۵ بایت از فضای دستورالعمل ذخیره کند، و حتی در حد ۱ بایت. اکثر پردازنده‌های RISC حداقل به ۸ بایت نیاز دارند.

در نهایت، حدود ۲/۳ از دستورالعمل‌های آن می‌توانند توسط ثابت افزار پیاده‌سازی شده با استفاده از ۱/۳ باقی‌مانده دستورالعمل‌های "ضروری" شبیه‌سازی شوند. اگرچه نتیجه بسیار کند است، پردازنده حاصل می‌تواند تنها به ۴۴۶ جدول جستجو نیاز داشته باشد (که معیاری از پیچیدگی FPGA است و تقریباً معادل ۱۷۰۰ گیت منطقی الکترونیکی است).

ZPU دارای یک بردار بازنشانی است که از ۳۲ بایت فضای کد تشکیل شده و از موقعیت صفر شروع می‌شود. همچنین یک وقفه حساس به لبه دارد که برداری از ۳۲ بایت فضای کد را شامل می‌شود و از آدرس ۳۲ آغاز می‌شود. بردارهای ۲ تا ۶۳ هر کدام ۳۲ بایت فضا دارند، اما برای شبیه‌سازی دستورالعمل‌های ۳۳ تا ۶۳ رزرو شده‌اند.

ZPU پایه دارای مسیر داده ۳۲ بیتی است. همچنین نسخه‌ای از ZPU وجود دارد که دارای مسیر داده ۱۶ بیتی است تا منطق بیشتری صرفه‌جویی شود.

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

هم‌اکنون مدل‌های مختلفی از هسته ZPU وجود دارند. علاوه بر هسته‌های اصلی Zylin، هسته‌های ZPUino و ZPUFlex نیز موجود هستند. 
هسته Zylin برای استفاده از فضای حداقلی FPGA طراحی شده و شامل نسخه ۱۶ بیتی نیز می‌شود. ZPUino بهبودهای عملی برای سرعت دارد، می‌تواند دستورالعمل‌های شبیه‌سازی‌شده را با سخت‌افزار جایگزین کند و در یک چارچوب سیستم روی تراشه (SoC) جاسازی شده است. ZPUFlex برای استفاده از بلوک‌های حافظه خارجی طراحی شده و می‌تواند دستورالعمل‌های شبیه‌سازی‌شده را با سخت‌افزار جایگزین کند.

پروژه‌های علمی شامل مطالعات و بهبودهای کارایی انرژی
و مطالعات قابلیت اطمینان می‌باشند.

برای بهبود سرعت، اکثر پیاده‌سازها دستورالعمل‌های شبیه‌سازی‌شده را پیاده‌سازی کرده‌اند و یک کش پشته اضافه کرده‌اند.
علاوه بر این، یکی از پیاده‌سازها گفته است که یک معماری دو پشته‌ای می‌تواند اجازه دهد که پایپ‌لاینینگ انجام شود (یعنی سرعت به یک دستورالعمل در هر چرخه ساعت بهبود یابد)، اما این ممکن است نیاز به تغییراتی در کامپایلر داشته باشد.

یکی از پیاده‌سازها توان مصرفی را با استفاده از کش پشته و درج خودکار گیتینگ ساعت ۴۶٪ کاهش داد. مصرف توان سپس معادل با هسته Amber متن‌باز کوچک، که معماری ARM v2a را پیاده‌سازی می‌کند، بود.

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

## مجموعه دستورالعمل‌ها
"TOS" مخفف "Top Of Stack" (بالای پشته) است. "NOS" مخفف "Next to the top Of Stack" (بعد از بالای پشته) است.

### مجموعه دستورالعمل‌های مورد نیاز ZPU

نقاط کد از ۳۳ تا ۶۳ ممکن است توسط کد در بردارنده‌های ۲ تا ۳۲ شبیه‌سازی شوند: LOADH و STOREH (دسترسی به حافظه ۱۶ بیتی)، LESSTHAN (مقایسه‌ها که ۱ را برای درست و ۰ را برای نادرست تنظیم می‌کند)، LESSTHANOREQUAL، ULESSTHAN، ULESSTHANOREQUAL، SWAP (تبادل TOS با NOS)، MULT، LSHIFTRIGHT، ASHIFTLEFT، ASHIFTRIGHT، CALL، EQ، NEQ، NEG، SUB، XOR، LOADB و STOREB (دسترسی به حافظه ۸ بیتی)، DIV، MOD، EQBRANCH، NEQBRANCH، POPPCREL، CONFIG، PUSHPC، SYSCALL، PUSHSPADD، HALFMULT، CALLPCREL.

## منابع


رده:پردازنده
رده:ریزپردازنده‌های باز