সুচিপত্র:

ভিএইচডিএলে মাস্টারমাইন্ড গেম: 3 টি ধাপ
ভিএইচডিএলে মাস্টারমাইন্ড গেম: 3 টি ধাপ

ভিডিও: ভিএইচডিএলে মাস্টারমাইন্ড গেম: 3 টি ধাপ

ভিডিও: ভিএইচডিএলে মাস্টারমাইন্ড গেম: 3 টি ধাপ
ভিডিও: Голубая стрела (1958) фильм 2024, জুলাই
Anonim
ভিএইচডিএলে মাস্টারমাইন্ড গেম
ভিএইচডিএলে মাস্টারমাইন্ড গেম
ভিএইচডিএলে মাস্টারমাইন্ড গেম
ভিএইচডিএলে মাস্টারমাইন্ড গেম

আমাদের প্রকল্পের জন্য, আমরা VHDL- এ Baster3 বোর্ডে "মাস্টারমাইন্ড" গেমটি তৈরি করেছি। মাস্টারমাইন্ড হল একটি কোড-ব্রেকিং গেম যা traditionতিহ্যগতভাবে পেগ এবং একটি গেম বোর্ড দিয়ে খেলে। খেলোয়াড় এক সারিতে 4 টি রঙের পেগ রাখে, দুই খেলোয়াড়ের থেকে লুকানো। প্লেয়ার টু এর 'x' সংখ্যার অনুমান আছে যা বোর্ডে পেগ রেখে সারিতে প্লেয়ার এককে দৃশ্যমান করে। প্রতিটি অনুমানের পরে, খেলোয়াড় দুটিকে 2 টি সংখ্যার বিষয়ে অবহিত করা হয়: কতগুলি পেগ সঠিক রঙ এবং কতগুলি পেগ সারিতে সঠিক অবস্থানে রয়েছে। সেই সংকেতগুলি ব্যবহার করে, খেলোয়াড় দুজনকে অবশ্যই পিনের সঠিক ক্রম অনুমান করতে হবে যে খেলোয়াড়টি বরাদ্দকৃত সংখ্যায় অনুমান করা হয়েছে।

আমাদের বাস্তবায়নে, গেমটি একক খেলোয়াড়। প্রোগ্রাম দ্বারা পেগের একটি এলোমেলো সংমিশ্রণ তৈরি করা হয় এবং সঠিক ক্রম অনুমান করতে খেলোয়াড়কে অবশ্যই বেসিস 3 বোর্ড ব্যবহার করতে হবে। চারটি "রঙ" আছে, যা বাইনারি মান দ্বারা প্রতিনিধিত্ব করে। 7-সেগমেন্ট ডিসপ্লে তিনটি মান দেখায়: অবশিষ্ট বাঁক, সঠিক অবস্থানে পিনের সংখ্যা এবং ভুল অবস্থানে সঠিক রঙের পিনের সংখ্যা (এই মানগুলি 9, 0 এবং 0 থেকে শুরু হয়)। প্লেয়ার তার অনুমানের জন্য বাইনারি মান নির্বাচন করার জন্য বোর্ডে সুইচ ব্যবহার করে এবং অনুমান জমা দেওয়ার জন্য অন্য একটি সুইচ উল্টে দেয়। যদি তারা সঠিক হয়, গেমটি শেষ হয় এবং 7-সেগমেন্ট ডিসপ্লে "GG" দেখায়। যদি না হয়, টার্ন কাউন্টার 1 দ্বারা হ্রাস পায় এবং খেলোয়াড় তাদের অনুমানের কতগুলি পিনের সংমিশ্রণে পিনের রঙ বা অবস্থানের সাথে মিলিত হয় তার উপর ভিত্তি করে প্রতিক্রিয়া পায়। যদি খেলোয়াড় সঠিকভাবে অনুমান না করে পালা ফুরিয়ে যায়, ডিসপ্লে দেখায় "GO" (গেমের প্রতিনিধিত্ব)। প্লেয়ার রিসেট সুইচটি যে কোন সময় শুরু করতে পারে।

ধাপ 1: উপকরণ

উপকরণ
উপকরণ
উপকরণ
উপকরণ
উপকরণ
উপকরণ

যেহেতু পুরো গেমটি নিজেই বোর্ডে খেলতে পারে, তাই কেবলমাত্র প্রয়োজনীয় উপকরণগুলি হল বেসিস 3 বোর্ড, বোর্ডের সাথে সংযোগের জন্য একটি মাইক্রো ইউএসবি কেবল এবং একটি কম্পিউটার/ল্যাপটপ যা আপনি কোড ব্যবহার করতে পারেন!

ধাপ 2: কোড

কোড
কোড
কোড
কোড

এফপিজিএ -তে এই গেমটি কাজ করার জন্য, এটি লেখার সহজ উপায় হল একটি রাষ্ট্রীয় মেশিন তৈরি করা। একটি স্টেট মেশিন থাকার ফলে গেমটি আসলে কাজ করার জন্য প্রয়োজনীয় অনুক্রমিক এবং ইন্টারেক্টিভ অভিজ্ঞতা অর্জন করতে পারে। সবকিছু সুষ্ঠুভাবে চলার জন্য, রাষ্ট্রীয় মেশিনটি FPGA- এর অভ্যন্তরীণ ঘড়ির সংকেতের উপর ভিত্তি করে তৈরি করা হবে, যাতে সবকিছু সুসংগত থাকে। প্রধান মডিউল হল চারটি রাজ্যের একটি রাষ্ট্রযন্ত্র; প্রারম্ভিক রাজ্য (প্রাথমিক), সাবমিট উত্তর রাজ্য (SubAns), প্রদর্শন রাজ্য (ডিস), এবং CheckEndGame রাজ্য (CheckEnd)। স্টেট মেশিনের পাশাপাশি, প্রধান মডিউলের দুটি সাবমডিউল রয়েছে, একটি 4-অঙ্কের সাতটি সেগমেন্ট ডিসপ্লে (যার নিজস্ব ClkDivider সাবমডিউল রয়েছে), এবং র্যান্ডম নম্বর জেনারেটর (আসলে একটি psuedo- এলোমেলো সংখ্যা জেনারেটর)। প্রতিটি সুইচের উপরে এলইডি চালু করার জন্য একটি মৌলিক প্রক্রিয়া ব্লক রয়েছে যখন লোকেদের সহজে কী ইনপুট করছে তা দেখার উপায় হিসাবে চালু করা হয়। কোডের একটি মৌলিক ওভারভিউ চিত্রিত মনের মানচিত্রে দেখা যাবে।

প্রথম উপাদানটি দেখতে হবে র্যান্ডম নম্বর জেনারেটর (র্যান্ডমজেন)। যেহেতু হার্ডওয়্যার থেকে উৎপন্ন সত্যিকারের এলোমেলো সংখ্যা পাওয়া টেকনিক্যালি সম্ভব নয়, তাই সবচেয়ে সহজ সমাধান ছিল র্যান্ডমজেন আসলে একটি লিনিয়ার-ফিডব্যাক শিফট রেজিস্টার (LFSR)। LFSR- এর একটি ইনপুট আছে clk এবং একটি আউটপুট "a" (একটি 12-বিট সংখ্যা)। প্রতিটি ঘড়ি চক্র, "000000000001" থেকে শুরু করে একটি নতুন 12-বিট সংখ্যা উৎপন্ন হয়, অবশেষে নিজেকে পুনরাবৃত্তি করার আগে 1 এবং 0 এর 12-বিটের সমস্ত সংমিশ্রণের মধ্য দিয়ে যায়। আউটপুট "এ" প্রতিটি ঘড়ি চক্র দেওয়া হয়, তাই এটি ক্রমাগত জুড়ে চলছে। ক্লকটি প্রধান মডিউল থেকে ক্লকে ম্যাপ করা হয় এবং "এ" প্রধান মডিউলের র্যান্ডনাম সংকেতে ম্যাপ করা হয়।

দ্বিতীয় সাবমডিউল হল--সংখ্যার সাতটি সেগমেন্ট ডিসপ্লে। এটি একটি 4-অঙ্কের সাতটি সেগমেন্ট ডিসপ্লে প্রদর্শনের একটি সহজবোধ্য উপায়। ডিসপ্লেটি প্রধান মডিউল থেকে Clk- এ সেট করা আছে, তবুও এই সাব -মডিউলের একটি ClkDivider এর নিজস্ব সাব -মডিউল রয়েছে। ClkDivider (1298 Hz এ সেট করা হয়) সাতটি সেকমেন্টের জন্য ঘড়ির গতি বাড়ানোর জন্য ব্যবহার করা হয় যাতে সমস্ত সংখ্যা একই সময়ে চালু থাকে (যেহেতু শুধুমাত্র একটি ডিজিট আসলে একটি সময়ে চালু থাকতে পারে)। পরিবর্তনশীল "ডিজিট" ডিসপ্লেতে দাগ দিয়ে চক্রের জন্য ব্যবহৃত হয়, এবং প্রতিটি ডিজিটের সাথে একটি মৌলিক 4-বিট ইনপুট ডিসপ্লের শর্ত আসে, যেখানে 0 থেকে 9 সংখ্যা দেখানোর বিকল্প এবং কিছুই নেই। ডিসপ্লেতে সবচেয়ে দূরে বাম সংখ্যাটি সেট করা হয়েছে কারণ এটি এই গেমটিতে ব্যবহৃত হয় না।

প্রধান মডিউলটি রাষ্ট্রীয় মেশিন নিয়ে গঠিত। প্রক্রিয়ার চারটি রাজ্য হল প্রাথমিক, সাবঅ্যান্স, ডিস এবং চেকএন্ড। প্রাথমিক অবস্থায়, যদি SubmitBtn (চেক করার জন্য আপনার উত্তর জমা দেওয়ার জন্য ব্যবহৃত সুইচ) '1' তে সেট করা হয়, তাহলে মেশিনটি SubAns রাজ্যে চলে যায়। যেকোন সময় Rbtn (মেশিন রিসেট করতে ব্যবহৃত সুইচ) '1' তে সেট করা হয়, তারপর মেশিনটি প্রাথমিক অবস্থায় ফিরে আসে। যখন SubAns রাজ্যে, যখন SubmitBtn = '0' আবার, এটি ডিস রাজ্যে চলে যায়। যখন ডিস রাজ্যে, যদি কাউন্টডাউন = 0 (অনুমান করার জন্য বাম দিকে 0 এ পড়ে) বা যদি RSpotCount = 4 (মানে প্লেয়ারটি সঠিক দাগের সমস্ত সঠিক রঙ হিসাবে), মেশিনটি চেকএন্ড স্টেটে যায়। যদি এর কোনটিই না ঘটে, তাহলে যখন আবার SubmitBtn = '1' হবে, তখন এটি আবার অনুমান করার জন্য SubAns অবস্থায় ফিরে যাবে। যখন চেক এন্ড স্টেটে থাকে, এটি গেমের শেষ, এবং একমাত্র উপায় হল রিসেটটি হিট করা, এটি প্রাথমিক অবস্থায় ফিরিয়ে দেওয়া। এটি রাষ্ট্রীয় মেশিন ডায়াগ্রামে সহজেই দেখা যায়। আচরণগতভাবে প্রারম্ভিক অবস্থা সবকিছুকে শুরুর অবস্থানে ফিরিয়ে আনে। কাউন্টডাউন (সিগন্যাল যা প্লেয়ারের কতগুলি বাঁক বাঁচায়) 9, RSpotCount (সিগন্যাল যা আপনি অনুমান করেছেন যে কতগুলি রং সঠিক স্থানে সংরক্ষণ করে) 0, RColorCount (সংকেত যা কতগুলি সংরক্ষণ করে আপনি যে রংগুলি অনুমান করেছেন তা সঠিক কিন্তু ভুল স্থানে) 0 তে সেট করা হয়েছে, এবং ক্ষুদ্র গণনা (সংকেত যা শেষ পর্যন্ত কাউন্টডাউনে ম্যাপ করা হয়েছে যা প্রকৃতপক্ষে পরবর্তী রাজ্যের প্রতিটি মোড় পরিবর্তন করে) 9 এ সেট করা হয়েছে। এছাড়াও, প্রাথমিক অবস্থায় RandNum (psuedo- এলোমেলো উৎপন্ন সংখ্যা) চারটি ভিন্ন চেক (প্রতি 3-বিট রঙের জন্য একটি) এবং সিগন্যাল চেক 1, চেক 2, চেক 3, চেক 4 এ বিভক্ত। এই চেকগুলি আসলে আপনার অনুমানের সাথে তুলনা করা হয়, তাই যদিও এলএফএসআর সর্বদা র্যান্ডনামকে প্রতিটি চক্র পরিবর্তন করতে বাধ্য করে, একবার আপনি প্রাথমিক অবস্থায় চলে গেলে চেকগুলি একই থাকে, যার ফলে আপনার সংরক্ষিত মানটি আপনার উত্তরটির সাথে তুলনা করতে পারে। এর অর্থ এই যে, যে কোনো সময় মেশিনটি পুনরায় সেট করা হলে, প্লেয়ারের অনুমান করার জন্য একটি নতুন মান রয়েছে।

SubmitAnswer State (SubAns) কাউন্টডাউন সক্ষমকারী (সংকেত "পরিবর্তন") '1' তে পরিবর্তন করে। টার্ন ট্র্যাকিং কাজ করার জন্য এটি পরে প্রয়োজন। তারপরে, রাজ্য প্লেয়ারের ইনপুটগুলিকে সুইচ থেকে উপরের রাজ্যে তৈরি চেকের সাথে তুলনা করে। সিগন্যাল rs1, rs2, rs3, rs4 এবং সিগন্যাল rc1, rc2, rc3, rc4 হল পূর্ণসংখ্যার ধরন যার উপর নির্ভর করে যদি if স্টেটমেন্টগুলো 1 বা 0 তে সেট করা থাকে। উদাহরণস্বরূপ যদি রঙ 1 প্লেয়ারের অনুমান র্যান্ডনামের চেক 1 এর সমান হয়, তাহলে rs1 = 1 এর মানে হল যে সঠিক রঙটি সঠিক স্থানে রয়েছে। যদি রঙ 1 চেক 1 এর সমান না হয়, কিন্তু অন্য একটি চেকের সমান করে, তাহলে rc = 1. এটি প্রতিটি রঙ এবং প্রতিটি চেকের জন্য করা হয়।

ডিসপ্লে স্টেট (ডিস) প্রথমে কাউন্টডাউন এনাবলারের সন্ধান করে। যদি এটি '1' হয়, তাহলে ক্ষুদ্র গণনা 1 নিচে নেমে যায় (তাই প্রথম পালায় এটি 9 থেকে 8 পর্যন্ত যায় ইত্যাদি)। অন্যথায় পালা বদলায় না। তা যতই সক্ষম হোক না কেন, উপর থেকে সমস্ত rs মান যোগ করা হয় এবং RSpotCounter সংকেত দেওয়া হয়। এছাড়াও সমস্ত rc মান যোগ করা হয় এবং RColorCounter এ বরাদ্দ করা হয়। পরিশেষে কাউন্টডাউনকে ছোট কাউন্টডাউনের মান দেওয়া হয়। RSpotCounter, RColorCounter এবং কাউন্টডাউন সংকেতগুলি প্রক্রিয়ার বাইরে 4-বিট std_logic_vectors- এ রূপান্তরিত হয় এবং একটি পোর্ট ম্যাপের মাধ্যমে সেভেন সেগমেন্ট ডিসপ্লে সাবমডিউলে ঠেলে দেওয়া হয়। এইভাবে, ডিসপ্লে সঠিক জিনিসগুলি দেখায় যতক্ষণ না আপনি একটি নতুন উত্তর জমা দেন।

চেক এন্ড স্টেট হল আপনি জিতেছেন বা হেরেছেন কিনা। যদি আপনি জিতে থাকেন (সব 4 টি রং সঠিক জায়গায় আছে, অন্যথায় RSpotCounter = 4 নামে পরিচিত), তাহলে "জিজি" (টেকনিক্যালি 66 হিসাবে দেখানো হয়েছে) সেভেন সেগমেন্টে দেখানো হয়েছে যে আপনি জিতেছেন। যদি আপনি হারিয়ে যান (কাউন্টডাউন 0 তে পৌঁছেছে) তাহলে গেম ওভারের জন্য ডিসপ্লেতে "GO" (টেকনিক্যালি 60 হিসাবে দেখানো হয়েছে) প্রদর্শিত হবে। যেকোনো ফলাফলের সাথে, রিসেট সুইচটি চালু করলে মেশিনটি আবার খেলতে প্রাথমিক অবস্থায় চলে যাবে।

সোর্স কোড পাওয়া যাবে এখানে।

ধাপ 3: উপসংহার

এই প্রকল্পটি সম্পন্ন করা আমাদের আরো জটিল সার্কিট নির্মাণ সম্পর্কে অনেক কিছু শিখিয়েছে। আমাদের প্রাথমিক নকশা একটি সীমিত রাষ্ট্র যন্ত্র ছিল না। আমরা ডিবাগ করা কঠিন মনে করেছি, এবং বিভিন্ন পদ্ধতি (একটি FSM সহ) ব্যবহার করে কোডটি কয়েকবার পুনরায় লিখেছি। প্রশিক্ষকের পরামর্শে, আমরা এফএসএম পদ্ধতির সাথে আটকে গেলাম এবং আমরা গেমটি শেষ করতে সক্ষম হয়েছি। আমরা শিখেছি যে একটি প্রচলিত প্রোগ্রামিং পদ্ধতির তুলনায় হার্ডওয়্যারের উপর ভিত্তি করে কোড ডিজাইন করা অনেক বেশি কার্যকর। আমরা সাত সেগমেন্ট ডিসপ্লে সম্পর্কিত বেশ কয়েকটি চ্যালেঞ্জের মুখোমুখি হয়েছি। "Ghosting" ছাড়া একাধিক সংখ্যা প্রদর্শন করা এটি কঠিন ছিল, এবং এটি সম্পন্ন করার জন্য আমাদের একটি ঘড়ি বিভাজক ব্যবহার করতে হয়েছিল। যদি আমরা এই প্রকল্পটি আরও উন্নত করতে চাই, আমরা রঙিন এলইডিগুলিকে বেসিস 3 এর সাথে সংযুক্ত করব যাতে ব্যবহারকারী রঙের সংখ্যাসূচক উপস্থাপনার পরিবর্তে রং দেখতে পারে (যেমন প্রচলিত খেলাতে)। শেষ পর্যন্ত, আমরা জটিল সার্কিট ডিজাইন, বাস্তব জীবনের অ্যাপ্লিকেশন এবং নিখুঁত অবস্থার সাথে সিমুলেশন চালানোর পরিবর্তে হার্ডওয়্যার ব্যবহারের চ্যালেঞ্জ সম্পর্কে আরও বেশি উপলব্ধি অর্জন করেছি।

প্রস্তাবিত: