৫. 8051 এর ইন্টারনাল আর্কিটেকচার এবং কার্যক্রম
মাইক্রোকন্ট্রোলার হল একটা সিঙ্গেল চিপ মাইক্রোকম্পিউটার। একটা কম্পিউটারের ভিতরে কি কি থাকে? প্রসেসর,র্যাম,রোম,ইনপুট/আউটপুট ডিভাইস (মনিটর,ডিভিডি রাইটার,সাউন্ড বক্স ইত্যাদি)। তেমনি আমাদের মাইক্রোকন্ট্রোলারের ভিতরেও এইসব জিনিস থাকে। তবে খুবই সীমিত আকারে থাকে। যেমন র্যাম থাকে কয়েশ বাইট থেকে কয়েক হাজার বাইট পর্যন্ত, রোমের পরিমানও কয়েক হাজার বাইট, আর ইনপুট/আউটপুট ডিভাইস কানেক্ট করার জন্যে থাকে ইনপুট/আউটপুট পিন। কম্পিউটারের যেমন ক্লক স্পিড থাকে তেমনি আমাদের মাইক্রকন্ত্রলারের ও ক্লক স্পিড থাকে, যেটা ক্রিস্টাল অসসিলেটরের মাধ্যমে মাইক্রোকন্ট্রোলারকে প্রদান করা হয় বা অনেক মডেলের মাইক্রোকন্ট্রোলারে ইন্টারনাল ক্লক থাকেই। তারমানে আমরা এটুকু বুঝতে পারছি যে মাইক্রোকন্ট্রোলার হল আসলে কম্পিউটারের একটা মিনিয়েচার ভার্সন। এই পোস্টটি একটু বড় হবে এবং খুবই মনোযোগ সহকারে পড়ার অনুরোধ থাকলো। কেননা এটার উপরই মাইক্রোকন্ট্রোলারের বেসিক অনেক কিছু ডিপেন্ড করছে।
এই পোস্টে আমরা স্পেসিফিকভাবে শুধু 8051 এর বেসিক ইন্টারনাল আর্কিটেকচার এবং এর ভিতরের কাজকর্মগুলোর সাথে পরিচিত হব। নিচে 8051 এর একটি বেসিক ইন্টারনাল ব্লক ডায়াগ্রাম দেয়া হল।
উপরের চিত্রে আমরা একটি ব্লক ডায়াগ্রাম দেখতে পাচ্ছি। এটা হল 8051 এর বেসিক ইন্টারনাল ব্লক ডায়াগ্রাম। Interrupt Control, 4K byte ROM, 128 byte RAM, Timer1/Timer0, I/O Ports, Serial Port এই প্রত্যেক টাই হল একেকটা পেরিফেরাল। আর যে কালো তীর চিহ্নিত পথ দেখানো হয়েছে এটাকে বলা হয় বাস (BUS). অর্থাৎ এই পথ দিয়েই এড্রেস এবং ডেটা আদান-প্রদান হয় ব্রেইন তথা সিপিউ এর সাথে। বাস আসলে অনেকগুলো তারের সমষ্টি ছাড়া আর কিছুই না। ৮বিটের বাস বলতে ৮টা পাশাপাশি তারের সমষ্টিকে বোঝায় যেই ৮ টা তারের মধ্যে দিয়ে কোন একটা সিগন্যাল সাইমাল্টেনিয়াসলি চলাফেরা করতে পারে। অর্থাৎ ঐ ৮টা তারের যেকোন একটা তার দিয়ে ১ অথবা ০ সিগন্যাল যাতায়াত করে থাকে। আরও সহজ ভাবে বলতে গেলে বলা যায় যে একটি তারে হয় সিগন্যাল থাকবে (১) অথবা থাকবেনা (০)। তেমনিভাবে ১৬বিটের বাস বলতে ১৬ টা পাশাপাশি তারের সমষ্টিকে বোঝানো হয়। তারমানে ৮বিটের ডেটা-বাস হল পাশাপাশি ৮টা তারের সমষ্টি এবং ১৬ বিটের এড্রেস-বাস হল পাশাপাশি ১৬ টা তারের সমষ্টি।
অসসিলেটরকে ডিরেক্ট সিপিউ এর সাথে কানেক্ট দেখানো হয়েছে। কেননা অসসিলেটর ই সিপিউ এর ইন্সট্রাকশন এক্সিকিউট করার স্পিড দেয়।
Bus Control ইউনিট টা ডেটা-বাস এবং এড্রেস-বাস সিলেক্ট করার জন্যে ব্যবহৃত হয়। যেহেতু 8051 এর ক্ষেত্রে অনেক সময় এক্সাটারনাল র্যাম, রোম ব্যবহার করতে হয় এবং সেক্ষেত্রে একই পোর্টএর মাধ্যমে ডেটা এবং এড্রেস কালেক্ট করতে হয় সেহেতু কিছু মাল্টিপ্লেক্সিং এবং ডিমাল্টিপ্লেক্সিং টাইপের কিছু অপারেশন এই ইউনিটটি কন্ট্রোল করে থাকে।
নিচে আরেকটি ব্লক ডায়াগ্রাম দেখলে 8051 এর অপারেশন কীভাবে সম্পূর্ণ হয় সে সম্পর্কে আমরা জানতে পারবো।
উপরের চিত্রে আমরা সবথেকে বাম দিকে একটা বড় ব্লক দেখতে পাচ্ছি যেটার নাম Program Memory. আমরা মাইক্রোকন্ট্রোলারের জন্যে যে কোড লিখব সেই কোডগুলো অর্থাৎ ইন্সট্রাকশন গুলো এই মেমোরিতে সেভ হয়। মাইক্রোকন্ট্রোলারের ক্ষেত্রে আমরা কম বেশি সবাই প্রোগ্রাম বার্ন করার বিষয়টি শুনেছি। প্রোগ্রাম বার্ন করা বলতে আসলে আমাদের লিখা কোডের ইন্সট্রাকশন গুলো এই প্রোগ্রাম মেমোরিতে আপলোড করাকে বুঝানো হয়। এই ব্লকের বাম পাশে আমরা উপরের দিকে 000H এবং নিচের দিকে FFFH দেখতে পাচ্ছি। এটা দ্বারা আসলে প্রোগ্রাম মেমোরির এড্রেস বোঝান হয়েছে। 000H এবং FFFH হেক্সাডেসিমাল ফরম্যাটে লিখা, ডেসিমাল ফরম্যাটে এরা যথাক্রমে 0 এবং 4095 হয়। আমরা আগেই জেনেছিলাম যে 8051 এর ৪ কিলোবাইটের রোম আছে।
৪ কিলোবাইট = (৪ * ১০২৪) বাইট = ৪০৯৬ বাইট।
০ থেকে ৪০৯৫ পর্যন্ত হয় টোটাল ৪০৯৬ টা ধাপ। এইজন্যেই প্রোগ্রাম মেমোরির প্রথম এড্রেস হল 000H (0) এবং সবার শেষ এড্রেস হল FFFH (4095)।
Program Memory এর ডান পাশে দেখতে পাচ্ছি Program Counter. এটা আসলে একটা ১৬ বিটের অর্থাৎ ২ বাইটের রেসজিস্টার যেটার কাজ হল প্রোগ্রাম মেমোরির যে এড্রেসের ইন্সট্রাকশন এক্সিকিউট করা হবে সেই এড্রেসটা ধরে রাখা। এখন ১৬ বিটের কোন সংখ্যার সর্বোচ্চ মান হয় ৬৫,৫৩৬।
২^১৬ = ৬৫,৫৩৬ ,
আবার , ৬৪ * ১,০২৪ = ৬৫,৫৩৬
উপরের দুটা হিসাবের রেজাল্ট একই। কিন্তু হিসাব দুটা ভিন্ন ভিন্ন। প্রথম হিসাবের রেজাল্ট আমরা সবাই বুঝতে পেরেছি মোটামোটি। কিন্তু দ্বিতীয় টার?
আমরা এর আগে জেনেছি যে 8051 সর্বোচ্চ রোম সাপোর্ট করে ৬৪ কিলোবাইট (ইন্টারনাল ৪কিলোবাইট কিংবা পুরোটাই এক্সাটারনাল)। তো এই ৬৪ কিলোবাইটের প্রোগ্রাম মেমোরি অথবা রোমের সর্বোচ্চ এড্রেস হয় ৬৫,৫৩৬ - ১ = ৬৫,৫৩৫ বাইট (যেহেতু ০ থেকে ইনডেক্সিং শুরু তাই ১ বাদ দিয়ে ধরতে হয়)। Program Counter ১৬ বিটের জন্যেই আসলে 8051 সর্বোচ্চ ৬৪ কিলোবাইটের রোম সাপোর্ট করে। সেক্ষেত্রে প্রোগ্রাম মেমোরির এড্রেস 0000H থেকে FFFFH হয়ে যায়।
প্রোগ্রাম মেমোরির নিচের অংশে যে ব্লকটি আছে তার নাম হল Instruction Decoder. আমরা মাইক্রোকন্ট্রোলারকে কোডে যে ইন্সট্রাকশন দেই সেটাকে ট্রান্সলেট করে হার্ডওয়্যারকে সেই অনুযায়ী আপডেট করাই এর কাজ।
সবার ডানদিকে আমরা পাশাপাশি দুটা ব্লক দেখতে পাচ্ছি। এর মধ্যে বড় ব্লকটি ও এক রকমের মেমরি। এটাকে বলা হয় ডেটা মেমোরি বা র্যাম। 8051 এর জন্যে র্যাম হল সাধারনত ১২৮ বাইট। তাই এর এড্রেস শুরু হয় 00H থেকে এবং শেষ হয় 7FH এ।
২ ^ ৮ = ১২৮; যেহেতু ০ থেকে এড্রেসিং শুরু তাই ১২৮ - ১ = ১২৭ কে শেষ এড্রেস ধরা হয়।
ডেটা মেমোরির পাশে ছোট একটি ব্লক দেখা যাচ্ছে যেটার নাম SFR (Special Function Register). এটা হল 8051 এর কিছু রেজিস্টার যা স্পেসাল কিছু টাস্ক করে থাকে। প্রোগ্রাম মেমোরি, ডেটা মেমোরি, রেজিস্টার নিয়ে আসলে আরও অনেক কিছু বলার আছে। কারন এই তিনটা বিষয় সম্পর্কে ভালো ভাবে না জানলে কোড করা একটু টাফ হয়ে যাবে বিশেষ করে এসেম্বলি কোড করা। এইজন্যে এর পরবর্তী পোস্টে এগুলো নিয়ে আরও বিশদভাবে আলোচনা করা হবে।
চিত্রের মাঝে যে V শেপের ব্লকটি দেখা যাচ্ছে সেটাকে বলা হয় ALU(Arithmetic Logic Unit). সকল প্রকার গানিতিক হিসাব এবং লজিক্যাল ডিসিশন নেয়াই এর প্রধান কাজ। 8051 এর ক্ষেত্রে ALU হল ৮ বিটের। অর্থাৎ এর সকল প্রকার অপারেশনই ৮ বিটের সংখ্যার মধ্যেই সীমাবধ্য। ALU এর প্রত্যেক ইন্সট্রাকশন এক্সিকিউট হওয়ার পরেই SFR এর কিছু রেজিস্টার আপডেট হয়ে যায়। PSW (Program Status Word) এরকম একটি রেজিস্টার। আরেকটি গুরুত্বপূর্ণ রেজিস্টার হল Accumulator রেজিস্টার। ALU কোন একটা অপারেশন সম্পূর্ণ করার পরে ফলাফল এই রেজিস্টারে জমা রাখে। এবিষয়ে পরে আরও বিস্তারিত জানা যাবে।
8051 এর ভিতরে কীভাবে কার্যক্রম চলে তা বোঝার জন্যে আমরা নিচের অংশ টুকু খুব মনোযোগ দিয়ে পড়ব।
মাইক্রোকন্ট্রোলারকে দিয়ে কোন কাজ করাতে গেলে আমাদেরকে সাধারণত কোড লিখতে হয়।এই কোড আমরা এসেম্বলি, সি বা সি++ এ লিখে থাকি। ম্যাক্সিমামি সি দিয়ে কোড লিখা হয়। এই কোড লিখা হয় একটা IDE তে, এবং এটাকে কম্পাইল করলে একটা হেক্স ফাইল তৈরি হয়। এই হেক্স ফাইলটিই আমাদেরকে মাইক্রোকন্ট্রোলারে বার্ন করতে হয় অর্থাৎ রোমে আপলোড করতে হয়। নরমালি কোডের ইন্সট্রাকশনগুলো প্রোগ্রাম মেমোরিতে জমা হয় এবং ডেটা জমা হয় সাধারণত ডেটা মেমোরিতে। প্রোগ্রাম মেমোরিতে প্রোগ্রাম একবার আপলোড করা হলে সেটা মাইক্রোকন্ট্রোলার পাওয়ার অফ করা হলেও মুছে যায়না। কিন্তু ডেটা মেমোরির ডেটা কিন্তু মাইক্রোকন্ট্রোলারে পাওয়ার অফ করলেই মুছে যায়। অর্থাৎ ডেটা মেমোরি কিন্তু ভোলাটাইল টাইপের (উদ্বায়ী পদার্থের মত) কিন্তু প্রোগ্রাম মেমোরি নন-ভোলাটাইল।
আরও পরিষ্কার ভাবে উদাহরন দেয়া যায়। মাইক্রোকন্ট্রোলারে কোড আপলোড করে একে পাওয়ার আপ করা হল। এখন কোড অনুযায়ী ডেটা নিয়ে কাজ করে সেই আপডেটেড-ডেটা ডেটা-মেমোরিতে জমা হবে এবং প্রোগ্রাম কাউন্টার (PC) রেজিস্টারের মান বাড়তে থাকবে যেহেতু একটার পর একটা ইন্সট্রাকশন এক্সিকিউট হবে। এই অবস্থায় যদি মাইক্রোকন্ট্রোলারকে রিসেট দেয়া হয় বা পাওয়ার খুলে নিয়ে আবার দেয়া হয় তাহলে কি হবে?
প্রোগ্রাম কাউন্টার (PC) রেজিস্টার এর মান 000H এ চলে যাবে। অর্থাৎ প্রোগ্রাম মেমোরির ইনিশিয়াল ইন্সট্রাকশন এক্সিকিউট হবে আবার। এবং ডেটা-মেমোরিতে যে ডেটাগুলো জমা হয়েছিলো সবগুলো মুছে গিয়ে আবার নতুন থেকে শুরু হবে।
প্রোগ্রাম কাউন্টার (PC) রেজিস্টার প্রোগ্রাম মেমোরির যে এড্রেসকে নির্দেশ করবে, সে ইন্সট্রাকশন এক্সিকিউট হবে এবং ইন্সট্রাকশন ডিকোডার সেটাকে ট্রান্সলেট করে মাইক্রোকন্ট্রোলারের হার্ডওয়্যারকে সেই অনুযায়ী আপডেট করে দিবে। এভাবে একটা করে ইন্সট্রাকশন এক্সিকিউট হওয়ার সাথে সাথে প্রোগ্রাম কাউন্টার (PC) রেজিস্টারের মান বাড়তে থাকবে। প্রোগ্রাম কাউন্টার (PC) রেজিস্টারের মান ১ বা ২ করে বৃদ্ধি পেতে থাকে (ইন্সট্রাকশনের অপকোডের সাইজ অনুযায়ী), কিন্তু কখনই হ্রাস পায়না।
আর এই যে ইন্সট্রাকশন গুলো এক্সিকিউট হচ্ছে। সেটা কে করছে? এটা করছে হল ALU. এই হল মোটামোটি ভাবে 8051 এর ভিতরের বেসিক কার্যক্রম।
Want more about "program memory, data memory and register "!
উত্তরমুছুন