|  |  |
| --- | --- |
|  | برخی از ویرایش‌ها در این مقاله در چارچوب یک تکلیف دانشگاهی انجام شده‌اند. این تکالیف توسط ؟ برای دانشجویان تعیین شده‌اند. |

**معماری هاروارد بهبود یافته** نوعی از معماری هاروارد است که بر خلاف معماری خالص هاروارد، امکان دسترسی به محتویات حافظه را به عنوان داده فراهم می‌کند. اکثر کامپیوترهایی که به عنوان معماری هاروارد ثبت شده‌اند، در واقع دارای معماری هاروارد بهبودیافته هستند.

معماری هاروارد
--------------

معماری اصلی کامپیوتری هاروارد، Harvard Mark I، از سیستم‌های حافظه کاملاً مجزا برای ذخیره دستورالعمل‌ها و داده‌ها استفاده می‌کند. CPU دستورالعمل بعدی را دریافت و داده‌ها را به‌طور هم‌زمان و مستقل بارگیری یا ذخیره می‌کند. این امر برخلاف کامپیوتر معماری فون نویمان است که در آن دستورالعمل‌ها و داده‌ها در یک سیستم حافظه ذخیره می‌شوند و بدون پیچیدگی حافظه نهان CPU باید به آنها دسترسی داشت.

جداسازی فیزیکی دستورالعمل‌ها و حافظهٔ داده‌ها در بعضی مواقع به عنوان ویژگی متمایز رایانه‌های معماری مدرن هاروارد شناخته می‌شود. به کار بردن فناوری‌های حافظه مختلف برای دستورالعمل‌ها (مثلاً حافظه فلش) و داده‌ها (معمولاً حافظه خواندن/نوشتن) در ماشین‌های فون نویمان با استفاده میکروکنترلرها (سیستم‌های کامپیوتری یکپارچه شده روی یک تراشه) رواج یافته‌است. تمایز آن با ماشین هاروارد این است که دستورالعمل و حافظهٔ داده فضاهای آدرس متفاوتی را اشغال می‌کنند. برخلاف ماشین فون نیومن، یک آدرس حافظه به‌طور منحصر به فرد مکان ذخیره‌سازی را شناسایی نمی‌کند و هم‌چنین باید فضای حافظه (دستورالعمل یا داده) را که آدرس به آن تعلق دارد، بداند.

معماری فون نویمان
-----------------

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

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

معماری هاروارد بهبودیافته
-------------------------

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

### معماری Split-cache (یا تقریباً فون نویمان)

متداول‌ترین اصلاح، سلسله مراتب حافظه را با حافظه پنهان CPU جداگانه برای دستورالعمل‌ها و داده‌ها در سطوح پایین‌تر سلسله مراتب ایجاد می‌کند. یک فضای آدرس برای دستورالعمل‌ها و داده‌ها وجود دارد که مدل فون نویمان را ارائه می‌کند، اما CPU دستورالعمل‌ها را از کش دستورالعمل واکشی می‌کند و داده‌ها را از کش داده‌ها واکشی می‌کند. اکثر برنامه نویسان هرگز نیازی به این واقعیت ندارند که هسته پردازنده معماری هاروارد (اصلاح شده) را پیاده‌سازی می‌کند، اگرچه از مزایای سرعت آن سود می‌برند. فقط برنامه نویسانی که دستورالعمل‌ها را تولید و در حافظه ذخیره می‌کنند، باید از مسائلی مانند انسجام حافظه نهان آگاه باشند؛ اگر حافظه یک نسخهٔ کش‌شدهٔ دستورالعمل را در کش دستورالعمل اصلاح یا باطل نکند.

### معماری حافظه دستورالعمل به عنوان داده

تغییر دیگر ماهیت «فضای آدرس جداگانه» یک ماشین هاروارد را حفظ می‌کند، اما عملیات ماشین ویژه‌ای را برای دسترسی به محتویات حافظه دستورالعمل به عنوان داده فراهم می‌کند. از آن‌جایی که داده‌ها مستقیماً به عنوان دستورالعمل قابل اجرا نیستند، چنین ماشین‌هایی همیشه به عنوان معماری «تغییریافته» هاروارد دیده نمی‌شوند:

* دسترسی خواندن: مقادیر دادهٔ اولیه را می‌توان در هنگام شروع برنامه از حافظهٔ دستورالعمل در حافظهٔ داده کپی کرد. اگر قرار نیست داده‌ها اصلاح شوند (ممکن است یک مقدار ثابت باشد، مانند pi یا یک رشته متنی)، می‌توان توسط برنامه در حال اجرا مستقیماً از حافظهٔ دستورالعمل بدون اشغال فضای حافظه داده به آن دسترسی داشت که اغلب با مجاز می‌باشد.
* دسترسی نوشتن: به‌طور کلی قابلیت برنامه‌ریزی مجدد مورد نیاز است و تعداد کمی از رایانه‌ها صرفاً مبتنی بر رام هستند. به عنوان مثال، یک میکروکنترلر معمولاً عملیاتی برای نوشتن روی فلش مموری که برای نگه‌داری دستورالعمل‌های آن استفاده می‌شود، دارد. این قابلیت ممکن است برای مقاصدی از جمله به‌روزرسانی نرم‌افزار استفاده شود. جایگزینی EEPROM /PROM یک روش جایگزین است.

### معماری حافظه داده به عنوان دستورالعمل

چند پردازندهٔ معماری هاروارد، مانند MAXQ، می‌توانند دستورالعمل‌های واکشی‌شده از هر بخش حافظه را اجرا کنند؛ برخلاف پردازندهٔ اصلی هاروارد، که فقط می‌تواند دستورالعمل‌های واکشی‌شده از بخش حافظهٔ برنامه را اجرا کند. چنین پردازنده‌هایی، مانند دیگر پردازنده‌های معماری هاروارد – و برخلاف معماری خالص فون نویمان – می‌توانند یک دستورالعمل و یک مقدار داده را، اگر در بخش‌های حافظه مجزا باشند به‌طور هم‌زمان بخوانند، زیرا پردازنده (حداقل) دو بخش حافظهٔ جداگانه یا مستقل دارد. یک تفاوت محسوس بین برنامه‌نویس معماری هاروارد اصلاح‌شده و معماری خالص فون نیومن هنگام اجرای یک دستورالعمل از یک بخش حافظه به همان بخش حافظه نمی‌توان به‌طور هم‌زمان به عنوان داده دسترسی داشت.

مقایسه‌ها
---------

سه ویژگی ممکن است برای تشخیص ماشین‌های هاروارد اصلاح‌شده از ماشین‌های هاروارد و فون نویمان خالص استفاده شود:

حافظه‌های دستورالعمل و حافظه‌های داده فضاهای آدرس متفاوتی را اشغال می‌کنند.

برای ماشین‌های هاروارد خالص، یک آدرس «صفر» در فضای دستورالعمل وجود دارد که به یک مکان ذخیره دستورالعمل اشاره دارد و یک آدرس جداگانه «صفر» در فضای داده که به یک مکان ذخیرهٔ دادهٔ مشخص اشاره دارد. در مقابل، فون نویمان و ماشین‌های هاروارد اصلاح‌شده با حافظهٔ پنهان، دستورالعمل‌ها و داده‌ها را در یک فضای آدرس واحد ذخیره می‌کنند، بنابراین آدرس «صفر» تنها به یک مکان اشاره دارد و این‌که آیا با نحوه نگارش برنامه، الگوی باینری در آن مکان به عنوان یک دستورالعمل تفسیر می‌شود یا داده تعریف می‌شود. با این حال، درست مانند ماشین‌های هاروارد خالص، ماشین‌های هاروارد بهبود یافته با حافظه دستورالعمل‌ها به‌عنوان داده دارای فضاهای آدرس جداگانه‌ای هستند، بنابراین آدرس‌های جداگانه‌ای «صفر» برای فضای آموزشی و داده‌ها دارند، بنا بر این، این نوع ماشین‌های هاروارد اصلاح‌شده را از هاروارد خالص متمایز نمی‌کند.

حافظه‌های دستورالعمل و داده دارای مسیرهای سخت‌افزاری مجزا به واحد پردازش مرکزی (CPU) هستند.
این نکته مربوط به ماشین‌های هاروارد خالص یا بهبودیافته است و دلیل هم‌زیستی آن‌ها با معماری انعطاف‌پذیرتر و عمومی‌تر فون نویمان، مسیرهای حافظه جداگانه به CPU امکان واکشی دستورالعمل‌ها و دسترسی به داده‌ها را به‌طور هم‌زمان فراهم می‌کند و توان عملیاتی را بهبود می‌بخشد. ماشین‌های هاروارد خالص دارای مسیرهای جداگانه با فضاهای آدرس جداگانه هستند. ماشین‌های هاروارد اصلاح‌شده با حافظهٔ پنهان دارای چنین مسیرهای دسترسی جداگانه‌ای برای حافظه‌های پنهان CPU یا دیگر حافظه‌های متصل به هم هستند، اما یک مسیر دسترسی یکپارچه بقیه سلسله مراتب حافظه را پوشش می‌دهد. یک پردازندهٔ فون نویمان فقط آن مسیر دسترسی یکپارچه را دارد. از دیدگاه یک برنامه‌نویس، یک پردازنده هاروارد اصلاح شده که در آن حافظه‌های دستوری و داده‌ها یک فضای آدرس را به اشتراک می‌گذارند، تا زمانی که انسجام حافظهٔ پنهان به یک مشکل تبدیل شود، مانند کدهای خود اصلاح شده و بارگذاری برنامه معمولاً به عنوان یک ماشین فون نویمان در نظر گرفته می‌شود. این می‌تواند گیج‌کننده باشد؛ اما چنین مسائلی معمولاً فقط برای برنامه نویسان سیستم و یکپارچه سازان قابل مشاهده است. دیگر ماشین‌های هاروارد بهبود یافته از این نظر مانند ماشین‌های هاروارد خالص هستند.

دستورالعمل‌ها و حافظه‌های داده ممکن است به روش‌های مختلف قابل دسترسی باشند.
ماشین اصلی هاروارد، Mark I، دستورالعمل‌ها را روی یک نوار کاغذ پانچ‌شده و داده‌ها را در شمارنده‌های الکترومکانیکی ذخیره می‌کرد. این کار به دلیل محدودیت‌های فناوری موجود در آن زمان بود. امروزه یک ماشین هاروارد مانند میکروکنترلر PIC ممکن است از حافظه فلش ۱۲ بیتی برای دستورالعمل‌ها و ۸ بیتی SRAM گسترده برای داده‌ها استفاده کند. در مقابل، یک میکروکنترلر فون نویمان مانند یک ARM7TDMI، یا یک هستهٔ اصلاح شده هاروارد ARM9، لزوماً دسترسی یکنواخت به حافظهٔ فلش و SRAM (در آن موارد ۸ بیت بایت) فراهم می‌کند.

استفاده‌های مدرن از معماری اصلاح شده هاروارد
--------------------------------------------

خارج از برنامه‌هایی که به DSP یا میکروکنترلر بدون کش نیاز است، اکثر پردازنده‌های مدرن یک حافظه پنهان CPU دارند که دستورالعمل‌ها و داده‌ها را تقسیم‌بندی می‌کند.

هم‌چنین پردازنده‌هایی وجود دارند که با دقیق‌ترین تعریف، ماشین‌های هاروارد هستند (این برنامه و حافظه داده فضای آدرس متفاوتی را اشغال می‌کنند)؛ و فقط به معنای ضعیفی که عملیات خواندن یا نوشتن حافظه برنامه به عنوان داده وجود دارد، اصلاح شده‌اند. برای مثال، دستورالعمل‌های LPM (بارگذاری حافظه برنامه) و SPM (حافظه برنامه ذخیره) در Atmel AVR چنین اصلاحی را اجرا می‌کنند. راه حل‌های مشابهی در میکروکنترلرهای دیگر مانند PIC و Z8Encore و خانواده‌های بسیاری از پردازنده‌های سیگنال دیجیتال مانند هسته‌های TI C55x و غیره یافت می‌شود. از آن‌جایی که اجرای دستورالعمل‌ها هنوز به فضای آدرس برنامه محدود می‌شوند، این پردازنده‌ها بسیار متفاوت با ماشین‌های فون نویمان هستند.

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

جستارهای وابسته
---------------

* معماری هاروارد
* معماری فون نویمان

منابع
-----

1. ↑  «دانلود ترجمه مقاله پیاده سازی معماری فون نویمان کوانتومی با مدارات ابررسانا». *فرداپیپر | دانلود رایگان ترجمه مقاله پروپوزال پاورپوینت آماده*. دریافت‌شده در ۲۰۲۳-۰۵-۳۱.
2. ↑  "AVR109: Self Programming" (PDF) (Application note). Atmel. June 2004. Retrieved 29 January 2015.
3. ↑  MAXQ Family User's Guide[*پیوند مرده*]. Sections 1.2 "Harvard Memory Architecture" and 2.5 "Pseudo-Von Neumann Memory Access".
4. ↑  Konark Goel *et al.* About MAXQ GCC port.

1. ↑  The maintainers of the standard C library for the GCC port to the Atmel AVR microcontroller, which has separate address spaces for code and data, state in *Data in Program Space* that separate address spaces imply a Harvard architecture. They go on to explain that the C language only has one pointer address space, and thus was not designed for Harvard architecture machines. They then describe the non-standard extensions adopted by GCC for the AVR and the AVR C library to allow access to data stored in instruction (program) memory. They even explain why the const keyword cannot be pressed into service to distinguish data objects to be placed in instruction memory.