<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>مدونة عمر علي عيد مختار</title>
	<atom:link href="http://omarmokhtar.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://omarmokhtar.net</link>
	<description>There are only 10 types of people in the world — those who understand binary, and those who don&#039;t.</description>
	<lastBuildDate>Sat, 21 Jan 2012 11:13:03 +0000</lastBuildDate>
	<language>ar</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='omarmokhtar.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/aded96ff68624fe17f4fdd13be9a179d?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>مدونة عمر علي عيد مختار</title>
		<link>http://omarmokhtar.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://omarmokhtar.net/osd.xml" title="مدونة عمر علي عيد مختار" />
	<atom:link rel='hub' href='http://omarmokhtar.net/?pushpress=hub'/>
		<item>
		<title>يوم الهندسة المصري .. نقطة تحول في حياة الكثيرين</title>
		<link>http://omarmokhtar.net/2011/09/11/eed2011/</link>
		<comments>http://omarmokhtar.net/2011/09/11/eed2011/#comments</comments>
		<pubDate>Sun, 11 Sep 2011 17:27:51 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[مذكرات]]></category>
		<category><![CDATA[خواطر مبرمج]]></category>
		<category><![CDATA[Egypt]]></category>
		<category><![CDATA[Egyptian Arabic]]></category>
		<category><![CDATA[مصر]]></category>

		<guid isPermaLink="false">http://omarmokhtar.net/?p=713</guid>
		<description><![CDATA[لا أدري من أين أبدأ الموضوع .. فمازلت لم أخرج بعد من الحالة التي تنتاب المشاركين في أكبر مؤتمر للمهندسين و طلبة الهندسة في مصر , يوم الهندسة المصري , بالرغم من أن قد مر على إنتهاءه أكثر من ثلاثة أيام. تلك الحالة التي تجمع بين الفرح بما قدمناه و الأمل و التفاؤل بما هو [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=713&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>لا أدري من أين أبدأ الموضوع .. فمازلت لم أخرج بعد من الحالة التي تنتاب المشاركين في أكبر مؤتمر للمهندسين و طلبة الهندسة في مصر , يوم الهندسة المصري , بالرغم من أن قد مر على إنتهاءه أكثر من ثلاثة أيام. تلك الحالة التي تجمع بين الفرح بما قدمناه و الأمل و التفاؤل بما هو قادم و الوطنية و الحماس و الحنين إلى اللحظات التي قضيناها على مر الأيام الثلاث !</p>
<p>كنت قد دعيت لإلقاء كلمة في إحدى المحاضرات التي أقيمت في يوم الهندسة المصري حول تاريخ هذا المؤتمر و قصص نجاح المشاركين فيه و التي تكلم فيها العديد من الذين شاركوا في الأعوام السابقة , و قد كنت أمثل المشاركين الذين لم يتخرجوا بعد. و لم يكن من العناء أن أستعد أو أحضر لتلك الكلمة و أتذكر ما الذي إستفدته من مشاركتي كعارض لمشروع لعامين متتاليين في يوم الهندسة المصري , بل حتى إنني قد نسيت بعض النقاط المهمة من كثرة الأشياء التي إستفدت بها. و سأذكر منها ما أتذكره الآن حتى أوصل بعض الرسائل , قد يراها البعض صغيرة أو تافهة , غير أنها تمثل نقطة تحول كبيرة في حياة الكثيرين.</p>
<blockquote><p><strong>أولاً ..</strong></p>
<p>بحكم بعض المفاهيم الخاطئة المنتشرة في المجتمع , وضع البعض صورة نمطية لطلبة الجامعات تحولت إلى حقيقة بعد أن قد دفنت الصورة الحقيقية تحت أوهام المتشائمين. فقد إعتقد البعض بأن طالب البكالريوس عاجز عن أن يعلم نفسه بنفسه و عاجز عن أن يكتشف طريقه وحده و يقوده أساتذته إلى طريقه كالأعمى حتى التخرج. و بهذه النظرة الإستصغارية كثيراً ما يتعثر الطلاب عندما يبدأون في مشروع تخرجهم و يتعثر الخريجين في بداية حياتهم العملية إذ أنهم لم يعتادوا على العمل الجاد المتواصل و الإعتماد على النفس في تحصيل المعلومات و حل مشاكلهم بأنفسهم رغم أن الفرصة كانت أمامهم لسنوات لكنهم لم ينتهزوها. ففي أثناء العام الدراسي إذا كلف الطلبة بعمل مشروع صغير يتعلق بإحدى المواد الدراسية لا يجد الطلبة الظروف الكافية التي تجعلهم يستفيدون من هذا الأمر. ففي أغلب الأحيان لا تشكل المشاريع العملية نسبة كبيرة في تقييم المادة و ينشغل الطلبة بالمذاكرة للإمتحانات إذ أنه في أغلب الأحيان يعد التفرغ للعمل في المشروع تضييعاً للوقت و إنشغالاً عن المذاكرة ! ..  فيلجأ الطلبة إلى الإنتهاء سريعاً من المشروع العملي عن طريق تقديم شئ تقليدي مكرر خالي من الإبداع و الإبتكار بل و قد يكون مليئ بالأخطاء التي لم يجد الطلبة وقتاً ولا تشجيعاً على إصلاحها نظراً لإن أستاذ المادة سيراعي ظروفهم. و في مثل هذه الظروف يتم قتل الإبداع بداخل كل من أراد أن يبدع و يبتكر شيئاً في مشروعه فضلاً عن أنه سيحارب من قبل بقية الطلاب الذين من مصلحتهم أن تكون المشاريع كلها متساوية حتى يراعي الأستاذ ظروفهم ! كما سيحارب من قبل مدعي النصح و الواقعية الذين يرون أن ما سيقوم به تضييعاً للوقت في ما لا يفيد !</p>
<p>و كحل لتلك المشكلة يلجأ بعض الناجين من تلك الكارثة إلى أن يعلموا أنفسهم شيئاً و لو بسيطاً في فترة الأجازة الصيفية. غير أن هذا الأمر عادةً ما لا ينجح نظراً لإن الأغلبية تفقد حماسها بعد فترة خصوصاً عندما لا تجد ما يحفزها على الإستمرار. خصوصاً و أن أغلبية المحيطين به لن يشجعوه على هذا الأمر.</p>
<p>و قد كان الحل الأمثل لهذا الأمر &#8211; بالنسبة لي و للكثيرين غيري &#8211; هو أن أشارك كعارض لمشروع في يوم الهندسة المصري. ففي أثناء فترة تنفيذ المشروع لن أجد ما يدفعني لإهمال النواحي الإبداعية في المشروع بل سأجد ما يدفعني لها لأنني أريد أن أقدم أفضل ما عندي. فلم يعد هناك أي مبرر يجعلني أهمل بعض الأشياء و أتغافل عن بعض الأخطاء كما قد يحدث في أثناء الفترة الدراسية. و في ذات الوقت لن أصاب بالملل و أستشعر عدم جدوى ما أفعله أو أتكاسل و أتباطأ و ذلك لأن هناك موعد يجب أن أكون قد إنتهيت من كل شئ قبله و الأمر ليس مفتوحاً.</p>
<p>و قد يتسائل البعض كيف يقوم بعمل منتج أو مشروع و هو قليل الخبرة و ليس عنده أفكار ؟؟ .. بالنسبة للأفكار فهذا أسهل ما في الأمر. فلا أعتقد بأن هناك شخص لا يواجه أي مشاكل في حياته. إن كان لا يواجه آية مشاكل هندسية فهذا جيد فليعش سعيداً ! و إن كان يواجه بعض المشاكل فليقم بحلها ! و إن كان قليل الخبرة فهذه ليست مشكلة كبيرة. بل هي فرصة جيدة لكي يتعلم و يعتمد على نفسه في التعلم. و أكثر المعلومات تذكراً عند الطلبة هي المعلومات التي حصل عليها بعد أن شعر بأهميتها و حاجته إليها.</p>
<p><strong>ثانياً ..</strong></p>
<p>يعد يوم الهندسة المصري تدريباً عملياً على فن التسويق و طرح منتج جديد أو فكرة جديدة. فالعارضين يتحدثون خلال الثلاثة أيام عن مشروعهم ربما مئات المرات. و في كل مرة يكتشفون من خلال إنطباع و رد فعل الزائرين شيئاً جديداً كان يمكنه أن يجعل طريقة عرضهم للمشروع أفضل و أوضح و أكثر لفتاً لإنتباه المستمعين و ربما أقل في عدد الكلمات. فربما يبدأ الواحد منهم في اليوم الأول بعرض المشروع خلال خمسة دقائق و ينتهي به الأمر في اليوم الأخير بأنه قد إستطاع أن يلخص المشروع في دقيقة واحدة و بطريقة أكثر ترتيباً , بغض النظر عن كون العارضين يفقدون أصواتهم منذ اليوم الثاني ! و بالطبع فهذا يساعدهم بشكل كبير على التدرب على كيفية تقديم أنفسهم في المقابلات الوظيفية Job Interviews.</p>
<p><strong>ثالثاً ..</strong></p>
<p>تعلمت من مشاركتي في يوم الهندسة المصري أن أكسر حاجز الخوف و الرهبة من تقديم نفسي و أعمالي إلى الناس. ربما يصاب البعض ببعض الرهبة و التشكك في ذاته على سبيل المثال إذا ما ألقى محاضرة أو كتب مقالاً. فيشعر أحياناً بالخجل من نفسه و من ما قدمه و يتمنى أن لم يكن قد ألقى المحاضرة أو كتب المقال. و بالرغم من ذلك فإن القراء و المستمعين لن يشعروا بهذا الأمر و بل و قد تعجبهم المحاضرة أو المقالة. و هذا بسبب أن هذا الخوف ليس إلا وهم بداخلنا و لا وجود له على أرض الواقع. نفس الأمر يتكرر مع المشاريع التي نعرضها في يوم الهندسة المصري. ففي البداية قد يستصغر الواحد منا مشروعه &#8211; خصوصاً إذا كان مشروعه ليس بمشروع تخرج &#8211; و قد يشعر بالخجل من عرضه بجانب بقية المشاريع. غير أننا شيئاً فشيئاً سيزول عندنا هذا الشعور بعد أن نكتشف حقيقة أن هذه المخاوف لا توجد إلا بداخلنا ولا وجود لها على أرض الواقع.</p>
<p><strong>رابعاً ..</strong></p>
<p>يعد يوم الهندسة المصري مدرسة عملية للتربية الوطنية .. فلم تقدم ألاف المحاضرات و الخطب و لم تجدي دراسة &#8220;مادة التربية الوطنية&#8221; شيئاً يذكر بالمقارنة مع ما تعلمته من يوم الهندسة المصري. فإجتماع العديد من الطلاب من مختلف المحافظات. و ربما تجد بعض الخلافات السياسية إلى جانب الجغرافية. غير أنهم تجمعهم نفس المشكلات في التعليم و سوق العمل. تربطهم نفس الأهداف و نفس الأحلام. يعملون معاً على أرضية واحدة. يشجعون بعضهم بعضاً على المواصلة نحو هدفهم و يخدمون بعضهم بعضاً بلا مقابل.</p></blockquote>
<p>ربما يكون هناك المزيد من الأشياء التي لا أتذكرها الآن .. و لعل الكثيرين لديهم العديد من الإستفادات التي خرجوا بها. فهكذا تكون الأعمال التي تجمع شمل الوطن. مخطئ من يظن بأننا متفرقين و كسالى. نحتاج فقط إلى أن نتجمع على حلم واحد و على أرضية مشتركة. و الآن أترككم مع الفيديو الختامي ليوم الهندسة المصري العاشر لعام 2011.</p>
<p style="text-align:center;"><span style="text-align:center; display: block;"><a href="http://omarmokhtar.net/2011/09/11/eed2011/"><img src="http://img.youtube.com/vi/qs57MP1wbSM/2.jpg" alt="" /></a></span></p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d9%85%d8%b0%d9%83%d8%b1%d8%a7%d8%aa/'>مذكرات</a>, <a href='http://omarmokhtar.net/category/%d8%ae%d9%88%d8%a7%d8%b7%d8%b1-%d9%85%d8%a8%d8%b1%d9%85%d8%ac/'>خواطر مبرمج</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/713/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=713&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2011/09/11/eed2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>
	</item>
		<item>
		<title>Code And Play &#8211; Version 0.1 Beta</title>
		<link>http://omarmokhtar.net/2011/08/02/code-and-play-version-0-1-beta/</link>
		<comments>http://omarmokhtar.net/2011/08/02/code-and-play-version-0-1-beta/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 14:52:16 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[مذكرات]]></category>
		<category><![CDATA[code and play]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[scripting computer games]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://omarmokhtar.net/?p=700</guid>
		<description><![CDATA[منذ عدة شهور كنت ألعب إحدى الألعاب الإستراتيجية .. و لفت نظري (أو بمعنى أصح كان يضايقني) أن الفريق الذي أتحكم به لا أستطيع السيطرة عليه بشكل كامل .. فعلى سبيل المثال عندما كان يحدث هجوم من الفريق الأخر (و الذي يتحكم فيه الذكاء الأصطناعي) كان علي أن أقوم بتوجيه كل جندي إلى مساره بنفسي [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=700&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>منذ عدة شهور كنت ألعب إحدى الألعاب الإستراتيجية .. و لفت نظري (أو بمعنى أصح كان يضايقني) أن الفريق الذي أتحكم به لا أستطيع السيطرة عليه بشكل كامل .. فعلى سبيل المثال عندما كان يحدث هجوم من الفريق الأخر (و الذي يتحكم فيه الذكاء الأصطناعي) كان علي أن أقوم بتوجيه كل جندي إلى مساره بنفسي لإني إذا تركته سيتحكم الحاسب به أوتوماتيكياً و ربما سار في طريق أخر يفسد الخطة و يمكن أن يهرب !! .. المهم أن مسألة التحكم الكامل في اللعبة بدقة كان هو ما أريده و لكنه لا يوجد بالشكل الذي ينبغي في الألعاب خاصة في الألعاب الإستراتيجية ..</p>
<p>حينها خطرت ببالي فكرة تحل هذا المشكلة و هي أن اللاعب يقوم بكتابة أوامر و أكواد تصف كيف ستتصرف كائنات اللعبة و أثناء اللعبة يتم تنفيذ تلك الأوامر .. بدأت في تنفيذ لعبة بهذا المفهوم الذي ربما يكون جديداً أو على الأقل غير معروف في عالم الألعاب .. و بعد أن قمت بإستشارة إحدى الدكاترة في الجامعة عدلت المسار قليلاً .. و بعد بضعة أسابيع من العمل المتواصل خرج الإصدار التجريبي الأول إلى النور !</p>
<p><a href="http://omarblog.files.wordpress.com/2011/08/intro.jpeg"><img class="aligncenter size-full wp-image-701" title="intro" src="http://omarblog.files.wordpress.com/2011/08/intro.jpeg?w=600&#038;h=450" alt="" width="600" height="450" /></a></p>
<p>هذا الإصدار ليس لعبة بل هو برنامج يتيح للاعبين أن يقوموا بكتابة أكوادهم و إرسالها إلى خادم يقوم بعمل مباريات بين تلك الأكواد و تسجيل النتائج و هكذا .. إنظر إلى هذه الصورة :</p>
<p><a href="http://omarblog.files.wordpress.com/2011/08/screenshot-3.png"><img class="aligncenter size-full wp-image-702" title="Screenshot-3" src="http://omarblog.files.wordpress.com/2011/08/screenshot-3.png?w=600&#038;h=337" alt="" width="600" height="337" /></a></p>
<p>هذه أول لعبة من هذا النوع .<span id="more-700"></span>. في هذا الملعب يقوم اللاعب الأزرق بضرب بالونات اللاعب الأخضر و العكس .. و الذي يقوم بإفناء بالونات الأخر يفوز في النهاية .. و توجد بها بعض القوانين مثل أن اللاعب إذا تجاوز الحدود البيضاء تقل نتيجته و إذا ضرب بالون بنفس لونه تقل نتيجته أيضاً .. و إذا ضرب بالون اللاعب الأخر تزيد نتيجته ..</p>
<p>هذه اللعبة و غيرها من الألعاب التي ستصدر قريباً إن شاء الله يمكن للاعبين أن يلعبوها عن طريق هذا البرنامج :</p>
<p><a href="http://omarblog.files.wordpress.com/2011/08/screenshot-6.jpg"><img class="aligncenter size-full wp-image-703" title="Screenshot-6" src="http://omarblog.files.wordpress.com/2011/08/screenshot-6.jpg?w=600&#038;h=355" alt="" width="600" height="355" /></a></p>
<p>هنا يقوم اللاعبين بالتسجيل و الدخول ..</p>
<p><a href="http://omarblog.files.wordpress.com/2011/08/screenshot.jpg"><img class="aligncenter size-full wp-image-704" title="Screenshot" src="http://omarblog.files.wordpress.com/2011/08/screenshot.jpg?w=600&#038;h=352" alt="" width="600" height="352" /></a></p>
<p>و هنا يقوم اللاعبين بإختيار الألعاب التي يريدون لعبها و تحميلها .. القائمة اليسرى هي قائمة الألعاب و القائمة اليمنى هي قائمة المستخدمين الذين كتبوا أكواداً لهذه الألعاب .. و فوق الأزرار التي في الاسفل تجد شريط مكتوب فيه أعلى النتائج ..</p>
<p><a href="http://omarblog.files.wordpress.com/2011/08/screenshot-5.jpg"><img class="aligncenter size-full wp-image-705" title="Screenshot-5" src="http://omarblog.files.wordpress.com/2011/08/screenshot-5.jpg?w=600&#038;h=355" alt="" width="600" height="355" /></a></p>
<p>و هنا يقوم إحدى اللاعببين بكتابة كود لإحدى الألعاب .. و بعد أن يقوم بعمل Save يتم إرسال الكود إلى الخادم يقوم بمباراة جميع اللاعبين المسجلين في هذه اللعبة و تعديل النتائج ..</p>
<p>ربما يقوم هذا الفيديو بتوضيح أكثر :</p>
<span style="text-align:center; display: block;"><a href="http://omarmokhtar.net/2011/08/02/code-and-play-version-0-1-beta/"><img src="http://img.youtube.com/vi/s7Mi3ovjcZ0/2.jpg" alt="" /></a></span>
<h1></h1>
<h1><strong>للتحميل :</strong></h1>
<p>حتى هذه اللحظة يتوفر إصدار نظام لينكس .. و قريباً إن شاء الله سيتوفر إصدار لنظام ويندوز</p>
<p><a href="https://sourceforge.net/projects/cap-scg/">https://sourceforge.net/projects/cap-scg/</a></p>
<p>و أخيراً و ليس أخراً .. مازال هناك الكثير لإضافته و تعديله .. و ربما تكون هناك بعض المشاكل و الأخطاء المخفية هنا و هناك و لم أكتشفها و تظهر عند بعض المستخدمين ! .. و لهذا أرحب بجميع إقتراحاتكم و إضافاتكم و مشاكلكم في التعليقات ..</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d9%85%d8%b0%d9%83%d8%b1%d8%a7%d8%aa/'>مذكرات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/700/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/700/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/700/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/700/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/700/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/700/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/700/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=700&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2011/08/02/code-and-play-version-0-1-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/08/intro.jpeg" medium="image">
			<media:title type="html">intro</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/08/screenshot-3.png" medium="image">
			<media:title type="html">Screenshot-3</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/08/screenshot-6.jpg" medium="image">
			<media:title type="html">Screenshot-6</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/08/screenshot.jpg" medium="image">
			<media:title type="html">Screenshot</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/08/screenshot-5.jpg" medium="image">
			<media:title type="html">Screenshot-5</media:title>
		</media:content>
	</item>
		<item>
		<title>مدخل إلى محاكاة تصميمات الهاردوير</title>
		<link>http://omarmokhtar.net/2011/02/22/simulation/</link>
		<comments>http://omarmokhtar.net/2011/02/22/simulation/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 06:42:39 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[شروحات]]></category>
		<category><![CDATA[Arithmetic logic unit]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Electronics]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[VHDL]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=673</guid>
		<description><![CDATA[بدأنا في الدرس السابق بعمل مثال بسيط بلغة الـ VHDL و هو وحدة المعالجة و المنطق Arithmetic Logic Unit &#8211; ALU و قد قمنا بإستعراض بعض الأشياء التي تظهر في التقرير الذي يخرجه لنا برنامج الـ Xilinx ISE Webpack عن التصميم الذي قمنا به من مساحة و التأخير الذي يستغرقه و الطاقة المستهلكة و غير ذلك .. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=673&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>بدأنا في الدرس السابق بعمل مثال بسيط بلغة الـ <a class="zem_slink" title="VHDL" rel="homepage" href="http://www.eda.org/vasg/">VHDL</a> و هو وحدة المعالجة و المنطق <a class="zem_slink" title="Arithmetic logic unit" rel="wikipedia" href="http://en.wikipedia.org/wiki/Arithmetic_logic_unit">Arithmetic Logic Unit</a> &#8211; ALU و قد قمنا بإستعراض بعض الأشياء التي تظهر في التقرير الذي يخرجه لنا برنامج الـ <a class="zem_slink" title="Xilinx ISE" rel="homepage" href="http://www.xilinx.com/tools/webpack.htm">Xilinx ISE</a> Webpack عن التصميم الذي قمنا به من مساحة و التأخير الذي يستغرقه و الطاقة المستهلكة و غير ذلك .. و قد أجلنا الكلام عن محاكاة التصميم إلى هذا الدرس</p>
<p>تخيل أنك بيدك الآن دائرة تكاملية <a class="zem_slink" title="Integrated circuit" rel="wikipedia" href="http://en.wikipedia.org/wiki/Integrated_circuit">Integrated Circuit</a> تقوم بإختبارها .. ستقوم أولاً بتوصيلها مثلاً على لوحة إختبار Bread Board .. ربما تقوم بتوصيل بعض الدوائر التكاملية الأخرى أو لا تقوم بذلك حسب الإختبار الذي تريده .. ربما نجد معك أيضاً أثناء الإختبار جهاز راسم الإشارات Oscilloscope  لتشاهد الإشارات الداخلة و الخارجة .. و ربما يكون بجانبك ورقة تكتب فيها ملاحظاتك و قياساتك .. و سوف نسمي هذا كله مقعد الإختبار Test Bench ..  تذكر أننا في الدرس الأول و الثاني شددنا على مفهوم أن اللغات الوصفية و التي منها لغة الـ VHDL لا تخاطب الهاردوير و إنما تخاطب الذي سيقوم بتصميم الهاردوير .. و بما أننا في هذه المرة لن نقوم بتصميم الهاردوير و إنما سنقوم بإختبار الهاردوير .. فسوف نحتاج أيضاً إلى لغة وصفية تصف للرجل الجالس على مقعد الإختبار Test Bench ماذا سيفعل بالضبط لكي يقوم بإختباره .. فسوف نصف له كيف سنقوم بتركيب الدوائر التكاملية التي صممناها (مثل وحدة المعالجة و المنطق في الدرس السابق) و نصف له أين يقوم بتوصيلها و هل سيقوم بتوصيل بعض الدوائر الأخرى أم لا و هكذا .. ثم نصف له بعد ذلك خطوات التجربة .. هل سيقوم مثلاً بإدخال بعض المدخلات لوحدة المعالجة و المنطق ثم يقوم بإختبار هل النتيجة ستخرج كما ينبغي أم لا و ما هي الأشياء التي سوف يجربها و كيف سيتصرف عند رؤية أي مخرج من المخرجات و هكذا ..  في قائمة Hierarchy التي في أيمن الشاشة قم بتحديد الملف الذي وضعت فيه كود وحدة المعالجة و المنطق ALU و إضغط عليه بالزر الأيمن و إختر New Source ثم قم بتحديد VHDL <a class="zem_slink" title="Test bench" rel="wikipedia" href="http://en.wikipedia.org/wiki/Test_bench">TestBench</a> :  <a href="http://omarblog.files.wordpress.com/2011/02/vhdltestbench.jpeg"><img class="aligncenter size-full wp-image-682" title="VHDLTESTBENCH" src="http://omarblog.files.wordpress.com/2011/02/vhdltestbench.jpeg?w=600&#038;h=458" alt="" width="600" height="458" /></a> و قم بتسمية الملف الجديد بأي شئ ثم إضغط Next حيث ستقوم بإختيار الوحدة التي تريد أن تقوم بعمل محاكاة و إختبار لها ..<span id="more-673"></span> <a href="http://omarblog.files.wordpress.com/2011/02/choosefile.jpeg"><img class="aligncenter size-full wp-image-683" title="ChooseFile" src="http://omarblog.files.wordpress.com/2011/02/choosefile.jpeg?w=600&#038;h=452" alt="" width="600" height="452" /></a> قم بتحديد الملف الذي تريد محاكاته .. و في هذه الحالة ليس لدينا إلا ملف واحد فقط و وحدة واحدة فقط و هي وحدة المعالجة و المنطق .. إضغط Next ثم إضغط Finish ..  سيفتح لك صفحة بها بعضاً من كود الـ VHDL به المحاور الآتية ..  أولاً إعتبر نفسك تتعامل مع لوحة إختبار Bread Board .. ستقوم بوضع الدائرة التكاملية Integrated Circuit التي قمت بتصميمها في لوحة الإختبار ثم تقوم بتوصيل بعض الأسلاك على الأرجل التي تريد أن تختبرها في الدائرة التكاملية .. ثم ستقوم بالتعامل مع تلك الأسلاك و التي ستقوم بتوصيلها على بعض الأقفال لكي تدخل عن طريقها البيانات و تضع المخرجات على جهاز راسم للإشارات Oscilloscope أو على بعضاً من الديودات المضيئة <a class="zem_slink" title="Light-emitting diode" rel="wikipedia" href="http://en.wikipedia.org/wiki/Light-emitting_diode">LEDs</a> .. هذا بالضبط الذي سوف تفعله في الكود الوصفي لعملية الإختبار و المحاكاة .. ستقوم بإستخدام الوحدة التي تريدها ليس عن طريق تكوينها الداخلي و إنما ستسخدمها و تختبرها على أنها مكون بداخل دائرة و التي شبهناها بلوحة الإختبار .. إنظر إلى الكود التالي :</p>
<blockquote>
<p style="text-align:left;">ENTITY ALU_Simulation IS</p>
<p style="text-align:left;">END ALU_Simulation;</p>
</blockquote>
<p>هنا قمنا بتعريف وحدة فارغة على أنها لوحة الإختبار .. و قد جرى العرف ان لوحة الإختبار ليس لها مدخلات و مخرجات .. و سنقوم بوضع الوحدة المراد إختبارها بداخل هذه الوحدة الفارغة أو لوحة الإختبار ..</p>
<blockquote>
<p style="text-align:left;" dir="ltr">ARCHITECTURE behavior OF ALU_Simulation IS</p>
<p style="text-align:left;" dir="ltr">COMPONENT ALU</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">PORT( A : IN  std_logic_vector(31 downto 0);</p>
<p style="text-align:left;padding-left:60px;" dir="ltr">B : IN  std_logic_vector(31 downto 0);</p>
<p style="text-align:left;padding-left:60px;" dir="ltr">ALU_OUT : OUT  std_logic_vector(31 downto 0);</p>
<p style="text-align:left;padding-left:60px;" dir="ltr">Control : IN  std_logic_vector(2 downto 0));</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">END COMPONENT;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">signal A : std_logic_vector(31 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">signal B : std_logic_vector(31 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">signal Control : std_logic_vector(2 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">signal ALU_OUT : std_logic_vector(31 downto 0);</p>
<p style="text-align:left;" dir="ltr">BEGIN</p>
</blockquote>
<p style="text-align:right;">هنا قمنا بتعريف التكوين الداخلي Architecture للوحة الإختبار .. فقلنا Architecture ثم أتبعناها بإسم التكوين الداخلي و الذي جرى العرف على أن يكون Behavioral في وصف التصاميم و Behavior في وصف المحاكاة و الإختبار ..  ثم قلنا Of و أتبعناها بإسم الوحدة التي سننسب هذا التكوين لها ثم كلمة Is .. و بين كلمة Is و كلمة Begin نضع التعريفات التي سنستخدمها في الكود .. قد نقوم بتعريف بعض الأسلاك مثلاً .. و يكون كل سلك له إسم يدل عليه .. قد نقوم بتعريف دائرة تكاملية Integrated Circuit و نقوم بإستخدامها في الكود .. قد نقوم بتعريف سلسلة حرفية String حيث سنقوم بكتابة فيها تقريراً عن الإختبار الذي سنقوم به .. قد نقوم بتعريف متغير من نضع فيه الوقت من نوع Time حيث سنضع فيه مثلاً الوقت الذي سنقوم بحسابه في أي شئ مثلاً أثناء الإختبار .. و سوف نقوم بمناقشة هذه الأشياء و هذه الأنواع من المتغيرات و كيفية إستخدامها لاحقاً إن شاء الله ..</p>
<p style="text-align:right;">و في هذا المثال قمنا بتعريف مكون Component إسمه ALU و الذي هو إسم الوحدة التي سنقوم بإختبارها (التي قمنا بتصميمها في الدرس السابق) .. و قمنا بكتابة بيانات مداخلها و مخارجها بنفس الطريقة التي قمنا بكتابتها عندما كنا نقوم بتعريف Entity .. و لكن بدلاً من كتابة كلمة Entity قمنا بكتابة كلمة Component و في النهاية كتبنا كلمة End Component و ليس End ALU ..</p>
<p style="text-align:right;">و بعدما قمنا بتعريف بعض الأسلاك  .. أو بمعنى أدق قمنا بتعريف بعض الإشارات .. السلك الأول إسمه A و هو في الواقع عبارة عن 32 سلكاً و لهذا قلنا أنه STD_LOGIC_VECTOR .. و كذلك بقية الأسلاك و التي هي في الواقع كل المخارج و المداخل للدائرة التكاملية لوحدة المعالجة و المنطق ALU .. حيث أن الإشارة A سوف نقوم بتوصيلها على المدخل A للدائرة التكاملية .. و كذلك بقية المداخل و المخارج ..</p>
<p style="text-align:right;">بعد كلمة Begin سنبدأ في وصف ما الذي سيفعله الرجل الجالس على مقعد الإختبار كما سنقوم بوصف دائرة الإختبار (و التي في هذه الحالة ليست إلا الدائرة التكاملية التي نريد إختبارها و الأسلاك موصلة على كل مداخلها و مخارجها) .. إنظر إلى هذا الكود :</p>
<blockquote>
<p style="text-align:left;" dir="ltr">Instance_ALU : ALU PORT MAP (</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">A =&gt; A,</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">B =&gt; B,</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">ALU_OUT =&gt; ALU_OUT,</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control =&gt; Control);</p>
</blockquote>
<p>هنا قمنا بوضع الدائرة التكاملية التي قمنا بتعريفها كمكون Component في الأعلى قبل Begin .. الفرق بين تعريفها و وضعها في اللوحة هو كما لو قلت لك أن هناك شئ إسمه <a class="zem_slink" title="Operational amplifier" rel="wikipedia" href="http://en.wikipedia.org/wiki/Operational_amplifier">OpAmp</a> و قمت بتعريفه لك مرة واحدة ثم وضعت عدة نسخ منه في دائرة معينة .. ففي التعريف نقوم فقط بتعريفه و تعريف مداخله و مخارجه و نذكره بين is و Begin .. و أما في وضعه في الدائرة فلن نذكر عن مداخله و مخارجه أية معلومات بل سنذكر فقط الأسلاك التي قمنا بتوصيلها بهذه المداخل أو هذه المخارج .. و بالطبع بما أننا قد نضع من هذه الدائرة التكاملية أكثر من واحدة في التصميم الواحد فإنه يفضل أن نقوم بوضع إسم لكل نسخة Instance .. و هنا قد إخترنا إسم Instance_ALU .. ثم أتبعناها بالرمز &#8220;:&#8221; ثم إسم الدائرة التكاملية ثم PORT MAP و نقوم بفتح قوس .. و بعد إغلاق القوس نقوم بوضع فاصلة منقوطة .. و بين القوسين نقوم بربط كل مدخل أو مخرج من مداخل و مخارج الدائرة التكاملية بسلكٍ من الأسلاك .. فقمنا بالربط المدخل A بالسلك A (الإسم هنا لا يدل على أي شئ .. يمكنك الربط بين المدخل A و بين السلك H مثلاً) .. و نذكر على اليسار إسم المدخل أو المخرج ثم علامة السهم ثم إسم السلك و بعدها نقوم بوضع فاصلة ..</p>
<p>و بعد أن قمنا بوصف دائرة الإختبار سنقوم بوصف خطوات الإختبار .. عندما نريد أن نضع خطوات متتابعة أو أي شئ له علاقة بالوقت فإننا نضعها في ما يسمى بالـ Process .. إنظر إلى هذا الكود :</p>
<blockquote>
<p style="text-align:left;" dir="ltr">stim_proc: process</p>
<p style="text-align:left;" dir="ltr">begin</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">A &lt;= x&#8221;12345678&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">B &lt;= x&#8221;87654321&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;000&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;001&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;010&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;011&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;100&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;101&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;110&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait for 20 ns;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">Control &lt;= &#8220;111&#8243;;</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">wait;</p>
<p style="text-align:left;" dir="ltr">end process;</p>
<p style="text-align:left;" dir="ltr">END Behavior;</p>
</blockquote>
<p style="text-align:right;">عند تعريف تلك العملية Process قمنا بتسميتها بإسم stim_proc الذي قد جرى العرف على تسمية عمليات الإختبار به .. ثم كلمة process ثم كلمة begin .. و بين begin و end process ذكرنا خطوات الإختبار .. في البداية عند الزمن صفر قمنا بإدخال القيمة 12345678 (و هي قيمة ست عشرية Hexadecimal) على الإشارة A (و التي هي الأسلاك الموصلة على المدخل A في الدائرة التكاملية) .. و أدخلنا القيمة 87654321 على B .. ثم أدخلنا قيمة 000 إلى الإشارة Control و التي ستحدد العملية الحسابية التي ستقوم بها وحدة المعالجة و المنطق .. ثم إنتظرنا لمدة 20 نانوثانية  حيث قلنا wait for ثم أتبعناها ببعض الوقت .. و بعد هذه الفترة الزمنية سوف نقوم بتغيير العملية الحسابية ثم ننتظر نفس المدة حتى نجرب كل العمليات الحسابية .. و بعد أن ننتهى من العملية نقول wait ثم end process .. و بعد أن ننتهي من وصف العملية و وصف كل شئ نقوم بإغلاق التكوين الداخلي فنقول End Behavior ..</p>
<p style="text-align:right;">و بالطبع لا تنسى أن تضع في بداية الكود المكتبات التي قمت بإستخدامها .. فبما أننا قد إستخدمنا الـ STD_LOGIC_VECTOR فإننا نحتاج إلى تلك المكتبة :</p>
<blockquote>
<p style="text-align:left;" dir="ltr">LIBRARY ieee;</p>
<p style="text-align:left;" dir="ltr">USE ieee.std_logic_1164.ALL;</p>
</blockquote>
<p style="text-align:right;">بعد  أن ننتهي من كتابة الكود نقوم الآن بتشغيله لكي تظهر أمامنا بيانات المخرجات التي ستخرج أثناء المحاكاة .. في الواقع فإنه يوجد أربعة أنواع أساسية من المحاكاة Simulation .. النوع الأول هو إختبار الوظيفي للتصميم Functional Test .. في هذا النوع من الإختبار لا يهمنا كم من الوقت سيستغرق التصميم لكي يخرج المخرجات بالشكل الصحيح و لكن كل الذي يهمنا هو ما المخرجات التي سيخرجها .. يسمى هذا النوع من الإختبارات Behavioral Simulation .. و يوجد نوع أخر من المحاكاة تظهر فيه المدة التي تأخذها الدائرة لكي تثبت المخرجات على الشكل الصحيح و هي مثل Post Map و Post Place and Rout و سوف نتحدث عنهم بشئ من التفصيل لاحقاً إن شاء الله .. و الآن لبدأ المحاكاة إنظر إلى هذه الصورة :<a href="http://omarblog.files.wordpress.com/2011/02/simulationtype.jpeg"><img class="aligncenter size-full wp-image-685" title="SimulationType" src="http://omarblog.files.wordpress.com/2011/02/simulationtype.jpeg?w=600" alt=""   /></a></p>
<p style="text-align:right;">للذهاب إلى وضعية المحاكاة ستجد في الأعلى بجانب كلمة View خيارين .. إما وضعية التصميم Implementation و إما وضعية المحاكاة Simulation .. إختر وضعية المحاكاة .. و تحتها مباشرةً ستجد خيارات نوع المحاكاة و هي Behavioral و Post Translate و Post Map و Post Place And Rout .. قم بتحديد Behavioral و قم بتحديد الملف الذي به كود المحاكاة و الذي أسميناه هنا ALU_Simulation.vhd .. ثم إضغط على Simulate Behavioral Model من قائمة Processes .. سيظهر لك مثل هذا :</p>
<p style="text-align:right;"><a href="http://omarblog.files.wordpress.com/2011/02/waveform.jpeg"><img class="aligncenter size-full wp-image-687" title="waveform" src="http://omarblog.files.wordpress.com/2011/02/waveform.jpeg?w=600&#038;h=208" alt="" width="600" height="208" /></a>هنا ستجد رسم لإشارة كل الاسلاك التي قمت بوضعها في لوحة الإختبار .. في الأعلى ستجد خط به بيانات الزمن .. ستجد أنه كلما مر 20 نانوثانية تتغير قيمة الـ Control فتتغير معها قيمة الإشارة الخارجة من ALU_OUT .. يمكنك أن تعرض البيانات على أنها أرقام ثنائية Binary أو أرقام عشرية Decimal أو ست عشرية Hexadecimal عن طريق الضغط بالزر الأيمن على أسماء الإشارات التي على اليسار و إختيار Radix ثم تحديد الطريقة التي تريد أن تعرض بها البيانات ..</p>
<p style="text-align:right;">لاحظ هنا أننا في المحاكاة لم تظهر لنا أي تأخير في إخراج النتيجة .. فعندما كان يتغير قيمة أي مدخل فإن قيمة المخرج تتغير الحال .. و هذا كلام غير صحيح في الواقع .. فهذا النوع من المحاكاة أو الإختبار فقط يخبرنا عن المخرجات حتى نتأكد أنها ستخرج بالشكل الذي كنا نتوقعه و لكنها لا تخبرنا بأي تفاصيل أخرى .. و لكي تقوم بإظهار ما يتعلق بالتزامن و التأخير نقوم بإستخدام ما يسمى بالـ Post Map Simulation أحياناً أو Post Rout Simulation أحياناً أخرى .. و سوف نذكر تفاصيل هذا إن شاء الله في دروس قادمة ..</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d8%b4%d8%b1%d9%88%d8%ad%d8%a7%d8%aa/'>شروحات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/673/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/673/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/673/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/673/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/673/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/673/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/673/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/673/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=673&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2011/02/22/simulation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/02/vhdltestbench.jpeg" medium="image">
			<media:title type="html">VHDLTESTBENCH</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/02/choosefile.jpeg" medium="image">
			<media:title type="html">ChooseFile</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/02/simulationtype.jpeg" medium="image">
			<media:title type="html">SimulationType</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/02/waveform.jpeg" medium="image">
			<media:title type="html">waveform</media:title>
		</media:content>
	</item>
		<item>
		<title>المثال العملي 1 : وحدة المعالجة و المنطق</title>
		<link>http://omarmokhtar.net/2011/02/18/alu/</link>
		<comments>http://omarmokhtar.net/2011/02/18/alu/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 19:23:50 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[شروحات]]></category>
		<category><![CDATA[Adder (electronics)]]></category>
		<category><![CDATA[Arithmetic logic unit]]></category>
		<category><![CDATA[Central processing unit]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Electronics]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=660</guid>
		<description><![CDATA[منذ فترة قمنا بوضع بعض الدروس حول تصميم الهاردوير بإستخدام لغة الـVHDL .. و الآن لنعد لإستكمالها .. تحدثنا في الدروس السابقة عن تعريف لغة الـVHDL و لماذا نحتاج إليها و كيف ستفيدنا في تصميم الهاردوير .. و هذه المرة سنقوم بكتابة مثال عملي بتلك اللغة .. سيكون الكلام هذه المرة عن وحدة المعالجة و المنطق المعروفة بالـALU و التي هي إختصار لـArithmetic Logic Unit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=660&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>منذ فترة قمنا بوضع بعض الدروس حول تصميم الهاردوير بإستخدام لغة الـVHDL .. و الآن لنعد لإستكمالها ..</p>
<p>تحدثنا في الدروس السابقة عن تعريف لغة الـVHDL و لماذا نحتاج إليها و كيف ستفيدنا في تصميم الهاردوير .. و هذه المرة سنقوم بكتابة مثال عملي بتلك اللغة .. سيكون الكلام هذه المرة عن وحدة المعالجة و المنطق المعروفة بالـALU و التي هي إختصار لـArithmetic Logic Unit .. و هي وحدة من أهم الوحدات في المعالج Processor .. و هي التي تقوم بعمليات الجمع و الطرح و الضرب و سائر العمليات الرياضية و العمليات المنطقية .. هذه الوحدة لها مدخلان يكونان هما المدخلان الذان نريد أن نقوم بعمل العملية الرياضية أو المنطقية عليهما .. و هناك مخرج من المخرجات به ناتج العملية .. فمثلاً قد يكون الناتج هو حاصل ضرب المدخلين أو مجموعهما أو الفرق بينهما و غير ذلك من العمليات .. و هناك مدخل ثالث يحدد لنا ما هي العملية التي نريد .. فعلى سبيل المثال إذا كان هذا المدخل بقيمة 000 فهذا معناه أنه سيقوم بعملية جمع .. و إذا كان 001 فهذا معناه أنه سيقوم بعملية طرح و غير ذلك بحسب الذي نريد .. و الآن إنظر إلى فقرة الـVHDL التالية :</p>
<blockquote>
<p style="text-align:left;" dir="ltr">entity <a class="zem_slink" title="Arithmetic logic unit" rel="wikipedia" href="http://en.wikipedia.org/wiki/Arithmetic_logic_unit">ALU</a> is Port (</p>
<p style="padding-left:30px;text-align:left;" dir="ltr">A : in  STD_LOGIC_VECTOR (31 downto 0);</p>
<p style="padding-left:30px;text-align:left;" dir="ltr">B : in  STD_LOGIC_VECTOR (31 downto 0);</p>
<p style="padding-left:30px;text-align:left;" dir="ltr">ALU_OUT : out  STD_LOGIC_VECTOR (31 downto 0);</p>
<p style="padding-left:30px;text-align:left;" dir="ltr">Control : in  STD_LOGIC_VECTOR (2 downto 0));</p>
<p style="text-align:left;" dir="ltr">end ALU;</p>
</blockquote>
<p style="text-align:right;">هنا قمنا بتعريف الوحدة بمداخلها و مخارجها .. هناك مدخلان بطول 32bits و هما A و B و هما المدخلان الذان سنقوم بعمل العملية الرياضية أو المنطقية عليهما .. و المخرج ALU_OUT بنفس الطول أيضاً .. و هناك المدخل Control الذي سيقوم بتحديد العملية التي سنقوم بها .. و طول هذا المدخل يتم تحديده بناءاً على عدد العمليات التي ستقوم وحدة المعالجة و المنطق بها .. فعلى سبيل المثال إذا كانت ستقوم بـعملياتان فقط فيكفي أن يكون الـControl بطول بت واحد .. و إذا كانت ستقوم بأكثر من عمليتين إلى أربع عمليات فسيكون طول الـControl بـ2bits إذ أن الإحتمالات هي 00 و 01 و 10 و 11 فقط .. و هكذا .. و في هذه الحالة سنقول مثلاً أننا نريد أن نقوم بعمل ثمانية عمليات فقط و لهذا جعلنا طول الـControl بـ3bits .. بالطبع فإن وحدة المعالجة و المنطق ليست هذا فقط .. بل يوجد بها في الواقع أكثر من ذلك و لكننا سنكتفي بهذا للتبسيط ..</p>
<p style="text-align:right;">و بعد أن قمنا بتعريف الوحدة .. سنقوم الآن بتوصيف سلوكها الداخلي .. إنظر إلى الفقرة القادمة :<span id="more-660"></span></p>
<blockquote>
<p style="text-align:left;" dir="ltr">architecture Behavioral of ALU is</p>
<p style="text-align:left;" dir="ltr">begin</p>
<p style="text-align:left;" dir="ltr">ALU_OUT &lt;=	A + B		when Control=&#8221;000&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A &#8211; B		when Control=&#8221;001&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A and B	when Control=&#8221;010&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A or B	when Control=&#8221;011&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A xor B	when Control=&#8221;100&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A nor B	when Control=&#8221;101&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A nand B when Control=&#8221;110&#8243; else</p>
<p style="text-align:left;padding-left:90px;" dir="ltr">A xnor B;</p>
<p style="text-align:left;" dir="ltr">end Behavioral;</p>
</blockquote>
<p style="text-align:right;">هنا قمنا بتوصيف حال المخرج ALU_OUT .. و من خلال الكود السابق أعتقد بأنه من الواضح بأنه سيخرج ناتج لعمليةٍ ما على المدخلين A و B و تختلف تلك العملية بإختلاف قيمة الـControl ..</p>
<p style="text-align:right;">و لكي يكتمل الكود الوصفي لوحدة المعالجة و المنطق علينا أولاً أن نذكر المكتبات التي قمنا بإستخدامها في هذا الكود .. و لهذا عليك أن تضع تلك السطور في البداية :</p>
<blockquote>
<p style="text-align:left;" dir="ltr">use <a class="zem_slink" title="Institute of Electrical and Electronics Engineers" rel="homepage" href="http://www.ieee.org/">IEEE</a>.STD_LOGIC_1164.ALL;</p>
<p style="text-align:left;" dir="ltr">use IEEE.std_logic_unsigned.all;</p>
</blockquote>
<p style="text-align:right;">المكتبة الأولى نستخدمها كي نتعامل مع الـSTD_LOGIC_VECTOR و المكتبة الثانية نستخدمها هنا كي نتعامل مع الإشارات + و-  بدلاً من عمل وحدة الجمع و الطرح بالجداول و نضع كل الإحتمالات إذ أن تلك المكتبات بها تلك الوحدات و ستضعها عندما تجد تلك الإشارات .. و هاتان المكتبتان موجودتان في المكتبة الرئيسية IEEE و لهذا أضف هذا السطر قبل ذكر المكتبتين السابقتين :</p>
<blockquote>
<p style="text-align:left;" dir="ltr">library IEEE;</p>
</blockquote>
<p>و بهذا نكون قد إنتهينا من وحدة المعالجة و المنطق البسيطة .. و الآن إذهب إلى  قائمة Processes التي في الغالب تكون في أيسر الشاشة و قم بتشغيل Synthesize ثم Implement Design ..</p>
<p><a href="http://omarblog.files.wordpress.com/2011/02/checksyntax.jpeg"><img class="aligncenter size-full wp-image-663" title="CheckSyntax" src="http://omarblog.files.wordpress.com/2011/02/checksyntax.jpeg?w=600" alt=""   /></a></p>
<p>في هذه المرحلة يبدأ البرنامج في إكتشاف الأخطاء موجودة في الكود .. و بإختصار شديد فإن مراحل تحويل الكود إلى دائرة منطقية يمر بعدة مراحل .. فأول تلك المراحل هي إكتشاف أخطاء الكود و التأكد من أنه سليم و هي مرحلة Check Syntax .. تليها مرحلة الـSynthesize هي مرحلة تكوين و إستنتاج و إختصار الدائرة المنطقية بناءاً على ما جاء في الكود من وصف لها .. و الشئ الذي نصل إليه بعد عملية الـSynthesize هو الدائرة المنطقية و بناءاً على هذا فإنك تستطيع ان ترى الدائرة المنطقية التي وصل البرنامج إليها عن طريق View RTL Schematic أو View Technology Schematic و قد بيننا الفرق بينهما في الدروس السابقة .. و أما مرحلة الـImplement فهي مرتبطة بالرقاقة القابلة للبرمجة Programmable Chip التي سوف نستخدمها لتجربة التصميم .. فيوجد العديد من الموديلات تختلف كل منها على حسب السرعة في الأداء و الحجم الأقصى للتصاميم التي تستطيع إستيعابها و غير ذلك .. و علاقة ذلك بمرحلة الـImplement هو أن في تلك المرحلة يقوم البرنامج بتحديد مكان كل دائرة منطقية داخل الرقاقة Chip و يقوم بتحديد الروابط و التوصيلات بين الدوائر و بعضها و بين الدوائر و المخرجات و غير ذلك .. و بالطبع فبإختلاف موديل الرقاقة ستختلف هذه المرحلة ..</p>
<p>من القائمة Project إختر Design Summary/Reports .. ستجد بها تقارير عن التصميم الذي قمت به مثل النسبة المستخدمة من الرقاقة .. فمثلاً إذا كانت أقل من 100% فهذا يعني أن الرقاقة تسع هذا التصميم و إذا كانت أكثر فهذا معناه أن التصميم كبير جداً و عليك أن تقوم بتجربته على رقاقة أكبر من التي إخترتها في البداية .. ستجد كذلك في بعض التقارير ما يتعلق بالوقت المستغرق أو التأخير Propagation Delay لكي تخرج المخرجات بالشكل الصحيح .. هذا مثلاً ستجده في  Post-PAR Static Timing Report في جدول يسمى Pad To Pad حيث ستجد علاقات بين كل مدخل و كل مخرج ..  على سبيل المثال إنظر إلى هذه المجموعة :</p>
<blockquote>
<pre>A&lt;0&gt;           |ALU_OUT&lt;0&gt;     |   11.034|
A&lt;0&gt;           |ALU_OUT&lt;1&gt;     |   11.711|
A&lt;0&gt;           |ALU_OUT&lt;2&gt;     |   11.409|
A&lt;0&gt;           |ALU_OUT&lt;3&gt;     |   12.226|
A&lt;0&gt;           |ALU_OUT&lt;4&gt;     |   12.059|
A&lt;0&gt;           |ALU_OUT&lt;5&gt;     |   12.509|
A&lt;0&gt;           |ALU_OUT&lt;6&gt;     |   11.218|
A&lt;0&gt;           |ALU_OUT&lt;7&gt;     |   11.411|
A&lt;0&gt;           |ALU_OUT&lt;8&gt;     |   12.278|
A&lt;0&gt;           |ALU_OUT&lt;9&gt;     |   12.717|
A&lt;0&gt;           |ALU_OUT&lt;10&gt;    |   12.608|</pre>
</blockquote>
<p style="text-align:right;">يظهر لنا هذا التقرير الوقت المستغرق لكي تخرج المخرجات بالشكل الصحيح إذا تغير مدخل واحد فقط .. فهنا على سبيل المثال إفترضنا في هذا الجدول أن المدخل الذي تغير هو أول بت في المدخل A .. إذا تغير هذا المدخل فإن أول بت في المخرج ALU_OUT سيتغير بعد 11.034 نانوثانية nanosecond و سيتغير البت الذي بعده بعد 11.711 .. بالطبع جاء البت الثاني متأخراً عن البت الأول إذ أن نتيجته في عملية الجمع مثلاً معتمدة عليه .. فأنت حينما تقوم بجمع رقمين تبدأ بأول خانة ولا تستطيع أن تبدأ في الخانة التي تليها إلا إذا أنهيت الخانة الأولى لإن الخانة الثانية قد تعتمد على نتيجة جمع الخانة الأولى عن طريق الفيض Carry و لهذا فنتيجتها ستأتي متأخرة عنها .. و بنفس المنطق فإن البت التي تليها سوف تكون أكثر تأخراً .. فإذا كانت البت الأولى ستتغير بعد 11.034 نانوثانية فإن البت الأخيرة ستتغير بعد 13.429 نانوثانية .. و لهذا السبب فإن جمع الرقم المكون من 8bits أسرع من جمع الرقم المكون من 32bits .. هذه الأرقام تم حسابها بالطبع بناءاً على أن أول بت في المدخل A هو الذي تغير .. أما إذا تغير البت الثاني في المدخل A فإن البت الأول في المخرج ALU_OUT لن يتغير أصلاً .. (تخيل مثلاً أنك تجمع الرقم 100 و 001 ستكون النتيجة هي 101 .. فإذا غيرت قيمة البت الثاني لتكون مثلاً 110+001 فإن قيمة البت الأول في الناتج لن يتغير و سيبدأ التغيير من البت الثاني ليكون 111) و لهذا فإذا نظرت في الجدول ستجد أن التغيرات المبنية على تغيير قمية البت الثاني بدأت من البت الثاني في الناتج و ليس الأول :</p>
<blockquote>
<pre>A&lt;0&gt;           |ALU_OUT&lt;30&gt;    |   14.106|
A&lt;0&gt;           |ALU_OUT&lt;31&gt;    |   13.429|
A&lt;1&gt;           |ALU_OUT&lt;1&gt;     |   10.793|
A&lt;1&gt;           |ALU_OUT&lt;2&gt;     |   10.877|
A&lt;1&gt;           |ALU_OUT&lt;3&gt;     |   11.694|
A&lt;1&gt;           |ALU_OUT&lt;4&gt;     |   11.527|
A&lt;1&gt;           |ALU_OUT&lt;5&gt;     |   11.977|
A&lt;1&gt;           |ALU_OUT&lt;6&gt;     |   10.686|
A&lt;1&gt;           |ALU_OUT&lt;7&gt;     |   10.879|
A&lt;1&gt;           |ALU_OUT&lt;8&gt;     |   11.746|
A&lt;1&gt;           |ALU_OUT&lt;9&gt;     |   12.185|</pre>
</blockquote>
<p style="text-align:right;">و بالطبع فإن الوقت المستغرق هنا سيكون أقل .. إذا أن تغيير البت الأول قد يتسبب في تغيير الرقم و الـ32bits كلهم .. و لكن التغيير في البت الثاني يغير فقط في الـ31bits العليا من الرقم .. و لهذا سيكون التأخير أقل .. إذا تصفحت الجدول أكثر ستجد بأن التغيير في المدخل Control الذي يحدد العملية الحسابية التي ستقوم وحدة المعالجة و المنطق بها يتسبب في تأخير كبير جداً .. فعلى سبيل المثال إنظر إلى هذا الجزء من الجدول :</p>
<blockquote>
<pre>Control&lt;0&gt;     |ALU_OUT&lt;0&gt;     |   15.034|
Control&lt;0&gt;     |ALU_OUT&lt;1&gt;     |   15.172|
Control&lt;0&gt;     |ALU_OUT&lt;2&gt;     |   14.870|
Control&lt;0&gt;     |ALU_OUT&lt;3&gt;     |   15.687|
Control&lt;0&gt;     |ALU_OUT&lt;4&gt;     |   15.520|
Control&lt;0&gt;     |ALU_OUT&lt;5&gt;     |   15.970|
Control&lt;0&gt;     |ALU_OUT&lt;6&gt;     |   14.679|</pre>
</blockquote>
<p style="text-align:right;">حيث يبدوا أن  هذا المدخل ذو حساسية كبيرة إذ أن التغيير فيه قد يعني أحياناً أن وحدة المعالجة  و المنطق ستقوم ببدأ بعملية حسابية أخرى من جديد .. على سبيل المثال قد تكون قيمة مدخل الـControl تقول بأننا نريد أن نقوم بعملية جمع و فجأة تغيرت لتقول بأننا نريد أن نقوم بعملية طرح فمعنى ذلك أننا سنلغي كل ما سبق حسابه و نقوم ببدأ عملية الطرح من جديد ..</p>
<p style="text-align:right;">إننا كمصممين دائماً ما نأخذ في إعتبارنا أسوأ الإحتمالات تحت أسوأ الظروف .. و لهذا السبب إذا سألتني مثلاً كم تستغرق وحدة المعالجة و المنطق لكي تقوم بعملية حسابية أو منطقية و تريد مني أن أعطيك رقماً واحداً فإنني سأعطيك قيمة التأخير التي ستحدث عند أسوأ الظروف .. و كثيراً من الأحيان تكون هي قيمة أكبر تأخير في هذا الجدول تحسباً لأسوأ الظروف ..</p>
<p style="text-align:right;">و هكذا نكون قد إنتهينا من هذا الدرس .. و لندع المحاكاة Simulator و كيفية عملها بلغة الـVHDL في الدرس القادم إن شاء الله ..</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d8%b4%d8%b1%d9%88%d8%ad%d8%a7%d8%aa/'>شروحات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/660/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=660&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2011/02/18/alu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2011/02/checksyntax.jpeg" medium="image">
			<media:title type="html">CheckSyntax</media:title>
		</media:content>
	</item>
		<item>
		<title>التعريف بـXilinx و لغة الـVHDL الوصفية للهاردوير</title>
		<link>http://omarmokhtar.net/2010/12/17/hdl1/</link>
		<comments>http://omarmokhtar.net/2010/12/17/hdl1/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 12:57:02 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[شروحات]]></category>
		<category><![CDATA[Cadence Design Systems]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Electronic design automation]]></category>
		<category><![CDATA[Electronics]]></category>
		<category><![CDATA[Field-programmable gate array]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Hardware description language]]></category>
		<category><![CDATA[Integrated circuit]]></category>
		<category><![CDATA[Mentor Graphics]]></category>
		<category><![CDATA[Programmable Logic]]></category>
		<category><![CDATA[SystemVerilog]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Video Graphics Array]]></category>
		<category><![CDATA[Xilinx]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=637</guid>
		<description><![CDATA[تحدثنا في السابق عن مفهوم اللغات الوصفية للهاردوير Hardware Description Languages (راجع مقدمة إلى اللغات الوصفية للهاردوير)  .. و الآن ندخل إلى أول درس عملي سنقوم بتنفيذه عن طريق اللغات الوصفية للهاردوير .. و سنختار من بين اللغات الوصفية لغة الـVHDL .. و التي هي إختصار لكلمة VHSIC Hardware Description Language .. و أما VHSIC [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=637&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>تحدثنا في السابق عن مفهوم اللغات الوصفية للهاردوير <a class="zem_slink" title="Hardware description language" rel="wikipedia" href="http://en.wikipedia.org/wiki/Hardware_description_language">Hardware Description Languages</a> (راجع <a href="http://omarblog.wordpress.com/2010/12/09/digital-design/">مقدمة إلى اللغات الوصفية للهاردوير</a>)  .. و الآن ندخل إلى أول درس عملي سنقوم بتنفيذه عن طريق اللغات الوصفية للهاردوير .. و سنختار من بين اللغات الوصفية لغة الـVHDL .. و التي هي إختصار لكلمة <strong>V</strong>HSIC <strong>H</strong>ardware <strong>D</strong>escription <strong>L</strong>anguage .. و أما <a class="zem_slink" title="VHSIC" rel="wikipedia" href="http://en.wikipedia.org/wiki/VHSIC">VHSIC</a> فتعني <strong>V</strong>ery <strong>H</strong>igh <strong>S</strong>peed <strong>I</strong>ntegrated <strong>C</strong>ircuit .. و يوجد غيرها الكثير من اللغات الوصفية كالـVerilog و غيرها ..</p>
<p><strong>تذكر</strong> .. هدفنا الذي نريد أن نصل إليه هو أن نقوم بتصميم الدوائر الرقمية و الهاردوير بطريقة سهلة بدلاً من القيام بعمل جداول طويلة جداً قد تصل إلى المئات و الألاف من المعطيات .. و ذلك عن طريق اللغات الوصفية التي ستتحول بعد ذلك إلى دوائر رقمية .. و الذي سيقوم بتحويلها برنامج يشبه إلى حدٍ ما المترجم Compiler الذي سيتخدم في اللغات البرمجية ..</p>
<p>البرنامج الذي سوف نقوم بإستخدامه يسمى <strong>ISE WebPACK</strong> وهو من إنتاج شركة <a class="zem_slink" title="Xilinx" rel="homepage" href="http://www.xilinx.com/">Xilinx</a> و هي شركة ذات شهرة في هذا المجال ..</p>
<p>إدخل إلى هذا الرابط :</p>
<p><a href="http://www.xilinx.com/support/download/index.htm">http://www.xilinx.com/support/download/index.htm</a></p>
<p>و قم بتحميل الإصدار الأخير .. و إنتبه إلى أن النسخة التي ستقوم بتنزيلها ستفوق الـ3 جيجا بايت .. و بعد أن تقوم بتثبيتها ستأخذ ما يزيد على الـ10 جيجا بايت ..</p>
<p><span id="more-637"></span></p>
<p>و البرنامج مجاني .. فلن تحتاج إلى دفع أي شئ .. و لكن ستحتاج إلى الإشترك في موقعهم <a href="http://www.xilinx.com">http://www.xilinx.com</a> و بالطبع فالإشتراك مجاني أيضاً ..</p>
<p><strong>و كما ذكرنا قبل ذلك .. </strong>بما أن التصميم الذي سنقوم بوصفه في يد البرنامج فلنقم بإستغلال هذا الأمر و جعله يقوم بعدة أشياء حول التصميم .. فعلى سبيل المثال ربما يقوم بمحاكاة التصميم لكي ترى هل سيخرج المخرجات Outputs بالشكل الذي كنت تتوقعه أم لا .. و قلنا بأن الإختبار له العديد من الصور .. و المحاكاة Simulation إحدى طرق الإختبار .. و لكن المحاكاة تخرج لك على شاشة الحاسوب ما الذي سيخرجه التصميم إذا ما تم تشغيله بالفعل ..</p>
<p>و لكن هذا ليس كافياً .. نر يد أن نختبر التصميم بالفعل لنرى كيف سيتعامل مع البيئة المحيطة .. فربما مثلاً نريد أن نقوم بتصميم بطاقة الفيديو <a class="zem_slink" title="Video Graphics Array" rel="wikipedia" href="http://en.wikipedia.org/wiki/Video_Graphics_Array">VGA</a> و نريد أن نختبر ما إذا كانت ستعرض الصور على الشاشة بالفعل أم لا .. أو نريد أن نصمم بطاقة الصوت <a class="zem_slink" title="Sound card" rel="wikipedia" href="http://en.wikipedia.org/wiki/Sound_card">Sound Card</a> و نريد أن نختبر ما إذا كان سيخرج الصوت بالفعل أم لا .. لا نريد أن يتقصر الأمر على بعض الأصفار و الواحدات تخرج على شاشة الحاسوب تتحدث عن مخرجات التصميم .. نريد أن نرى نتائج بالفعل قبل أن نقوم بعملية التصنيع .. و الحل المتبادر إلى الذهن في هذه الحالة هو أن نقوم بتوصيل كل تلك الدوائر على لوحة التجارب Bread Board و نقوم بتوصيل دوائر البوابات المنطقية <a class="zem_slink" title="Logic gate" rel="wikipedia" href="http://en.wikipedia.org/wiki/Logic_gate">Logic Gates</a> <a class="zem_slink" title="Integrated circuit" rel="wikipedia" href="http://en.wikipedia.org/wiki/Integrated_circuit">Integrated Circuits</a> .. و بما أن هذا الأمر يصعب بل يستحيل كلما إزداد حجم التصميم فإننا نلجأ إلى الرقاقات القابلة للبرمجة Programmable Chips .. المبدأ العام في هذا الأمر هوأنك عندما تقوم ببرمجة تلك الرقاقات فإنها تصبح و كأنها هي التصميم الذي قمت به و تتصرف تماماً كما سيتصرف التصميم .. بعض تلك الرقاقات يحتوي على مجموعة كبيرة من البوابات المنطقية Logic Gates و توجد وصلات بين تلك البوابات .. تلك التوصيلات يمكن أن تشغل و يمكن أن تقفل .. و عندما تقوم ببرمجتها يتم تشغيل التوصيلات و إيقاف البعض الأخر حتى تصبح البوابات المنطقية موصلة ببعضها البعض موافقة للتصميم الذي قمت به .. هذا ما يحدث في بعض الرقاقات و هناك بعض الأساليب و الطرق الأخرى سنحتاج إلى ذكرها لاحقاً إن شاء الله</p>
<p>و تقوم شركة Xilinx بتصميم العديد من تلك الرقاقات .. و عندما نقوم بعمل تصميم جديد في البرنامج الذي سوف نشرحه بعد قليل يجب أن تخبره عن إسم الموديل الذي تريد أن تختبرعليه تصميمك .. بعض الرقاقات تسمى FPGA إختصاراً لـField <a class="zem_slink" title="Field-programmable gate array" rel="wikipedia" href="http://en.wikipedia.org/wiki/Field-programmable_gate_array">Programmable Gate Array</a> .. و هي الرقاقات التي من هذا النوع تتميز بالقدرة على إستيعاب تصميمات كبيرة و سرعة عالية ..</p>
<p><strong>و الآن لنبدأ في شرح أساسيات لغة الـVHDL :</strong></p>
<blockquote><p><strong>و قبل ذلك .. تذكر أن : </strong>عادةً في التصميمات الكبيرة و المعقدة .. نقوم بتقسيمها إلى وحدات صغيرة .. فعلى سبيل المثال عندما نقوم بتصميم معالج Processor لن نأتي ببعض الترانزيستورات Transistors و نقوم بتصميم دائرة كبيرة و معقدة .. و لكن سوف نقوم بتقسيمها إلى وحدات و طبقات .. و المعالج يتكون من بعض المسجلات Registers و وحدة المعالجة و المنطق <a class="zem_slink" title="Arithmetic logic unit" rel="wikipedia" href="http://en.wikipedia.org/wiki/Arithmetic_logic_unit">Arithmetic Logic Unit</a> و وحدة التحكم <a class="zem_slink" title="Control unit" rel="wikipedia" href="http://en.wikipedia.org/wiki/Control_unit">Control Unit</a> و الواجهات الخارجية التي قد تستخدم للتعامل مع الذاكرة Ram أو المدخلات و المخرجات Input/Output Buffer .. ثم نقوم بتصميم كل وحدة و إختبارها وحدها .. فنجد مثلاً أن وحدة المعالجة و المنطق ALU بداخلها وحدات أخرى .. فنجد وحدة تقوم بالجمع و وحدة تقوم بالطرح و وحدة تقوم بالضرب و غير ذلك من الوحدات .. بالإضافة إلى وحدة تقوم بإختيار الناتج المطلوب من بين الوحدات الأخرى حسب العملية الحسابية التي نريد أن نقوم بها و التي سنعرفها عن طريق وحدة التحكم .. و إذا أردنا أن نصمم كل وحدة من تلك الوحدات سنجد بداخلهم بوابات منطقية .. و إذا أردنا تصميم البوابات المنطقية سنجد بداخلها مجموعة من الترانزيستورات و المقاومات .. <strong>الشاهد </strong>أن من قام بالتصميم الكلي للمعالج لم يهتم بما بداخل الوحدات التي سوف يستخدمها .. فهو قد قام بإستخدام وحدات أخرى لا يدري عنها غير أنها كيان <strong>Entity</strong> له بعض المدخلات و المخرجات و لا يهمه تكوينها الداخلي <strong>Architecture</strong> بما أنه سيستخدمها كعنصر <strong>Component</strong> بداخل تصميمه .. و هكذا الحال مع كل الوحدات .. فمصمم وحدة المعالجة و المنطق إستخدم بعض الوحدات كعناصر Components لا يهمه تكوينها الداخلي Architecture طالما هو ينظر إليها على أنها كيان Entity له مخرجات و مدخلات فقط .. بهذه الطريقة نستطيع تسهيل مهمة التصميم .. يمكننا إختبار كل وحدة بذاتها .. يمكننا إستخدام نفس الوحدة التي تم تصميمها في تصميمات أخرى .. و قد تحدثنا عن هذا الأمر بالتفصيل سابقاً عدة مرات .. و في لغة الـVHDL نتبع إسلوب تقسيم التصميم إلى وحدات و نقوم بتصميم كل وحدة بذاتها و قد نقوم بإستخدام وحدات إخرى تم تصميمها من قبل و هكذا ..</p></blockquote>
<p><strong>و الأن</strong> .. قم بعمل مشروع جديد على برنامج الـISE Webpack ..</p>
<p><a href="http://omarblog.files.wordpress.com/2010/12/vhdl1.jpeg"><img class="aligncenter size-full wp-image-638" title="vhdl1" src="http://omarblog.files.wordpress.com/2010/12/vhdl1.jpeg?w=600&#038;h=515" alt="" width="600" height="515" /></a></p>
<p>هنا قمنا بإنشاء مشروع جديد و قمنا بتسميته ..</p>
<p><a href="http://omarblog.files.wordpress.com/2010/12/vhdl2.jpeg"><img class="aligncenter size-full wp-image-639" title="vhdl2" src="http://omarblog.files.wordpress.com/2010/12/vhdl2.jpeg?w=600&#038;h=511" alt="" width="600" height="511" /></a></p>
<p style="text-align:justify;">و هنا نقوم بتحديد إسم الرقاقة التي نريد أن نختبر التصميم عليها .. بالطبع إذا كنت لا تريد أن تختبر على رقاقة قابلة للبرمجة قم بتحديد أي شئ .. و إذا كان لديك واحدة قم بإختيارها هنا .. كما ستقوم بإختيار اللغة التي سوف تصف بها تصميمك في خانة Preferred Language ..</p>
<p style="text-align:justify;"><a href="http://omarblog.files.wordpress.com/2010/12/vhdl3.jpeg"><img class="aligncenter size-full wp-image-640" title="vhdl3" src="http://omarblog.files.wordpress.com/2010/12/vhdl3.jpeg?w=600&#038;h=423" alt="" width="600" height="423" /></a></p>
<p style="text-align:justify;">و هكذا نكون قد أنشأنا مشروعاً جديداً .. لنقم الآن بإضافة وحدات إلى التصميم .. قد تكون تلك الوحدة هي التصميم الذي سيتكون من وحدات أخرى بداخله .. و هو ما يسمى بالـTop Module .. و قد يكون مجرد وحدة بداخل التصميم سنستخدمها كعنصر Component بداخل بعض الوحدات الأخرى .. لإنشاء وحدة جديدة .. إضغط بالزر الأيمن على إسم المشروع و إختار New Source ..</p>
<p style="text-align:justify;"><a href="http://omarblog.files.wordpress.com/2010/12/vhdl5.jpeg"><img class="aligncenter size-full wp-image-642" title="vhdl5" src="http://omarblog.files.wordpress.com/2010/12/vhdl5.jpeg?w=600&#038;h=435" alt="" width="600" height="435" /></a></p>
<p style="text-align:justify;">قم بإختيار VHDL Module .. أما عن بقية الأشياء هنا .. عندنا VHDL Test Bench نقوم بإسخدامها عندما نقوم بعمل محاكاة للتصميم .. و بالطبع Verilog Module و Verilog Test Fixture لنفس الغرض و لكن بلغة الـVerilog .. يمكن أيضاً تصميم وحدة من الوحدات بإستخدام الرسم Schematic .. بعض الأشياء الأخرى سنتحدث عنها لاحقاً إن شاء الله ..</p>
<p style="text-align:justify;">سنقوم بتصميم ناخب (أو ما يسمى بالـMUX) .. و هو عبارة عن دائرة لها مدخلات متعددة و مخرج واحد .. المطلوب من الوحدة هو أن تقوم بإختيار أي المدخلات سوف يتم إختياره ليكون المخرج .. و يتم التحديد على  أساس مدخل أخر يسمى بالـSelect Line لنقوم بالإختيار على أساسه ..</p>
<p style="text-align:justify;"><a href="http://omarblog.files.wordpress.com/2010/12/vhdl6.jpeg"><img class="aligncenter size-full wp-image-643" title="vhdl6" src="http://omarblog.files.wordpress.com/2010/12/vhdl6.jpeg?w=600&#038;h=435" alt="" width="600" height="435" /></a></p>
<p style="text-align:justify;">و هنا نقوم بتحديد المدخلات و المخرجات لتلك الوحدة .. هنا نريد أن نقوم بإختيار ما بين input1 و input2 و input3 و input4 .. بالطبع هنا لدينا أربع إحتمالات .. و هي 00 و 01 و 10 و 11 .. أي إثنان من البتات 2bits للمدخل الذي سيقوم بالإختيار المسمى SelectLine .. و طول كل من المدخلات 16bit .. بداخل الكود يمكن أن نتعامل مع المدخل الواحد ككل .. أي نتعامل مع الـ16bits مرة واحدة فنذكر كلمة input1 هكذا .. و يمكن أن نتعامل مع bit واحد فقط فنقول</p>
<blockquote>
<p style="text-align:left;" dir="ltr">input1(4)</p>
</blockquote>
<p style="text-align:right;">و قد جرت العادة على أننا نبدأ العد من الصفر و ليس من الواحد كما يحدث في اللغات البرمجية .. و لهذا السبب قمنا بتحديد طول المدخل أنه من 15 و حتى 0 .. أي 16bit .. إذا كان المدخل به أكثر من bit واحد فإنه يسمى Bus و حينها نقوم بوضع علامة على خانة Bus و نذكر الطول كما فعلنا هنا ..</p>
<p style="text-align:right;"><a href="http://omarblog.files.wordpress.com/2010/12/vhdl7.jpeg"><img class="aligncenter size-full wp-image-646" title="vhdl7" src="http://omarblog.files.wordpress.com/2010/12/vhdl7.jpeg?w=600&#038;h=361" alt="" width="600" height="361" /></a></p>
<p style="text-align:right;">بهذه الطريقة نقوم بكتابة الكود الوصفي .. نصف به سلوك الدائرة .. و هذا هو الكود الذي يصف وحدة الناخب أو الـMUX</p>
<blockquote>
<p style="text-align:left;" dir="ltr">library IEEE;</p>
<p style="text-align:left;" dir="ltr">use IEEE.STD_LOGIC_1164.ALL;</p>
<p style="text-align:left;" dir="ltr">entity Multiplexer is</p>
<p style="text-align:left;" dir="ltr">Port ( SelectLine : in  STD_LOGIC_VECTOR (1 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">input1 : in  STD_LOGIC_VECTOR (15 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">input2 : in  STD_LOGIC_VECTOR (15 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">input3 : in  STD_LOGIC_VECTOR (15 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">input4 : in  STD_LOGIC_VECTOR (15 downto 0);</p>
<p style="text-align:left;padding-left:30px;" dir="ltr">output : out  STD_LOGIC_VECTOR (15 downto 0));</p>
<p style="text-align:left;" dir="ltr">end Multiplexer;</p>
<p style="text-align:left;" dir="ltr">architecture Behavioral of Multiplexer is</p>
<p style="text-align:left;" dir="ltr">begin</p>
<p style="text-align:left;" dir="ltr">output &lt;= input1 when SelectLine=&#8221;00&#8243; else</p>
<p style="text-align:left;padding-left:60px;" dir="ltr">input2 when SelectLine=&#8221;01&#8243; else</p>
<p style="text-align:left;padding-left:60px;" dir="ltr">input3 when SelectLine=&#8221;10&#8243; else input4;</p>
<p style="text-align:left;" dir="ltr">end Behavioral;</p>
</blockquote>
<p style="padding-left:30px;text-align:right;">في البداية نقوم بذكر المكتبات التي سوف نستخدمها .. بمعنى أخر .. يوجد بتلك المكتبات وحدات جاهزة .. و البرنامج الذي سيقوم بتصميم الدائرة سيستخدم فقط الوحدات المعرفة بداخل المكتبات التي ذكرتها في الأعلى .. و سنذكر المزيد من التفاصيل حول هذا الأمر لاحقاً إن شاء الله ..</p>
<p style="padding-left:30px;text-align:right;">في بداية وصفنا لهذه الوحدة .. قمنا بوصف المدخلات و المخرجات .. و قبل ذلك قمنا بتعريف الوحدة التي نريدها على أنها كيان Entity لا نعرفه عنه سوى أنه مربع مصمط به مدخلات و مخرجات فقط .. نذكر كلمة entity ثم إسمها الذي أسميناه لها ثم كلمة is ..  و بين سطر  entity Multiplexer is و بين end Multiplexer ذكرنا المدخلات و المخرجات .. نكتب كلمة Port ثم بين قوسين نذكر كل المدخلات و المخرجات .. فعلى سبيل المثال المدخل الأول إسمه SelectLine .. ثم نقطتان .. ثم هل هو مدخل أم مخرج حيث نقول in أو out .. ثم هل هو مكون من bit واحد أم هو Bus به عدد من البتات bits .. فإذا كان عبارة عن Bus نقول STD_LOGIC_VECTOR ثم بين قوسين نذكر حجمه .. و إذا كان المدخل bit واحد فإننا نقول STD_LOGIC فقط .. و بين كل تعريف لكل مدخل أو مخرج نضع فاصلة منقوطة .. فهناك فاصلة منقوطة بين تعريف SelectLine و input1 .. و هناك فاصلة منقوطة بين تعريف input1 و input2 .. حتى نصل إلى تعريف input4 نضع فاصلة منقوطة بينه و بين تعريف output .. ثم نغلق القوس .. ثم نضع فاصلة منقوطة لتغلق عبارة Port .. ثم ننهي تعريف الكيان Entity بكلمة end يتبعها إسم الكيان .. ثم فاصلة منقوطة ..</p>
<p style="padding-left:30px;text-align:right;">هكذا نكون قد قمنا بتعريف الكيان .. نريد أن نصف التكوين الداخلي لهذا الكيان الآن .. سنقوم بإعطاء إسم لهذا التكوين الداخلي .. و قد جرى العرف على أن يتم تسمية التكوين الداخلي أو ما يعرف بالـArchitecture بإسم Behavioral .. فقمنا بتعريف التكوين فقلنا Architecture ثم إسمه و الذي إقترحنا أن يكون Behavioral .. ثم نذكر إسم الكيان الذي نريد أن يكون به هذا التكوين فنقول of ثم إسم الـEntity و الذي كان Multiplexer .. ثم is begin حتى نبدأ في وصف التكوين الداخلي .. و بعد أن ننتهي من وصفه ننهي الأمر بكلمة end ثم إسم التكوين ثم فاصلة منقوطة ..</p>
<p style="padding-left:30px;text-align:right;">و في أثناء وصفنا للتكوين بين begin و end كنا نريد أن نصف حال المخرج الذي أسميناه output .. فقلنا أن output بقيمة input1 إذا كان المدخل SelectLine بقيمة 00 و إذا لم يكن ذلك فسيكون output بقيمة input2 إذا كان SelectLine بقيمة 01 .. فإذا لم يكن كذلك فسيكون Output بقيمة input3 إذا كان SelectLine بقيمة 10 و إذا لم يتحقق أي شرط من الشروط السابقة فسيكون output بقيمة input4 .. هذا ما يسمى بالـWhen Statement .. قلنا بأن هذه الوحدة التي نقوم بوصفها تجعلنا نقوم بالإختيار من بين مدخلات عديدة .. و الإختيار الذي سنقوم به سيكون على حسب المدخل SelectLine .. الإختيار الذي سيقع سيخرج في المخرج output .. و في وصفنا لسلوك المخرج المدعو output ذكرنا إسمه و بعدها الرمز</p>
<blockquote>
<p style="padding-left:30px;text-align:left;" dir="ltr">&lt;=</p>
</blockquote>
<p style="padding-left:30px;text-align:right;">ثم نذكر الحالات التي سيكون عليها .. و بعد ذلك كل حالة نذكر الشرط الذي سيجعل تلك الحالة تقع .. نذكر الشرط بعد كلمة when يتعبها كلمة else يتبعها ذكر حالة أخرى مع شرط أخر .. أو إذا كانت الحالة الأخيرة ستحدث إذا لم تتحقق أي من الشروط الأخرى فإننا لا نذكر عبارة when بعدها و نقوم بوضع فاصلة منقوطة في النهاية ..</p>
<p style="padding-left:30px;text-align:right;">من الممكن أن تكون هذه الوحدة هي عبارة عن عنصر سنقوم بإستخدامه في وحدة أخرى .. و من الممكن أن تكون هي التصميم كله .. و في هذه الحالة تسمى الـTop Module .. و هذا البرنامج يعتبر أن أول وحدة قمنا بإنشائها هي الـTop Module .. و إذا أردت تغيير الـTop Module قد بتحديده من القائمة التي في أيسر النافذة و إضغط بالزر الأيمن و إختار Set as Top Module ..</p>
<p style="padding-left:30px;text-align:right;">إنظر إلى القائمة التي تحتها ..</p>
<p style="padding-left:30px;text-align:right;"><a href="http://omarblog.files.wordpress.com/2010/12/vhdl9.jpeg"><img class="aligncenter size-full wp-image-648" title="vhdl9" src="http://omarblog.files.wordpress.com/2010/12/vhdl9.jpeg?w=600" alt=""   /></a></p>
<p style="padding-left:30px;text-align:right;">قم بتشغيل Check Syntax حتى تتأكد من صحة الكود الوصفي الذي كتبته ..</p>
<p style="padding-left:30px;text-align:right;">إذا كانت الوحدة التي قمت بتحديدها في القائمة التي فوق هذه القائمة هي الوحدة الرئيسية أو الـTop Module فحينها يمكنك أن تجعل البرنامج يعرض لك الرسم التوضيحي Schematic للتصميم أو للدائرة ككل .. و الرسم التوضيحي هذا له نوعين .. النوع الأول هو رسم الغرض منه أن تفهم التصميم .. لذا فهو رسم مقروء واضح لكل من يراه .. فعلى سبيل المثال إذا كان هناك مدخل به أكثر من bit واحد .. أو ما يسمى بالـBus فإنه سيرسمه على أنه مدخل واحد و ربما يكتب تحته عدد الـbits لهذا المدخل .. لن تجده مثلاً يقوم برسمه 16 مرة .. و النوع الأخر هو رسم للدائرة بكل تفاصيلها .. ليس الغرض منه أن تفهم .. إنما الغرض منه أن يعطيك الدائرة بما فيها من تفاصيل لكي تقوم بتصنيعها أو توصيلها بنفسك أو أي شئ من هذا .. و يدعم هذا البرنامج هذين النوعين من الرسوم .. إذا ضغطت على View RTL Schematic فإنه سيظهر لك النوع الأول .. و إذا ضغطت على View Technology Schematic فسيظر لك النوع الثاني ..</p>
<p style="padding-left:30px;text-align:right;"><a href="http://omarblog.files.wordpress.com/2010/12/vvvhhhdddlll.jpeg"><img class="aligncenter size-full wp-image-649" title="vvvhhhdddlll" src="http://omarblog.files.wordpress.com/2010/12/vvvhhhdddlll.jpeg?w=600&#038;h=277" alt="" width="600" height="277" /></a></p>
<p style="padding-left:30px;text-align:right;">هنا سنقوم بعرض الرسم التوضيحي للتصميم .. في القائمة اليسرى ستجد التصميم بكل طبقاته .. ستجد في الأعلى التصميم كله كوحدة واحدة .. يندرج منه العديد من الوحدات بداخل تلك الوحدة .. و إذا قمت بفتح أي من الوحدات ستجد بداخلها وحدات أخرى تندرج منها .. و أنت ربما لا تريد أن تظهر كل الطبقات .. تريد أن تظهر التصميم على أنه وحدة واحدة .. أو تريد أن تظهر تفاصيل بعض الوحدات و تتجاهل تفاصيل وحدات أخرى .. و لهذا السبب ستقوم بتحديد ماذا تريد أن تراه .. قم بتحديده في القائمة اليسرى ثم إضغط Add ثم Create Schematic ..</p>
<p style="padding-left:30px;text-align:right;"><a href="http://omarblog.files.wordpress.com/2010/12/rtl.jpeg"><img class="aligncenter size-full wp-image-650" title="rtl" src="http://omarblog.files.wordpress.com/2010/12/rtl.jpeg?w=600&#038;h=379" alt="" width="600" height="379" /></a></p>
<p style="padding-left:30px;text-align:right;">و هنا قمنا بإظهار الرسم التوضيحي .. نلاحظ هنا أن البرنامج إستنتج من خلال الكود أننا كنا نريد أن نضع ناخب (MUX) .. فقام برسمه في التصميم بالرمز المعروف له .. و هذا أمر سنعتاد عليه .. أحياناً سنجده يستنتج بنفسه أننا كنا نقصد عمل دائرة جمع Adder أو طرح Subtracter أو ضرب Multiplier أو كنا نريد أن نضع ذاكرة Ram .. فكلما إستنتج وجود شئٍ ما سيقوم بوضعه في الرسم بالرمز المعروف له .. و إذا لم يستنتج أننا نقصد شئ معروف فسيقوم بوضعه كمربع مليء بالبوابات المنطقية ..</p>
<p style="padding-left:30px;text-align:right;">و هكذا نكون قد إنتهينا من وصف هذه الدائرة .. و لندع المحاكاة و برمجة رقاقات الـFPGA للمرة القادمة ..</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d8%b4%d8%b1%d9%88%d8%ad%d8%a7%d8%aa/'>شروحات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/637/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=637&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2010/12/17/hdl1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl1.jpeg" medium="image">
			<media:title type="html">vhdl1</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl2.jpeg" medium="image">
			<media:title type="html">vhdl2</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl3.jpeg" medium="image">
			<media:title type="html">vhdl3</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl5.jpeg" medium="image">
			<media:title type="html">vhdl5</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl6.jpeg" medium="image">
			<media:title type="html">vhdl6</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl7.jpeg" medium="image">
			<media:title type="html">vhdl7</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vhdl9.jpeg" medium="image">
			<media:title type="html">vhdl9</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/vvvhhhdddlll.jpeg" medium="image">
			<media:title type="html">vvvhhhdddlll</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/12/rtl.jpeg" medium="image">
			<media:title type="html">rtl</media:title>
		</media:content>
	</item>
		<item>
		<title>مقدمة إلى اللغات الوصفية للهاردوير</title>
		<link>http://omarmokhtar.net/2010/12/09/digital-design/</link>
		<comments>http://omarmokhtar.net/2010/12/09/digital-design/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 21:54:13 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[مذكرات]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[Hardware description language]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[Organizations]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming language]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=626</guid>
		<description><![CDATA[قانونٌ واحد جمع بين معظم التطورات في شتى مجالات الهندسة .. يمكن أن تلحظ سريان هذا القانون بسهولة في العديد من التطورات و الإختراعات .. يقول هذا القانون بأنك إذا وجدت عملاً روتينياً مكرراً يقوم به الإنسان بشكل متكرر و كانت التكنولوجيا التي عندك تسمح لك بأن تجعل الآلة تعمل هذا العمل بدلاً من الإنسان [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=626&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>قانونٌ واحد جمع بين معظم التطورات في شتى مجالات الهندسة .. يمكن أن تلحظ سريان هذا القانون بسهولة في العديد من التطورات و الإختراعات .. يقول هذا القانون بأنك إذا وجدت عملاً روتينياً مكرراً يقوم به الإنسان بشكل متكرر و كانت التكنولوجيا التي عندك تسمح لك بأن تجعل الآلة تعمل هذا العمل بدلاً من الإنسان فقم بعمل تلك الآلة .. و إذا كانت التكونولوجيا التي عندك لا توفر لك هذا فقم بتطويرها حتى تصل بها إلى هذا المستوى</p>
<p>و إذا دققت النظر في معظم الأشياء &#8211; إن لم يكن كلها &#8211; ستجد أن هذه القاعدة تنطبق عليها .. فعلى سبيل المثال .. الموظف الذي يقوم بإدارة قواعد البيانات .. كان يحتفظ بالعديد من الدفاتر و الأوراق و يقوم بالبحث فيها و ترتيبها .. عندما زاد الأمر عن حده و وجدنا أننا بحاجة إلى العديد من الموظفين .. و لهذا الأمر تم عمل برامج إدارة قواعد البيانات و خوارزميات البحث Searching Algorithms إلى غير ذلك .. فليس الجديد أن توجد قواعد بيانات و إنما الجديد هو من الذي سيقوم بها .. هل الإنسان أم الآلة ..  فالإنسان دائماً ما يمل من تكرار العمليات الروتينية التي لا تفكير فيها ولا إبداع و يميل أكثر إلى إعمال عقله و ليس إلى تعطيله .. و البحث وسط الأوراق عملية تعطل العقل و تجعل الإنسان مجرد آلة تعمل .. فلماذا لا نجعل الآلة تعمل هذا العمل من البداية .. و يدخل في هذا الأمر العديد من الأشياء مثل الروبوتات Robotics و الذكاء الإصطناعي Artificial Intelligence و الشبكات Networking و الإتصالات و غير ذلك ..</p>
<p>و لم يقتصر الأمر على تسهيل حياة المستخدم النهائي End User فحسب .. بل تعدى الأمر إلى المصممين أيضاً .. فبعض التصميمات تحتاج إلى العديد من المعادلات الرياضية المعقدة مما يجعلنا نحتاج إلى عمل بعض البرامج التي تقوم بحل المعادلات الرياضية و تحليلها .. فالمصمم هو الأخر يريد أن يستغل وقته في الإبداع و إستخراج أفضل الأفكار و ليس في حل معادلات رياضية روتينية تقليدية تحتاج إلى الوقت أكثر من إحتياجها إلى العقل .. و يدخل في هذا الأمر برامج تصميم الدوائر الإلكترونية و الكهربائية و برامج المحاكاة للأنظمة الكهربائية و الميكانيكية و أنظمة التحكم الآلي إلى غير ذلك ..</p>
<p><span id="more-626"></span></p>
<p>ولا شك بأن مجال التصميم الرقمي Digital Design هو أحوج المجالات إلى إستخدام التصميم الآلي أو ما يعرف بإسم Design Automation .. فكما يعلم من درس تصميم الدوائر الرقمية Digital Design أننا نستخدم ما يسمى بالبوابات المنطقية Logic Gates و نقوم بكتابة كل المخرجات outputs المتوقعة التي يمكن أن ستخرجها الدائرة الرقمية و كل المدخلات inputs المتوقع أن تدخل إلى الدائرة و نقوم بالربط بينهما في جدول يعرف بإسم Truth Table .. و بناءاً على هذا الجدول نقوم بتصميم الدائرة المنطقية التي نريد .. و المثال الآتي يوضح تلك الطريقة (أو يراجع عليها حتى يتذكرها من يعرفها في الأصل) ..</p>
<p>تخيل أننا نريد أن نصمم دائرة رقمية .. لها أربعة مدخلات و مخرج واحد .. الهدف منها هو أننا نريد أن نختار أي المدخلات سوف تعبر نحو المخرجات .. و يتم تحديد المدخل الذي سوف يعبر عن طريق مدخل أخر .. و هذه الدائرة تسمى &#8220;الناخب&#8221; أو ما يعرف بالـMUX .. له العديد و العديد من الإستخدامات .. بل هو أكثر الدوائر إستخداماً في الحواسيب .. فيوجد منها في الذاكرة RAM حيث يدخل إليه كل البيانات المخزنة فيها و يتم إختيار الجزء أو البايت الذي نريد قرائته أو إستخدامه فقط .. أو أحياناً ستجد بأن هناك العديد من الوحدات بداخل الحاسب الآلي تريد أن تدخل بعض البيانات إلى المعالج Processor .. ففي هذه الحالة ستكون تلك الدائرة موجودة بالخارج ليقوم المعالج بإختيار الوحدة التي يريد أن يستقبل منها البيانات التي تريد أن ترسلها .. المهم أن لها إستخدامات عديدة جداً .. و الآن نريد أن نقوم بتصميم تلك الدائرة .. و حسب الطريقة التقليدية في التصميم سنقوم بعمل جدول به  كل الإحتمالات المتوقعة للمدخلات و المخرجات .. و تلك الدائرة لها مخرج واحد و أربع مدخلات (قد يكون لها اي عدد من المدخلات بالطبع) و يوجد لها مدخل أخر يحدد أي المدخلات سوف يتم إختياره ليعبر نحو المخرج .. و الصورة التي بالأسفل بها هذا الجدول و تلك الدائرة التي إستنتجناها بناءاً على الجدول .. و سوف نقوم بتسمية المدخلات I0 و I1 و I2 و I3 .. و المدخلات التي سيتم إختيار المخرج عن طريقها  S0 و S1 .. و المخرج سوف نسميه F ..</p>
<p><img class="aligncenter" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Multiplexer_Example01.svg/450px-Multiplexer_Example01.svg.png" alt="" width="450" height="640" /></p>
<p>و بعد أن قمنا بعمل مثل هذا الجدول (و الذي يحتوي على 64 إحتمال) قمنا بإستنتاج الدائرة بناءاً على الجدول .. و كما يعلم من لديه فكرة عن التصميم الرقمي بهذه الطريقة سيجد بأن من قام بالإبداع و الإختراع هو من أتى بفكرة دائرة الناخب Mux و ليس من قام بتصميمها .. بمعنى أخر .. الذي جائت له فكرة أن يقوم بعمل دائرة تختار أي المدخلات سوف تعبر إلى المخرجات و إخترع لها تطبيقات هو بالفعل الذي إخترع .. و أما من قام برصد كل الحالات المتوقعة في جدول و قام بإستنتاج الدائرة من الجدول فلم يخترع شيئاً و إنما قام بعمل روتيني مكرر فضلاً عن الوقت الذي قد يضيعه وهو يقوم بمثل هذا ..</p>
<p>و بما أننا دائماً نريد أن نجعل الآلة هي التي تقوم بعمل العمليات الروتينية لنجعل الإنسان يركز أكثر على الإبداع و التفكير .. فقد خرجت بعض البرامج التي تقوم بتصميم الدوائر الرقمية .. فقط صف لها ماذا سوف تفعل الدائرة و سيقوم البرنامج بإستنتاج كل شئ و تصميم الدائرة لك .. و هنا يأتي السؤال الذي سيطرح نفسه .. و هو كيف سنقوم بوصف الدائرة للبرنامج حتى يقوم بتصميمها ؟؟ هل سنقوم بوضع الجدول الذي يحتوي على كل الإحتمالات و يقوم هو بإستنتاج الدائرة ؟؟ إن وضع الجدول بحد ذاته هو أمر يطول .. ستجد أنك سوف تحتاج إلى عدد من المعطيات يزيد كلما زادت عدد المدخلات .. فستجد أن معطيات الجدول تساوي 2^(عدد المدخلات) مضروباً في عدد المخرجات .. إذ أن كل مخرج من المخرجات له دائرته الخاصة به .. و الدائرة السابقة كان بها عدد 6 من المدخلات .. 4 منهم للبيانات التي تريد أن تعبر و 2 منهم يحددان أي مدخل من المدخلات سوف يعبر .. أي أننا نحتاج إلى 64 حالة من الحالات سوف نضعها في الجدول .. و عدد المخرجات هو 1 و لهذا فالأمر بسيط .. و لكن ماذا يحدث إذا كنت تريد أن تقوم بتصميم معالج يعمل على 32bits ؟؟ هل ستقوم بعمل جدول به 2^32 من الحالات و الذي يعادل 4294967296 حالة ؟؟ هذا فضلاً عن عدد المخرجات التي سوف يخرجها هذا المعالج فضلاً عن المدخلات و المخرجات التي تأتي من المسجلات Registers و التي سوف تكتشف بعد ذلك أنها ستتسبب في نوعين من الجداول .. الأول يسمى جدول الإنتقال Transition Truth Table و الأخر جدول التنفيذ Excitation Table .. و لهذا السبب لن يكون الحل هو أن نعطي البرنامج الذي سيقوم بالتصميم جدول الإحتمالات و يقول هو بتصميم الدائرة ..</p>
<p>إذا كانت لديك فكرة تريد أ ن تنفذها كهاردوير Hardware و تريد أن تخبر المصمم (الذي سيقوم بعمل الجدول) عن فكرتك ليبدأ في التصميم .. ماذا ستقول له ؟؟ بالطبع سوف تصف له سلوك و تصرف الدائرة أو قد ترسم له بعض الرسومات التوضيحية مثل الرسم الإنسيابي Flow Chart بالإضافة إلى بعض التعليقات الكلامية حتى يتضح له ماذا سيفعل .. بالضبط هذا ما سوف تقوم به عندما تتحدث مع البرنامج الذي سيقوم بالتصميم عن تصميمك .. و بالطبع لن تقوم بكتابة بعض الكلمات الإنجليزية !! فبما أنك ستتعامل مع ألة فلا شك أن هذا الوصف الذي سوف تصفه للدائرة أو للتصميم الذي تريد سيكون محكوماً ببعض القواعد و القوانين مثل التي في لغات البرمجة و التي تعرف بالـSyntax و الـSemantics .. و هذا هو مفهوم اللغات الوصفية اللهاردوير Hardware Description Language ..</p>
<p>مفهوم اللغات الوصفية Description Languages يختلف إختلافاً كبيراً عن اللغات البرمجية Programming Languages .. فاللغات الوصفية تخاطب فيها برنامجاً من البرامج سيقوم بفهم ما قلته له و سيقوم بعمل دائرة رقمية بناءاً على وصفك الذي وصفت .. أما اللغات البرمجية فأنت تخاطب فيها المعالج Processor و تذكر له فيها التعليمات التي سوف يقوم بتنفيذها و هو يقوم بتنفيذها عميانياً بغير تفكير منه .. و المنتج الذي تنتظره من اللغة الوصفية هو دائرة رقمية .. أما المنتج الذي تنتظره من لغة برمجية هو تعليمات instructions موجهة إلى المعالج ليقوم بتنفيذها ..</p>
<p>و بما أن تصميم الدائرة سيكون في يد البرنامج و ليس في يد إنسان .. فلا شك أنه يمكننا الإستفادة منه بقدر الإمكان .. فيمكنه أن يقوم بإختصار التصميم Design Optimization .. و يمكنه أن يقوم بحساب مساحة التصميم و الوقت الذي تحتاجه الدائرة لكي تخرج المخرجات بشكل صحيح Time Response .. كما يمكنها أن تقوم بعمل محاكاة للدائرة لكي ترى المخرجات المتوقعة بنفسك لترى هل ستعمل الدائرة بالشكل المطلوب أم لا .. و العديد و العديد من الأشياء التي سوف نعرفها في الدروس القادمة إن شاء الله ..</p>
<p>و إختبار التصميم باب واسع من العلم .. فنحن لا نريد أن نقوم بعمل تصميم أو دائرة تكاملية Integrated Circuit و بعد أن نقوم بتصنيعها نكتشف أنها لا تعمل أو أننا قد أخطئنا في التصميم .. فلا بد من إختبارها أولاً .. و أول مرحلة في الإختبار هي مرحلة المحاكاة Simulation و في هذه المرحلة يقوم البرنامج الذي معه التصميم بمحاكاته بحيث يخبرنا بالمخرجات التي سوف تخرج من التصميم إذا تم تشغيله بالفعل .. بالطبع بناءاً على المعادلات التي إستنتجها بعد أن إنتهى من التصميم .. و لكن هذه المرحلة ليست كافية .. نحتاج إلى إختبار التصميم بالفعل كدائرة كهربائية و ليس كبيانات تخرج على شاشة الحاسوب .. و في هذه الحالة نستخدم الرقاقات القابلة للبرمجة Programmable Chips .. و هي ليست سوى دوائر تكاملية Integrated Circuits نقوم ببرمجتها بطريقة أو بأخرى فتصبح هذه الدائرة هي التصميم الذي نريده .. فتتصرف كما سيتصرف التصميم الذي قمنا بعمله و كأنها تقلد الدائرة .. و بهذه الطريقة سنختبر التصميم بالفعل كإشارات إلكترونية Electronic Signals حقيقية و ليس كبيانات مبنية على الحسابات فقط .. و لكن بالطبع برمجة تلك الرقاقات ليست هي الهدف .. و غالباً ما تستخدم للإختبار .. و بعد أن نقوم بعمل الإختبار و نتأكد بالفعل أن هذا التصميم سيعمل نقوم بعد ذلك بتصنيعه ..</p>
<p>يوجد العديد من اللغات الوصفية .. و في ما يلي من دروس إن شاء الله سنتعرض للغة الـVHDL .. سنبدأ بوضع أمثلة بسيطة و شرحها عما قريب إن شاء الله ..</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d9%85%d8%b0%d9%83%d8%b1%d8%a7%d8%aa/'>مذكرات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/626/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=626&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2010/12/09/digital-design/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Multiplexer_Example01.svg/450px-Multiplexer_Example01.svg.png" medium="image" />
	</item>
		<item>
		<title>Ubuntu Linux 10.10 is Out Now !! Hurry Up</title>
		<link>http://omarmokhtar.net/2010/10/10/101010101010/</link>
		<comments>http://omarmokhtar.net/2010/10/10/101010101010/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 16:48:32 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[أخبار لينوكس]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=615</guid>
		<description><![CDATA[يومٍ لن يتكرر إلا بعد ألف عامٍ من الزمان .. إنه اليوم العاشر من الشهر العاشر (أكتوبر) في السنة العاشرة بعد الألفين .. أو كما أطلق عليه البعض يوم الـBinary إذ أنك إن كتبت هذا التاريخ بالأرقام فلن تخرج عن الواحد أو الصفر .. على أي الأحوال كل هذا لا يهم الآن .. المهم أن [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=615&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>يومٍ لن يتكرر إلا بعد ألف عامٍ من الزمان .. إنه اليوم العاشر من الشهر العاشر (أكتوبر) في السنة العاشرة بعد الألفين .. أو كما أطلق عليه البعض يوم الـBinary إذ أنك إن كتبت هذا التاريخ بالأرقام فلن تخرج عن الواحد أو الصفر ..</p>
<p>على أي الأحوال كل هذا لا يهم الآن .. المهم أن شركة كانونيكال (و قلتدها بعض الشركات الآخرى) قامت بإصدار الإصدار العاشر فاصل العاشر من توزيعتها المعروفة أوبونتو لينوكس Ubuntu Linux 10.10 .. في العادة تقوم شركة كانونيكال Canonical بإصدار تلك التوزيعة Distribution كل ستة أشهر .. و جرى العرف على مر السنين أن يكون الإصدار في الشهر الرابع و يليه الإصدار الآخر في الشهر العاشر ثم الرابع و هكذا .. و كانت الإصدارات تخرج إلى النور في أخر خميس من الشهر .. غير أن في هذه المرة قاموا بإصداره في اليوم العاشر من الشهر حتى يتوافق رقم الإصدار 10.10 مع التاريخ 10.10.10 .. لا أدري كم كانت الساعة حينها إلا أنها بالقرب من العاشرة بتوقيت جرنيتش فربما كان في الساعة العاشرة بعد الثانية العاشرة من الدقيقة العاشرة و ربما كان بعد عشرة علامات من العلامة العشرية للثانية العاشرة على حسب ما يسعه عدد البتات Bits التي تمثل الرقم الكسري floating point .. دعونا من كل ذلك .. المهم أن الإصدار قد خرج ..</p>
<p>و هذا هو رابط التحميل</p>
<p><a href="http://www.ubuntu.com/desktop/get-ubuntu/download">http://www.ubuntu.com/desktop/get-ubuntu/download</a></p>
<p><img class="aligncenter" src="http://www.ubuntu.com/sites/default/files/active/maverick/install_01_medium.jpg" alt="" width="448" height="366" /></p>
<p><span id="more-615"></span></p>
<p><img class="aligncenter" src="http://www.ubuntu.com/sites/default/files/active/maverick/install_02_medium.jpg" alt="" width="447" height="369" /></p>
<p><img class="aligncenter" src="http://www.ubuntu.com/sites/default/files/active/maverick/install_04_medium.jpg" alt="" width="447" height="368" /></p>
<p>سأعود إليكم بعد تجربتها و جاري التحميل الآن !!</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d8%a3%d8%ae%d8%a8%d8%a7%d8%b1-%d9%84%d9%8a%d9%86%d9%88%d9%83%d8%b3/'>أخبار لينوكس</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/615/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/615/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/615/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/615/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/615/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/615/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/615/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/615/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=615&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2010/10/10/101010101010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://www.ubuntu.com/sites/default/files/active/maverick/install_01_medium.jpg" medium="image" />

		<media:content url="http://www.ubuntu.com/sites/default/files/active/maverick/install_02_medium.jpg" medium="image" />

		<media:content url="http://www.ubuntu.com/sites/default/files/active/maverick/install_04_medium.jpg" medium="image" />
	</item>
		<item>
		<title>فقط 80 مليون مصري ضد التغيير</title>
		<link>http://omarmokhtar.net/2010/10/01/egyptiansantichange/</link>
		<comments>http://omarmokhtar.net/2010/10/01/egyptiansantichange/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 21:02:27 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[مذكرات]]></category>
		<category><![CDATA[خواطر مبرمج]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=595</guid>
		<description><![CDATA[تقريباً كدة من ييجي خمس أو عشر سنين .. كنت تسمع مقارنات بين الشباب بتوع زمان أيام سعد زغلول أو جمال عبد الناصر و بين الشباب بتوع دلوقتي .. يقولك إن الشباب بتوع زمان كانوا مهتمين بالسياسة و متابعين كل الأحداث و ليهم مواقف و أراء و كدة .. بينما الشباب بتاع الأيام دي و [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=595&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>تقريباً كدة من ييجي خمس أو عشر سنين .. كنت تسمع مقارنات بين الشباب بتوع زمان أيام سعد زغلول أو جمال عبد الناصر و بين الشباب بتوع دلوقتي .. يقولك إن الشباب بتوع زمان كانوا مهتمين بالسياسة و متابعين كل الأحداث و ليهم مواقف و أراء و كدة .. بينما الشباب بتاع الأيام دي و لو سألتهم على أي حدث من الأحداث المهمة ولا حتى إية أسامي الوزراء حتلاقيهم ميعرفوش حاجة و كل إللي يعرفوه هو أسامي المغنيين و الأفلام و الكورة و بس .. و دة طبعاً حاصل و محدش يقدر ينكره ..</p>
<p>لكن سبحان مغير الأحوال .. متفهمش إية إللي حصل .. فجأة إقتحمت السياسة أحاديث شباب مصر .. كل طبقات الشباب بما فيهم بتوع الحشيش .. معرفش ممكن يكون إية السبب إللي خلى الشباب بتوع دلوقتي يهتم بالسياسة و يتابع الأحداث كويس أكتر من الشباب بتوع من خمس أو عشر سنين فاتوا ..</p>
<p>يا ترى في حريات زيادة الشعب أخدها ؟؟ يا ترى بعض الأحداث و المواقف إضطرت الناس إنها تهتم بالسياسة ؟؟ يا ترى إلإنترنت و الفيس بوك بالأخص حرك الدنيا شوية ؟؟</p>
<p><strong> ما علينا .. مش موضوعنا دلوقتي .. المهم ..</strong></p>
<p>حالياً .. التركيز اليومين دول على حاجة بيسموها التغيير .. إية التغيير ؟؟ قالك عاوزين نغير بعض القوانين و السياسات إللي في البلد .. بما إنهم شايفين إن بعض القوانين و السياسات الحالية هي السبب في كل المشاكل .. و حاطين أملهم على إن الوصول لحاجة زي كدة هي عن طريق تغيير الحكومة و تغيير المسؤولين .. و بدأ يظهر بعض الأبطال و الزعماء الشعبيين يلتف حولهم الجمهور .. زي الدكتور محمد مصطفى البرادعي الرئيس السابق للوكالة الدولية للطاقة الذرية .. زي السيد عمرو موسى أمين عام جامعة الدول العربية .. زي أيمن نور و نعمان جمعة في الإنتخابات إللي فاتت .. و إن كان أيمن نور مازال له شعبية حتى هذه اللحظة .. زعماء شعبيين كتير بقى .. ممكن أعدلك أساميهم من هنا للصبح ..<span id="more-595"></span></p>
<p>إللي عاوز  أقوله للشعب المصري (طيب القلب) .. للشعب المصري (المكافح) .. للشعب المصري (المخلص) .. بقولهم بلاش تغيير .. حتزعلوا و حتندموا .. التغيير حيجبلكم وجع دماغ و مش حيوصلكم للي إنتم عاوزينه ..</p>
<p>و طبعاً أنا مش بطعن في حد أو بجرح في حد .. لا حقول إن البرادعي وحش أو حلو .. ولا حقول عمرو موسى وحش ولا حلو .. ولا حتى بقول إن جمال مبارك وحش .. مش جاي أتكلم مين وحش و مين حلو دلوقتي .. و عشان تعرف قصدي .. تعالى نتخيل إية إللي حيحصل لو إفترضنا إننا وصلنا للتغيير المنشود ..</p>
<p>1- لو كنت موظف .. خلاص معادش ينفع يبقى في حاجة إسمها إنك تغيب أو تتأخر أو تمشي بدري من الشغل أو تبقى قاعد على مكتبك مش بتعمل حاجة و بتضيع وقتك .. خلاص إنتهينا .. وقت الشغل شغل مفيش هزار .. طبعاً ممكن تصبر على الوضع دة فترة .. بس مش حتستحمل بعد كدة .. و طبعاً الكلام دة مش بجيبه من عندي ولا من تأليفي .. إلا أني بشوف ساعات الناس بتشتكي لما المدير بتاعهم يبقى صارم و عاوز الناس تشتغل صح .. بتحصل و بتحصل كتير كمان ..</p>
<p>2- لو كنت طالب .. تعالى بقى يا حبيبي .. الشغل بتاع زمان دة مفيش منه تاني خلاص .. ما هو تغيير بقى !! .. مفيش حاجة إسمها أصل أنا عاوز أتخرج فلازم الدكتور ينجحني السنة دي عشان مشيلش المادة تاني .. ما هي الحاجات دي هي إللي وديتنا في داهية .. تلاقي خريجين كتير بس أي كلام و ميعرفوش أي حاجة و قاعدين يضيعوا وقت .. و تلاقي مفيش لا إتقان ولا أمانة في الشغل .. ما هما متعلموش كويس من الأول .. فلو سمحت إذا كنت عاوز تغيير و عاوز البلد تبقى أحسن يبقى إستحمل بقى .. مفيش حاجة إسمها الدرس دة يتلغى عشان صعب و إحنا مكسلين نذاكره .. مفيش حاجة إسمها إنك تبقى داخل الإمتحان حافظ المسائل و عاجبك الوضع دة و فرحان بيه .. أو زي الجماعة إللي بيهربوا من دكتور معين و ياخدوا مع واحد تاني .. (دة في الجامعات إللي ماشية بنظام الساعات)  .. قالك أصل الدكتور دة حيبهدلنا و إمتحاناته فيها أفكار و الأسئلة صعبة فبلاش تاخد معاه .. دة بيحصل حالياً و بنشوفه كتير جداً .. فضلاً عن الدكتور الغلس بقى إللي بيخلي الطلبة يعملوا مشاريع .. و طبعاً لو طلع قانون يلزم أعضاء هيئة التدريس بإنهم يبقى كويسين حتقوم الدنيا و لن تقعد .. و أهو دة أخرة التغيير .. و خدوا بالكم برضو إن مش حيبقى في وسايط ولا أي حاجة من دي عشان نبقى صرحاء مع بعض ..</p>
<p>3- لو إنت بقى دكتور في جامعة أو معيد .. القانون دة بقى حيغلس عليك .. أنا عارف إن بقالك مش عارف كام سنة المادة بتدرسها كدة و متعود عليها و متعود على إمتحاناتها و أهو روتين بتأديه و خلاص .. حتبقى ملزم (عشان تحافظ على وظيفتك) إنك تجاوب على أسئلة الطلاب و إنك تساعدهم و تعلمهم و تفهمهم حتى لو حاجات من برة المنهج و يا ويلك لو كنت ناسي معلومات قديمة بما إنك متعود على روتين معين .. و حتبقى ملزم بإنك تخليهم يعملوا أبحاث و مشاريع  و تتابعها معاهم و طبعاً مع التجديد عشان الطلبة متلجأش إنهم ياخدوا الحاجات بتاعت الطلبة بتوع السنين إللي فاتت .. و طبعاً الإمتحانات لازم تجدد و تحط إمتحانات جديدة فيها أفكار .. الموضوع حياخد منك وقت و جهد .. بس عشان تبقى واخد بالك إية أخرة التغيير  إللي بندور عليه ..</p>
<p>و طبعاً في مبدأ إحنا ماشيين عليه حيتلغى تماماً من القاموس بتاعنا .. مفيش حاجة إسمها إن واحد لا يستحق شئ معين تقوم تديهوله رغم إنه لا يستحقه لمجرد إنه صعبان عليك لظروف معينة .. يعني مثلاً لو في مدرس في مدرسة مستواه ضعيف و لا يصلح للتدريس .. و إنت قررت إنك تعفيه من منصبة (يعني تكرشه بس بلفظ متحضر شوية) متقوليش &#8220;حرام أصله عنده عيال و عنده بيت و الراجل ياكل منين&#8221; .. مفيش مجاملة في الحاجات دي !! .. و برضو الكلام ينطبق على الموظفين و كل الناس إللي واخدة أي وظيفة .. طالما هو مستواه أقل من وظيفته و لو إستمر حيفسد مش حيصلح يبقى ميصعبش عليك بقى .. لو عنده عيال فهو  إللي ضيع عياله بإنه أهمل مستواه و أخد وظيفة لا يستحقها .. و ينطبق الكلام على الطالب إللي نجح عشان يا عيني الواد عاوز يتخرج .. سواء نجح بالكوسة أو نجح عن طريق إن الدكتور سهل الإمتحانات و شال نص المنهج و لغى المشاريع عشان سعادته ينجح .. و بتحصل و كتير كمان بل إنها ظاهرة متفشية مش مجرد حالات نادرة ..</p>
<p><strong>ها يا شباب ؟؟ مستعدين للتغيير ؟؟ يا طلاب الجامعات .. لسة عاوزين تغيير مع إنه ممكن ييجي على دماغكم زي ما إنتوا شايفين ؟؟ يا موظفين .. لسة عاوزين تغيير ؟؟ يا طبقات الشعب المصري المختلفة .. لسة عاوزين تغيير ؟؟ أنا قلت إللي عندي و حذرت عشان محدش ييجي يشتكي بعد كدة ..</strong></p>
<p>طبعاً حيطلع واحد يقول في نفسه &#8220;إزاي الكلام دة ؟؟ مين قالك إن الناس مش حيعجبها ؟؟ .. الناس لو لقت حد مهتم بالإصلاح حتمشي صح&#8221; .. أحب أقول<strong> إذا كان الناس عاوزين تغيير و إصلاح بجد .. يورونا نفسهم من دلوقتي</strong> .. أشوف الطالب مهتم بإنه يتعلم و بإنه يبحث و يدور حتى لو محدش طلب منه .. أشوف الموظفين مش بيكسلوا و مهتمين بشغلهم و مش مقصرين في أي حاجة و مش بيضيعوا وقتهم .. أشوف دكاترة و معيدين ماشيين صح مفيش لا حفظ ولا إمتحان السنة إللي فاتت ييجي زي ما هو عشان مكسل يحط إمتحان جديد و مكسل يدرس مادة على بعضها فيشيل منها حاجات .. أشوف ناس عاوز تبقى متحضرة فعلاً مش ناس بتكسل في كل حاجة و ما بتصدق تلاقي أجازة عشان تنام في البيت .. أشوف ناس ماشية صح و بتحاول تصلح بقدر الإمكان .. عاوزين شغل بجد .. مش عاوزين حد يعطلنا عن الإتقان و يعطلنا عن التعليم الصح زي ما بنشوف كل يوم للأسف .. أشوف ناس معندهاش مبدأ إن يصعب عليك حد عشان عنده عيال .. ما إحنا قلنا هو إللي ضيع نفسه و عياله بإهماله .. <strong>بإختصار .. عاوزين نشوف ناس مستعدة للتغيير بجد</strong> .. لو مشفوتش كدة يبقى فعلاً .. صدقت لما قلت .. إن الـ80 مليون مصري ضد التغيير ..</p>
<p><a href="http://omarblog.files.wordpress.com/2010/10/operationseugicalweb-20100214-123812.jpg"><img class="aligncenter size-full wp-image-602" title="operationseugicalweb-20100214-123812" src="http://omarblog.files.wordpress.com/2010/10/operationseugicalweb-20100214-123812.jpg?w=600" alt=""   /></a></p>
<p><a href="http://omarblog.files.wordpress.com/2010/10/1138.jpg"><img class="aligncenter size-full wp-image-603" title="1138" src="http://omarblog.files.wordpress.com/2010/10/1138.jpg?w=600" alt=""   /></a></p>
<p><a href="http://omarblog.files.wordpress.com/2010/10/1089.jpg"><img class="aligncenter size-full wp-image-604" title="1089" src="http://omarblog.files.wordpress.com/2010/10/1089.jpg?w=600" alt=""   /></a></p>
<p><a href="http://omarblog.files.wordpress.com/2010/10/1158.jpg"><img class="aligncenter size-full wp-image-605" title="1158" src="http://omarblog.files.wordpress.com/2010/10/1158.jpg?w=600" alt=""   /></a></p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d9%85%d8%b0%d9%83%d8%b1%d8%a7%d8%aa/'>مذكرات</a>, <a href='http://omarmokhtar.net/category/%d8%ae%d9%88%d8%a7%d8%b7%d8%b1-%d9%85%d8%a8%d8%b1%d9%85%d8%ac/'>خواطر مبرمج</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/595/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=595&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2010/10/01/egyptiansantichange/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/10/operationseugicalweb-20100214-123812.jpg" medium="image">
			<media:title type="html">operationseugicalweb-20100214-123812</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/10/1138.jpg" medium="image">
			<media:title type="html">1138</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/10/1089.jpg" medium="image">
			<media:title type="html">1089</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/10/1158.jpg" medium="image">
			<media:title type="html">1158</media:title>
		</media:content>
	</item>
		<item>
		<title>حول النموذج المثالي و التصميم المجرد و الطبقات</title>
		<link>http://omarmokhtar.net/2010/09/17/idealabstract/</link>
		<comments>http://omarmokhtar.net/2010/09/17/idealabstract/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 05:00:48 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[خواطر مبرمج]]></category>
		<category><![CDATA[شروحات]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=572</guid>
		<description><![CDATA[لمزيداً من التعميق لمفهوم طبقات الهندسة و إستكمالاً لما بدأناه في تلك المقالة .. أقدم لكم تلخيصاً شاملاً لبعض المفاهيم حول هذا الموضوع في عدة نقاط .. 1) في البداية أفترض أنك قد قرأت مقالة طبقات الهندسة أو على علم بهذا المفهوم. 2) عندما تقوم بتصميم أي شئ عليك أن تحدد في أي طبقة أنت [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=572&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>لمزيداً من التعميق لمفهوم <a href="http://omarblog.wordpress.com/2010/08/07/layers/">طبقات الهندسة</a> و إستكمالاً لما بدأناه في تلك المقالة .. أقدم لكم تلخيصاً شاملاً لبعض المفاهيم حول هذا الموضوع في عدة نقاط ..</p>
<p>1) في البداية أفترض أنك قد قرأت مقالة <a href="http://omarblog.wordpress.com/2010/08/07/layers/">طبقات الهندسة</a> أو على علم بهذا المفهوم.</p>
<p>2) عندما تقوم بتصميم أي شئ عليك أن تحدد في أي طبقة أنت تعمل. و لهذا يجب عليك أن تكون على علم بهذه الطبقة و ما فيها. و عليك أن تعرف ما هي الطبقة التي فوقك و هي بالنسبة لك طبقة المستخدمين الذين سيستفيدون من تصميمك. و لهذا يجب أيضاً أن تكون على علم بتلك الطبقة. و ليس شرطاً أن يكون تصميمك مقدماً إلى المستخدم النهائي End User. و إنما قد يكون تصميمك سيستفيد منه مصممين آخرين. فعلى سبيل المثال قد تكون أنت من يقوم بتصميم المعالجات الدقيقة Microprocessors. فالمستخدم بالنسبة لك في هذه الحالة هو من سيقوم بكتابة نظام تشغيل بإستخدام لغة التجميع أسمبلي Assembly Language. كما يجب عليك أن تكون على علم بالطبقة التي تحتك و التي سوف تستخدم منتجاتها و التي أنت المستخدم بالنسبة لها. و في مثال المعالجات الدقيقة فإن تلك الطبقة هي من يقوم بتصميم البوابات المنطقية Logic Gates و بعض الدوائر التماثلية Analog مثل الساعة Clock و غيرها. و بناءاً على هذا الكلام فإنك لكي تعمل بشكل جيد يجب عليك أن تكون على علم بثلاث طبقات على الأقل.</p>
<p>3) يختلف ترتيب الطبقات تاريخياً عن ترتيبها من ناحية التصميم. بعبارة آخرى<span id="more-572"></span>عندما تقوم بعمل تصميم كبير فإنك تفكر أولاً في ما يحتاجه المستخدم النهائي. ثم تفكر في الطبقة التي تحتها و تنزل بمستوى التفاصيل Level Of Details إلى مستوى أعمق قليلاً لتدخل في الطبقة التي تحتها حتى تصل إلى الطبقة التي سوف تكون أنت المستخدم لها و ليس المصمم لها (راجع  <a href="http://omarblog.wordpress.com/2010/05/21/object-oriented-engineering/">Object Oriented Engineering</a>). فالحاصل أنك تفكر في الطبقة العليا كيف ستكون ثم تفكر في الطبقة التي تليها ماذا ستفعل فيها لكي تنفذ ما قمت بتصوره في الطبقة التي فوقها. أما بالنسبة للترتيب التاريخي للطبقات فهناك طبقتان أساسيتان وجدتا منذ فجر التاريخ. فالأولى هي طبقة المستخدم النهائي و الثانية هي طبقة المادة و التي يوجد بها أدق أدق التفاصيل و يعتمد فهمها و الدخول فيها على القوانين الفيزيائية و الظواهر الطبيعية. فعلى سبيل المثال إذا تحدثت عن مروحة قديمة فلن نجد فيها سوى طبقتان. الأولى هي طبقة المستخدم النهائي الذي يفتح و يغلق المروحة. و الثانية هي الطبقة الفيزيائية أو طبقة المادة. لن تجد فيها سوى بعض الملفات Coils و التي يقوم مجالها المغناطيسي بتدوير المروحة عندما يمر تيار كهربائي في الملفات. فمصمم المروحة في هذا الزمان يجب أن يكون على علم بقوانين المغناطيسية. إذا جئنا لنتحدث عن رجل آلي Robot فسنجد به العديد من الطبقات. فهناك طبقة المستخدم النهائي. و هناك طبقة ليست سوى تصميم مجرد أو رسم تخطيطي يوجد به بعض الوحدات تسمى بالمحركات Motors يربطها وحدة خالية من التفاصيل إسمها دائرة التحكم و بجانبها وحدة خالية من التفاصيل أيضاً تأخد المدخلات inputs. إذا إخترت أن تتعمق في طبقة المحركات عندها ستجد ما يتعلق بالمغناطيسية و قوانينها الفيزيائية. أما مصمم الروبوت فلم يكن يهمه تلك القوانين الفيزيائية و المغناطيسية إذ أنه تعامل مع المحرك على أنه شئ له عزم و له تيار يأخذه يقابل هذا العزم و له طاقة يستهلكها إلى غير ذلك من الأشياء التي تهم مستخدم المحرك. بالنسبة للمروحة القديمة فلم تكن التفاصيل الموجودة فيها كثيرة لدرجة إحتياجهم إلى عمل طبقة للمحرك و طبقة للقوانين الفيزيائية و طبقة للمستخدم النهائي. و تاريخياً كلما زادت التفاصيل إحتاج الناس إلى عمل طبقة جديدة تخفف من تعقيد النظام.</p>
<p>4) بما أن تاريخياً لم يكن هناك سوى الطبقة الفيزيائية Physical Layer في كل شئ و بما أن تاريخياً تدرجت التصاميم و الإختراعات من البسيط إلى المعقد فإن الدارسين لتلك التصاميم في الجامعات يبدأون بالطبقة الفيزيائية أو طبقة الدوائر الإلكترونية.</p>
<p>5) ليس معنى كون أكثر الخريجين يعملون في الطبقات العالية المستوى High Level مثل قواعد البيانات و تصميم مواقع الإنترنت و إدارة الشبكات و التحكم في المصانع و غيرها أن الطبقات المنخفضة المستوى لا يعمل بها أحد. أو كما يعتقد البعض بأن ما درسوه في الطبقات المنخفضة مجرد أساسيات وضعت منذ زمن بعيد و لم نعد بحاجة إلى تذكرها. الأمر ليس كذلك على الإطلاق. فليس هناك معلومة واحدة تعد من الأساسيات التي لا حاجة لنا بها. بما في ذلك أعقد القوانين الفيزيائية و الرياضية. و الحقيقة هي أن كل الطبقات مازالت تطور و مازال هناك من يعمل فيها. فهناك من يتعامل مع أشباه الموصلات في عمله. و هناك من يتعامل مع البوابات المنطقية في عمله. و هناك من يتعامل مع لغة التجميع Assembly في عمله و هناك من يتعامل مع المكبرات Amplifiers في عمله. فكل الطبقات و كل العلوم و كل شئ مازال هناك من يعمل فيه. فليس كل الناس يعملون في قواعد البيانات. الفارق الوحيد فقط هو أن عدد الذين يعملون في الطبقات العالية  أكثر بكثير من عدد الذين يعملون في الطبقات المنخفضة المستوى.</p>
<p>6) في الطبقات المنخفضة سنجد بأنها تتميز بالكثرة في الكم. فعلى سبيل المثال, الذين يقومون بتصنيع أشباه الموصلات و تصنيع الترانزيستور Transistor يقومون بالإنتاج بأعداد و كميات ضخمة تصل إلى ملايين المليارات. فكل سكان العالم يحتاجون إلى الترانزيستور و كل المهندسين في العالم و كل التخصصات و كل التصميمات تحتاج إليه. فلابد من إنتاجه بشكل كبير. و لكن هل يحتاج العالم إلى باحثين كثيرين في هذا المجال ؟؟ إن أنواع الترانزيستور و كل المكونات الإلكترونية محدودة و معدودة. نعم يقومون بتطويرها و تحسين أدائها بلا شك. فلم يخترعوه و يتركوه بزعم أن هذا من الأساسيات التي لسنا بحاجة إليها. بل مازالت هناك العديد من التطورات عليه و على كفائته و حجمه و الطاقة التي يستهلكها. إذا صعدنا إلى الأعلى قليلاً سنجد بأن هناك من يقوم بتصميم المعالجات الدقيقة Microprocessors. يوجد بالطبع العديد من الإصدارات للمعالجات الدقيقة تتباين في الكفاءة و السرعة و الحجم و الطاقة و غير ذلك لتتناسب مع جميع الأغراض. و لهذا بالطبع نحتاج إلى عدد أكبر يعمل في هذا المجال لأن الكثرة في الكيف ظهرت في هذه الطبقة إلا أن الكثرة في الكم قد إنخفضت. فليست كل التطبيقات تحتاج إلى المعالجات الدقيقة. و لنصعد إلى الأعلى قليلاً. و تأمل مطوري أنظمة التشغيل. ستجد بأن جميعهم يستخدمون نفس المعالجات إلا أن الأنظمة أكثر من المعالجات. و لهذا مطوري أنظمة التشغيل أكثر من مطوري المعالجات. و سنجد الإختلافات بين أنظمة التشغيل التي تعمل نفس المعالج. و لهذا سنجد بأن المعالجات أكثر في الكمية و أقل في الكيفية. و حين ننتهي إلى طبقة المستخدم النهائي سنجد بأن أنواع و إصدارات الهواتف المحمولة مثلاً كبيرة جداً .. إلا أن كل شركة تبيع لعدد محدود من الزبائن و ليس لكل البشر.</p>
<p>7) تتميز بعض الطبقات بشئ إسمه <strong>النموذج المثالي</strong> Ideal Model و هي أن يقوم المصمم بإفتراض أنه يتعامل مع أشياء مثالية لا عيب ولا خطأ فيها و تؤدي الغرض على أكمل وجه حيث يتجاهل الواقع و المكونات العملية و يركز على أفضل حالة يتخيلها للشئ الذي سيستخدمه. و لماذا يقوم بإبعاد نفسه عن الواقع ؟؟ هذا ليس إبعاداً لنفسه عن الواقع بل هذا توضيح للهدف الذي يريد أن يصل إليه. فلو شائت الأقدار أن يصل إلى هذا الهدف فهذا ممتاز. و إن إقترب منه فهذا جيد. فعلى سبيل المثال يقوم مصممي الدوائر الإلكترونية بإفتراض أن مكبر العمليات Operational Amplifier الذي يضعونه في الدائرة هو مكبر مثالي. فيتيخلون أفضل حاله له علماً بأنهم يعلمون أنها مستحيلة عملياً. فيقولون بأن التيار الداخل إليه يساوي صفر. و هذا مستحيل جملةً و تفصيلاً إذ أن الشئ الوحيد المحسوس الملموس فيزيائياً في الدوائر الكهربائية هو التيار الكهربائي. إذاً كيف يكون التيار الداخل إلى المكبر OpAmp يساوي صفراً ؟؟ نعم .. نحن نعلم أنه ليس بصفر و لكني سأقول في التصميم الذي صممته أن التيار يساوي صفر. فإذا جاء أحد مصممي هذا الOp Amp و قال لي بأني قد توصلت إلى جعل التيار بالميكروأمبير Micro Ampere فهذا جيد و سنقول أنه إقترب من النموذج المثالي. ثم جاء مصمم آخر و جعل قيمة التيار تقاس بالنانوأمبير nano Ampere فهذا أفضل و أفضل و قد إقترب أكثر من النموذج المثالي. بهذه الطريقة بعد أن تقوم بالتصميم و أنت جالس في بيتك ستجد بأن تصميمك يتحسن مع الزمن إذ أنك قد وضعت نماذجاً مثالية في تصميمك و مصممي الطبقات التي تحتك يحاولون جاهدين أن يقتربوا من المثالية التي تريدها. و تخيل لو أنك لم تذكر أي نماذج مثالية في تصميمك و ذكرت بأن التيار الداخل إلى المكبر أقصاه 2 ميكروأمبير. ليس لأي مبرر علمي و إنما لأن أقصى تكنولوجيا توصلت إليها هي أن تجعله بهذه القيمة. في هذه الحالة مهما حدث فلن يستطيع من بعدك أن يطور على تصميمك إذ أنه لا يدري هل كنت تريد أن يكون التيار بهذه القيمة فعلاً أم أردت قيمة أصغر. و في هذه الحالة لن يستطيع أحد غيرك أن يطور على تصميمك مما يفقده قيمته العلمية.</p>
<p>و ينطبق على النماذج المثالية العديد من الأشياء. فعلى سبيل المثال نقول بأن المحول (الترانسفورمر) Transformer المثالي ليس به تيارات داخلية ولا طاقات مفقودة. بينما عملياً يستحيل ذلك إلا أنني أريد أن يقترب المصممون من الشئ الذي إفترضته. كما يوجد ما يسمى بالقفل Switch المثالي و هو عبارة عن قفل عادي له طرفين إما أن يكونوا موصلين ببعضهما البعض أو أن يكونوا معزولين على حسب الذي يقوله الطرف الثالث. و صفات هذا القفل أو المفتاح هو أنه عندما يكون الطرفين موصلان On or Saturated فإن فرق الجهد بينهما صفر. و عندما يكونان معزولان Cut off فإن التيار المار خلالهما صفراً أيضاً. و الوقت الذي يستغرقه القفل لكي ينتقل من حالة التوصيل إلى حالة العزل أو الفتح Switching Time هو صفراً من الثواني.  كما أنها تستهلك صفراً من الطاقة. بهذا المفهوم قاموا بعمل الترانزيستور الثنائي الأقطاب Bipolar Junction Transistor BJT و الذي إقترب إلى حدٍ ما من النموذج المثالي. و من قبله قاموا بإستخدام الحاكمات المغناطيسية Electromagnetic Relays حيث كانت تقترب من النموذج المثالي إلا في الوقت المستغرق لتغيير الحالة و في الطاقة المستهلكة. و قاموا كذلك بعمل الترانزيستور الحقلي Field Effect Transistor FET و الموسفت MOSFET. و لهذا عندما تقوم بعمل تصميم فعليك أن تقوم بعمل نموذج مثالي له. فضع قفلاً قبل أن تقرر بأي الأشياء العملية ستقوم بعمله. و ينطبق هذا أيضاً على البطارية المثالية التي ليس لها مقاومة داخلية و المكثف المثالي و الملف المثالي و المرشح الترددات المنخفضة المثالي Ideal Low Pass Filter .. إلخ.</p>
<p>9) إن السعي وراء تقسيم العمل على عدة طبقات له عدة فوائد. منها <strong>أن تجعل تصميمك أو دائرتك الإلكترونية أو الكود الذي كتبه مقروءاً</strong>. ففي مجال البرمجة مثلاً ,الذي يريد أن يتعرف على ميكانيكية عمل إحدى البرامج ربما لا يكون على علم بأساليب التعامل مع الذاكرة. فهو دخل ليقرأ الكود الذي كتبته أنت ليعرف الخوازرميات العامة للبرنامج و ليس إلى خوارزميات إدارة الذاكرة. و لهذا فيجب عليك ألا تخلط الطبقات ببعضها و تضع الأوامر العامة التي تصف ميكانيكية عمل البرنامج مع أوامر إدارة الذاكرة. إذا أراد أحدهم أن يتعرف على أوامر إدارة الذاكرة فسيجدها منفصلة وحدها في تصنيف Class أو دالة Function or Method. و في هذه الحالة لن يكود الكود مقروءاً فحسب بل يستطيع المبرجمين الآخرين الإستفادة من جزئية التعامل مع الذاكرة في البرنامج لأنها منفصلة في مكان وحدها. و هذا ينظم عملية <strong>الإستفادة من بعض أجزاء التصميم في تصاميم آخرى بدلاً من إعادة تصميمه</strong>. كما أننا نفترض أنك ستقوم بإفتراض وجود نموذج مثالي في البرنامج. فعلى سبيل المثال إذا أردت أن تقوم بعمل ترتيب أو بحث في بعض العناصر فإفترض أن هناك دالة سوف تقوم بعمل هذا الأمر في أقل وقت ممكن. ثم أفعل أقصى ما وصلت إليه و الذي سيكون بالطبع أقل من النموذج المثالي. و في هذه الحالة سيأتي بعد ذلك مبرمجين آخرين يتوصلون إلى طرق أفضل من التي وصلت إليها و يقومون بإستبدال هذه الجزئية المنفصلة ليجعلوها أقرب من المثالية. و هذا هو <strong>فتح المجال للتطوير و التحسين على التصميم</strong>. كما أن هذا الأمر سيسهل عليك عملية التصميم. فالجزئية الفرعية التي لا تستطيع تصميمها إتركها و ركز على التصميم العام و على الجزئيات المهمة فيه. و هذا ما يسمى بـ<strong>جعل التصميم يعتمد على ماذا What و ليس على كيف How.</strong></p>
<p>و في النهاية. أتمنى أن أجد الجميع قد إلتزم بهذه الأمور في تصاميمه و مشاريعه و لم يخلط الطبقات و الوحدات ببعضها البعض و أبتعد عن التفكير في أدق التفاصيل بدون أن يحدد <strong>ماذا</strong> يريد. و أعتقد بأن هذا الموضوع قد أخذ حظه بما فيه الكفاية !!</p>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d8%ae%d9%88%d8%a7%d8%b7%d8%b1-%d9%85%d8%a8%d8%b1%d9%85%d8%ac/'>خواطر مبرمج</a>, <a href='http://omarmokhtar.net/category/%d8%b4%d8%b1%d9%88%d8%ad%d8%a7%d8%aa/'>شروحات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/572/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=572&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2010/09/17/idealabstract/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>
	</item>
		<item>
		<title>التطبيق الأول &#8211; عمل لعبة المضرب و الطوب البسيطة بإستخدام بمكتبة الرسوم المفتوحة OpenGL</title>
		<link>http://omarmokhtar.net/2010/09/13/openglapplication1/</link>
		<comments>http://omarmokhtar.net/2010/09/13/openglapplication1/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 20:43:33 +0000</pubDate>
		<dc:creator>عمر علي مختار</dc:creator>
				<category><![CDATA[شروحات]]></category>

		<guid isPermaLink="false">http://omarblog.wordpress.com/?p=484</guid>
		<description><![CDATA[‫تطبيق (أ) ‫لعبة المضرب و الطوب ‬ ‫ لعبة المضرب و الطوب من أشهر الألعاب و أبسطها على الإطلاق. و العديد من المبرمجين قد قاموا بعمل تلك اللعبة. بل‬ ‫لا أبالغ حين أقول أن أغلب مبرمجي الألعاب قد قاموا بعمل هذه اللعبة مرة واحدة على الأقل كبداية لرحلتهم في برمجة الألعاب. و مع إختلاف الأفكار [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=484&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="text-align:center;"><strong><span style="text-decoration:underline;">‫تطبيق (أ)</span></strong></div>
<div id="_mcePaste" style="text-align:center;"><strong><span style="text-decoration:underline;">‫لعبة المضرب و الطوب</span></strong></div>
<div style="text-align:center;"><strong><span style="text-decoration:underline;"><br />
</span></strong></div>
<div style="text-align:center;"><strong><span style="text-decoration:underline;">‬</span></strong></div>
<div id="_mcePaste">‫</div>
<div>لعبة المضرب و الطوب من أشهر الألعاب و أبسطها على الإطلاق. و العديد من المبرمجين قد قاموا بعمل تلك اللعبة. بل‬ ‫لا أبالغ حين أقول أن أغلب مبرمجي الألعاب قد قاموا بعمل هذه اللعبة مرة واحدة على الأقل كبداية لرحلتهم في برمجة الألعاب. و مع إختلاف الأفكار و الأشكال و‬ ‫الطرق و الأساليب إلا أن الأصل والفكرة واحدة. إنظر إلى تعدد صور اللعبة و الإضافات التي عليها رغم أن فكرتها واحدة:</div>
<div><a href="http://omarblog.files.wordpress.com/2010/09/toob.jpeg"><br />
<span style="color:#000000;"> </span></a><a href="http://omarblog.files.wordpress.com/2010/09/toob.jpeg"><img class="aligncenter size-full wp-image-489" style="display:block;margin-left:auto;margin-right:auto;border:0 initial initial;" title="toob" src="http://omarblog.files.wordpress.com/2010/09/toob.jpeg?w=600&#038;h=449" alt="" width="600" height="449" /></a></div>
<div>فهل يمكننا أن نقوم بلعبة مماثلة بما قد عرفناه في الفصول السابقة ؟؟ <span id="more-484"></span>ماذا تعلمنا في الفصول السابقة ؟؟ قد عرفنا‬ ‫كيف نقوم بإنشاء نافذة و عرفنا كيف نقوم برسم بعض الأشكال البسيطة و تلوينها و عمل تدريجات للألوان بمكتبة الرسوم‬ ‫المفتوحة. كما تعلمنا كيف نتحكم بالزمن و الوقت و نستطيع كذلك أن نعمل أشكالً متحركة. كما نستطيع أن نستقبل مدخلات لوحة المفاتيح و مدخلات المؤشر و نستطيع أن نتحكم بشكل و مكان المؤشر. و كل ذلك يكفي لعمل نموذج بسيط لتلك اللعبة. و‬ ‫سوف نبدأ بالتدريج في اللعبة خطوة خطوة حتى نهايتها.</div>
<div>
<p style="margin-bottom:0;text-align:right;" dir="ltr">‫إن فكرة اللعبة بسيطة للغاية. في اللعبة هناك مجموعة من الطوب في الأعلى و الهدف هو تحطيم كل هذا الطوب. و في‬ ‫الأسفل عندك مضرب يسير في الإتجاه الأفقي و هناك كرة تقوم بتحطيم الطوب و يجب على المضرب أن يمنع الكرة من أن تنزل‬ ‫فيصدها فتقوم الكرة بالرجوع ناحية الطوب مرة آخرى و تحطم بعض الطوب ثم تنزل إلى الأسفل فيضربها المضرب حتى لا ‫تسقط فترجع إلى الطوب و هكذا. و إذا سقطت الكرة يخسر اللاعب و إذا حطمت كل الطوب يكسب. هذا هو أساس اللعبة و يمكنك‬ ‫أن تقوم بإضافة بعض الأشياء مثل أن تضيف المزيد من الكرات أو المزيد من المحاولات أو تجعل بعض الطوب يتحطم بضربتان‬ ‫بدلًا من ضربة واحدة أو غير ذلك. و نحن نريد في البداية أن نقوم بالأساسي ثم إذا أردت إضافة بعض الأشياء الآخرى فلك ذلك.</p>
<p style="margin-bottom:0;text-align:right;" dir="ltr">و لنقم أولًا بترتيب أولوياتنا و عمل مخطط كروكي للعبة قبل الخوض في كتابة الكود. و يمكنك إعتبار هذا الكلام‬ ‫مجرد ما يدور في ذهن المبرمج حين يقوم بالتفكير في كتابة إحدى الألعاب. فأولًا مما تتكون اللعبة ؟؟ أو ما هي الكائنات التي عندنا ؟؟ تتكون من مضرب يمشي‬ ‫في الأسفل. إذاً نحن نحتاج إلى متغيرات تحمل مكان هذا المضرب. هل نحتاج إلى متغيران إحداهما لمحور السينات و الآخر لمحور‬ ‫الصادات ؟؟ لا لأن المضرب يسير في الإتجاه الفقي فقط و أما مكانه في محور الصادات فثابت لا يتغير. كيف سيتحرك هذا‬ ‫المضرب ؟؟ الأفضل تحريكه بمؤشر الفأرة. و بناءاً على ذلك فإن المتغير الذي يحمل مكان المضرب هو متغير مكان المؤشر في‬ ‫محور السينات. و لنقم الآن بوضع هذا الأمر في اللعبة ثم نفكر بعد ذلك في عمل الكرة. كل ما سنقوم بعمله في الكود هو إنشاء‬ ‫نافذة كما تعلمنا و نقوم بعمل الدالة التي ترصد تحرك المؤشر و تقوم بتحويل قيمة مكانه في محور السينات إلى الإحداثيات‬ ‫النسبية. و سنقوم بعمل دالة التوقيت و التي لن ترسم إلى مضرب في أسفل الشاشة حول النقطة التي يتحرك فيها المؤشر. و‬ ‫بالطبع سنقوم بإلغاء شكل المؤشر كما تعلمنا. و ها هو كود ما ذكرناه إلى الآن:</p>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">#include &lt;GL/gl.h&gt;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">#include &lt;GL/glut.h&gt;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">float Mx;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int H,W;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int Win;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Mouse(int X, int Y)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Mx = (float)X/W*2-1;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void DispTimer(int V)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutTimerFunc(10,DispTimer,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glClear(GL_COLOR_BUFFER_BIT);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glBegin(GL_QUADS);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(1,0,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx-0.1,-0.87);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(0,0,1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx-0.1,-0.93);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(1,1,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx+0.1,-0.93);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(1,0,1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx+0.1,-0.87);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glEnd();</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glFlush();</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutSwapBuffers();</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Resize(int Width, int Height)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">W = Width;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">H = Height;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glViewport(0,0,Width,Height);</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Keys(unsigned char K, int X, int Y)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">if (K == 27)</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glutDestroyWindow(Win);</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Dummy() {}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int main(int argc, char **argv)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutInit(&amp;argc,argv);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">Win = glutCreateWindow(&#8220;Brix&#8221;);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutFullScreen();</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutSetCursor(GLUT_CURSOR_NONE);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glClearColor(0.9,0.5,0,1);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutReshapeFunc(Resize);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutPassiveMotionFunc(Mouse);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutMotionFunc(Mouse);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutDisplayFunc(Dummy);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutKeyboardFunc(Keys);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutTimerFunc(10,DispTimer,0);</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">glutMainLoop();</p>
<p style="margin-bottom:0;padding-left:30px;text-align:left;" dir="ltr">return 0;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">‫هذا الكود هو عبارة عن برنامج يقوم برسم المضرب الذي يتحرك في الأسفل عن طريق مؤشر الفأرة. و إذا قمت‬ ‫بتشغيل هذا الكود فسوف يظهر لك مثل هذه الصورة:</p>
<p style="margin-bottom:0;">‬</p>
<div style="text-align:left;"><a href="http://omarblog.files.wordpress.com/2010/09/app1.png"><img class="aligncenter size-full wp-image-490" title="app1" src="http://omarblog.files.wordpress.com/2010/09/app1.png?w=600&#038;h=469" alt="" width="600" height="469" /></a></div>
<div>‫و الآن لنشرح هذا الكود حتى لا يكون فيه أي غموض. و كانت هذه أول سطور في البرنامج:‬</div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">float Mx;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int H,W;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int Win;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫المتغير الأول ‪ Mx‬سنضع فيه مكان المؤشر في محور السينات ‪ X‬بالإحداثيات النسبية (راجع بداية الفصل الرابع) و‬ ‫سنستخدم هذا المتغير لكي نرسم المضرب حوله. و المتغير الثاني و الثالث ‪ H‬و ‪ W‬سنضع فيهما طول و عرض الشاشة و هذا‬ ‫لكي نقوم بتحويل إحداثيات البكسل إلى الإحداثيات النسبية. و أما المتغير الرابع ‪ Win‬فقد ذكرنا في الفصل الثالث أن دالة‬ ‫إنشاء النوافذ ‪ glutCreateWindow‬تقوم بإرجاع قيمة من نوع عدد صحيح و نحن نستعمل هذه القيمة و نأخذها عندنا‬ ‫في متغير حتى إذا أردنا أن نستدعي دالة إغلاق النافذة نمرر لها هذا الرقم (أو كان عندنا عدة نوافذ أنشأناها و نريد أن‬ ‫نتنقل بين النوافذ مثلاً). و المتغير ‪ Win‬هو الذي سنضع فيه هذا الرقم.‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Mouse(int X, int Y)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Mx = (float)X/W*2-1;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫هذه الدالة هي الدالة التي سوف تستدعيها مكتبة جلوت إذا تحرك المؤشر و تمرر له مكانه بإحداثيات البكسل. و نحن‬ ‫هنا نقوم بتحويل إحداثيات المؤشر في محور السينات إلى إحداثيات نسبية و نضع مكان المؤشر في محور السينات في المتغير‬ ‫العام ‪.Mx‬‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void DispTimer(int V)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutTimerFunc(10,DispTimer,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glClear(GL_COLOR_BUFFER_BIT);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glBegin(GL_QUADS);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(1,0,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx-0.1,-0.87);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(0,0,1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx-0.1,-0.93);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(1,1,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx+0.1,-0.93);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glColor3f(1,0,1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glVertex2f(Mx+0.1,-0.87);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glEnd();</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glFlush();</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutSwapBuffers();</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫هذه هي الدالة التي تقوم بعمليات الرسمة و تحديثها كل 10 ميلي ثانية. في أول سطر في الدالة قمنا بإخبار‬ ‫مكتبة جلوت بأن تقوم بإستدعاء الدالة بعد 10 ميلي ثانية لكي تقوم بتحديث الرسمة في وقت ثابت (راجع الفصل الثاني). ثم‬ ‫قمنا بتنظيف الشاشة في دالة ‪) glClear‬راجع الفصل الأول). ثم قمنا برسم مضلع من أربعة أضلاع. و قمنا برسمه حول نقطة‬ ‫‪ .Mx‬إنظر إلى هذه الرسم التوضيحي الذي يوضح لك لماذا ذكرنا تلك الحداثيات في دالة ‪:glVertex2f</p>
<p style="margin-bottom:0;text-align:right;">‬‬</p>
<div><a href="http://omarblog.files.wordpress.com/2010/09/app2.png"><img class="aligncenter size-full wp-image-491" title="app2" src="http://omarblog.files.wordpress.com/2010/09/app2.png?w=600&#038;h=469" alt="" width="600" height="469" /></a></div>
<div>
<div>‫فكما ترى , هذه هي الإحداثيات التي ذكرناها لدالة ‪ .glVertex2f‬فكما ترى فإن إحداثيات المضرب في محور الصادات ثابتة ‫على عكس محور السينات فإنه يعتمد على مكان المؤشر. و هذا ما يجعل المضرب يتحرك مع المؤشر. و تذكر أننا حين نريد أن‬ ‫نرسم مضلع من أربع أضلاع و نمرر لدالة ‪ glBegin‬الثابت ‪ GL_QUADS‬فإننا نقوم بإستدعاء دالة ‪glVertex2f‬‬ ‫أربع مرات و في كل مرة نذكر لها إحداثيات نقطة من نقاط هذا المضلع و ربما قمنا بتغيير لون هذه النقطة و مكتبة الرسوم‬ ‫المفتوحة بدورها تقوم بعمل تدريجات ألوان في المضلع حتى تصل النقاط المختلفة الألوان ببعضها.‬</div>
</div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Resize(int Width, int Height)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">W = Width;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">H = Height;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glViewport(0,0,Width,Height);</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫هذه الدالة ستقوم مكتبة جلوت بإستدعائها حينما يتم تغيير حجم النافذة و قد قمنا بجعلها تضع المقاسات الجديدة في متغيرات عمومية. ثم بعد ذلك إستدعينا دالة ‪ glViewport‬حتى نعيد ضبط الإحداثيات النسبية على المساحة التي مررناها للدالة (راجع الفصل الرابع).</p>
<p style="margin-bottom:0;text-align:right;">
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Keys(unsigned char K, int X, int Y)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">if (K == 27)</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">glutDestroyWindow(Win);</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">‫و هذه الدالة ستقوم مكتبة جلوت بإستدعائها حين يضغط المستخدم على زر له رقم في جدول آسكي (راجع الفصل‬ ‫الثالث). و في هذه الدالة قمنا بإختبار رقم الزر الذي تم تمريره للدالة فإذا كان 27 (رقم زر الـ ‪ (Escape‬فإننا نقوم‬ ‫بإغلاق النافذة و قد قمنا بتمرير المتغير ‪ Win‬الذي قلنا أنه يحمل رقم النافذة التي أنشأناها حتى ننهي البرنامج حين يضغط‬ ‫المستخدم على الزر ‪ .Escape‬و تذكر أننا نعمل على شاشة ‪ FullScreen‬لذلك يجب أن نوفر طريقة للغلق.‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void Dummy() {}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int main(int argc, char **argv)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutInit(&amp;argc,argv);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Win = glutCreateWindow(&#8220;Brix&#8221;);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutFullScreen();</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutSetCursor(GLUT_CURSOR_NONE);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glClearColor(0.9,0.5,0,1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutReshapeFunc(Resize);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutPassiveMotionFunc(Mouse);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutMotionFunc(Mouse);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutDisplayFunc(Dummy);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutKeyboardFunc(Keys);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutTimerFunc(10,DispTimer,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutMainLoop();</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">return 0;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫قمنا بإنشاء دالة فارغة و أسميناها ‪ Dummy‬و ذلك حتى تقوم مكتبة جلوت بإستدعائها حين يحدث شئ على النافذة‬ ‫يتطلب إعادة الرسم و نحن قد آثرنا ان نقوم بتحديث الرسم كل جزء محدد من الثانية فلسنا بحاجة لهذا الأمر و لكن بعض‬ ‫المترجمات تتعسف في هذا الأمر و ترغمك أن تقوم بعمل دالة لعادة الرسم (راجع الفصل الثاني). أما في الدالة الرئيسية فقد‬ ‫قمنا بإنشاء نافذة و وضعنا رقمها في المتغير العام ‪ Win‬ثم قمنا بإستدعاء دالة ‪ glutSetCursor‬لكي نقوم بإلغاء‬ ‫شكل المؤشر (السهم التقليدي). و قمنا بتحديد لون الخلفية في دالة ‪) glClearColor‬راجع الفصل الأول). و بعد ذلك‬ ‫أخبرنا مكتبة جلوت بأن تقوم بإستدعاء دالة ‪ Resize‬حين يتغير حجم النافذة و دالة ‪ Mouse‬حين يتحرك المؤشر. و قد‬ ‫ذكرناها مرتين حتى نخبر مكتبة جلوت بأن تستدعيها في حالة الضغط على أي زر و في حالة عدم الضغط على أي زر (راجع‬ ‫الفصل الرابع) و دالة ‪ Keys‬حين يضغط المستخدم على أي زر (راجع الفصل الثالث) ثم قمنا بتشغيل المؤقت و هو الدالة التي‬ ‫أسميناها ‪.DispTimer‬‬</p>
<p style="margin-bottom:0;text-align:right;">‫الآن و بعد أن قمنا بعمل المضرب يتبقى عندنا الكرة و الطوب. و لنبدأ أولًا بالكرة. الكرة تتحرك في أي إتجاه لذلك‬ ‫سنعمل لها متغيرين واحد لمكانها في محور ‪ X‬و الآخر لمكانها في محور ‪ .Y‬إذاً سنقوم في دالة التوقيت برسم كرة عند قيمة‬ ‫المتغيرين الذان يحملان مكان الكرة. هذه القيمتين هل هما ثابتتين أم متغيريتين ؟؟ بالطبع متغيريتين إذ أنهما لو كانتا ثابتتين‬ ‫ستبدو الكرة ثابتة. لذلك يجب علينا أن نقوم بشئ يجعل قيمة المتغيرين حتى تبدوا الكرة و كأنها تتحرك. نفترض أن عندنا‬ ‫متغير إسمه ‪ Bx‬و ‪ By‬يعبران عن مكان الكرة. و سنفترض أن عندنا متغير يعبر عن إتجاه الكرة. بمعنى أن الكرة ربما تتحرك‬ ‫متجهه إلى أعلى يسار النافذة أو إلى أسفل يمينها أو غير ذلك. و هذا الإتجاه يتغير دائماً فمثلًا عندما تصطدم الكرة بالمضرب‬ ‫و قد كانت سائرة ناحية أسفل يمين الشاشة فإنها ترتد و تسير ناحية أعلى يمين الشاشة. كما أنها قد تصطدم بالجدار فإذا‬ ‫إصطدمت به ترتد في التجاه الآخر. لنقم بحفظ إتجاه الكرة الأفقي في متغير و إتجاهها الرأسي في متغير آخر و على حسب هذا‬ ‫المتغير يتم تغيير مكان الكرة في ‪ Bx‬و ‪ .By‬يمكن مثلًا أن نضع مثل هذا الكود في الدالة التي تستدعى كل 10 ميلي ثانية:‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">if (Dx == 1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Bx += 0.01;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">else</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Bx -= 0.01;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">if (Dy == 1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">By += 0.01;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">else</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">By -= 0.01;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫هذا كان مجرد كود إبتدائي لعمل تحريك للكرة حيث إعتبرنا أن هناك متغيرين لتحديد إتجاه الكرة و قد أسميناهم ‪ Dx‬و ‪Dy‬‬ ‫و إذا كان ‪ Dy‬بقيمة 1 فإن المتغير ‪ By‬سوف يزيد فهكذا ستسير الكرة إلى العلى. و إن لم يكن بقيمة 1 فإن الكرة تسير‬ ‫إلى الأسفل. و كذلك الحال في الإتجاه الأفقي. أما بالنسبة لتصادم الكرة بالجدران فيمكن أن نختبر قيمة ‪ Bx‬و ‪ By‬لكي نعرف مكان الكرة ثم نقوم بتغيير إتجاهها عن طريق تغيير قيمة ‪ Dy‬و ‪ .Dx‬بالطبع فإن الكرة إذا إصطدمت بأعلى النافذة أو بإحدى‬ ‫جوانبها فسوف ترتد أما إذا نزلت إلى الأسفل فإنها تسقط و يخسر اللاعب. كما أنها إذا إصطدمت بالمضرب فإنها ترتد إلى‬ ‫الأعلى. بالنسبة للإصطدام بالجدران يمكن كتابة مثل هذا الكود:</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">if (Bx &gt; 1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Dx = 0;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">else if (Bx &lt; -1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Dx = 1;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">if (By &gt; 1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Dy = 0;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">‫حيث أن القيمة 1 بالنسبة لمحور السينات ‪ X‬تعني أقصى يمين النافذة و القيمة -1 تعني أقصى يسار النافذة و نحن قد قمنا‬ ‫بإختبار القيمة فإذا تجاوزت تلك الحدود نقوم بتغيير الإتجاه. و كذلك الحال بالنسبة للحافة العليا للنافذة. أما عندما نقوم‬ ‫بعمل نفس الشئ عندما تصطدم الكرة مع المضرب فإنظر إلى هذا الرسم التوضيحي لقانون التصادم:</p>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;"><a href="http://omarblog.files.wordpress.com/2010/09/app3.png"><img class="aligncenter size-full wp-image-492" title="app3" src="http://omarblog.files.wordpress.com/2010/09/app3.png?w=600" alt=""   /></a></p>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">سنقوم في الكود بإختبار ما إذا كانت الكرة مصطدمة مع المضرب أم لا. عندما يكون هناك إصطدام للكرة مع المضرب فإن نقطة‬ ‫‪ Bx‬يجب أن تكون بين النقاط 0.1-‪ Mx‬و 0.1+‪ Mx‬و التي هي حدود المضرب. كما أن نقطة ‪ By‬و يجب أن تكون أعلى‬ ‫من نقطة -0.39 و أعلى من النقطة -0.78 و التي هي أسفل المضرب و سطحه. سنقوم بتحويل هذا الكلام إلى كود لكي نقوم‬ ‫بجعل الكرة ترتد بعد أن تكون قد ضربت بالمضرب. و سنتكلم في الفصول القادمة عن التصادم بشئ من التفصيل:</p>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">‪if (Bx &lt; Mx+0.1 &amp;&amp; Bx &gt; Mx-0.1 &amp;&amp; By &lt; -0.87 &amp;&amp; By &gt; -0.93)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Dy = 1;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">‫و بعد أن قمنا بحساب كل شئ يتعلق بحركة الكرة لنقوم برسم الكرة. و قد قلنا بأن مكانها عند المتغير ‪ Bx‬و ‪ .By‬و حتى لا ‫نشتت القارئ فإننا لن نتكلم عن رسم الكرة في هذا التطبيق بل سنؤجله إلى الفصل القادم حين نتحدث عن مكتبة الرسوم بشئ من‬ ‫التفصيل. لذلك سنرسم الكرة كأنها مربع عادي حول نقطة ‪ Bx‬و ‪ By‬هذه المرة:‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">glBegin(GL_QUADS);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glColor3f(1,0.8,0.9);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glVertex2f(Bx-0.02,By+0.02);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glVertex2f(Bx-0.02,By-0.02);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glVertex2f(Bx+0.02,By-0.02);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glVertex2f(Bx+0.02,By+0.02);</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">glEnd();</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫و الآن لنضيف كل هذا إلى الكود الأصلي و نرى ما التأثير الذي سيحدث. فكل ما سوف نضيفه إلى الكود هو أننا سنقوم بتعريف‬ ‫المتغيرات التي ذكرناها و هي ‪ Bx‬و ‪ By‬و ‪ Dx‬و ‪ Dy‬و هي متغيرات عمومية.‬</p>
<div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">float Bx = -1, By = 0;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int Dx = 0, Dy = 0;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫و أما عن القيم الفتراضية التي وضعناها لهذه المتغيرات فهي تعني أن الكرة في بداية اللعبة سوف تكون في منتصف يسار‬ ‫النافذة كما نرى في القيم الإفتراضية للمتغيرين ‪ Bx‬و ‪ .By‬و سوف يكون إتجاه سيرها إلى اليمين و إلى الأسفل كما نرى في‬ ‫القيم الفتراضية للمتغيرات ‪ Dx‬و ‪ .Dy‬ثم في دالة الرسم قمنا بإضافة السطور الخاصة بالتحريك و تغيير مكان الكرة و كل الإصطدامات بالضافة إلى كود رسم الكرة. و بعد التعديل يفترض أن تجد اللعبة بهذا الشكل:</p>
<p style="margin-bottom:0;text-align:right;">‬</p>
<div><a href="http://omarblog.files.wordpress.com/2010/09/app4.png"><img class="aligncenter size-full wp-image-493" title="app4" src="http://omarblog.files.wordpress.com/2010/09/app4.png?w=600&#038;h=468" alt="" width="600" height="468" /></a></div>
<div>
<div>‫و الآن لنقم بعمل الخطوة الأخيرة. ألا و هي الطوب. و بما أننا ربما نضع الكثير من الطوب فربما نحتاج إلى عمل حلقة‬ ‫تكرارية ‪ Loop‬على كل طوبة لرسمها و فحص ما إذا كانت الكرة قد إصطدمت بها أم لا. يجب أن يكون هناك متغير لكل طوبة‬ ‫يوضح هل هذه الطوبة قد تحطمت أم لا فإذا كانت قد تحطمت لا نقوم برسمها و أما إذا كانت مازالت لم تحطم فنقوم برسمها. و‬ ‫يجب كذلك أن يكون هناك متغير لمكان الطوبة. و مادام عندنا الكثير من المتغيرات فلنقم بعمل تركيب ‪ Structure‬نضع فيه‬ ‫بيانات الطوبة الواحدة. إنظر إلى هذا الكود:‬</div>
</div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">typedef struct</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">float X,Y;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">int Damaged;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">} Brick;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫ثم نعرف من هذا التركيب عدد من الطوب في مصفوفة ‪:Array</p>
<p style="margin-bottom:0;text-align:right;">
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">Brick B‬‬[28];</p>
</blockquote>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">‫و يجب في بداية البرنامج أن نقوم بتعبئة هذه المصفوفة بالبيانات اللازمة. طبعاً سنجعل كل الطوب غير محطم و كذلك سنضع‬ ‫إحداثيات كل طوبة. نتخيل مثلًا أن عندنا ثلاث صفوف من الطوب ففي الصف العلوي لدينا على سبيل المثال عشر طوبات و الذي‬ ‫يليه فيه ثمان طوبات و الذي يليه فيه ست طوبات و الذي يليه فيه أربعة. إذاً فالمجموع الكلي للطوب هو ثمان و عشرين طوبة‬ ‫و الآن لنقم أولًا بعمل حلقة تكرارية لجعل كل الطوب غير محطم و لنفترض أن المتغير ‪ Damaged‬إذا كان يحمل قيمة 1‬ ‫فيدل على أن الطوبة محطمة و إذا كان يحمل القيمة صفر فيدل على أن الطوبة غير محطمة. ضع هذا الكود في الدالة ‪:main‬‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">for (int r = 0 ; r &lt; 28 ; r++)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].Damaged = 0;</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;" dir="ltr">
<p style="margin-bottom:0;text-align:right;" dir="ltr">‫هكذا قد جعلنا كل الطوب غير محطم في بداية البرنامج. و أما ما يتعلق بإحداثيات الطوب فإنظر إلى هذه الصورة للتوضيح:</p>
<p style="margin-bottom:0;text-align:right;" dir="ltr">
</div>
<div><a href="http://omarblog.files.wordpress.com/2010/09/app5.png"><img class="aligncenter size-full wp-image-494" title="APP5" src="http://omarblog.files.wordpress.com/2010/09/app5.png?w=600" alt=""   /></a></div>
<div>
<div>‫كما ترى في الصورة فإننا قد جعلنا طول الطوبة هو 0.2 و عرضها 0.1 و الآن إنظر إلى الصف الأول من الطوب. سوف نقوم‬ ‫بعمل حلقة تكرارية على الصف الأول أي من أول الرقم 0 في المصفوفة إلى الرقم 9 و يكون معنا متغير يحمل نقطة ‪ X‬و‬ ‫يزيد هذا المتغير في كل مرة بمقدار 0.2 حتى نصل إلى إحداثيات الطوبة الأخيرة في الصف:‬</div>
</div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">float tmpX = -1;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">for (int r = 0 ; r &lt; 10 ; r++)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].X = tmpX;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].Y = 1;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">tmpX += 0.2;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫و الآن بعد أن نصل إلى آخر طوبة سوف تأخذ إحداثيات 0.8 لمحور السينات و 1 لمحور الصادات. كذلك الحال في بقية الطوب‬ ‫و طبعاً سنقوم بعمل حلقة تكرارية لكل صف من الصفوف و نعطي المتغير ‪ tmpX‬القيمة المناسبة في كل مرة:‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">tmpX = -0.8;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">for (int r = 10 ; r &lt; 18 ; r++)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].X = tmpX;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].Y = 0.9;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">tmpX += 0.2;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">tmpX = -0.6;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">for (int r = 18 ; r &lt; 24 ; r++)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].X = tmpX;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].Y = 0.8;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">tmpX += 0.2;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">tmpX = -0.4;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">for (int r = 24 ; r &lt; 28 ; r++)</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].X = tmpX;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].Y = 0.7;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">tmpX += 0.2;</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫و بعد أن قمنا بملأ بيانات الطوب في بداية البرنامج لنقم الآن برسم الطوب ثم بعد ذلك نقوم بإكتشاف تصادم الطوب‬ ‫مع الكرة و كيف ستنعكس الكرة نتيجة لهذا التصادم. بالطبع سوف نقوم بعمل حلقة التكرارية على كل طوبة ثم نقوم بإختبار‬ ‫قيمة المتغير ‪ Damaged‬للطوبة فنحدد هل نرسمها أم لا. و سيكون الكود في دالة الرسم بهذا الشكل:‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">glBegin(GL_QUADS);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">for (int r = 0 ; r &lt; 28 ; r++)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">if (B[r].Damaged == 0)</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(1,0,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X,B[r].Y);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(0,1,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X,B[r].Y-0.1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(1,0,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X+0.2,B[r].Y-0.1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(0,1,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X+0.2,B[r].Y);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">glEnd();</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫و هكذا قمنا برسم كل الطوب الغير محطم حيث أننا قد مررنا على كل الطوب و إختبرنا قيمة المتغير ‪Damaged‬‬ ‫لمعرفة هل هذه الطوبة محطمة أم لا ثم رسمناها و لاحظ أننا قد رسمناها باللون الأحمر يتدرج إلى الأخضر. و طبعاً قد‬ ‫تتسائل لماذا وضعنا دالة ‪ glBegin‬و ‪ glEnd‬خارج الحلقة التكرارية. و الجواب على ذلك باننا قد قلنا قبل ذلك أننا‬ ‫عندما نقوم برسم مضلع من أربع أضلع ‪ GL_QUADS‬فإن مكتبة الرسوم تأخذ كل أربع إستدعاءات لدالة ‪ glVertex‬على‬ ‫أنها مضلع منفرد. و كذلك الحال في ‪ GL_TRIANGLES‬فإن مكتبة الرسوم ستأخذ كل ثلث إستدعاءات على أنهم مثلث منفرد‬ ‫بإستثناء ‪ GL_POLYGON‬التي ترسم مضلعات بدون تحديد عدد معين فإنه يجب عليك أن تقوم في كل مرة ترسم فيها شكل‬ ‫خماسي على سبيل المثال أن تقوم بإستدعاء ‪ glBegin‬و ‪ glEnd‬في كل مرة لأن مكتبة الرسوم لا تدري كم مضلعاً تريد.‬</p>
<div>
<div>‫و الآن ندخل في كتابة أوامر إصطدام الطوب بالكرة. بالطبع سنقوم في الحلقة التكرارية السابقة -التي سبق أن جعلناها‬ ‫ترسم الطوب- بجعلها تقوم بإختبار هل الكرة مصطدمة مع الطوبة أم لا فإذا لم تكن مصطدمة فلن يحدث شئ و إن كانت مصطدمة‬ ‫فإنها تعلم على الطوبة بأنها مصطدمة فتقوم بتغيير قيمة المتغير ‪ Damaged‬لتكون 1 (و ذلك حتى لا نقوم برسمها مرة‬ ‫آخرى و حتى لا نقوم بإختبار التصادم معها في كل مرة) و بعد ذلك نقوم بجعل الكرة تنعكس. إنظر إلى الصورة التوضيحية‬ ‫لقانون تصادم المستطيلات و المربعات:</div>
<div>‬</div>
</div>
<div><a href="http://omarblog.files.wordpress.com/2010/09/app6.png"><img class="aligncenter size-full wp-image-495" title="app6" src="http://omarblog.files.wordpress.com/2010/09/app6.png?w=600" alt=""   /></a></div>
<div>‫كيف نعرف أن هذين المربعين قد تقاطعا ؟؟ إذا توفرت الشروط الآتية: النقطة X1 في مربع 2 أقل من النقطة X2 ‬في مربع‬ ‫1 و النقطة X2 ‬في مربع 2 أكبر من النقطة X1 ‬في مربع 1. و النقطة Y1 ‬في مربع 2 فوق النقطة Y2 ‬في مربع 1 و‬ ‫النقطة Y2 ‬في مربع 2 تحت النقطة Y1 ‬في مربع 1. بالنسبة للكرة و الطوب فإن النقطة X1 ‬في الكرة هي 0.02-‪ Bx‬و‬ ‫النقطة X2 ‬هي 0.02+‪ Bx‬و النقطة Y1 ‬هي 0.02-‪ By‬و النقطة Y2 ‬هي 0.02+‪ By‬و في الطوب النقطة X1 ‬هي‬ ‫‪ B[r].X‬و النقطة X2 ‬هي 0.2+‪ B[r].X‬و النقطة Y1 ‬هي ‪ B[r].Y‬و النقطة Y2 ‬هي 0.1+‪ B[r].Y‬و هكذا‬ ‫نكون مستعدين لإختبار تصادم الطوبة بالكرة. إنظر إلى كود إكتشاف التصادم بعد أن أضفناه إلى الحلقة التكرارية:</div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">glBegin(GL_QUADS);</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">for (int r = 0 ; r &lt; 28 ; r++)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">if (B[r].Damaged == 0)</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">if (B[r].Y &gt; By-0.02 &amp;&amp; B[r].Y-0.1 &lt; By+0.02 &amp;&amp; B[r].X &lt; Bx+0.02 &amp;&amp; B[r].X+0.2 &gt; Bx-0.02)</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:120px;" dir="ltr">if (Dx == 1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:150px;" dir="ltr">Dx = 0;</p>
<p style="margin-bottom:0;text-align:left;padding-left:120px;" dir="ltr">else</p>
<p style="margin-bottom:0;text-align:left;padding-left:150px;" dir="ltr">Dx = 1;</p>
<p style="margin-bottom:0;text-align:left;padding-left:120px;" dir="ltr">if (Dy == 1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:150px;" dir="ltr">Dy = 0;</p>
<p style="margin-bottom:0;text-align:left;padding-left:120px;" dir="ltr">else</p>
<p style="margin-bottom:0;text-align:left;padding-left:150px;">Dy = 1;</p>
<p style="margin-bottom:0;text-align:left;padding-left:120px;" dir="ltr">B[r].Damaged = 1;</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(1,0,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X,B[r].Y);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(0,1,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X,B[r].Y-0.1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(1,0,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X+0.2,B[r].Y-0.1);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glColor3f(0,1,0);</p>
<p style="margin-bottom:0;text-align:left;padding-left:90px;" dir="ltr">glVertex2f(B[r].X+0.2,B[r].Y);</p>
<p style="margin-bottom:0;text-align:left;padding-left:60px;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">}</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">glEnd();</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫قمنا بإضافة كود إكتشاف التصادم كما شرحناه ثم قمنا بجعل الكرة تعكس إتجاهها تماماً فتعود من حيث جائت ثم يتم تغيير‬ ‫قيمة ‪ Damaged‬للطوبة لكي تصبح محطمة فلا ترسم بل لا يتم التعامل معها أصلًا. و هكذا نكون قد إنتهينا من كل شئ‬ ‫تقريباً في اللعبة‬. بعد التشغيل ستجد اللعبة كهذه الصورة:</p>
<p style="margin-bottom:0;text-align:right;">
<div><a href="http://omarblog.files.wordpress.com/2010/09/app7.png"><img class="aligncenter size-full wp-image-496" title="app7" src="http://omarblog.files.wordpress.com/2010/09/app7.png?w=600&#038;h=415" alt="" width="600" height="415" /></a></div>
<div>
<div>‫بعد أن تقوم بتجريب اللعبة ستجد أن كل شئ يعمل كما ينبغي إلا أننا قد نسينا أن نضع اللمسة الأخيرة في اللعبة و هي‬ ‫الفوز و الخسارة. فبعد أن تقوم بتحطيم كل الطوب لا يحدث شئ و تظل اللعبة تعمل كما أن الكرة لو سقطت لا يحدث شئ لذلك‬ ‫نريد أن نضيف اللمسة الأخيرة على اللعبة. و الأمر بسيط لا يتعدى أكثر من أن نضع شرطاً واحداً في دالة ‪ DispTimer‬لكي‬ ‫نختبر مكان الكرة في محور الصادات هل تجاوز النقطة -1 أم لا فإن لم تتجاوزها لا يحدث شئ و أما إن تجاوزتها فإن اللعبة‬ ‫تنتهي و يتم إعلام اللاعب بطريقة أو بآخرى أنه قد خسر. و بالطبع فإننا لم ندخل بعد في الكلم عن تحميل الصور حتى نظهر‬ ‫للاعب رسالة تفيده بأنه قد خسر بل كل ما عرفناه في الرسم هو كيف نرسم أشكال هندسية أولية فقط. لذلك سنقوم بشئ بسيط و هو أن اللعبة سوف تبدأ من جديد فيعود كل الطوب غير محطم و يعود المضرب في منتصف الشاشة و تأتي الكرة في منتصف‬ ‫يسار الشاشة كما كان في البداية. و كذلك الحال في الفوز. و الفوز يتم حين يحطم اللعب كل الطوب. و لكي نعرف هل كل‬ ‫الطوب قد تم تحطيمه أم لا يمكننا أن نقوم بعمل عداد يزيد كلما ضربنا طوبة و حين يصل العداد إلى 28 يفوز اللعب. سنقوم أولًا بعمل دالة تقوم بإرجاع كل شئ في اللعبة إلى طبيعته. و هو أن يتم إستعادة الطوب و إرجاع الكرة إلى مكانها و وضع‬ ‫المضرب في منتصف النافذة. و قد أسميناها ‪ .ResetGame‬إنظر إلى هذه السطور من الكود:</div>
</div>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">void ResetGame()</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">{</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">for (int r = 0 ; r &lt; 28 ; r++)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">B[r].Damaged = 0;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Bx = -1;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">By = 0;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Dx = 1;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Dy = 0;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">Mx = 0;</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">glutWarpPointer(W/2,H/2);</p>
<p style="margin-bottom:0;text-align:left;" dir="ltr">}</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫و هكذا قمنا بإعادة كل شئ إلى طبيعته. و الآن لنقم بإستدعاء تلك الدالة عندما تنزل الكرة إلى أقل من -1 في محور الصادات‬ ‫أو إذا حطم اللعب كل الطوب. بالنسبة للكرة إذا نزلت سنكتب هذا الشرط في دالة ‪:DispTimer‬‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">if (By &lt; -1)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">ResetGame();</p>
</blockquote>
<p style="margin-bottom:0;text-align:right;">
<p style="margin-bottom:0;text-align:right;">‫أما عن إذا ما تحطم كل الطوب فإننا سوف نقوم بعمل عداد يزيد كلما حطمنا طوبة. سنقوم بتعريف متغير عمومي نعطيه قيمة‬ ‫صفر في البداية و يزيد كلما حطمنا طوبة فإذا وصل إلى 28 تأكدنا أن اللعب قد حطم كل الطوب:‬</p>
<div>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">int Toob=0;</p>
</blockquote>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">و في دالة ‪ DispTimer‬سنقوم في الحلقة التكرارية على الطوب بإضافة هذا السطر بعد 1 = ‪:B[r].Damaged‬‬</p>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">‪Toob‬‬++;</p>
</blockquote>
<p style="margin-bottom:0;">‫و بالطبع سنقوم في دالة إعادة اللعبة إلى طبيعتها بتصفير هذا المتغير هو الآخر. و سنقوم بتعديل شرط إستدعاء دالة إعادة كل‬ ‫شئ إلى طبيعته إلى التي:‬</p>
<blockquote>
<p style="margin-bottom:0;text-align:left;" dir="ltr">‪if (By &lt; -1 || Toob‬‬ &gt;= 28)</p>
<p style="margin-bottom:0;text-align:left;padding-left:30px;" dir="ltr">ResetGame‬‬();</p>
</blockquote>
<p style="margin-bottom:0;">‫و الآن قم بإجراء كل التغييرات التي وضعناها و جرب أن تلعب اللعبة. سترى أنها قد أصبحت لعبة متكاملة. و إذا نظرت‬ ‫في الكود ستجد أن كل شئ فيه قد تعلمناه في الدروس السابقة. إذاً فالمسآلة ليست بالتعقيد الذي ربما تصوره البعض في البداية. فبرمجة الألعاب لا تحتاج أكثر من أن تكون على علم بالرسم و الجرافكس بالإضافة إلى بعض الأفكار. يمكنك أن تقوم بعد ذلك بعمل بعض اللعاب الآخرى بناءاً على ما تعلمناه. يمكنك أن تقوم بعمل‬ ‫لعبة ‪ Snake‬الشهيرة مثلًا و عبارة عن ثعبان يمشي و يأكل التفاح و إذا آكل تفاحة يزداد طوله و يجب عليه ألا يصطدم‬ ‫بنفسه و طبعاً كلما طال كلما أصبحت العملية أكثر تعقيداً و صعوبة. فالأمر لا يحتاج أكثر من أن تكون قادر على توليد الأفكار‬ ‫الجديدة و التفكير في حل المشكلة التي أمامك. و لهذا الأمر قمنا بعمل هذه التطبيقات بعد كل مجموعة من الفصول حتى نعطي‬ ‫القارئ أفكار لبعض الأشياء التي يمكن أن يعملها بما قد تعلمه.</p>
</div>
</div>
</div>
</div>
<div>‬</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p style="margin-bottom:0;text-align:right;">‬</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<br />Filed under: <a href='http://omarmokhtar.net/category/%d8%b4%d8%b1%d9%88%d8%ad%d8%a7%d8%aa/'>شروحات</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/omarblog.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/omarblog.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/omarblog.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/omarblog.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/omarblog.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/omarblog.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/omarblog.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/omarblog.wordpress.com/484/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=omarmokhtar.net&amp;blog=3873822&amp;post=484&amp;subd=omarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://omarmokhtar.net/2010/09/13/openglapplication1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">omarblog</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/toob.jpeg" medium="image">
			<media:title type="html">toob</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app1.png" medium="image">
			<media:title type="html">app1</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app2.png" medium="image">
			<media:title type="html">app2</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app3.png" medium="image">
			<media:title type="html">app3</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app4.png" medium="image">
			<media:title type="html">app4</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app5.png" medium="image">
			<media:title type="html">APP5</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app6.png" medium="image">
			<media:title type="html">app6</media:title>
		</media:content>

		<media:content url="http://omarblog.files.wordpress.com/2010/09/app7.png" medium="image">
			<media:title type="html">app7</media:title>
		</media:content>
	</item>
	</channel>
</rss>
