সুচিপত্র:

VHDL Basys3: Connect 4 Game: 5 ধাপ
VHDL Basys3: Connect 4 Game: 5 ধাপ

ভিডিও: VHDL Basys3: Connect 4 Game: 5 ধাপ

ভিডিও: VHDL Basys3: Connect 4 Game: 5 ধাপ
ভিডিও: 6.FPGA FOR BEGINNERS- Process in VHDL with an example on the Basys3 board 2024, নভেম্বর
Anonim
ভিএইচডিএল বেসিস 3: কানেক্ট 4 গেম
ভিএইচডিএল বেসিস 3: কানেক্ট 4 গেম

ভূমিকা:

এটি একটি কানেক্ট 4 ডিজিটাল লজিক গেম যা ভিএইচডিএল -এ ডিজাইন করা হয়েছে ভিভাদো সফটওয়্যার ব্যবহার করে এবং বেসিস 3 বোর্ডে প্রোগ্রাম করা হয়েছে। এই প্রকল্পের নির্মাণ এবং নকশা মধ্যবর্তী, কিন্তু নতুনরা ধাপগুলি অনুলিপি করতে পারে এবং ডিজিটাল গেম তৈরি করতে পারে।

গেমটি কানেক্ট 4 গেমের মতো কাজ করে। বোর্ডে পাওয়া বাম এবং ডান বোতাম ব্যবহার করে খেলোয়াড়রা তাদের কার্সার স্ক্রিন জুড়ে সরাতে পারেন। বোর্ডের মাঝামাঝি বোতাম টিপলে খেলোয়াড় column কলামে তাদের মার্কার স্থাপন করবে এবং তারপর এটি পরবর্তী খেলোয়াড়ের পালা হয়ে যাবে। একবার একজন খেলোয়াড় জিতে গেলে, বোর্ডে আপ বোতাম টিপে গেমটি পুনরায় সেট করা যেতে পারে।

ধাপ 1: দ্রুত বিবরণ এবং উপকরণ

দ্রুত প্রযুক্তিগত বিবরণ:

  • বোর্ডে PMOD সংযোগের তিনটি সেট ব্যবহার করে (JA, JB, JC)

    • প্রতিটি PMOD সংযোগকারীর জন্য 8 টি পিন (Vcc এবং GND পিন বাদে) ব্যবহৃত হয়
    • JA - সারি নিয়ন্ত্রণ
    • JB - সবুজ কলাম নিয়ন্ত্রণ
    • JC - লাল কলামের নিয়ন্ত্রণ
  • স্ক্রিন ক্লক 960Hz এ কাজ করে

    একটি নির্দিষ্ট সময়ে শুধুমাত্র 8 টি LEDs চালু আছে। স্ক্রিনটি যথেষ্ট দ্রুত ঘড়ির গতিতে রিফ্রেশ করে যে বিভ্রান্তি দেওয়া হয় যে একটি নির্দিষ্ট সময়ে 8 টিরও বেশি এলইডি চালু আছে।

  • বাটন ঘড়ি 5Hz এ কাজ করে; ভিএইচডিএল কোড সম্পাদনা করে ptionচ্ছিকভাবে জরিমানা করা যেতে পারে।
  • ডার্লিংটন অ্যারে এর অভ্যন্তরীণ প্রতিরোধের LED বার্ন আউট প্রতিরোধ করার জন্য যথেষ্ট

গেমটি নিম্নলিখিত উপাদান এবং সরঞ্জামগুলি ব্যবহার করে নির্মিত হয়েছে:

  • (1) বেসিস 3 বোর্ড
  • (2) LED ম্যাট্রিক্স দ্বি-রঙ 8x5:
  • (2) ULN2803 - ডার্লিংটন ট্রানজিস্টার অ্যারে - ডেটাশীট
  • ওয়্যার স্পুলস
  • জাম্পার তার
  • তারের স্ট্রিপার
  • ব্রেডবোর্ড (বড় স্কয়ার যথেষ্ট হওয়া উচিত)
  • মাল্টিমিটার এবং পাওয়ার সাপ্লাই (সমস্যা সমাধান)

পদক্ষেপ 2: হার্ডওয়্যার সংযুক্ত করা

হার্ডওয়্যার সংযুক্ত করা হচ্ছে
হার্ডওয়্যার সংযুক্ত করা হচ্ছে
হার্ডওয়্যার সংযুক্ত করা হচ্ছে
হার্ডওয়্যার সংযুক্ত করা হচ্ছে

নির্দেশিকা:

প্রকল্পের ওয়্যারিং অত্যন্ত জটিল হতে পারে, অনুগ্রহ করে আপনার সময় নিন এবং যাচাই করুন যে সমস্ত সংযোগ এক সময়ে এক সেট সঠিক।

প্রকল্পটিতে দুটি এলইডি স্ক্রিন ব্যবহার করা হয়েছে কিন্তু একত্রিত হয়ে একটি বড় স্ক্রিন তৈরি করা হয়েছে। এটি একই বিন্দুতে সমস্ত সারি সংযুক্ত করে সম্পন্ন করা যেতে পারে। যেহেতু প্রতিটি পর্দা দ্বি-রঙের, তাই একটি পর্দার লাল এবং সবুজ সারি অন্য পর্দার লাল এবং সবুজ সারির সাথে আবদ্ধ থাকতে হবে। এটি করার মাধ্যমে, আমরা কেবল 8 টি পিন দিয়ে সমস্ত সারি নিয়ন্ত্রণ করতে পারি। অন্যান্য 16 টি পিন ডিসপ্লের কলামগুলি নিয়ন্ত্রণ করতে ব্যবহৃত হয়। জন্য 8 পিন সরাসরি জাম্পার তারের মাধ্যমে pmod সংযোগকারীদের সাথে সংযুক্ত করা যেতে পারে। Pmod সংযোগগুলি প্রথমে ULN2083A এর ইনপুটে যায় এবং ULN2083A এর আউটপুট সরাসরি স্ক্রিনের কলামের সাথে সংযুক্ত থাকে। কারণ ডিজাইনটি 8x8, কিছু কলাম শারীরিকভাবে সংযুক্ত হবে না।

  • JA: সারি সংযোগ: সারি 1 থেকে JA: 1 থেকে সারি 8 জন্য JA: 10।
  • জেএ: লাল কলাম সংযোগ:
  • JC: সবুজ কলাম সংযোগ

কোন পিন কোন সারি/কলামের সাথে মিলে যায় তা জানতে পোস্ট করা ছবিগুলি পড়ুন।

দ্রষ্টব্য: ট্রানজিস্টরগুলি প্রতিরোধের মধ্যে নির্মিত হয়েছে, তাই LED গুলিকে সিরিজের সাথে সংযুক্ত করার জন্য অতিরিক্ত প্রতিরোধের প্রয়োজন হয় না।

ধাপ 3: প্রযুক্তিগত ব্যাখ্যা: পর্দা

দৃষ্টি দৃ of়তার উপর পর্দা কাজ করছে। স্ক্রিনটি এত দ্রুত রিফ্রেশ করছে যে, মানুষের চোখ দৃশ্যমানভাবে সনাক্ত করতে পারে না যে কিছু এলইডি দ্রুত বন্ধ হয়ে যাচ্ছে। আসলে, ডিসপ্লে ঘড়িকে ধীর করে, কেউ ফ্ল্যাশিং লক্ষ্য করতে পারে।

সেই সারির জন্য সংরক্ষিত ডেটা অনুযায়ী ডিসপ্লেটি আটটি সারি চালু করে এবং ডিসপ্লেটি একটি কলাম চালু করে। তারপর এটি দ্রুত আটটি সারির জন্য পরবর্তী ডেটা এন্ট্রিতে স্থানান্তর করে এবং পরবর্তী কলামটি চালু করে - অন্য সব কলাম বন্ধ থাকা অবস্থায়। এই প্রক্রিয়াটি একটি দ্রুত যথেষ্ট ঘড়ির গতিতে চলতে থাকে যে LED এর ঝলকানি অদৃশ্য হয়ে যায়।

প্রদর্শনের জন্য ডেটা স্টোরেজটি VHDL ফাইলে আর্কিটেকচারের পরে অবিলম্বে নিম্নলিখিত পদ্ধতিতে শুরু করা হয়:

RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (0 ডাউনটো 0): = "00000000";

সংকেত GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 downto 0): = "00000000"; - কলামের উপর নির্ভর করে সারি ডেটা: সবুজ

LED ডিসপ্লে ম্যাট্রিক্সকে নিয়ন্ত্রণ করে এমন প্রক্রিয়াটির একটি ছোট স্নিপেট।

- যে প্রক্রিয়া LED ডিসপ্লে ম্যাট্রিক্স ডিসপ্লে নিয়ন্ত্রণ করে: প্রসেস (ColCLK) - 0 - 16 8X8 RED এবং 8x8 GREEn ম্যাট্রিক্স ভেরিয়েবল RowCount: পূর্ণসংখ্যা পরিসীমা 0 থেকে 16: = 0; যদি শুরু হয় - সংশ্লিষ্ট কলাম DOCol <= "1000000000000000" এর সারি ডেটা; - কলাম ট্রিগার- "0000000000000001" -এর জন্য এই কোডটি পুনরাবৃত্তি করুন- RedB, RedC … GreenA, GreenB … GreenH এ পরিবর্তন করুন

গ্রিনএইচ শেষে, প্রক্রিয়াটি শেষ হওয়ার ঠিক আগে এই স্নিপেটটি অন্তর্ভুক্ত করা হয়েছে যাতে রউকাউন্ট শূন্যে রিসেট করা যায়।

যদি (RowCount = 15) তাহলে - কলাম A RowCount থেকে রিফ্রেশ রিস্টার্ট করুন: = 0; অন্যথায় RowCount: = RowCount + 1; - কলামের মাধ্যমে স্থানান্তর শেষ হলে;

এখন, ডিসপ্লে প্রক্রিয়ার সংবেদনশীলতার তালিকায় থাকা ঘড়িটি ব্যাখ্যা করতে। Basys3 বোর্ড 100MHz এ একটি অভ্যন্তরীণ ঘড়ি কাজ করে। আমাদের উদ্দেশ্যে, এটি একটি ঘড়ির খুব দ্রুত তাই আমাদের এই ঘড়িটিকে 960Hz ঘড়িতে নিম্নলিখিত প্রক্রিয়া ব্যবহার করে ভাগ করতে হবে।

- ঘড়ি প্রক্রিয়া 960HzCLKDivider: প্রক্রিয়া (CLK) পরিবর্তনশীল clkcount: পূর্ণসংখ্যা পরিসর 0 থেকে 52083: = 0; যদি শুরু হয় যদি (clkcount = 52083) তাহলে ColCLK <= not (ColCLK); clkcount: = 0; যদি শেষ; যদি শেষ; শেষ প্রক্রিয়া;

ধাপ 4: প্রযুক্তিগত ব্যাখ্যা: প্রদর্শিত তথ্য পরিবর্তন করা

প্রযুক্তিগত ব্যাখ্যা: প্রদর্শিত তথ্য পরিবর্তন
প্রযুক্তিগত ব্যাখ্যা: প্রদর্শিত তথ্য পরিবর্তন

ভিএইচডিএল কোডে, স্ক্রিনে প্রদর্শিত তথ্য বা ডেটা কার্সার প্রক্রিয়া দ্বারা নিয়ন্ত্রিত হয়, যার সংবেদনশীলতার তালিকায় একটি ভিন্ন ঘড়ি রয়েছে। এই কোডটিকে বিটিএনসিএলকে বলা হত, একটি ঘড়ি যা বোতামগুলি টিপলে কমিয়ে দেওয়ার জন্য তৈরি করা হয়। এটি অন্তর্ভুক্ত করা হয়েছে যাতে যদি একটি বোতাম চাপানো হয়, উপরের সারির কার্সারটি খুব দ্রুত কলাম জুড়ে না যায়।

- 5 Hz. ButtonCLK- এ চলমান ঘড়ি প্রক্রিয়া: প্রক্রিয়া (CLK) পরিবর্তনশীল btnclkcount: পূর্ণসংখ্যা পরিসর 0 থেকে 10000001: = 0; যদি শুরু হয় BtnCLK <= not (BtnCLK); অন্যথায় btnclkcount: = btnclkcount + 1; যদি শেষ; যদি শেষ; শেষ প্রক্রিয়া;

এই প্রক্রিয়ার BtnCLK সংকেত আউটপুট দিয়ে, আমরা এখন কার্সার প্রক্রিয়া ব্যাখ্যা করতে পারি। কার্সার প্রক্রিয়ায় শুধুমাত্র BtnCLK এর সংবেদনশীলতার তালিকায় রয়েছে কিন্তু কোড ব্লকে, বোতামগুলির অবস্থা পরীক্ষা করা হয় এবং এর ফলে RedA, RedB… GreenH- এর ডেটা পরিবর্তিত হবে। এখানে কার্সার কোডের একটি স্নিপেট রয়েছে, যার মধ্যে রয়েছে রিসেট ব্লক এবং প্রথম কলামের ব্লক।

কার্সার: প্রসেস (BtnCLK) ভেরিয়েবল OCursorCol: STD_LOGIC_VECTOR (2 ডাউনটো 0): = "000"; - OCursorCol পূর্ববর্তী কলাম ভেরিয়েবল NCursorCol: STD_LOGIC_VECTOR (2 downto 0): = "000"; -NCursorCol সেট করে নতুন কার্সার কলাম শুরু-রিসেট কন্ডিশন (UP বাটন)-বোর্ড পুনরায় চালু করার জন্য খেলা পরিষ্কার করা হয় যদি (রাইজিং_ইজ (BtnCLK)) তারপর যদি (RST = '1') তাহলে RedA <= "00000000"; রেডবি <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; গ্রিনএ <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; গ্রিনডি <= "00000000"; GreenE <= "00000000"; গ্রিনএফ <= "00000000"; GreenG <= "00000000"; GreenH যদি (Lbtn = '1') তাহলে NCursorCol: = "111"; - কলাম H elsif (Rbtn = '1') তারপর NCursorCol: = "001"; - কলাম B elsif (Cbtn = '1') তারপর NCursorCol: = OCursorCol; - কলাম একই NTurnState থাকে <= not (TurnState); - পরবর্তী খেলোয়াড়ের পালা ট্রিগার করে- নীচে থেকে উপরের দিকে বর্তমান কলাম পরীক্ষা করে এবং প্রথম LED চালু করে যা চালু নেই। রঙ বর্তমান খেলোয়াড়ের কার্সার রঙের উপর নির্ভর করে। ck এর জন্য 7 টি ডাউন 1 লুপে যদি (RedA (0) = '1') এবং (RedA (ck) = '0') এবং (GreenA (ck) = '0') তাহলে RedA (Ck) <= '1'; RedA (0) <= '0'; প্রস্থান; যদি শেষ;

যদি (GreenA (0) = '1') এবং (RedA (ck) = '0') এবং (GreenA (ck) = '0') তাহলে

GreenA (Ck) <= '1'; গ্রিনএ (0) - রেড প্লেয়ার গ্রিনএ (0) <= '0'; যদি (NCursorCol = OCursorCol) তাহলে - যদি RedA (0) <= '1' চাপানো না হয়; elsif (NCursorCol = "111") তারপর - যদি Lbtn চাপলে RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") তারপর - Iff Rbtn চাপলে RedB (0) <= '1'; RedA (0) - সবুজ প্লেয়ার RedA (0) <= '0'; যদি (NCursorCol = OCursorCol) তাহলে GreenA (0) <= '1'; elsif (NCursorCol = "111") তারপর GreenH (0) <= '1'; গ্রিনএ (0) <= '0'; elsif (NCursorCol = "001") তারপর GreenB (0) <= '1'; গ্রিনএ (0) <= '0'; যদি শেষ; শেষ কেস;

উল্লেখ্য, প্রথম কেস স্টেটমেন্ট যাকে বলা হয়: OCursorCol (যা পুরানো কার্সার কলামের জন্য দাঁড়িয়ে আছে) সসীম রাষ্ট্রযন্ত্রের সূচনা। ডিসপ্লের প্রতিটি কলামকে FSM- এ তার নিজস্ব রাজ্য হিসেবে গণ্য করা হয়। এখানে 8 টি কলাম আছে তাই একটি 3-বিট বাইনারি সংখ্যা সেট প্রতিটি কলামকে একটি রাষ্ট্র হিসাবে চিহ্নিত করার জন্য ব্যবহার করা হয়েছিল। এফএসএম কীভাবে রাষ্ট্রের মধ্যে চলে তা নির্ভর করে বোতামটি চাপার উপর। উপরের স্নিপেটে, যদি বাম বোতাম টিপে থাকে, FSM "111" এ চলে যাবে যা ডিসপ্লের শেষ কলাম হবে। যদি ডান বোতামটি চাপানো হয়, তবে FSM "001" এ চলে যাবে যা প্রদর্শনের দ্বিতীয় কলাম হবে।

যদি মাঝের বোতামটি চাপানো হয়, FSM একটি নতুন অবস্থায় চলে যাবে না বরং তার পরিবর্তে TurnState সংকেত পরিবর্তন করবে, যা কোন খেলোয়াড়ের পালা নোট করার জন্য এক-বিট সংকেত। উপরন্তু, মাঝের বোতামটি একটি কোড ব্লক চালাবে যা চেক করে যে একেবারে নীচের অংশে শীর্ষে খালি সারি আছে কিনা। এটি সর্বনিম্ন, অপূর্ণ সারিতে একটি চিহ্নিতকারী রাখার চেষ্টা করবে। মনে রাখবেন, এটি একটি কানেক্ট ফোর গেম।

টার্নস্টেট নামক নেস্টেড কেস স্টেটমেন্টে, আমরা কার্সারের রঙ কি এবং প্রথম সারির কোন কলামের জন্য আমরা ডেটা পরিবর্তন করতে চাই তা পরিবর্তন করি যাতে ডিসপ্লে প্রক্রিয়া পরিবর্তনকে প্রতিফলিত করতে পারে।

আমরা বাকি সাতটি ক্ষেত্রে এই মৌলিক কোডটি পুনরাবৃত্তি করি। এফএসএম ডায়াগ্রাম রাজ্যগুলি কীভাবে পরিবর্তন হচ্ছে তা বোঝার জন্য সহায়ক হতে পারে।

ধাপ 5: কোড

কোড
কোড

এটি সংযোগ 4 এর জন্য কার্যকরী কোড যা ভিভাদো সফটওয়্যার ব্যবহার করে ভিএইচডিএলে সংকলিত হতে পারে।

একটি সীমাবদ্ধতাও আপনাকে গেমটি চালু এবং চালানোর অনুমতি দেয়।

আমরা একটি ব্লক ডায়াগ্রাম প্রদান করেছি যা ব্যাখ্যা করে কিভাবে প্রতিটি প্রক্রিয়ার ইনপুট এবং আউটপুট পরস্পর সংযুক্ত থাকে।

প্রস্তাবিত: