{"id":285403,"date":"2017-04-24T01:20:06","date_gmt":"2017-04-23T21:20:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=285403"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=285403","title":{"rendered":"\u0414\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435 \u043d\u0430 FPGA"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/37f\/62c\/0ee\/37f62c0eeabb409ebe52ad7db0f0f871.png\"\/><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445: <a href=\"https:\/\/habrahabr.ru\/post\/323258\/\"><b>\u0414\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435 \u043d\u0430 FPGA<\/b><\/a> \u0438 <a href=\"https:\/\/habrahabr.ru\/post\/325808\/\"><b>\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u043d\u0430 FPGA<\/b><\/a>. \u0417\u0430\u0445\u0432\u0430\u0442 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044f \u0446\u0435\u043b\u044f\u043c, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0440\u0430\u043c\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u0430\u043a\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430\u0434\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043c\u043a\u0443? \u041e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0445 \u0432 \u043a\u0430\u0434\u0440 \u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e: \u043e\u0434\u043d\u0438 \u0438\u0437 \u043d\u0438\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435. \u0415\u0441\u043b\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0430\u043c\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0445 \u0432 \u043a\u0430\u0434\u0440, \u0442\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u0440\u044f\u0434 \u043b\u0438 \u043a\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d.<br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u041f\u043e\u0440\u044b\u0432\u0448\u0438\u0441\u044c \u0432 \u0441\u0435\u0442\u0438, \u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041e\u0434\u043d\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 FPGA, \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430, \u0442\u0440\u0435\u0442\u044c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e, \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442.\u043a. \u044f \u0445\u043e\u0447\u0443 \u0437\u0430 \u043e\u0434\u0438\u043d.<\/p>\n<p>  \u0412\u0441\u0451 \u0436\u0435, \u043e\u0434\u0438\u043d \u0438\u0437 <a href=\"http:\/\/www.electronics.dit.ie\/staff\/aschwarzbacher\/research\/mpc08-1Blob.pdf\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/a> \u043f\u0440\u0438\u0432\u043b\u0451\u043a \u043c\u043e\u0451 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0412 \u043d\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0441\u0430\u043c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u043a\u043b\u043e\u043a\u043e\u0432\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435, \u0447\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u0430\u043c \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u0440\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0445 \u043d\u0430 \u0435\u0433\u043e \u0432\u0445\u043e\u0434, \u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432 \u0441\u0430\u043c\u043e\u043c \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u0440\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c 160 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0435\u0441\u043b\u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 320 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/df2\/a65\/e60\/df2a65e6075a49e5bf9c5172e82909a6.png\"\/><\/p>\n<p>  \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432: <b>RUN detector<\/b>, <b>BLOB detector<\/b> \u0438 <b>Bounding box generator<\/b>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0432\u043e\u0451\u043c \u043a\u043b\u043e\u043a\u043e\u0432\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0431\u043b\u043e\u043a\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e FIFO.<\/p>\n<h3>RUN detector<\/h3>\n<p>  \u0412\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0441\u043b\u0443\u0436\u0430\u0442 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437<a href=\"https:\/\/habrahabr.ru\/post\/325808\/\"> \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438<\/a>.<br \/>  \u042d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u0438\u0449\u0435\u0442 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u0435\u0434\u0438\u043d\u0438\u0446, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 RUN-\u044b. \u0422\u0430\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u0436\u0430\u0442\u0438\u044f <b>RLE (Run Length Encoding)<\/b>, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438 \u0441\u0436\u0430\u0442\u0438\u0438 JPEG \u0438 \u0435\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445. \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432 RUN-\u043e\u0432: <b>class-length<\/b>, <b>class-start<\/b> \u0438 <b>start-end<\/b>. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/365\/f1c\/bff\/365f1cbffd76493fa54bf5e9fcc68864.png\"\/><\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 (<b>start-end<\/b>) \u0442.\u043a. \u043e\u043d \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412 \u043f\u043e\u043b\u0435 <b>start<\/b> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446, \u0430 \u0432 \u043f\u043e\u043b\u0435 <b>end<\/b> \u2014 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 <b>start-end<\/b> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 RUN \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 FIFO. \u041d\u0430\u0440\u044f\u0434\u0443 \u0441 RUN-\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 FIFO \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043a\u043e\u043d\u0446\u0430 \u043a\u0430\u0434\u0440\u0430.<\/p>\n<p>  \u041a\u043e\u0434 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Verilog  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Run detector<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>module run_detector #(     parameter RES_X=10'd320,     parameter RES_Y=10'd240,     parameter XOFFSET=10'd320,     parameter YOFFSET=10'd0) (     input wire         clk,     input wire         nRst,     input wire        data_valid,     input wire [0:0]        data_in,     input wire [10:0]    xi,     input wire [10:0]    yi,          output reg [9:0]        run_start,     output reg [9:0]        run_end,     output reg        row_end,     output reg        frame_end,     output reg        new_run,     output reg        rd_req );  localparam    ST_IDLE=0, ST_RUN_START=1, ST_RUN_END=2, ST_ROW_END=3, ST_FRAME_END=4; localparam XRES = RES_X + XOFFSET - 1; localparam YRES = RES_Y + YOFFSET - 1;  reg [2:0] run_state = 0; reg [9:0] run_start_d; reg [9:0] run_end_d;  wire row_done_w = ((xi == XRES) && (yi &lt;= YRES)) ? 1'b1:1'b0; wire frame_done_w = ((xi == XRES) && (yi == YRES)) ? 1'b1:1'b0;  always @(posedge clk or negedge nRst)     if (!nRst) begin         run_state &lt;= ST_IDLE;         run_start &lt;= 10'd0;         run_end &lt;= 10'd0;         row_end &lt;= 1'b0;         frame_end &lt;= 1'b0;         new_run &lt;= 1'b0;         rd_req &lt;= 1'b0;     end else begin                  new_run &lt;= 1'b0;         row_end &lt;= 1'b0;         frame_end &lt;= 1'b0;              case     (run_state)         ST_IDLE: begin             if (data_valid) begin                     if (data_in) begin                     run_state &lt;= ST_RUN_START;                     run_start &lt;= xi[9:0];                 end             end         end         ST_RUN_START: begin             if (!data_in) begin                 run_state &lt;= ST_RUN_END;                 run_end &lt;= xi[9:0] - 1'b1;                 new_run &lt;= 1'b1;             end         end                 ST_RUN_END: begin             if (data_in) begin                 run_start &lt;= xi[9:0];                 run_state &lt;= ST_RUN_START;             end else begin                 run_state &lt;= ST_IDLE;             end             end             ST_ROW_END, ST_FRAME_END: begin             if (!data_valid) begin                 run_state &lt;= ST_IDLE;             end         end         endcase                  if (row_done_w || frame_done_w) begin             run_state &lt;= frame_done_w ? ST_FRAME_END : ST_ROW_END;             row_end &lt;= row_done_w ? 1'b1 : 1'b0;             frame_end &lt;= frame_done_w ? 1'b1 : 1'b0;                          run_start &lt;= 10'd0;             run_end &lt;= 10'd0;                 new_run &lt;= 1'b1;         end             end endmodule <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h3>BLOB detector<\/h3>\n<p>  \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043d\u0438\u0436\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/786\/f95\/838\/786f95838c584c098b101e3ca34e6175.png\"\/><\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<br \/>  \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440, \u0432 \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438: \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f RUN-\u043e\u0432 (<b>run memory<\/b>) \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (<b>object memory<\/b>). \u0412\u0441\u0435\u0433\u043e 32 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  <b>INIT<\/b><br \/>  \u0420\u0430\u0431\u043e\u0442\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <b>INIT<\/b>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 <b>run memory<\/b> \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u043e\u043a. \u0417\u0430\u0442\u0435\u043c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>IDLE<\/b>.<\/p>\n<p>  <b>IDLE<\/b><br \/>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c FIFO \u043e\u0442 RUN \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<b> FIND_RUN<\/b>.<\/p>\n<p>  <b>FIND_RUN<\/b><br \/>  \u0417\u0434\u0435\u0441\u044c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 RUN-\u0430 \u0438\u0437 FIFO \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>FIND_OVERLAP<\/b> \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e RUN-\u0430 \u0441 RUN-\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u043e\u0432\u043e\u043c\u0443 RUN-\u0443 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430.<\/p>\n<p>  <b>FIND_OVERLAP<\/b><br \/>  \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 <b>run memory<\/b> \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u044e\u0442\u0441\u044f \u0432 2-\u0445 \u0440\u044f\u0434\u0430\u0445 \u2014 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 RUN \u0438\u0437 FIFO \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0431\u043b\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 (\u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0438\u0439). \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0442\u043e, \u043a\u0430\u043a RUN-\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 <b>run memory<\/b>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/da8\/471\/e73\/da8471e737bb4de7b569a5b8328191ad.png\"\/><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 RUN \u0438\u043c\u0435\u0435\u0442 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u043d\u0443\u044e \u043c\u0435\u0442\u043a\u0443, \u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 RUN-\u043e\u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>CREATE_OBJ<\/b> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e RUN-\u0430. \u0418\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e, \u0442\u043e \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 <b>object memory<\/b> \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043c\u0435\u0442\u043a\u0438 RUN-\u0430 \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>UPDATE_OBJ<\/b> \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e RUN-\u0430 \u043c\u0435\u0442\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0439, \u0434\u0430\u043d\u043d\u043e\u0439 \u0435\u043c\u0443 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0438\u0437 FIFO, \u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 RUN \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0443\u0436\u0435 \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438 \u043d\u0430\u0448\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0438 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043b\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>MERGE_OBJ<\/b>.<\/p>\n<p>  <b>CREATE_OBJ<\/b> <br \/>  \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.   <\/p>\n<ul>\n<li><b>X start<\/b> \u2014 \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 X<\/li>\n<li><b>X end<\/b> \u2014 \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 X<\/li>\n<li><b>Y start<\/b> \u2014 \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y<\/li>\n<li><b>Y end<\/b> \u2014 \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y <\/li>\n<li><b>Object mass<\/b> \u2014 \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435<\/li>\n<\/ul>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <b>object memory<\/b> \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 (\u043c\u0435\u0442\u043a\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e RUN-\u0430). \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>IDLE<\/b> \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e RUN-\u0430 \u0438\u0437 FIFO.<\/p>\n<p>  <b>UPDATE_OBJ <\/b><br \/>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 <b>object memory<\/b> \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0434\u043b\u0438\u043d\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a \u043d\u0435\u043c\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e RUN-\u0430. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>FIND_OVERLAP<\/b> \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c RUN-\u043e\u043c \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 run memory.<\/p>\n<p>  <b>MERGE_OBJ<\/b><br \/>  \u0417\u0434\u0435\u0441\u044c \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043e\u0434\u0438\u043d, \u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e\u0441\u043b\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>FIND_OVERLAP<\/b> \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c RUN-\u043e\u043c \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 <b>run memory<\/b>. <br \/>  \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <b>1<\/b> \u0438 <b>2<\/b> \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0449\u0435\u0433\u043e RUN-\u0430, \u0437\u0430\u0448\u0442\u0440\u0438\u0445\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/fd5\/f84\/a69\/fd5f84a69abf43bf83d6e5ef3c5c5700.png\"\/><\/p>\n<p>  <b>FINISH_OBJ<\/b><br \/>  \u0412 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0438\u0437 FIFO \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u043a\u043e\u043d\u0446\u0430 \u043a\u0430\u0434\u0440\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0432 <b>run memory<\/b> \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 FIFO. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043d\u0446\u0430 \u043a\u0430\u0434\u0440\u0430, \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>UPLOAD_DATA<\/b> \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 <b>object memory<\/b> \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 FIFO.<\/p>\n<p>  <b>UPLOAD_DATA<\/b><br \/>  \u041f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 <b>object memory<\/b> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 FIFO. \u0421\u043b\u043e\u0432\u043e\u043c, \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u043c \u0432 FIFO \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <b>Xstart<\/b>, <b>Xend<\/b>, <b>Ystart<\/b> \u0438 <b>Yend<\/b>. \u0412\u0441\u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e 32 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0434\u0440\u0430 <b>320&#215;240<\/b> \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041d\u043e \u043d\u0435 \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b. \u041e\u0431\u044a\u0435\u043a\u0442\u044b, \u043c\u0430\u0441\u0441\u043e\u0439 \u043c\u0435\u043d\u0435\u0435 <b>100<\/b> \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 FIFO \u043a\u0430\u043a \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u043c\u043a\u0438. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u0442\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044e \u043f\u0430\u043c\u044f\u0442\u044c <b>object memory<\/b> \u0438 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 <b>START<\/b>, \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>  \u041a\u043e\u0434 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Verilog  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Blob detector<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>module blob_detector  #(     parameter RES_X=10'd320,     parameter RES_Y=10'd240) (     input wire             clk,     input wire             nRst,     \/\/ input RUN FIFO     input wire             fifo_empty,     input wire [21:0]    fifo_data,     output wire            fifo_rd_en,     \/\/ output boxes interface     output reg            we,     output reg [47:0]      data_o );  localparam ST_START = 0, ST_INIT = 1, ST_IDLE = 2, ST_FIND_RUN = 3, ST_FIND_OVERLAP = 4, ST_FIND_OVERLAP_0 = 5,            ST_CREATE_OBJ = 6, ST_UPDATE_OBJ_2 = 7, ST_UPDATE_OBJ = 8, ST_MERGE_OBJ = 9,            ST_MERGE_OBJ_2 = 10, ST_FINISH_OBJ = 11, ST_FINISH_OBJ_2 = 12,            ST_UPLOAD_DATA_START = 13, ST_UPLOAD_DATA = 14, ST_UPLOAD_DATA_END = 15;             localparam MAX_RUNS = RES_X &gt;&gt; 1;  \/\/`define DETECTOR_DEBUG_MODE \/\/is using for modeling  \/\/ RUN memory reg [7:0] run_mem_wr_addr = 0; reg [7:0] run_mem_rd_addr = 0; reg [7:0] run_mem_saved_addr = 0; reg run_mem_wr_en = 0; reg run_mem_flip = 0;  \/\/ RUN memory data wire [9:0] run_rd_start_x; wire [9:0] run_rd_end_x; wire [9:0] run_rd_label; \/\/ RUN FIFO data reg [9:0] run_cur_start_x = 0; reg [9:0] run_cur_end_x = 0; reg [9:0] run_cur_label = 0; wire [1:0] eb; reg [9:0] free_label = 0;  `define OBJ_MASS_THR            19'd100 `define OBJ_LIMIT            32 `define FRAME_END            fifo_data[21] `define ROW_CHANGED            fifo_data[20] `define RUN_EMPTY_LABEL        10'h200 `define EMPY_RUN_SLOT        10'h1FF  \/\/ FSM reg [5:0] blob_detector_fsm_state = 0; \/\/ Internal reg [9:0] current_row = 0; reg [9:0] temp_label = 0; reg frame_end_r = 0;  `ifdef DETECTOR_DEBUG_MODE \/\/ DEBUG reg create_obj = 0; reg merge_obj = 0; reg update_obj = 0; reg skip_obj = 0; reg finish_obj = 0;  wire [8:0] rd_ram_addr = {~run_mem_flip, run_mem_rd_addr}; wire [8:0] wr_ram_addr = {run_mem_flip, run_mem_wr_addr}; `endif  \/\/ read the input FIFO assign fifo_rd_en = (!fifo_empty && blob_detector_fsm_state == ST_FIND_RUN);  \/\/ RUN memory alt_ram_30x512 run_ram (     .clock(clk),     .data({2'h0, run_cur_start_x, run_cur_end_x, run_cur_label}),     .rdaddress({~run_mem_flip, run_mem_rd_addr}),     .wraddress({run_mem_flip, run_mem_wr_addr}),     .wren(run_mem_wr_en),     .q({eb, run_rd_start_x, run_rd_end_x, run_rd_label}) );  reg [4:0] obj_wr_addr = 0, obj_rd_addr = 0, obj_saved_rd_addr = 0; reg obj_mem_wr_en = 0;  \/\/ object's fields for writing reg [9:0] obj_start_x = 0, obj_start_y = 0, obj_end_x = 0, obj_end_y = 0; reg [21:0] obj_mass = 0; reg obj_valid = 0, obj_updated = 0;  \/\/ object's wires for reading wire [9:0] obj_rd_start_x, obj_rd_start_y, obj_rd_end_x, obj_rd_end_y; wire [21:0] obj_rd_mass; wire obj_rd_valid, obj_rd_updated;  \/\/ object detection condition wire obj_detected_valid = (obj_rd_valid && (obj_rd_mass &gt; `OBJ_MASS_THR));  \/\/ Object memory object_ram obj_ram (     .clock(clk),     .data({obj_valid,obj_updated,obj_start_x,obj_end_x,obj_start_y,obj_end_y,obj_mass}),     .rdaddress(obj_rd_addr),     .wraddress(obj_wr_addr),     .wren(obj_mem_wr_en),     .q({obj_rd_valid,obj_rd_updated,obj_rd_start_x,obj_rd_end_x,obj_rd_start_y,obj_rd_end_y,obj_rd_mass}) );  \/*  * The main detector process  *\/ always @(posedge clk or negedge nRst)     if (!nRst) begin         blob_detector_fsm_state &lt;= ST_START;         run_mem_flip &lt;= 1'b0;         free_label &lt;= 10'd0;         temp_label &lt;= 10'd0;         current_row &lt;= 10'd0;         frame_end_r &lt;= 1'b0;         run_mem_wr_en &lt;= 1'b0;         obj_mem_wr_en &lt;= 1'b0;         we &lt;= 1'b0;     end else begin              run_mem_wr_en &lt;= 1'b0;         obj_mem_wr_en &lt;= 1'b0;         we &lt;= 1'b0;          `ifdef DETECTOR_DEBUG_MODE                 \/\/ DEBUG         create_obj &lt;= 1'b0;         merge_obj &lt;= 1'b0;         update_obj &lt;= 1'b0;         skip_obj &lt;= 1'b0;         finish_obj &lt;= 1'b0; `endif                 case (blob_detector_fsm_state)         ST_START: begin             current_row &lt;= 10'd0;             free_label &lt;= 10'd0;             run_mem_rd_addr &lt;= 8'd0;             run_mem_wr_addr &lt;= 8'd0;             obj_rd_addr &lt;= 5'd0;             obj_wr_addr &lt;= 5'd0;             frame_end_r &lt;= 1'b0;             run_mem_flip &lt;= 1'b0;             blob_detector_fsm_state &lt;= ST_INIT;             run_cur_start_x &lt;= `EMPY_RUN_SLOT;             run_cur_end_x &lt;= `EMPY_RUN_SLOT;             run_mem_wr_en &lt;= 1'b1;         end         ST_INIT: begin             if (run_mem_wr_addr &gt;= MAX_RUNS) begin                 run_mem_wr_addr &lt;= 8'd0;                 run_mem_flip &lt;= ~run_mem_flip;                 run_mem_wr_en &lt;= 1'b0;                 blob_detector_fsm_state &lt;= ST_IDLE;             end else begin                 run_mem_wr_addr &lt;= run_mem_wr_addr + 1'b1;                 run_mem_wr_en &lt;= 1'b1;             end         end         ST_IDLE: begin             if (!fifo_empty) begin                 blob_detector_fsm_state &lt;= ST_FIND_RUN;             end         end         ST_FIND_RUN: begin             \/\/ fifo is already read by now             \/\/ ALWAYS set the empty label to the new run             temp_label &lt;= `RUN_EMPTY_LABEL;             run_cur_start_x &lt;= fifo_data[19:10];             run_cur_end_x &lt;= fifo_data[9:0];                          if (`ROW_CHANGED) begin                 frame_end_r &lt;= `FRAME_END;                 blob_detector_fsm_state &lt;= ST_FINISH_OBJ;             end else begin                 \/\/ set first read addres of a RUN                 run_mem_rd_addr &lt;= 8'd0;                 blob_detector_fsm_state &lt;= ST_FIND_OVERLAP_0;             end         end         ST_FIND_OVERLAP_0: begin             \/\/ an empty case (altera's altsyncram is read in 2 cycles, one of them is empty)             blob_detector_fsm_state &lt;= ST_FIND_OVERLAP;         end         ST_FIND_OVERLAP: begin             if ((run_rd_start_x == `EMPY_RUN_SLOT) || (run_rd_start_x &gt; run_cur_end_x + 1'b1)) begin                 \/\/ create new object                 if (temp_label == `RUN_EMPTY_LABEL) begin                     \/\/ asssign the run a free label                     run_cur_label &lt;= free_label;                     \/\/ ???                     obj_saved_rd_addr &lt;= obj_rd_addr;                     obj_rd_addr &lt;= free_label[4:0];                     \/\/ store current run into the memory                     run_mem_wr_en &lt;= 1'b1;                     blob_detector_fsm_state &lt;= ST_CREATE_OBJ;                 end else begin                     \/\/ some garbage was read from the FIFO                     run_mem_rd_addr &lt;= 8'd0;                     blob_detector_fsm_state &lt;= ST_IDLE;                 end             end else begin                 \/\/ not empty slot in memory                 if (((run_rd_start_x &gt;= run_cur_start_x) && (run_rd_start_x &lt;= run_cur_end_x)) ||                     ((run_rd_end_x &gt;= run_cur_start_x) && (run_rd_end_x &lt;= run_cur_end_x)) ||                     ((run_rd_end_x &gt;= run_cur_start_x) && (run_rd_start_x &lt;= run_cur_end_x)) ) begin                     \/\/ overlap                     if (temp_label == `RUN_EMPTY_LABEL) begin                         run_cur_label &lt;= run_rd_label;                         temp_label &lt;= run_rd_label;                         \/\/ write current RUN                         run_mem_wr_en &lt;= 1'b1;                         \/\/ read the object with the overlaped RUN, save the current read addres                         obj_saved_rd_addr &lt;= obj_rd_addr + 1'b1;                         obj_rd_addr &lt;= run_rd_label[4:0];                         \/\/ leave the RUN read address the same                         run_mem_saved_addr &lt;= run_mem_rd_addr;                         blob_detector_fsm_state &lt;= ST_UPDATE_OBJ;                     end else begin                         \/\/ if label exists (we came from UPDATE state)                         if (temp_label != run_rd_label) begin                             \/\/ merge read RUN and existent object (objects might NOT be overlaped)                             obj_rd_addr &lt;= run_rd_label[4:0];                             \/\/ goto merge state                             blob_detector_fsm_state &lt;= ST_MERGE_OBJ;                         end else begin                             \/\/ otherwise this is the same RUN, skip it                             run_mem_rd_addr &lt;= run_mem_rd_addr + 1'b1;                             blob_detector_fsm_state &lt;= ST_FIND_OVERLAP_0;                         end                     end                 end else begin                     \/\/ not overlaps, skip it                     run_mem_rd_addr &lt;= run_mem_rd_addr + 1'b1;                     blob_detector_fsm_state &lt;= ST_FIND_OVERLAP_0;                 end             end         end         ST_CREATE_OBJ: begin `ifdef DETECTOR_DEBUG_MODE                     \/\/ DEBUG             create_obj &lt;= 1'b1; `endif                         \/\/ the label of the current RUN             obj_wr_addr &lt;= run_cur_label[4:0];             \/\/ features             obj_valid &lt;= 1'b1;             obj_updated &lt;= 1'b1;             obj_start_x &lt;= run_cur_start_x;             obj_end_x &lt;= run_cur_end_x;             obj_start_y &lt;= current_row;             obj_end_y &lt;= current_row;             obj_mass &lt;= run_cur_end_x - run_cur_start_x + 1'b1;             free_label &lt;= free_label + 1'b1;             \/\/ write this OBJ into mem             obj_mem_wr_en &lt;= 1'b1;             \/\/ increment the next RUN write address             run_mem_wr_addr &lt;= run_mem_wr_addr + 1'b1;             \/\/ RUN read address starts from the begining             run_mem_rd_addr &lt;= 8'd0;             \/\/ check the FIFO for the next RUN             blob_detector_fsm_state &lt;= ST_IDLE;         end         ST_UPDATE_OBJ: begin             \/\/ we mut take altsyncram's latency into account (one empty cycle)             obj_rd_addr &lt;= run_rd_label[4:0];             blob_detector_fsm_state &lt;= ST_UPDATE_OBJ_2;         end         ST_UPDATE_OBJ_2: begin `ifdef DETECTOR_DEBUG_MODE                     \/\/ DEBUG             update_obj &lt;= 1'b1; `endif                         \/\/ update the object if only it was previously valid             \/\/ thus we avoid updating unused objects came from the             \/\/ merge state             if (obj_rd_valid) begin                 obj_valid &lt;= 1'b1;                 obj_updated &lt;= 1'b1;                 obj_start_x &lt;= (run_cur_start_x &lt; obj_rd_start_x) ? run_cur_start_x : obj_rd_start_x ;                 obj_end_x &lt;= (run_cur_end_x &gt; obj_rd_end_x) ? run_cur_end_x : obj_rd_end_x;                 obj_start_y &lt;= (current_row &lt; obj_rd_start_y) ? current_row : obj_rd_start_y;                 obj_end_y &lt;= (current_row &gt; obj_rd_end_y) ? current_row : obj_rd_end_y;                 obj_mass &lt;= obj_rd_mass + (run_cur_end_x - run_cur_start_x);                 \/\/ save updated obj to it's original address                 obj_wr_addr &lt;= obj_rd_addr;                 \/\/ restore saved read address                 run_mem_rd_addr &lt;= run_mem_saved_addr;                 \/\/ write updated object                 obj_mem_wr_en &lt;= 1'b1;             end     `ifdef DETECTOR_DEBUG_MODE                         else begin                 \/\/ just skip this object                 \/\/ perhaps it was updated previously or going to be updated on the next RUN                 skip_obj &lt;= 1'b1;             end `endif                         \/\/ let store current run into the memory             blob_detector_fsm_state &lt;= ST_FIND_OVERLAP_0;             \/\/ increment the next RUN write address             run_mem_wr_addr &lt;= run_mem_wr_addr + 1'b1;                      end         ST_MERGE_OBJ: begin             \/\/ invalidate the (second) object             \/\/ !!!free list MUST be updated ??? I can't figure out how it should be done...             obj_valid &lt;= 1'b0;             obj_wr_addr &lt;= run_rd_label[4:0];             obj_mem_wr_en &lt;= 1'b1;                          blob_detector_fsm_state &lt;= ST_MERGE_OBJ_2;         end         ST_MERGE_OBJ_2: begin `ifdef DETECTOR_DEBUG_MODE                     \/\/ DEBUG             merge_obj &lt;= 1'b1; `endif                         if (obj_rd_valid) begin                 obj_valid &lt;= 1'b1;                 obj_start_x &lt;= (obj_start_x &lt; obj_rd_start_x) ? obj_start_x : obj_rd_start_x;                 obj_end_x &lt;= (obj_end_x &gt; obj_rd_end_x) ? obj_end_x : obj_rd_end_x;                 obj_start_y &lt;= (obj_start_y &lt; obj_rd_start_y) ? obj_start_y : obj_rd_start_y;                 obj_end_y &lt;= (obj_end_y &gt; obj_rd_end_y) ? obj_end_y : obj_rd_end_y;                 obj_mass &lt;= obj_mass + obj_rd_mass;                 obj_wr_addr &lt;= temp_label[4:0];                 \/\/ write updated (first) object                 obj_mem_wr_en &lt;= 1'b1;                 \/\/ read just written object                 obj_rd_addr &lt;= temp_label[4:0];             end                              blob_detector_fsm_state &lt;= ST_FIND_OVERLAP_0;             run_mem_rd_addr &lt;= run_mem_rd_addr + 1'b1;         end         ST_FINISH_OBJ: begin             \/\/ if there are NO opened objects in the row             run_cur_start_x &lt;= `EMPY_RUN_SLOT;             run_cur_end_x &lt;= `EMPY_RUN_SLOT;             run_mem_rd_addr &lt;= 8'd0;             blob_detector_fsm_state &lt;= ST_FINISH_OBJ_2;             run_mem_wr_en &lt;= 1'b1;             end         ST_FINISH_OBJ_2: begin             run_mem_flip &lt;= ~run_mem_flip;             run_mem_wr_addr &lt;= 8'd0;             current_row &lt;= current_row + 1'b1;             if (frame_end_r) begin `ifdef DETECTOR_DEBUG_MODE                             \/\/ DEBUG                 finish_obj &lt;= 1'b1; `endif                                 \/\/ do some stuff around bounding boxes                 frame_end_r &lt;= 1'b0;                 obj_rd_addr &lt;= 5'd0;                 obj_saved_rd_addr &lt;= 5'd0;;                 blob_detector_fsm_state &lt;= ST_UPLOAD_DATA_START;             end else begin                 blob_detector_fsm_state &lt;= ST_IDLE;             end                 end         ST_UPLOAD_DATA_START: begin             \/\/ an empty case (altera's altsyncram is read in 2 cycles, one of them is empty)             obj_saved_rd_addr &lt;= obj_rd_addr;             blob_detector_fsm_state &lt;= ST_UPLOAD_DATA;         end         ST_UPLOAD_DATA: begin             if (obj_rd_addr &gt;= (`OBJ_LIMIT - 1)) begin                 blob_detector_fsm_state &lt;= ST_UPLOAD_DATA_END;             end else begin                 data_o &lt;= {2'h0, obj_saved_rd_addr, obj_detected_valid, obj_rd_start_x, obj_rd_end_x, obj_rd_start_y, obj_rd_end_y};                 \/\/data_o &lt;= {2'h0, obj_saved_rd_addr, obj_rd_valid, obj_rd_start_x, obj_rd_end_x, obj_rd_start_y - 10'd320, obj_rd_end_y - 10'd320};                 \/\/data_o &lt;= {2'h0, obj_saved_rd_addr, 1'b1, 10'd340, 10'd380, 10'd120, 10'd160};                 we &lt;= 1'b1;                 \/\/ clean obj memory                 obj_wr_addr &lt;= obj_rd_addr;                 obj_valid &lt;= 1'b0; obj_updated &lt;= 1'b0;                 obj_start_x &lt;= 10'd0; obj_end_x &lt;= 10'd0;                 obj_start_y &lt;= 10'd0; obj_end_y &lt;= 10'd0;                 obj_mass &lt;= 20'd0;                 obj_mem_wr_en &lt;= 1'b1;                 \/\/ set box generator's address                 \/\/if (obj_detected_valid) obj_saved_rd_addr &lt;= obj_saved_rd_addr + 1'b1;                 \/\/ set the next read address                 obj_rd_addr &lt;= obj_rd_addr + 1'b1;                 blob_detector_fsm_state &lt;= ST_UPLOAD_DATA_START;             end         end         ST_UPLOAD_DATA_END: begin             obj_rd_addr &lt;= 5'd0;             blob_detector_fsm_state &lt;= ST_START;         end         default: blob_detector_fsm_state &lt;= ST_START;                  endcase     end endmodule <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: <b>FIND_OVERLAP_0<\/b>, <b>UPDATE_OBJ_2<\/b>, <b>MERGE_OBJ_2<\/b>, <b>FINISH_OBJ_2<\/b> \u0438 <b>UPLOAD_DATA_START<\/b> \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c 2-\u0445 \u043f\u043e\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u041f\u041b\u0418\u0421. \u0412\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430 1 \u0442\u0430\u043a\u0442 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0432 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435, \u043c\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0442 \u0442.\u043a. \u0432\u0445\u043e\u0434\u044b \u043c\u0435\u0433\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>altsyncram<\/b> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u044b\u0435 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b \u043a\u043b\u043e\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0438. \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0430\u0437\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 1 \u0442\u0430\u043a\u0442. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u043b \ud83d\ude42<\/p>\n<h3>Bounding box generator<\/h3>\n<p>  \u042d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u043c\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 32, \u0442\u043e \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u043c\u043a\u0438 \u0442\u0430\u043a \u0436\u0435 32. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441. \u042d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 <b>object memory<\/b> \u043c\u043e\u0434\u0443\u043b\u044f <b>Blob detector<\/b>. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 FIFO \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0430\u043c\u043a\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 FIFO \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0438 \u043b\u0438\u0431\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0440\u0430\u043c\u043a\u0438, \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438\u0445.<br \/>  \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430: \u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0430\u043c\u043a\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0438\u0437 FIFO. \u0415\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0442\u043e \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0446\u0432\u0435\u0442 \u0440\u0430\u043c\u043a\u0438, \u0438\u043d\u0430\u0447\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c.<\/p>\n<p>  \u041a\u043e\u0434 box generator-\u0430  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Bounding box generator<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>module box_generator #(         parameter BADDR = 5'd0,         parameter COLOR = 16'hF8_00     )     (         input clk,         input nRst,         input [4:0] addr,         input [40:0] data,         input we,         input [10:0] hcount,         input [10:0] vcount,         input [15:0] pixel_i,         output wire [15:0] pixel_o     );      reg [10:0] xs = 0,xe = 0,ys = 0,ye = 0; reg box_valid = 0; reg [15:0] pixel_r;  wire addr_valid = (addr == BADDR) ? 1'b1 : 1'b0;      always @(posedge clk or negedge nRst)         if (!nRst) begin             xs &lt;= 11'd0; ys &lt;= 11'd0;             xe &lt;= 11'd0; ye &lt;= 11'd0;                 box_valid &lt;= 1'b0;         end else begin             if (we && addr_valid) begin                 xs = data[39:30];                 xe = data[29:20];                 ys = data[19:10];                 ye = data[9:0];                 box_valid = data[40];             end         end          always @(*) begin         if ((hcount &gt;= xs && hcount &lt;= xe) && (vcount == ys || vcount == ye)) begin             pixel_r = COLOR;         end else begin             if ((hcount == xs || hcount == xe) && (vcount &gt;= ys && vcount &lt;= ye))                 pixel_r = COLOR;             else                 pixel_r = pixel_i;         end     end        assign pixel_o = box_valid ? pixel_r : pixel_i;     endmodule <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0441\u0442\u0430\u0432\u043a\u0430 32-\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u043c\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <b>generate<\/b>. \u0412\u044b\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0437\u0430\u0432\u0435\u0434\u0451\u043d \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e. <\/p>\n<pre><code>wire [15:0] box_out [0:`OBJ_LIMIT-1];  genvar i;     generate         for(i = 0; i &lt; `OBJ_LIMIT; i = i + 1 ) begin : box_gen             if (i == 0) begin                 box_generator #(                     .BADDR(i),                     .COLOR(`CL_RED)                 )                 BOX_GEN (                     .clk(pix_clk),                     .nRst(nRst),                     .addr(box_data[45:41]),                     .data(box_data[40:0]),                     .we(box_fifo_rd_en),                     .hcount(counter_x),                     .vcount(counter_y),                     .pixel_i({morph_out[7:3], morph_out[7:2], morph_out[7:3]}),                     .pixel_o(box_out[0])                 );             end else begin                 box_generator #(                     .BADDR(i),                     .COLOR(`CL_RED)                 )                 BOX_GEN (                     .clk(pix_clk),                     .nRst(nRst),                     .addr(box_data[45:41]),                     .data(box_data[40:0]),                     .we(box_fifo_rd_en),                     .hcount(counter_x),                     .vcount(counter_y),                     .pixel_i(box_out[i-1]),                     .pixel_o(box_out[i])                 );             end         end     \u0435ndgenerate <\/code><\/pre>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0431\u043b\u043e\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code>wire [9:0] run_start, run_end; wire row_end, frame_end, new_run; wire [21:0] run_fifo_data_o;\t wire run_fifo_full, run_fifo_empty, run_fifo_wr_en, run_fifo_rd_en; \t \trun_detector #( \t\t.RES_X(10'd320),  \t\t.RES_Y(10'd240), \t\t.XOFFSET(10'd320), \t\t.YOFFSET(10'd0) \t\t)  \tRUN_DETECTOR ( \t\t.clk(pix_clk), \t\t.nRst(nRst), \t\t.data_valid(in_frame2), \t\t.data_in(&morph_out), \t\t.xi(counter_x), \t\t.yi(counter_y), \t\t.run_start(run_start), \t\t.run_end(run_end), \t\t.row_end(row_end), \t\t.frame_end(frame_end), \t\t.new_run(new_run), \t\t.rd_req(run_read_req) \t); \t wire [10:0] run_fifo_rd_used, run_fifo_wr_used;\t wire run_fifo_rd_avail   = |run_fifo_rd_used[10:2]; wire run_fifo_almost_full  = &run_fifo_wr_used[9:2]; \t assign run_fifo_wr_en = (!run_fifo_almost_full && new_run) ? 1'b1: 1'b0;\t \t \talt_fifo_22x512 RUN_FIFO ( \t\t.wrclk(pix_clk), \t\t.data({frame_end, row_end, run_start, run_end}), \t\t.aclr(~nRst), \t\t.rdreq(run_fifo_rd_en), \t\t.wrreq(run_fifo_wr_en), \t\t.rdempty(run_fifo_empty), \t\t.rdclk(clk), \t\t.wrfull(), \t\t.q(run_fifo_data_o), \t\t.rdusedw(run_fifo_rd_used), \t\t.wrusedw(run_fifo_wr_used) \t); \t wire box_we; wire [47:0] box_data; wire [47:0] box_data_det;  \tblob_detector  #( \t\t.RES_X(10'd320), \t\t.RES_Y(10'd240) \t\t) \tBLOB_DET\t ( \t\t.clk(clk), \t\t.nRst(nRst), \t\t\/\/ input RUN FIFO \t\t.fifo_empty(run_fifo_empty), \t\t.fifo_data(run_fifo_data_o), \t\t.fifo_rd_en(run_fifo_rd_en), \t\t\/\/ output boxes interface \t\t.we(box_we), \t\t.data_o(box_data_det) \t);  wire [7:0] box_fifo_rd_used, box_fifo_wr_used;\t wire box_fifo_rd_avail   = |box_fifo_rd_used[7:0]; wire box_fifo_almost_full  = &box_fifo_wr_used[6:2];  wire box_fifo_wr_en  = (box_we && !box_fifo_almost_full) ? 1'b1 : 1'b0; \/\/ read object FIFO right after valid first screen (this might be done anywhere within a frame)  wire obj_read_ena = ((counter_y == 11'd0) && (counter_x &lt; 10'd32)) ? 1'b1 : 1'b0; wire box_fifo_rd_en  = box_fifo_rd_avail && obj_read_ena; \t \tdcfifo_41x128 BOX_FIFO ( \t\t.aclr(~nRst), \t\t.data(box_data_det), \t\t.rdclk(pix_clk), \t\t.rdreq(box_fifo_rd_en), \t\t.wrclk(clk), \t\t.wrreq(box_fifo_wr_en), \t\t.q(box_data), \t\t.rdempty(), \t\t.rdusedw(box_fifo_rd_used), \t\t.wrfull(), \t\t.wrusedw(box_fifo_wr_used) \t); <\/code><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/O5qaqyZWG6A?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u043c. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0451\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 RUN-\u043e\u0432.<\/p>\n<h3>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0442\u0435\u043c\u0435<\/h3>\n<p>  <a href=\"http:\/\/libgen.me\/view.php?id=738271\">Donald G. Bailey Design for Embedded Image Processing on FPGAs<\/a><br \/>  <a href=\"http:\/\/www.electronics.dit.ie\/staff\/aschwarzbacher\/research\/mpc08-1Blob.pdf\">FPGA Implementation of a Single Pass Real-Time Blob Analysis Using Run Length Encoding<\/a><br \/>  <a href=\"http:\/\/seat.massey.ac.nz\/research\/centres\/SPRG\/pdfs\/2015_CASVT_PP.pdf\">A Resource-Efficient Hardware Architecture for Connected Components Analysis <\/a><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:\/\/habrahabr.ru\/post\/327162\/\"> https:\/\/habrahabr.ru\/post\/327162\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/37f\/62c\/0ee\/37f62c0eeabb409ebe52ad7db0f0f871.png\"\/><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445: <a href=\"https:\/\/habrahabr.ru\/post\/323258\/\"><b>\u0414\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435 \u043d\u0430 FPGA<\/b><\/a> \u0438 <a href=\"https:\/\/habrahabr.ru\/post\/325808\/\"><b>\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u043d\u0430 FPGA<\/b><\/a>. \u0417\u0430\u0445\u0432\u0430\u0442 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044f \u0446\u0435\u043b\u044f\u043c, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0440\u0430\u043c\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u0430\u043a\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430\u0434\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043c\u043a\u0443? \u041e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0445 \u0432 \u043a\u0430\u0434\u0440 \u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e: \u043e\u0434\u043d\u0438 \u0438\u0437 \u043d\u0438\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435. \u0415\u0441\u043b\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0430\u043c\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0445 \u0432 \u043a\u0430\u0434\u0440, \u0442\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u0440\u044f\u0434 \u043b\u0438 \u043a\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d.  <\/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-285403","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/285403","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=285403"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/285403\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=285403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=285403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=285403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}