{"id":361435,"date":"2024-05-21T01:13:35","date_gmt":"2024-05-21T01:13:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=361435"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T01:13:35","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=361435","title":{"rendered":"<span>\u0421\u043e\u0437\u0434\u0430\u0435\u043c I2C Master Controller \u043d\u0430 Verilog. \u041f\u0438\u0448\u0435\u043c HDL \u043a\u043e\u0434<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0432 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u044f \u0431\u043e\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e HDL-\u043a\u043e\u0434\u0430. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c FSM, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0448\u0438\u043d\u0435.\u00a0\u00a0<\/p>\n<p>  \u0412\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u0438\u0434\u0435\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u2014 \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.\u00a0<\/p>\n<p>  \u0412\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442! =)<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/au\/1g\/_q\/au1g_qp1khbkydj25kfqvgpxfgy.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/au\/1g\/_q\/au1g_qp1khbkydj25kfqvgpxfgy.png\"\/><\/div>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<blockquote><p><b>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440.<\/b> \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u044e \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435. \u042f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u043f\u043e\u0434 \u041f\u041b\u0418\u0421 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Verilog \u0438 \u043c\u043e\u0433\u0443 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, etc. \u041d\u043e \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f. \u0427\u0442\u043e \u0436, \u043f\u043e\u0435\u0445\u0430\u043b\u0438\u2026<\/p><\/blockquote>\n<p>  <\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u043d\u0443\u043b\u0435\u0432\u043e\u0439. \u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0438 \u043a \u0447\u0435\u043c\u0443 \u0441\u0442\u0440\u0435\u043c\u0438\u043c\u0441\u044f?<\/font><\/h2>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0438 \u0442\u0430\u043a \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0432 Standard Mode \u0442.\u043a. \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e I2C Slave \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0443\u043c\u0435\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 Fast Mode.<\/p>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f HDL-\u043a\u043e\u0434\u0430 \u2014 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ul>\n<li>\u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u0431\u0440\u043e\u0441\u0430;<\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0432 \u0447\u0435\u0442\u043a\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0437\u0430\u0434\u0443\u043c\u043a\u043e\u0439 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/772876\/\"><i><b>\u043f\u0440\u043e\u0448\u043b\u043e\u0439<\/b><\/i><\/a> \u0441\u0442\u0430\u0442\u044c\u0438;<\/li>\n<li>\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0448\u0438\u043d\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u0445 \u043c\u043e\u0434\u0443\u043b\u044f (\u0430\u0434\u0440\u0435\u0441, \u0431\u0430\u0439\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445);<\/li>\n<li>\u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0440\u0442;<\/li>\n<li>\u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b ACK\/NACK \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0440\u0442;<\/li>\n<li>\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u0435\u0442 \u043a\u043e\u0433\u0434\u0430 \u0438 \u043a\u0430\u043a\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 ModelSim, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/744872\/\"><b><i>\u044d\u0442\u043e\u0439<\/i><\/b><\/a> \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0448\u0438\u043d\u0443 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442, \u0443\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0448\u0430\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.\u00a0<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u043f\u0435\u0440\u0432\u044b\u0439. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/font><\/h2>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0434, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0430\u043b\u043e-\u043c\u0430\u043b\u044c\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043f\u043e\u0432\u043b\u0435\u043a \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0438 \u043b\u043e\u043c\u0430\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u044b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u043f\u044b\u0442\u0430 \u0432 Verilog \u043e\u043a\u043e\u043b\u043e \u043d\u0443\u043b\u044f.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f, \u043e\u0431\u043e\u0437\u0432\u0430\u0432 \u0435\u0433\u043e <b>i2c_bit_controller<\/b>:<\/p>\n<pre><code class=\"vhdl\">`timescale 1ns\/1ps  module i2c_bit_controller ( input rstn_i,              \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 input clk_i,                  \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f  input wr_i2c_i,               \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 input [2:0] cmd_i,            \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439  input [7:0] din_i,            \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 output [7:0] dout_o,     \/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 output ack_o,\/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c ACK\/NACK  output [3:0] state_o,         \/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 output ready_o,               \/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0439 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 output [4:0] bit_count_o,\/\/ \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0442 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438  inout tri sda_io,             \/\/ \u0412\u0445\u043e\u0434\/\u0432\u044b\u0445\u043e\u0434 \u0434\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 SDA output tri scl_io\/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b SCL );<\/code><\/pre>\n<p>  \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u043e\u044f\u0441\u043d\u044e \u043f\u0440\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445:<\/p>\n<ul>\n<li><b>rstn_i<\/b> \u2014 \u044d\u0442\u043e \u0432\u0445\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u0431\u0440\u043e\u0441\u0430 \u0432\u0441\u0435\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0435\u0435 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e;<\/li>\n<li><b>clk_i<\/b> \u2014 \u044d\u0442\u043e \u0432\u0445\u043e\u0434 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 10 \u041c\u0413\u0446;<\/li>\n<li><b>wr_i2c_i<\/b>\u2014 \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0447\u0430\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 \u043f\u043e\u0442\u043e\u043c \u0434\u0435\u0440\u0433\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u043f\u0443\u0441\u043a\u043e\u0432\u043e\u0439 \u043a\u0440\u044e\u0447\u043e\u043a;<\/li>\n<li><b>cmd_i<\/b> \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b;<\/li>\n<li><b>din_i<\/b> \u2014 \u044d\u0442\u043e \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0448\u0438\u043d\u0443;<\/li>\n<li><b>dout_o<\/b> \u2014 \u044d\u0442\u043e \u043f\u043e\u0440\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438;<\/li>\n<li><b>ack_o<\/b> \u2014 \u044d\u0442\u043e \u043f\u043e\u0440\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f ACK\/NACK \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438;<\/li>\n<li><b>state_o<\/b> \u2014 \u044d\u0442\u043e\u0442 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u043f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430;<\/li>\n<li><b>ready_o<\/b> \u2014 \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u043b\u0438\u0431\u043e Idle, \u043b\u0438\u0431\u043e Hold;<\/li>\n<li><b>bit_count_o<\/b> \u2014 \u044d\u0442\u043e \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442 \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438;<\/li>\n<li><b>sda_io<\/b> \u2014 \u044d\u0442\u043e\u00a0 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0442\u0440\u0435\u043c\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0448\u0438\u043d\u0435 SDA;<\/li>\n<li><b>scl_io<\/b> \u2014 \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0442\u0440\u0435\u043c\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0432\u044b\u0434\u0430\u0447\u0438 \u043d\u0430 \u0448\u0438\u043d\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 SCL.<\/li>\n<\/ul>\n<p>  \u041a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u044f\u0441\u043d\u043e, \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u0432\u0442\u043e\u0440\u043e\u0439. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b.<\/font><\/h2>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f. \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0435 \u0432\u0441\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u043b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u044f \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0443\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0443. \u041d\u043e \u044d\u0442\u043e \u043b\u0438\u0440\u0438\u043a\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f \u0432\u0432\u0435\u043b \u0432 \u043e\u0431\u043e\u0440\u043e\u0442:<\/p>\n<pre><code class=\"vhdl\">\/\/ \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 localparam START_CMD   = 3'b001; localparam WR_CMD      = 3'b010; localparam RD_CMD      = 3'b011; localparam STOP_CMD    = 3'b100; localparam RESTART_CMD = 3'b101;  \/\/ \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f FSM localparam IDLE_STATE = 4'b0001;\/\/ 1 localparam START1_STATE= 4'b0010;\/\/ 2 localparam START2_STATE= 4'b0011;\/\/ 3 localparam HOLD_STATE= 4'b0100;\/\/ 4 localparam RESTART1_STATE  = 4'b0101;\/\/ 5 localparam RESTART2_STATE  = 4'b0110;\/\/ 6 localparam STOP1_STATE= 4'b0111;\/\/ 7 localparam STOP2_STATE= 4'b1000;\/\/ 8 localparam STOP3_STATE= 4'b1001;\/\/ 9 localparam DATA1_STATE= 4'b1010;\/\/ 10 localparam DATA2_STATE= 4'b1011;\/\/ 11 localparam DATA3_STATE= 4'b1100;\/\/ 12 localparam DATA4_STATE= 4'b1101;\/\/ 13 localparam DATAEND_STATE = 4'b1110;\/\/ 14 <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u0432\u0432\u0435\u043b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 FSM.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u0442\u0440\u0435\u0442\u0438\u0439. \u201c\u041d\u043e\u0433\u043e\u0434\u0440\u044b\u0433\u201d <\/font><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043b\u043e\u0433\u0438\u043a\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438. \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043d\u0430 \u0448\u0438\u043d\u0430\u0445 SDA \u0438 SCL. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u0448\u0438\u043d\u0435, \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440\u043e\u0432, \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0438\u0442\u044f\u043d\u0443\u0442 \u043a \u043d\u0443\u043b\u044e \u2014 \u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u043e\u043b\u044c, \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044f\u0441\u044c \u043e \u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u2014 \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0442\u043f\u0443\u0441\u0442\u0438\u043c \u0448\u0438\u043d\u0443 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0432 Z-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043c \u0434\u0432\u0435 \u043f\u0430\u0440\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0434\u043b\u044f SDA, SCL \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432:<\/p>\n<pre><code class=\"vhdl\">reg sda_out_r; reg scl_out_r;  reg sda_r; reg scl_r;<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u043e\u043d\u0442 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443:<\/p>\n<pre><code class=\"vhdl\">always @(posedge clk_i, negedge rstn_i) begin   if (~rstn_i)    begin  sda_r &lt;= 1'b1; scl_r &lt;= 1'b1;    end else    begin  sda_r &lt;= sda_out_r; scl_r &lt;= scl_out_r;    end end<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u00a0 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0438 \u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438. \u0414\u043b\u044f SCL \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"vhdl\">assign scl_io = (scl_r) ? 1'bz : 1'b0;<\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <b>scl_r<\/b> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 1 \u2014 \u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0440\u0442 \u0432 Z-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c 0 \u2014 \u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c 0. \u041a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. \u041f\u043e\u0441\u043b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pi\/-h\/9u\/pi-h9u9gymqed4b-vcbzqdwix30.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/pi\/-h\/9u\/pi-h9u9gymqed4b-vcbzqdwix30.png\"\/><\/div>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 SDA \u2014 \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0412 \u0444\u0430\u0437\u044b, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u043d\u044b \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0430\u0437\u0443 \u043e\u0431\u043c\u0435\u043d\u0430, \u043d\u0430\u0437\u0432\u0430\u043b \u044f \u0435\u0435 <b>into_w<\/b>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"vhdl\"> reg data_phase_r;\/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440 c \u0438\u043d\u0434\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 reg [3:0] cmd_r;\/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b reg [3:0] cmd_next_r;\/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u043b\u044f FSM  reg [4:0] bit_r;\/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u0438\u0442\u0430  wire into_w;\/\/ \u0421\u0438\u0433\u043d\u0430\u043b-\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u0438\u043a, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445  assign into_w = (data_phase_r &amp;&amp; cmd_r == RD_CMD &amp;&amp; bit_r &lt; 8) || (data_phase_r &amp;&amp; cmd_r == WR_CMD &amp;&amp; bit_r == 8);  assign sda_io = (into_w || sda_r) ? 1'bz : 1'b0; <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u0434\u0435\u0442 <b>data_phase_r<\/b> (\u043a\u043e\u0433\u0434\u0430 FSM \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 DATA_PHASE, \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043e \u0447\u0435\u043c \u0438\u0434\u0435\u0442 \u0440\u0435\u0447\u044c) \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <b>RD_CMD<\/b>, \u0438 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0435 \u0432\u0441\u0435 \u0431\u0438\u0442\u044b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <b>WR_CMD<\/b> \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 8 \u0431\u0438\u0442 \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 ACK-\u0431\u0438\u0442\u0430.\u00a0<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0448\u0438\u043d\u044b \u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c Z-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041d\u0443 \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c 0 \u043d\u0430 SDA \u2014 \u043e\u0431\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u043d\u0430 \u0448\u0438\u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u043b\u044c.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043c \u0435\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043a\u0440\u0443\u0447\u0435\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043b ?.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439. State-\u043c\u0430\u0448\u0438\u043d\u0430<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0442\u0430\u0434\u0438\u044f\u043c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c State-\u043c\u0430\u0448\u0438\u043d\u0443 \u0441 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.\u00a0<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434:<\/p>\n<pre><code class=\"vhdl\"> reg [7:0] state_r;\/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f reg [7:0] state_next_r;\/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432  assign state_o = state_r;\/\/ \u041d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043a \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443 <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430:<\/p>\n<pre><code class=\"vhdl\"> always @(posedge clk_i, negedge rstn_i) begin   if (~rstn_i)    begin        state_r &lt;= IDLE_STATE;    end else    begin        state_r &lt;= state_next_r;    end end <\/code><\/pre>\n<p>  \u0418 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0443\u044e Next-state \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u043a\u043e \u0432\u0441\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e.\u00a0<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u0432\u0432\u0435\u043b \u0432 \u043e\u0431\u043e\u0440\u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e Ready, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <b>data_phase_r<\/b> \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 <b>bit_r<\/b>:<\/p>\n<pre><code class=\"vhdl\"> reg ready_r;\/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 reg [4:0] bit_next_r;\/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0431\u0438\u0442\u043e\u0432  assign ready_o = ready_r;\/\/ \u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 FSM \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 assign bit_count_o = bit_r;\/\/ \u0412\u044b\u0432\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u0438\u0442\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438  \/\/ Next-state \u043c\u0430\u0448\u0438\u043d\u0430 always @(*) begin  state_next_r = state_r;\/\/ \u0417\u0430\u0434\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  ready_r = 1'b0;\/\/ \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f data_phase_r = 1'b0;\/\/ \u0414\u043b\u044f \u0444\u0430\u0437\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 cmd_next_r = cmd_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b bit_next_r = bit_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430  case (state_r) IDLE_STATE: begin            ready_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u043e\u0442\u043e\u0432  if(wr_i2c_i &amp;&amp; cmd_i == START_CMD)\/\/ \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438           begin\/\/ \u0418 \u043f\u043e\u0434\u0430\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 START state_next_r = START1_STATE;\/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 end end  START1_STATE: begin    state_next_r = START2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end  START2_STATE: begin state_next_r = HOLD_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end  HOLD_STATE: begin ready_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u043e\u0442\u043e\u0432  if (wr_i2c_i)\/\/ \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438    begin cmd_next_r = cmd_i;  case (cmd_i) \/\/ \u0418\u0434\u0435\u043c \u0432 \u0448\u0430\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430                    RESTART_CMD: state_next_r = RESTART1_STATE;   STOP_CMD: state_next_r = STOP1_STATE;  default: begin bit_next_r   = 0;\/\/ \u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0438\u0442\u043e\u0432 state_next_r = DATA1_STATE;                     end endcase end end  DATA1_STATE: begin   data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 state_next_r = DATA2_STATE; \/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  DATA2_STATE: begin   data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445                          state_next_r = DATA3_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  DATA3_STATE: begin   data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445                          state_next_r = DATA4_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  DATA4_STATE: begin                           data_phase_r = 1'b1; \/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445  if (bit_r == 8)\/\/ \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432\u0441\u0435 \u0431\u0438\u0442\u044b begin state_next_r = DATAEND_STATE;\/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0430\u0437\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f end else  begin  bit_next_r = bit_r + 1;\/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a state_next_r = DATA1_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end end  DATAEND_STATE: begin  state_next_r = HOLD_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  RESTART1_STATE: begin   state_next_r = RESTART2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  RESTART2_STATE: begin   state_next_r = START1_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end  STOP1_STATE: begin   state_next_r = STOP2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end  STOP2_STATE: begin              state_next_r = STOP3_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end        default: begin\/\/ \u0410-\u043b\u044f STOP3 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435   state_next_r = IDLE_STATE;\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 Idle end  endcase end<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u043b\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"vhdl\"> always @(posedge clk_i, negedge rstn_i) begin     if (~rstn_i)      begin              state_r &lt;= IDLE_STATE;       bit_r   &lt;= 0;               \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c    cmd_r   &lt;= 0;               \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c         end else      begin        state_r &lt;= state_next_r;     bit_r   &lt;= bit_next_r;        \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  cmd_r   &lt;= cmd_next_r;       \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c         end end <\/code><\/pre>\n<p>  \u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0441\u0438\u043d\u0442\u0435\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f FSM, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u0440\u044f\u043c \u0442\u043e \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rv\/ww\/qi\/rvwwqi1vmalfgu-sf5rl3yiqmie.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/rv\/ww\/qi\/rvwwqi1vmalfgu-sf5rl3yiqmie.png\"\/><\/p>\n<p>  \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u2014 \u043b\u0443\u0447\u0448\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0435\u0435 \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0444\u043b\u043e\u0443 \u0440\u0430\u0431\u043e\u0442\u044b State-\u043c\u0430\u0448\u0438\u043d\u044b. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c Verilog-\u043a\u043e\u0434 \u2014 \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0440\u0438\u0442\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/753076\/\"><i><b>\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/b><\/i><\/a>.\u00a0<\/p>\n<p>  \u041a\u043e\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c \u0438 \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0412\u0434\u0443\u043c\u0447\u0438\u0432\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0438 \u0434\u0443\u043c\u0430\u044e, \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u043f\u044f\u0442\u044b\u0439. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c SCL<\/font><\/h2>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c SCL \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e Master-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u2014 \u0442\u0443\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u0420\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u043c \u0432 \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 SCL \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u0443\u043b\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0442\u0430\u0434\u0438\u044f\u043c\u0438, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0430\u043c\u0438, \u0433\u0434\u0435 SCL \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0436\u0438\u0440\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>  \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 Next-state \u043c\u0430\u0448\u0438\u043d\u0443:<\/p>\n<pre><code class=\"vhdl\"> \/\/ Next-state \u043c\u0430\u0448\u0438\u043d\u0430 always @(*) begin  state_next_r = state_r;\/\/ \u0417\u0430\u0434\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  ready_r = 1'b0;\/\/ \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f data_phase_r = 1'b0;\/\/ \u0414\u043b\u044f \u0444\u0430\u0437\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 cmd_next_r = cmd_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b bit_next_r = bit_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430  scl_out_r = 1'b1;             \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  <\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0430\u043f\u0430 START2_STATE:<\/p>\n<pre><code class=\"vhdl\"> START2_STATE: begin   scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c state_next_r = HOLD_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end<\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430 HOLD_STATE:<\/p>\n<pre><code class=\"vhdl\"> HOLD_STATE: begin  ready_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u043e\u0442\u043e\u0432 scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c    if (wr_i2c_i)\/\/ \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438    begin  cmd_next_r = cmd_i;  case (cmd_i)\/\/ \u0418\u0434\u0435\u043c \u0432 \u0448\u0430\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 RESTART_CMD: state_next_r = RESTART1_STATE;   STOP_CMD:     state_next_r = STOP1_STATE;  default: begin bit_next_r   = 0;\/\/ \u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0438\u0442\u043e\u0432 state_next_r = DATA1_STATE;             end      endcase end end<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u0430\u043f\u0430 DATA1_STATE:<\/p>\n<pre><code class=\"vhdl\"> DATA1_STATE: begin     scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 state_next_r = DATA2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u0430\u043f\u0430 DATA4_STATE:<\/p>\n<pre><code class=\"vhdl\"> DATA4_STATE: begin   scl_out_r = 1'b0;             \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c     data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445      if (bit_r == 8)\/\/ \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432\u0441\u0435 \u0431\u0438\u0442\u044b begin        state_next_r = DATAEND_STATE;\/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0430\u0437\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f  end else  begin  bit_next_r = bit_r + 1;\/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a state_next_r = DATA1_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end end<\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u0430\u043f DATAEND_STATE:<\/p>\n<pre><code class=\"vhdl\"> DATAEND_STATE: begin       scl_out_r = 1'b0;                     \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c      state_next_r = HOLD_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end<\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u0430\u043f RESTART1_STATE:<\/p>\n<pre><code class=\"vhdl\"> RESTART1_STATE: begin       scl_out_r = 1'b0;                     \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c      state_next_r = RESTART2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end<\/code><\/pre>\n<p>  \u0418 \u0432 \u044d\u0442\u0430\u043f STOP1_STATE:<\/p>\n<pre><code class=\"vhdl\"> STOP1_STATE: begin   scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c    state_next_r = STOP2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end<\/code><\/pre>\n<p>  \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u044f\u0442, \u0447\u0442\u043e \u044f \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 DATA-\u0444\u0430\u0437\u0430\u0445, \u044d\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u0435\u0442\u0447\u0438\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0437 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435. \u041f\u043b\u044e\u0441\u043e\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0444\u0430\u0437\u0430 DATAEND_STATE.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u0448\u0435\u0441\u0442\u043e\u0439. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c SDA.<\/font><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0438 \u0432\u0430\u0436\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u2014 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435. \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043d\u043e\u0439 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0434\u043b\u044f Tx \u0438 Rx \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0448\u0438\u043d\u0435.\u00a0<\/p>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u044d\u0442\u0430\u043f\u044b \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 SDA \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u0443\u043b\u044f.\u00a0<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430 START1_STATE:<\/p>\n<pre><code class=\"vhdl\">START1_STATE: begin         sda_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c state_next_r = START2_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443        end<\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430 START2_STATE:<\/p>\n<pre><code class=\"vhdl\">START2_STATE: begin    scl_out_r = 1'b0;   sda_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c state_next_r = HOLD_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443        end<\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430 HOLD_STATE:<\/p>\n<pre><code class=\"vhdl\">HOLD_STATE: begin      ready_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u043e\u0442\u043e\u0432      scl_out_r = 1'b0;     sda_out_r = 1'b0;    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  if (wr_i2c_i) \/\/ \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438    begin  cmd_next_r = cmd_i;  case (cmd_i) \/\/ \u0418\u0434\u0435\u043c \u0432 \u0448\u0430\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 RESTART_CMD: state_next_r = RESTART1_STATE;   STOP_CMD: state_next_r = STOP1_STATE;  default: begin bit_next_r   = 0;\/\/ \u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0438\u0442\u043e\u0432 state_next_r = DATA1_STATE;             end  endcase end end<\/code><\/pre>\n<p>  \u0418 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430 DATAEND_STATE:<\/p>\n<pre><code class=\"vhdl\"> DATAEND_STATE: begin    scl_out_r = 1'b0; sda_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  state_next_r = HOLD_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 end<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 Next-state \u043c\u0430\u0448\u0438\u043d\u0443:<\/p>\n<pre><code class=\"vhdl\"> \/\/ Next-state \u043c\u0430\u0448\u0438\u043d\u0430 always @(*) begin  state_next_r = state_r;\/\/ \u0417\u0430\u0434\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  ready_r = 1'b0;\/\/ \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f data_phase_r = 1'b0;\/\/ \u0414\u043b\u044f \u0444\u0430\u0437\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445   cmd_next_r = cmd_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b bit_next_r = bit_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430  scl_out_r = 1'b1; sda_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c 9-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 8 \u0431\u0438\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 1 \u0431\u0438\u0442 \u0434\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 ACK:<\/p>\n<pre><code class=\"vhdl\"> reg [8:0] tx_r; reg [8:0] tx_next_r;  reg [8:0] rx_r; reg [8:0] rx_next_r; <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u043b\u043e\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"vhdl\"> always @(posedge clk_i, negedge rstn_i) begin if (~rstn_i)  begin        state_r &lt;= IDLE_STATE; bit_r   &lt;= 0; cmd_r   &lt;= 0; tx_r    &lt;= 0;                   \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c rx_r    &lt;= 0;                   \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c      end else      begin        state_r &lt;= state_next_r; bit_r   &lt;= bit_next_r; cmd_r   &lt;= cmd_next_r; tx_r    &lt;= tx_next_r;             \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c rx_r    &lt;= rx_next_r;             \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c      end end <\/code><\/pre>\n<p>  \u0418 \u0432 Next-state \u043c\u0430\u0448\u0438\u043d\u0443:<\/p>\n<pre><code class=\"vhdl\"> \/\/ Next-state \u043c\u0430\u0448\u0438\u043d\u0430 always @(*) begin  state_next_r = state_r;\/\/ \u0417\u0430\u0434\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  ready_r = 1'b0;\/\/ \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f data_phase_r = 1'b0;\/\/ \u0414\u043b\u044f \u0444\u0430\u0437\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 cmd_next_r = cmd_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b bit_next_r = bit_r;\/\/ \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430  scl_out_r = 1'b1; sda_out_r = 1'b0;  tx_next_r = tx_r;           \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c rx_next_r = rx_r;           \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c<\/code><\/pre>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0438\u0445 \u0441\u0440\u0430\u0437\u0443 \u043a \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u043e\u0440\u0442\u0430\u043c \u043c\u043e\u0434\u0443\u043b\u044f:<\/p>\n<pre><code class=\"vhdl\"> assign dout_o = rx_r[8:1];\/\/ 8 \u0431\u0438\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 assign ack_o = rx_r[0];    \/\/ \u0420\u0430\u0437\u0440\u044f\u0434 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f ACK-\u0441\u0438\u0433\u043d\u0430\u043b<\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e NACK-\u0441\u0438\u0433\u043d\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Slave:<\/p>\n<pre><code class=\"vhdl\"> wire nack_w; assign nack_w = din_i[0]; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <b>tx_next_r<\/b> \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 HOLD_STATE:<\/p>\n<pre><code class=\"vhdl\"> HOLD_STATE: begin  ready_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u043e\u0442\u043e\u0432  scl_out_r = 1'b0; sda_out_r = 1'b0;  if (wr_i2c_i)\/\/ \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438    begin  cmd_next_r = cmd_i;  case (cmd_i)\/\/ \u0418\u0434\u0435\u043c \u0432 \u0448\u0430\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 RESTART_CMD: state_next_r = RESTART1_STATE;   STOP_CMD: state_next_r = STOP1_STATE;  default: begin bit_next_r   = 0;\/\/ \u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0438\u0442\u043e\u0432 state_next_r = DATA1_STATE; tx_next_r = {din_i, nack_w};\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c                 end  endcase end end<\/code><\/pre>\n<p>  \u0421\u0438\u0433\u043d\u0430\u043b SDA \u043d\u0430 \u0448\u0438\u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 9-\u0439 \u0431\u0438\u0442 <b>tx_r<\/b> \u0432 DATA-\u0441\u0442\u0430\u0434\u0438\u044f\u0445 \u0438 \u043f\u0443\u0442\u0435\u043c \u0441\u0434\u0432\u0438\u0433\u0430 \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0430:<\/p>\n<pre><code class=\"vhdl\"> DATA1_STATE: begin   sda_out_r = tx_r[8];\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 state_next_r = DATA2_STATE; \/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  DATA2_STATE: begin   sda_out_r = tx_r[8];\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 state_next_r = DATA3_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end  DATA3_STATE: begin   sda_out_r = tx_r[8];\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c scl_out_r = 1'b0;\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c  data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 state_next_r = DATA4_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end<\/code><\/pre>\n<p>  \u0410 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 DATA4_STATE \u043f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0441\u0434\u0432\u0438\u0433:<\/p>\n<pre><code class=\"vhdl\"> DATA4_STATE: begin   sda_out_r = tx_r[8];\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c scl_out_r = 1'b0;          data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445  if (bit_r == 8)\/\/ \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432\u0441\u0435 \u0431\u0438\u0442\u044b begin state_next_r = DATAEND_STATE;\/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0430\u0437\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f  end else  begin            tx_next_r = {tx_r[7:0], 1'b0};\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c bit_next_r = bit_r + 1;\/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a state_next_r = DATA1_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  end end<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d 9 \u0431\u0438\u0442\u0430\u043c\u0438, \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044f \u043a \u043d\u0435\u043c\u0443 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u043e\u043b\u044c \u2014 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435. \u0412\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0444\u0430\u0437\u0443 DATA2_STATE \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u0434\u0432\u0438\u0433\u043e\u043c:<\/p>\n<pre><code class=\"vhdl\"> DATA2_STATE: begin   sda_out_r = tx_r[8]; scl_out_r = 1'b0;  data_phase_r = 1'b1;\/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 state_next_r = DATA3_STATE;\/\/ \u0418\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443  \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c rx_next_r = {rx_r[7:0], sda_io};\/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0448\u0438\u043d\u044b \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440  end<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0435. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u043e. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044f \u0437\u0430\u043b\u0438\u043b \u043d\u0430 GitHub: <a href=\"https:\/\/github.com\/megalloid\/I2C_Master_Controller\">github.com\/megalloid\/I2C_Master_Controller<\/a>.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0428\u0430\u0433 \u0441\u0435\u0434\u044c\u043c\u043e\u0439. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/font><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c testbench \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u041e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043c\u043e\u044f <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/744872\/\"><b><i>\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/i><\/b><\/a> \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u042f \u043d\u0430\u043a\u0438\u0434\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0438\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.\u00a0<\/p>\n<p>  \u0414\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043c\u043d\u0435 \u0435\u0449\u0435 \u0434\u0430\u043b\u0435\u043a\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u0443\u0434\u0438\u0442\u0435 \u0441\u0442\u0440\u043e\u0433\u043e:<\/p>\n<pre><code class=\"vhdl\">`timescale 1ns \/ 1ps  module i2c_bit_controller_tb;  \/\/ Clock reg clk_r;  localparam CLK_PERIOD = 10; always #(CLK_PERIOD\/2) clk_r = ~clk_r;  \/\/ Registers reg rstn_r = 1'b1; reg [2:0] cmd_r; reg [3:0] state_r;  reg ready_r; reg wr_i2c_r = 0;  reg [4:0] bit_count_r; reg [4:0] counter_r = 0;  reg [7:0] din_r;  \/\/ Wires wire scl_w; wire sda_w;  \/\/ UUT i2c_master_controller uut( .rstn_i(rstn_r), .clk_i(clk_r),  .wr_i2c_i(wr_i2c_r), .cmd_i(cmd_r),  .din_i(din_r),  .state_o(state_r), .ready_o(ready_r), .bit_count_o(bit_count_r),  .sda_io(sda_w), .scl_io(scl_w) );  \/\/ Commands constants localparam START_CMD   = 3'b001; localparam WR_CMD      = 3'b010; localparam RD_CMD      = 3'b011; localparam STOP_CMD    = 3'b100; localparam RESTART_CMD = 3'b101;  initial begin  rstn_r = 0; clk_r = 0;  #10;  rstn_r = 1;  #10;  cmd_r = START_CMD;  #10;   wr_i2c_r = 1; din_r = 8'b11111111;  #400;  din_r = 8'b10101010;  #1000; $stop;  end  always @(posedge ready_r) begin counter_r = counter_r + 1;  if (counter_r == 3) begin cmd_r = RESTART_CMD; din_r = 8'b10101010; end else if (counter_r == 4)  begin cmd_r = WR_CMD; end else if (counter_r == 5)  begin cmd_r = STOP_CMD; end end  endmodule<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c RTL-\u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0438 \u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dk\/ng\/u3\/dkngu3fmq7czaft6ftlyi10hpwa.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/dk\/ng\/u3\/dkngu3fmq7czaft6ftlyi10hpwa.png\"\/><\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u044f\u043c\u0438 SCL, SDA \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b START \u043f\u043e\u0441\u043b\u0435 IDLE_STATE:\u00a0<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vu\/ul\/cs\/vuulcsamx2mh3d_eg9ntej_igoe.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/vu\/ul\/cs\/vuulcsamx2mh3d_eg9ntej_igoe.png\"\/><\/div>\n<p>  \u0427\u0435\u0442\u043a\u043e \u0432\u0438\u0434\u043d\u043e START-\u0441\u0438\u0433\u043d\u0430\u043b, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u0438\u0436\u0430\u0442\u0438\u044f \u043b\u0438\u043d\u0438\u0438 \u043a \u043d\u0443\u043b\u044e, \u0447\u0435\u0442\u043a\u043e \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 State-\u043c\u0430\u0448\u0438\u043d\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043c\u0435\u043d \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439. \u0412\u0441\u044f \u043f\u043e\u0441\u044b\u043b\u043a\u0430 \u0438\u0437 11111111 \u0432\u0435\u0440\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0448\u0438\u043d\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rv\/ur\/jf\/rvurjfbkwls-zxlrkpa6h91-e0g.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/rv\/ur\/jf\/rvurjfbkwls-zxlrkpa6h91-e0g.png\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u043d\u043e \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b RESTART:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/t_\/ca\/sf\/t_casfj2u4nmssmnryvfeqntacy.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/t_\/ca\/sf\/t_casfj2u4nmssmnryvfeqntacy.png\"\/><\/div>\n<p>  \u041d\u0443 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b STOP \u2014 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0440\u043d\u043e, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0441\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/hd\/n8\/hr\/hdn8hreko5o1gb0h1p7i3g0bjeo.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/hd\/n8\/hr\/hdn8hreko5o1gb0h1p7i3g0bjeo.png\"\/><\/p>\n<p>  \u0427\u0442\u043e \u0436, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435. \u0421\u043b\u043e\u0432\u043e\u043c, \u0443\u0441\u043f\u0435\u0445!<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c, \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434 \u0438, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432 \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0443\u0436\u0435 \u0443 \u0441\u0435\u0431\u044f \u0432 ModelSIm \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442.<\/p>\n<p>  \u0410 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0430 \u043f\u0443\u0442\u0438 \u043a \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0446\u0435\u043b\u0438 \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0443\u0436\u0435 \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0436\u0435\u043b\u0435\u0437\u043e\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0445\u043e\u0447\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 EEPROM \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u0441 Cyclone IV \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0430 \u043f\u043b\u0430\u0442\u0435, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.\u00a0<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445! ?\u00a0<\/p>\n<blockquote><p><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c: <\/b> <a href=\"https:\/\/github.com\/megalloid\/I2C_Master_Controller\/tree\/main\">github.com\/megalloid\/I2C_Master_Controller\/tree\/main<\/a> <\/p><\/blockquote>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h4><font color=\"#454cee\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u044d\u0442\u043e:<\/font><\/h4>\n<p>  <\/p>\n<ul>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/772186\/\">KC868-AM: \u043c\u0438\u043d\u0438 \u043c\u044b \u0438\u043b\u0438 ESP32 IO Expansion Board<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/774806\/\">\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043c\u043d\u0435 \u0432 \u043f\u043e\u043c\u043e\u0449\u044c \u0438\u043b\u0438 \u043a\u0430\u043a \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0441\u043d\u0438<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/776304\/\">\u041a\u0440\u0443\u0442\u0435\u0439\u0448\u0438\u0439 \u041a\u041f\u041a \u0438\u0437 \u043a\u043e\u043d\u0446\u0430 90-\u0445 \u2014 \u043a\u0430\u043a\u0438\u043c \u0431\u044b\u043b Casio Cassiopeia E-105?<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/775230\/\">\u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f-\u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b dd<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/776276\/\">\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f Halo<\/a><\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/timeweb.cloud\/vds-vps?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\"\/><\/a><\/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\/776992\/\"> https:\/\/habr.com\/ru\/articles\/776992\/<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0432 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u044f \u0431\u043e\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e HDL-\u043a\u043e\u0434\u0430. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c FSM, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0448\u0438\u043d\u0435.\u00a0\u00a0<\/p>\n<p>  \u0412\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u0438\u0434\u0435\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u2014 \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.\u00a0<\/p>\n<p>  \u0412\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442! =)<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/au\/1g\/_q\/au1g_qp1khbkydj25kfqvgpxfgy.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/au\/1g\/_q\/au1g_qp1khbkydj25kfqvgpxfgy.png\"\/><\/div>\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-361435","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/361435","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=361435"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/361435\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=361435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=361435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=361435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}