{"id":421278,"date":"2024-06-30T04:00:26","date_gmt":"2024-06-30T04:00:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=421278"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=421278","title":{"rendered":"<span>The Dino game from Google Chrome using FPGA<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>Intro<\/h2>\n<p>Many people are familiar with the situation when there is no Internet, and a small dinosaur appears on the Google Chrome screen. Today we will tell you how to implement this game on the Cyclone IV FPGA board.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61a8b8e4edd610f626b80d7e\" data-style=\"\" id=\"61a8b8e4edd610f626b80d7e\" width=\"\"><\/div>\n<p>We are Yegor Blinov, Egor Kuziakov, and Inga Ezhova &#8212; the first-year students of <a href=\"https:\/\/habr.com\/ru\/post\/574134\/\" rel=\"noopener noreferrer nofollow\">Innopolis University<\/a>. In our program, there was a course &#171;Computer Architecture&#187;, where we had labs with FPGA boards Cyclone IV and MAX10. We were inspired by this equipment and decided to implement the project on one of the boards.<\/p>\n<details class=\"spoiler\">\n<summary>Short historical background<\/summary>\n<div class=\"spoiler__content\">\n<p>Field programmable gate arrays (<strong>FPGA<\/strong>s) are integrated circuits that enable designers to program customized digital logic in the field. FPGAs have been around since the 1980s and were originally conceived to give all design teams the ability to create custom logic.<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>1<\/sup><\/a><\/p>\n<\/div>\n<\/details>\n<h2>Overview<\/h2>\n<p>The algorithm of the project is as follows: the input data is received from the keyboard, then processed by the logic circuit, after that, the picture is displayed on the VGA screen. The rules of the game are simple and well-known. The dinosaur runs along the road, jumping over the cacti. The game is complicated by the fact that over time the speed of the dinosaur increases.<\/p>\n<h2>Materials<\/h2>\n<ul>\n<li>\n<p>Altera Cyclone IV (EP4CE6E22C8N)<\/p>\n<\/li>\n<li>\n<p>Quartus Prime Lite Edition 21.0<\/p>\n<\/li>\n<li>\n<p>A VGA monitor<\/p>\n<\/li>\n<li>\n<p>PS\/2 Keyboard<\/p>\n<\/li>\n<li>\n<p>Verilog HDL<\/p>\n<\/li>\n<\/ul>\n<h2>Architecture<\/h2>\n<p>This diagram describes the connections of elements in the project<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>5<\/sup><\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/670\/1db\/cf5\/6701dbcf5075b6e9aed2ce1445b8c186.png\" width=\"1600\" height=\"616\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/670\/1db\/cf5\/6701dbcf5075b6e9aed2ce1445b8c186.png\"\/><figcaption><\/figcaption><\/figure>\n<p>The game is divided into multiple logical blocks.\u00a0The descriptions of all of them can be found in the list below.<\/p>\n<h2>Modules<\/h2>\n<p><strong><em>keyboard<\/em><\/strong><\/p>\n<p>It recognizes the keystroke on the connected PS\/2 keyboard.<\/p>\n<p><strong><em>pll and sync<\/em><\/strong><\/p>\n<p>Pll module converts clock signals which control the entire circuit.\u00a0<\/p>\n<p>Sync module is used for generating <strong>h_sync<\/strong> and<strong> v_sync<\/strong> VGA outputs.<\/p>\n<p><strong><em>bit_stream<\/em><\/strong><\/p>\n<p>It draws game objects on the monitor, generates R, G, B values for an arbitrary pixel.<\/p>\n<p><strong><em>random<\/em><\/strong><\/p>\n<p>It generates accidental numbers.<\/p>\n<p><strong><em>cactus generator<\/em><\/strong><\/p>\n<p>It contains the logic of generating 4 cacti and moving them.<\/p>\n<p><strong><em>game<\/em><\/strong><\/p>\n<p>It processes game objects (such as cactus collision, and dinosaur jumping).<\/p>\n<p><strong><em>sound<\/em><\/strong><\/p>\n<p>It makes a sound signal when the game starts.<\/p>\n<h2>Implementation<\/h2>\n<p><strong>Input<\/strong><\/p>\n<p>We used the PS\/2 keyboard to control the game and decode signals according to different values <strong>ps_clock<\/strong> and <strong>ps_data<\/strong> logical inputs<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>2<\/sup><\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/79f\/4d7\/318\/79f4d7318254c2f6f28b81b44d3b7dac.png\" width=\"1401\" height=\"420\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/79f\/4d7\/318\/79f4d7318254c2f6f28b81b44d3b7dac.png\"\/><figcaption><\/figcaption><\/figure>\n<p><strong>Output<\/strong><\/p>\n<p><strong>VGA display<\/strong><a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>3<\/sup><\/a> is used for output. Image resolution is <strong>1024*768 60Hz<\/strong>. Video output is divided into 2 modules. The first module is <strong>sync<\/strong>. It implements <strong>H_Sync<\/strong> and <strong>V_Sync<\/strong> signals that are used for drawing images in module <strong>bit_stream<\/strong>. This module receives coordinates of a dinosaur and coordinates of cacti from <strong>cactus_module<\/strong> and draws a full image using stored in registers sprites. Modules can support colorful images, but they are not needed for this game. For generating the world, <strong>bit_stream<\/strong> uses an array of registers of cacti sprites that are randomly selected by a randomizer. Now, it supports up to 7 different cacti sprites.<\/p>\n<p>World\u2019s objects are generated by using Python script. This script receives images and outputs complete Verilog code containing arrays.<\/p>\n<p><strong>Sprites generation<\/strong><\/p>\n<p>The following are some parts of the code that demonstrate the generating of sprites and the world.<\/p>\n<details class=\"spoiler\">\n<summary>Sprite generator:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from PIL import Image  def generate_sprite(fn: str, check_function, result_string: str) -> str:     im = Image.open(fn)     size = im.size     s = \"\"     for x in range(size[0]):         for y in range(size[1]):             pixel = im.getpixel((x, y))             if check_function(pixel):                 s += result_string.format(x, y)     return s<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>World generator:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import random def generate_choices(): \u00a0\u00a0\u00a0 s = \"\" \u00a0\u00a0\u00a0 for i in range(32): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 r = random.randint(0, 6) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s += f\"cactuses_sprite_choice[{i}] = {r}; \" \u00a0\u00a0\u00a0 with open(\"output.txt\", \"w\") as f: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 f.write(s)<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>Game<\/h2>\n<p>In the game module, we have implemented the main game logic: physics for jumping and collision with cacti. As in the original game, we used the parabolic movement for dinosaur jumps.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e26\/5e3\/502\/e265e3502ce689aa4125e4aefbfb3043.png\" width=\"663\" height=\"582\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e26\/5e3\/502\/e265e3502ce689aa4125e4aefbfb3043.png\"\/><figcaption><\/figcaption><\/figure>\n<p>Cacti are generated by using the <strong>cactus_generator<\/strong> module. We tried different algorithms<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>4<\/sup><\/a>, but the most effective was the way in which a cactus teleports to its initial position. At the moment, this module generates only one cactus, but it is enough to change the constant and the module will generate up to 4 cacti in one cycle.<\/p>\n<h2>Game stages<\/h2>\n<p>Game logic depends on these registers and flags: dinosaur and cacti coordinates,<strong> <\/strong>game_over flag.<\/p>\n<ol>\n<li>\n<p>The game starts with the <strong>game_over<\/strong> state, then when the keyboard button is pressed the state changes to <strong>run<\/strong>.<\/p>\n<\/li>\n<li>\n<p>Over time, the <strong>cactus_generator<\/strong> module increases the speed of cacti, thus the dinosaur speed increases.<\/p>\n<\/li>\n<li>\n<p>When the keyboard button is pressed, the state changes to <strong>jump<\/strong>, the dinosaur becomes invulnerable to any cacti. The jump state returns to the <strong>run<\/strong> state when the dinosaur lands on the ground.<\/p>\n<\/li>\n<li>\n<p>When the dinosaur collides with a cactus, the game state <strong>run<\/strong> changes to the state <strong>game_over<\/strong>.<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>After a week of hard work, our team finished the project. We enjoyed the development of the project. In the process of working on it, we have improved the skills of writing hardware descriptions, drawing up logical circuits, and writing technical articles. During our work, we managed to implement the basic concept of the game, develop the logic and create a single mechanism from different elements.<\/p>\n<h2>Gratitude<\/h2>\n<p>We thank Alexander Tormasov, as primary instructor of the &#171;Fundamentals of computer architecture&#187; course for obtaining basic theoretical knowledge about computer hardware, and Artem Burmyakov for practical skills in hardware designing. We would also like to thank Innopolis University IT Support for providing a VGA display and keyboard for our project.<\/p>\n<p><a class=\"anchor\" name=\"references\" id=\"references\"><\/a><\/p>\n<p><a href=\"https:\/\/github.com\/KeepError\/dino-game-fpga\/tree\/master\/\" rel=\"noopener noreferrer nofollow\">Source code on GitHub<\/a><\/p>\n<details class=\"spoiler\">\n<summary>References:<\/summary>\n<div class=\"spoiler__content\">\n<p>1 &#8212; Historical background &#8212; <a href=\"https:\/\/www.intel.com\/content\/dam\/www\/programmable\/us\/en\/pdfs\/literature\/misc\/fpgas-for-dummies-ebook.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/www.intel.com\/content\/dam\/www\/programmable\/us\/en\/pdfs\/literature\/misc\/fpgas-for-dummies-ebook.pdf<\/a><\/p>\n<p>2 &#8212; PS\/2 controller &#8212; <a href=\"https:\/\/www.eecg.utoronto.ca\/~jayar\/ece241_08F\/AudioVideoCores\/ps2\/ps2.html\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/www.eecg.utoronto.ca\/~jayar\/ece241_08F\/AudioVideoCores\/ps2\/ps2.htm<\/u><\/a><\/p>\n<p>3 &#8212; VGA modules &#8212; <a href=\"https:\/\/youtu.be\/v9LLKFrm0w0\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/youtu.be\/v9LLKFrm0w0<\/u><\/a><\/p>\n<p>4 &#8212; Random generating &#8212; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Pseudorandom_number_generator\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/en.wikipedia.org\/wiki\/Pseudorandom_number_generator<\/u><\/a><\/p>\n<p>5 &#8212; Top-Level entity PDF &#8212; <a href=\"https:\/\/github.com\/KeepError\/dino-game-fpga\/blob\/master\/vga.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/KeepError\/dino-game-fpga\/blob\/master\/vga.pdf<\/a><\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/592979\/\"> https:\/\/habr.com\/ru\/articles\/592979\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>Intro<\/h2>\n<p>Many people are familiar with the situation when there is no Internet, and a small dinosaur appears on the Google Chrome screen. Today we will tell you how to implement this game on the Cyclone IV FPGA board.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61a8b8e4edd610f626b80d7e\" data-style=\"\" id=\"61a8b8e4edd610f626b80d7e\" width=\"\"><\/div>\n<p>We are Yegor Blinov, Egor Kuziakov, and Inga Ezhova &#8212; the first-year students of <a href=\"https:\/\/habr.com\/ru\/post\/574134\/\" rel=\"noopener noreferrer nofollow\">Innopolis University<\/a>. In our program, there was a course &#171;Computer Architecture&#187;, where we had labs with FPGA boards Cyclone IV and MAX10. We were inspired by this equipment and decided to implement the project on one of the boards.<\/p>\n<details class=\"spoiler\">\n<summary>Short historical background<\/summary>\n<div class=\"spoiler__content\">\n<p>Field programmable gate arrays (<strong>FPGA<\/strong>s) are integrated circuits that enable designers to program customized digital logic in the field. FPGAs have been around since the 1980s and were originally conceived to give all design teams the ability to create custom logic.<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>1<\/sup><\/a><\/p>\n<\/div>\n<\/details>\n<h2>Overview<\/h2>\n<p>The algorithm of the project is as follows: the input data is received from the keyboard, then processed by the logic circuit, after that, the picture is displayed on the VGA screen. The rules of the game are simple and well-known. The dinosaur runs along the road, jumping over the cacti. The game is complicated by the fact that over time the speed of the dinosaur increases.<\/p>\n<h2>Materials<\/h2>\n<ul>\n<li>\n<p>Altera Cyclone IV (EP4CE6E22C8N)<\/p>\n<\/li>\n<li>\n<p>Quartus Prime Lite Edition 21.0<\/p>\n<\/li>\n<li>\n<p>A VGA monitor<\/p>\n<\/li>\n<li>\n<p>PS\/2 Keyboard<\/p>\n<\/li>\n<li>\n<p>Verilog HDL<\/p>\n<\/li>\n<\/ul>\n<h2>Architecture<\/h2>\n<p>This diagram describes the connections of elements in the project<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>5<\/sup><\/a>.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>The game is divided into multiple logical blocks.\u00a0The descriptions of all of them can be found in the list below.<\/p>\n<h2>Modules<\/h2>\n<p><strong><em>keyboard<\/em><\/strong><\/p>\n<p>It recognizes the keystroke on the connected PS\/2 keyboard.<\/p>\n<p><strong><em>pll and sync<\/em><\/strong><\/p>\n<p>Pll module converts clock signals which control the entire circuit.\u00a0<\/p>\n<p>Sync module is used for generating <strong>h_sync<\/strong> and<strong> v_sync<\/strong> VGA outputs.<\/p>\n<p><strong><em>bit_stream<\/em><\/strong><\/p>\n<p>It draws game objects on the monitor, generates R, G, B values for an arbitrary pixel.<\/p>\n<p><strong><em>random<\/em><\/strong><\/p>\n<p>It generates accidental numbers.<\/p>\n<p><strong><em>cactus generator<\/em><\/strong><\/p>\n<p>It contains the logic of generating 4 cacti and moving them.<\/p>\n<p><strong><em>game<\/em><\/strong><\/p>\n<p>It processes game objects (such as cactus collision, and dinosaur jumping).<\/p>\n<p><strong><em>sound<\/em><\/strong><\/p>\n<p>It makes a sound signal when the game starts.<\/p>\n<h2>Implementation<\/h2>\n<p><strong>Input<\/strong><\/p>\n<p>We used the PS\/2 keyboard to control the game and decode signals according to different values <strong>ps_clock<\/strong> and <strong>ps_data<\/strong> logical inputs<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>2<\/sup><\/a>.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><strong>Output<\/strong><\/p>\n<p><strong>VGA display<\/strong><a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>3<\/sup><\/a> is used for output. Image resolution is <strong>1024*768 60Hz<\/strong>. Video output is divided into 2 modules. The first module is <strong>sync<\/strong>. It implements <strong>H_Sync<\/strong> and <strong>V_Sync<\/strong> signals that are used for drawing images in module <strong>bit_stream<\/strong>. This module receives coordinates of a dinosaur and coordinates of cacti from <strong>cactus_module<\/strong> and draws a full image using stored in registers sprites. Modules can support colorful images, but they are not needed for this game. For generating the world, <strong>bit_stream<\/strong> uses an array of registers of cacti sprites that are randomly selected by a randomizer. Now, it supports up to 7 different cacti sprites.<\/p>\n<p>World\u2019s objects are generated by using Python script. This script receives images and outputs complete Verilog code containing arrays.<\/p>\n<p><strong>Sprites generation<\/strong><\/p>\n<p>The following are some parts of the code that demonstrate the generating of sprites and the world.<\/p>\n<details class=\"spoiler\">\n<summary>Sprite generator:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from PIL import Image  def generate_sprite(fn: str, check_function, result_string: str) -> str:     im = Image.open(fn)     size = im.size     s = \"\"     for x in range(size[0]):         for y in range(size[1]):             pixel = im.getpixel((x, y))             if check_function(pixel):                 s += result_string.format(x, y)     return s<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>World generator:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import random def generate_choices(): \u00a0\u00a0\u00a0 s = \"\" \u00a0\u00a0\u00a0 for i in range(32): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 r = random.randint(0, 6) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s += f\"cactuses_sprite_choice[{i}] = {r}; \" \u00a0\u00a0\u00a0 with open(\"output.txt\", \"w\") as f: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 f.write(s)<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>Game<\/h2>\n<p>In the game module, we have implemented the main game logic: physics for jumping and collision with cacti. As in the original game, we used the parabolic movement for dinosaur jumps.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>Cacti are generated by using the <strong>cactus_generator<\/strong> module. We tried different algorithms<a href=\"#references\" rel=\"noopener noreferrer nofollow\"><sup>4<\/sup><\/a>, but the most effective was the way in which a cactus teleports to its initial position. At the moment, this module generates only one cactus, but it is enough to change the constant and the module will generate up to 4 cacti in one cycle.<\/p>\n<h2>Game stages<\/h2>\n<p>Game logic depends on these registers and flags: dinosaur and cacti coordinates,<strong> <\/strong>game_over flag.<\/p>\n<ol>\n<li>\n<p>The game starts with the <strong>game_over<\/strong> state, then when the keyboard button is pressed the state changes to <strong>run<\/strong>.<\/p>\n<\/li>\n<li>\n<p>Over time, the <strong>cactus_generator<\/strong> module increases the speed of cacti, thus the dinosaur speed increases.<\/p>\n<\/li>\n<li>\n<p>When the keyboard button is pressed, the state changes to <strong>jump<\/strong>, the dinosaur becomes invulnerable to any cacti. The jump state returns to the <strong>run<\/strong> state when the dinosaur lands on the ground.<\/p>\n<\/li>\n<li>\n<p>When the dinosaur collides with a cactus, the game state <strong>run<\/strong> changes to the state <strong>game_over<\/strong>.<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>After a week of hard work, our team finished the project. We enjoyed the development of the project. In the process of working on it, we have improved the skills of writing hardware descriptions, drawing up logical circuits, and writing technical articles. During our work, we managed to implement the basic concept of the game, develop the logic and create a single mechanism from different elements.<\/p>\n<h2>Gratitude<\/h2>\n<p>We thank Alexander Tormasov, as primary instructor of the &#171;Fundamentals of computer architecture&#187; course for obtaining basic theoretical knowledge about computer hardware, and Artem Burmyakov for practical skills in hardware designing. We would also like to thank Innopolis University IT Support for providing a VGA display and keyboard for our project.<\/p>\n<p><a class=\"anchor\" name=\"references\" id=\"references\"><\/a><\/p>\n<p><a href=\"https:\/\/github.com\/KeepError\/dino-game-fpga\/tree\/master\/\" rel=\"noopener noreferrer nofollow\">Source code on GitHub<\/a><\/p>\n<details class=\"spoiler\">\n<summary>References:<\/summary>\n<div class=\"spoiler__content\">\n<p>1 &#8212; Historical background &#8212; <a href=\"https:\/\/www.intel.com\/content\/dam\/www\/programmable\/us\/en\/pdfs\/literature\/misc\/fpgas-for-dummies-ebook.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/www.intel.com\/content\/dam\/www\/programmable\/us\/en\/pdfs\/literature\/misc\/fpgas-for-dummies-ebook.pdf<\/a><\/p>\n<p>2 &#8212; PS\/2 controller &#8212; <a href=\"https:\/\/www.eecg.utoronto.ca\/~jayar\/ece241_08F\/AudioVideoCores\/ps2\/ps2.html\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/www.eecg.utoronto.ca\/~jayar\/ece241_08F\/AudioVideoCores\/ps2\/ps2.htm<\/u><\/a><\/p>\n<p>3 &#8212; VGA modules &#8212; <a href=\"https:\/\/youtu.be\/v9LLKFrm0w0\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/youtu.be\/v9LLKFrm0w0<\/u><\/a><\/p>\n<p>4 &#8212; Random generating &#8212; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Pseudorandom_number_generator\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/en.wikipedia.org\/wiki\/Pseudorandom_number_generator<\/u><\/a><\/p>\n<p>5 &#8212; Top-Level entity PDF &#8212; <a href=\"https:\/\/github.com\/KeepError\/dino-game-fpga\/blob\/master\/vga.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/KeepError\/dino-game-fpga\/blob\/master\/vga.pdf<\/a><\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/592979\/\"> https:\/\/habr.com\/ru\/articles\/592979\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-421278","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/421278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=421278"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/421278\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=421278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=421278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=421278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}