<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>juniha 님의 블로그</title>
    <link>https://juniha.tistory.com/</link>
    <description>juniha 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 17 Jul 2026 01:46:41 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>juniha</managingEditor>
    <item>
      <title>[디지털 집적회로 기초 설계 실습]_RTL부터 P&amp;amp;R 까지 통합 플로우_2</title>
      <link>https://juniha.tistory.com/139</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Place and Route&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA5Wgg/dJMb9LRvuBm/EgGfKOhAft1X73SvKKogc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA5Wgg/dJMb9LRvuBm/EgGfKOhAft1X73SvKKogc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA5Wgg/dJMb9LRvuBm/EgGfKOhAft1X73SvKKogc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA5Wgg%2FdJMb9LRvuBm%2FEgGfKOhAft1X73SvKKogc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;349&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;P&amp;amp;R (Place and Route)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Standard cell 을 이용하여 배치와 연결 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull;전원망구성 &amp;rarr; 클록 트리 합성 &amp;rarr; 신호 배선&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PC3W1/dJMb9OU0cMB/nURGeDVqHGctTF8qYpC5TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PC3W1/dJMb9OU0cMB/nURGeDVqHGctTF8qYpC5TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PC3W1/dJMb9OU0cMB/nURGeDVqHGctTF8qYpC5TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPC3W1%2FdJMb9OU0cMB%2FnURGeDVqHGctTF8qYpC5TK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;381&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Design Flow&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; &lt;b&gt;Floor planning&lt;/b&gt; : 다이 / 코어 크기 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull;&lt;b&gt; CTS&lt;/b&gt; : 스큐 / 지연목표에 맞춰 CLK&amp;nbsp; 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; &lt;b&gt;Routing&lt;/b&gt; :&amp;nbsp; 글로벌 / 디테일 배선, DRC 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;bull; Signoff&lt;/b&gt; : 물리 검증 후 GDSII&amp;nbsp; 추출&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Innovus 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NexU7/dJMb9XK6qzQ/D7ZR2w0DTznvM3no8zrq71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NexU7/dJMb9XK6qzQ/D7ZR2w0DTznvM3no8zrq71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NexU7/dJMb9XK6qzQ/D7ZR2w0DTznvM3no8zrq71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNexU7%2FdJMb9XK6qzQ%2FD7ZR2w0DTznvM3no8zrq71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;613&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Innovus실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 터미널 &amp;rarr;cd .. &amp;rarr;mkdir&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull;&lt;b&gt; 실행위치&lt;/b&gt;: pwm_design 2innovus 입력 /2innovus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;bull; Digital tool sourcing&lt;/b&gt; : souce ../.env_csh_innovus_genus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 터미널 HiCSL &amp;rarr;innovus 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Import Synthesis File&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZ9qB/dJMb8Z90AJP/FkerEbPQZBAc1yjsVCr8bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZ9qB/dJMb8Z90AJP/FkerEbPQZBAc1yjsVCr8bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZ9qB/dJMb8Z90AJP/FkerEbPQZBAc1yjsVCr8bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZ9qB%2FdJMb8Z90AJP%2FFkerEbPQZBAc1yjsVCr8bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;328&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Technology/Physical Libraries&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XEviK/dJMb9X5pbXS/ZdkHqV8Pxa1VpVuNDWoap0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XEviK/dJMb9X5pbXS/ZdkHqV8Pxa1VpVuNDWoap0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XEviK/dJMb9X5pbXS/ZdkHqV8Pxa1VpVuNDWoap0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXEviK%2FdJMb9X5pbXS%2FZdkHqV8Pxa1VpVuNDWoap0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;367&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Power Assign&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YtqoB/dJMb9WemeSl/zRi0a6vQ8mJmiCtOCDhZp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YtqoB/dJMb9WemeSl/zRi0a6vQ8mJmiCtOCDhZp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YtqoB/dJMb9WemeSl/zRi0a6vQ8mJmiCtOCDhZp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYtqoB%2FdJMb9WemeSl%2FzRi0a6vQ8mJmiCtOCDhZp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;385&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: MMMC(Multi-Mode Multi-Corner) Setup&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ed1Ytw/dJMb9O1L9vA/FjHglPpHB5oLTwoI4oiKlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ed1Ytw/dJMb9O1L9vA/FjHglPpHB5oLTwoI4oiKlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ed1Ytw/dJMb9O1L9vA/FjHglPpHB5oLTwoI4oiKlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fed1Ytw%2FdJMb9O1L9vA%2FFjHglPpHB5oLTwoI4oiKlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;787&quot; height=&quot;357&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Timing Library Files&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nKy92/dJMb9O1L9vI/FiOWfyOuk9vgRfxXWmVy11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nKy92/dJMb9O1L9vI/FiOWfyOuk9vgRfxXWmVy11/img.png&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;99&quot; data-is-animation=&quot;false&quot; style=&quot;width: 72.3011%; margin-right: 10px;&quot; data-widthpercent=&quot;73.15&quot; id=&quot;kEditorPhotosEditingImage-7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nKy92/dJMb9O1L9vI/FiOWfyOuk9vgRfxXWmVy11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnKy92%2FdJMb9O1L9vI%2FFiOWfyOuk9vgRfxXWmVy11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QQfIM/dJMb9O1L9vL/YHn1M8rnILbfTJH9o7llq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QQfIM/dJMb9O1L9vL/YHn1M8rnILbfTJH9o7llq0/img.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;165&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;26.85&quot; style=&quot;width: 26.5361%;&quot; id=&quot;kEditorPhotosEditingImage-8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QQfIM/dJMb9O1L9vL/YHn1M8rnILbfTJH9o7llq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQQfIM%2FdJMb9O1L9vL%2FYHn1M8rnILbfTJH9o7llq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqxU2P/dJMb9NBNs5a/8QrUUeGockFnq9vLX5raJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqxU2P/dJMb9NBNs5a/8QrUUeGockFnq9vLX5raJk/img.png&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;281&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.2573%; margin-right: 10px;&quot; data-widthpercent=&quot;46.8&quot; id=&quot;kEditorPhotosEditingImage-9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqxU2P/dJMb9NBNs5a/8QrUUeGockFnq9vLX5raJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqxU2P%2FdJMb9NBNs5a%2F8QrUUeGockFnq9vLX5raJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;177&quot; height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GeNCt/dJMb9NBNs5c/tYQXXbOjkAfbN9itghTmC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GeNCt/dJMb9NBNs5c/tYQXXbOjkAfbN9itghTmC1/img.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;419&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.58%;&quot; data-widthpercent=&quot;53.2&quot; id=&quot;kEditorPhotosEditingImage-10&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GeNCt/dJMb9NBNs5c/tYQXXbOjkAfbN9itghTmC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGeNCt%2FdJMb9NBNs5c%2FtYQXXbOjkAfbN9itghTmC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RC Corner&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCCHnt/dJMb9OnahWH/I3HHqxyKw2ENBJcy4obmCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCCHnt/dJMb9OnahWH/I3HHqxyKw2ENBJcy4obmCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCCHnt/dJMb9OnahWH/I3HHqxyKw2ENBJcy4obmCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCCHnt%2FdJMb9OnahWH%2FI3HHqxyKw2ENBJcy4obmCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;380&quot; height=&quot;366&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Delay Corner&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D1Y4q/dJMb9d8f98I/WXLANjtzXlpJVYYdA1aj91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D1Y4q/dJMb9d8f98I/WXLANjtzXlpJVYYdA1aj91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D1Y4q/dJMb9d8f98I/WXLANjtzXlpJVYYdA1aj91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD1Y4q%2FdJMb9d8f98I%2FWXLANjtzXlpJVYYdA1aj91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;391&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Constraint Modes&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWSKzd/dJMb9OnahXi/7Me1JM5U3bP53Uv9aFoDMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWSKzd/dJMb9OnahXi/7Me1JM5U3bP53Uv9aFoDMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWSKzd/dJMb9OnahXi/7Me1JM5U3bP53Uv9aFoDMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWSKzd%2FdJMb9OnahXi%2F7Me1JM5U3bP53Uv9aFoDMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;379&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Analysis View&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3PHar/dJMb80A4UXH/nUITOQph5K7Hf6YAjCcU00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3PHar/dJMb80A4UXH/nUITOQph5K7Hf6YAjCcU00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3PHar/dJMb80A4UXH/nUITOQph5K7Hf6YAjCcU00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3PHar%2FdJMb80A4UXH%2FnUITOQph5K7Hf6YAjCcU00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;406&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설정완료&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjt57m/dJMb9Onah0N/BfYqxtdPsxG0jCLhe9oQ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjt57m/dJMb9Onah0N/BfYqxtdPsxG0jCLhe9oQ7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjt57m/dJMb9Onah0N/BfYqxtdPsxG0jCLhe9oQ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjt57m%2FdJMb9Onah0N%2FBfYqxtdPsxG0jCLhe9oQ7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;315&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;P&amp;amp;R: Specify Floorplan&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Floorplan&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xnVOM/dJMb9PTUATU/WGRbhJh4mL5bpg91RCKBO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xnVOM/dJMb9PTUATU/WGRbhJh4mL5bpg91RCKBO1/img.png&quot; style=&quot;width: 41.6998%; margin-right: 10px;&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;822&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;42.69&quot; id=&quot;kEditorPhotosEditingImage-16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xnVOM/dJMb9PTUATU/WGRbhJh4mL5bpg91RCKBO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxnVOM%2FdJMb9PTUATU%2FWGRbhJh4mL5bpg91RCKBO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4AA7/dJMb9N9Dofb/zqUoXt5pDo0LsItDaPTDT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4AA7/dJMb9N9Dofb/zqUoXt5pDo0LsItDaPTDT0/img.png&quot; style=&quot;width: 23.1773%; margin-right: 10px;&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;617&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;23.73&quot; id=&quot;kEditorPhotosEditingImage-17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4AA7/dJMb9N9Dofb/zqUoXt5pDo0LsItDaPTDT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4AA7%2FdJMb9N9Dofb%2FzqUoXt5pDo0LsItDaPTDT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cw8Eq/dJMb9N9Dofg/pfYS2yR9IFVgIoYTdgFvlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cw8Eq/dJMb9N9Dofg/pfYS2yR9IFVgIoYTdgFvlk/img.png&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;527&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.7973%;&quot; data-widthpercent=&quot;33.58&quot; id=&quot;kEditorPhotosEditingImage-18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cw8Eq/dJMb9N9Dofg/pfYS2yR9IFVgIoYTdgFvlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCw8Eq%2FdJMb9N9Dofg%2FpfYS2yR9IFVgIoYTdgFvlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Global Nets&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Global VDD,VSS 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dA9mEw/dJMb9M3Xzzy/V1DshsXzcfhGcDhMTxibV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dA9mEw/dJMb9M3Xzzy/V1DshsXzcfhGcDhMTxibV0/img.png&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;352&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.5231%; margin-right: 10px;&quot; data-widthpercent=&quot;29.2&quot; id=&quot;kEditorPhotosEditingImage-19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dA9mEw/dJMb9M3Xzzy/V1DshsXzcfhGcDhMTxibV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdA9mEw%2FdJMb9M3Xzzy%2FV1DshsXzcfhGcDhMTxibV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9y8Y2/dJMb9QrKyWA/dULlWKK56hisIY5XkjNLFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9y8Y2/dJMb9QrKyWA/dULlWKK56hisIY5XkjNLFK/img.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;373&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.8927%; margin-right: 10px;&quot; data-widthpercent=&quot;35.72&quot; id=&quot;kEditorPhotosEditingImage-20&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9y8Y2/dJMb9QrKyWA/dULlWKK56hisIY5XkjNLFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9y8Y2%2FdJMb9QrKyWA%2FdULlWKK56hisIY5XkjNLFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b68OmL/dJMb9M3Xzzz/6Vphg847jpHQCXPw8lDp40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b68OmL/dJMb9M3Xzzz/6Vphg847jpHQCXPw8lDp40/img.png&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;379&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.2586%;&quot; data-widthpercent=&quot;35.08&quot; id=&quot;kEditorPhotosEditingImage-21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b68OmL/dJMb9M3Xzzz/6Vphg847jpHQCXPw8lDp40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb68OmL%2FdJMb9M3Xzzz%2F6Vphg847jpHQCXPw8lDp40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;P&amp;amp;R: Add Power Line&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Power Ring 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdfFmA/dJMb9P7rH3n/4KnmHG4uYi8obYzRYWQOF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdfFmA/dJMb9P7rH3n/4KnmHG4uYi8obYzRYWQOF0/img.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;222&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;44.82&quot; style=&quot;width: 43.7773%; margin-right: 10px;&quot; id=&quot;kEditorPhotosEditingImage-22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdfFmA/dJMb9P7rH3n/4KnmHG4uYi8obYzRYWQOF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdfFmA%2FdJMb9P7rH3n%2F4KnmHG4uYi8obYzRYWQOF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QlNq3/dJMb9P7rH3w/D3Q7hsXO9f268Id3G8mcak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QlNq3/dJMb9P7rH3w/D3Q7hsXO9f268Id3G8mcak/img.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;383&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.5395%; margin-right: 10px;&quot; data-widthpercent=&quot;28.2&quot; id=&quot;kEditorPhotosEditingImage-23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QlNq3/dJMb9P7rH3w/D3Q7hsXO9f268Id3G8mcak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQlNq3%2FdJMb9P7rH3w%2FD3Q7hsXO9f268Id3G8mcak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NTlrL/dJMb8XYESV8/oYMKfwt0TjsLfyRlgF7EF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NTlrL/dJMb8XYESV8/oYMKfwt0TjsLfyRlgF7EF0/img.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;609&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.3576%;&quot; data-widthpercent=&quot;26.98&quot; id=&quot;kEditorPhotosEditingImage-24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NTlrL/dJMb8XYESV8/oYMKfwt0TjsLfyRlgF7EF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNTlrL%2FdJMb8XYESV8%2FoYMKfwt0TjsLfyRlgF7EF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ring configuration: width = 1 , spacing = 1 , offset = 1 (사용한공정drcrule에맞춰서설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Power Stripe 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7V7X9/dJMb9QkY2D1/pkpiS9JIWrMaXR0vkatAp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7V7X9/dJMb9QkY2D1/pkpiS9JIWrMaXR0vkatAp1/img.png&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;171&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.7817%; margin-right: 10px;&quot; data-widthpercent=&quot;48.92&quot; id=&quot;kEditorPhotosEditingImage-25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7V7X9/dJMb9QkY2D1/pkpiS9JIWrMaXR0vkatAp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7V7X9%2FdJMb9QkY2D1%2FpkpiS9JIWrMaXR0vkatAp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;313&quot; height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpDllg/dJMb9QFhD7g/Yn7RVymgBNfvk4RODucTYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpDllg/dJMb9QFhD7g/Yn7RVymgBNfvk4RODucTYk/img.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;720&quot; data-is-animation=&quot;false&quot; style=&quot;width: 23.4939%; margin-right: 10px;&quot; data-widthpercent=&quot;24.05&quot; id=&quot;kEditorPhotosEditingImage-26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpDllg/dJMb9QFhD7g/Yn7RVymgBNfvk4RODucTYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpDllg%2FdJMb9QFhD7g%2FYn7RVymgBNfvk4RODucTYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crU6Us/dJMb9OgoLgU/xDO1Tgm0vUxcUKPAkH4YpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crU6Us/dJMb9OgoLgU/xDO1Tgm0vUxcUKPAkH4YpK/img.png&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;798&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.3988%;&quot; data-widthpercent=&quot;27.03&quot; id=&quot;kEditorPhotosEditingImage-27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crU6Us/dJMb9OgoLgU/xDO1Tgm0vUxcUKPAkH4YpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrU6Us%2FdJMb9OgoLgU%2FxDO1Tgm0vUxcUKPAkH4YpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Edit Pin&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;InputPin 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IdNhO/dJMb80A4U2F/HSY1Kel5GH44xwkynSKZrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IdNhO/dJMb80A4U2F/HSY1Kel5GH44xwkynSKZrk/img.png&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;523&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.4652%; margin-right: 10px;&quot; data-widthpercent=&quot;42.96&quot; id=&quot;kEditorPhotosEditingImage-28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IdNhO/dJMb80A4U2F/HSY1Kel5GH44xwkynSKZrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIdNhO%2FdJMb80A4U2F%2FHSY1Kel5GH44xwkynSKZrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcu2Nr/dJMb80A4U2J/RFrKPOBHus2bUExtxg6J1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcu2Nr/dJMb80A4U2J/RFrKPOBHus2bUExtxg6J1k/img.png&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;586&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.372%;&quot; data-widthpercent=&quot;57.04&quot; id=&quot;kEditorPhotosEditingImage-29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcu2Nr/dJMb80A4U2J/RFrKPOBHus2bUExtxg6J1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcu2Nr%2FdJMb80A4U2J%2FRFrKPOBHus2bUExtxg6J1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OutputPin 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yJT9B/dJMb9PTUA0D/L8xzkkBlMWTetYvxELibn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yJT9B/dJMb9PTUA0D/L8xzkkBlMWTetYvxELibn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yJT9B/dJMb9PTUA0D/L8xzkkBlMWTetYvxELibn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyJT9B%2FdJMb9PTUA0D%2FL8xzkkBlMWTetYvxELibn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;583&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;P&amp;amp;R: Special Route&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Cell 을위한Power Line 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JLIQz/dJMb9OHsCVB/breoQFAXPX4RZppQeTkWy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JLIQz/dJMb9OHsCVB/breoQFAXPX4RZppQeTkWy0/img.png&quot; id=&quot;kEditorPhotosEditingImage-31&quot; style=&quot;width: 35.2514%; margin-right: 10px;&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;243&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;36.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JLIQz/dJMb9OHsCVB/breoQFAXPX4RZppQeTkWy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJLIQz%2FdJMb9OHsCVB%2FbreoQFAXPX4RZppQeTkWy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;249&quot; height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1PLz0/dJMb9LjGdxH/3JSwKRMKauLJKkkSNlilhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1PLz0/dJMb9LjGdxH/3JSwKRMKauLJKkkSNlilhk/img.png&quot; id=&quot;kEditorPhotosEditingImage-32&quot; style=&quot;width: 31.2819%; margin-right: 10px;&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;849&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;32.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1PLz0/dJMb9LjGdxH/3JSwKRMKauLJKkkSNlilhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1PLz0%2FdJMb9LjGdxH%2F3JSwKRMKauLJKkkSNlilhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kH9h8/dJMb9OHsCVR/9VkpHLCnvd3x9LIoAUCYy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kH9h8/dJMb9OHsCVR/9VkpHLCnvd3x9LIoAUCYy0/img.png&quot; id=&quot;kEditorPhotosEditingImage-33&quot; style=&quot;width: 31.1411%;&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;844&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;31.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kH9h8/dJMb9OHsCVR/9VkpHLCnvd3x9LIoAUCYy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkH9h8%2FdJMb9OHsCVR%2F9VkpHLCnvd3x9LIoAUCYy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xKfJJ/dJMb9QkY4sW/2tEHGrUoLWJtMqGD7OzFRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKfJJ/dJMb9QkY4sW/2tEHGrUoLWJtMqGD7OzFRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKfJJ/dJMb9QkY4sW/2tEHGrUoLWJtMqGD7OzFRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKfJJ%2FdJMb9QkY4sW%2F2tEHGrUoLWJtMqGD7OzFRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;457&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; P&amp;amp;R: Place Standard Cells&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Standard Cell 배치&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7aRT1/dJMb9MJEgHV/WVxoKHpIBhbUrUKNtZKKn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7aRT1/dJMb9MJEgHV/WVxoKHpIBhbUrUKNtZKKn0/img.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;589&quot; data-is-animation=&quot;false&quot; style=&quot;width: 12.6595%; margin-right: 10px;&quot; data-widthpercent=&quot;12.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7aRT1/dJMb9MJEgHV/WVxoKHpIBhbUrUKNtZKKn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7aRT1%2FdJMb9MJEgHV%2FWVxoKHpIBhbUrUKNtZKKn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUS3J/dJMb9LjGdyC/LRZ9VAsZKKx4Gp3VnVcmQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUS3J/dJMb9LjGdyC/LRZ9VAsZKKx4Gp3VnVcmQ0/img.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;257&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.4445%; margin-right: 10px;&quot; data-widthpercent=&quot;61.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUS3J/dJMb9LjGdyC/LRZ9VAsZKKx4Gp3VnVcmQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUS3J%2FdJMb9LjGdyC%2FLRZ9VAsZKKx4Gp3VnVcmQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r2Lwr/dJMb9LjGdyN/LjT3I0uusgaimK2hQfmnn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r2Lwr/dJMb9LjGdyN/LjT3I0uusgaimK2hQfmnn0/img.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;821&quot; data-is-animation=&quot;false&quot; style=&quot;width: 24.5704%;&quot; data-widthpercent=&quot;25.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r2Lwr/dJMb9LjGdyN/LjT3I0uusgaimK2hQfmnn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr2Lwr%2FdJMb9LjGdyN%2FLjT3I0uusgaimK2hQfmnn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; P&amp;amp;R: Routing&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkekUN/dJMb8Vs0lEs/4vzO2uVGQe8I3n3V9jeP40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkekUN/dJMb8Vs0lEs/4vzO2uVGQe8I3n3V9jeP40/img.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;337&quot; data-is-animation=&quot;false&quot; style=&quot;width: 64.1502%; margin-right: 10px;&quot; data-widthpercent=&quot;64.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkekUN/dJMb8Vs0lEs/4vzO2uVGQe8I3n3V9jeP40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkekUN%2FdJMb8Vs0lEs%2F4vzO2uVGQe8I3n3V9jeP40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oekkj/dJMb8Vs0lEz/kpXkfXPza9U51mRlX0fuoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oekkj/dJMb8Vs0lEz/kpXkfXPza9U51mRlX0fuoK/img.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;821&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.687%;&quot; data-widthpercent=&quot;35.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oekkj/dJMb8Vs0lEz/kpXkfXPza9U51mRlX0fuoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foekkj%2FdJMb8Vs0lEz%2FkpXkfXPza9U51mRlX0fuoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEH5DE/dJMb84DtMEj/rl6KLxIGZxCFE6nj6hRLi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEH5DE/dJMb84DtMEj/rl6KLxIGZxCFE6nj6hRLi1/img.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;810&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.249%; margin-right: 10px;&quot; data-widthpercent=&quot;46.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEH5DE/dJMb84DtMEj/rl6KLxIGZxCFE6nj6hRLi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEH5DE%2FdJMb84DtMEj%2Frl6KLxIGZxCFE6nj6hRLi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;856&quot; height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7OH62/dJMb9MbOj9w/ohBryTukqpdQw6FjTjOTz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7OH62/dJMb9MbOj9w/ohBryTukqpdQw6FjTjOTz0/img.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;610&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.5882%;&quot; data-widthpercent=&quot;53.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7OH62/dJMb9MbOj9w/ohBryTukqpdQw6FjTjOTz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7OH62%2FdJMb9MbOj9w%2FohBryTukqpdQw6FjTjOTz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Routing&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vHJya/dJMb9MJEhgv/4MDtXi21fqCeiQK6SZ7zL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vHJya/dJMb9MJEhgv/4MDtXi21fqCeiQK6SZ7zL0/img.png&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;343&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.7116%; margin-right: 10px;&quot; data-widthpercent=&quot;45.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vHJya/dJMb9MJEhgv/4MDtXi21fqCeiQK6SZ7zL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvHJya%2FdJMb9MJEhgv%2F4MDtXi21fqCeiQK6SZ7zL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dW9jbm/dJMb9WyEZfq/7XDjgBCMKTQRgacU1qIco1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dW9jbm/dJMb9WyEZfq/7XDjgBCMKTQRgacU1qIco1/img.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;614&quot; data-is-animation=&quot;false&quot; style=&quot;width: 24.8461%; margin-right: 10px;&quot; data-widthpercent=&quot;25.44&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dW9jbm/dJMb9WyEZfq/7XDjgBCMKTQRgacU1qIco1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdW9jbm%2FdJMb9WyEZfq%2F7XDjgBCMKTQRgacU1qIco1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0Gv4d/dJMb9MbOj7P/UkMpRIjFYuBY5FwE1NmAeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0Gv4d/dJMb9MbOj7P/UkMpRIjFYuBY5FwE1NmAeK/img.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;811&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.1167%;&quot; data-widthpercent=&quot;28.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0Gv4d/dJMb9MbOj7P/UkMpRIjFYuBY5FwE1NmAeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0Gv4d%2FdJMb9MbOj7P%2FUkMpRIjFYuBY5FwE1NmAeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; P&amp;amp;R: Check DRC&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; PVS 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvFCtj/dJMb9dAqcjz/uSMcLz0G1qoh28tRkyx2v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvFCtj/dJMb9dAqcjz/uSMcLz0G1qoh28tRkyx2v1/img.png&quot; style=&quot;width: 53.0497%; margin-right: 10px;&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;209&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;54.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvFCtj/dJMb9dAqcjz/uSMcLz0G1qoh28tRkyx2v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvFCtj%2FdJMb9dAqcjz%2FuSMcLz0G1qoh28tRkyx2v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;290&quot; height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk12mK/dJMb8V0P7Zi/pIfQ6YmppJFMeDcSPF8KT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk12mK/dJMb8V0P7Zi/pIfQ6YmppJFMeDcSPF8KT1/img.png&quot; style=&quot;width: 22.3131%; margin-right: 10px;&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;586&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;22.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk12mK/dJMb8V0P7Zi/pIfQ6YmppJFMeDcSPF8KT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk12mK%2FdJMb8V0P7Zi%2FpIfQ6YmppJFMeDcSPF8KT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwHvu/dJMb9dAqcjG/KQas1dJ4T5jbH2eTOV4uOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwHvu/dJMb9dAqcjG/KQas1dJ4T5jbH2eTOV4uOK/img.png&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;682&quot; data-is-animation=&quot;false&quot; style=&quot;width: 22.3116%;&quot; data-widthpercent=&quot;22.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwHvu/dJMb9dAqcjG/KQas1dJ4T5jbH2eTOV4uOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlwHvu%2FdJMb9dAqcjG%2FKQas1dJ4T5jbH2eTOV4uOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;398&quot; height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DRC Run&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/trmbl/dJMb9MCSQuD/w1sMJfb3xf7366hynF4bTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/trmbl/dJMb9MCSQuD/w1sMJfb3xf7366hynF4bTk/img.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;518&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;42.24&quot; style=&quot;width: 41.7454%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/trmbl/dJMb9MCSQuD/w1sMJfb3xf7366hynF4bTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftrmbl%2FdJMb9MCSQuD%2Fw1sMJfb3xf7366hynF4bTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhAzr/dJMb86BioX5/17TruXsklgCuUx8ovWE9z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhAzr/dJMb86BioX5/17TruXsklgCuUx8ovWE9z1/img.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;384&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.0918%;&quot; data-widthpercent=&quot;57.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhAzr/dJMb86BioX5/17TruXsklgCuUx8ovWE9z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrhAzr%2FdJMb86BioX5%2F17TruXsklgCuUx8ovWE9z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; DRC Metal 간격&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 임의로DRC 에러생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvOfu/dJMb9NhuFfA/p3oJkK8o676kwmJErd8KE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvOfu/dJMb9NhuFfA/p3oJkK8o676kwmJErd8KE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvOfu/dJMb9NhuFfA/p3oJkK8o676kwmJErd8KE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvOfu%2FdJMb9NhuFfA%2Fp3oJkK8o676kwmJErd8KE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;505&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DRC result&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBCnwU/dJMb9Xj15GW/rrE7JL6WkrA6s3RW7amSS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBCnwU/dJMb9Xj15GW/rrE7JL6WkrA6s3RW7amSS0/img.png&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;823&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.2858%; margin-right: 10px;&quot; data-widthpercent=&quot;27.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBCnwU/dJMb9Xj15GW/rrE7JL6WkrA6s3RW7amSS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBCnwU%2FdJMb9Xj15GW%2FrrE7JL6WkrA6s3RW7amSS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Q6fe/dJMb9N9DrFm/nfiZqbf22r6vSuvUrxWJZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Q6fe/dJMb9N9DrFm/nfiZqbf22r6vSuvUrxWJZk/img.png&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;863&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.7071%; margin-right: 10px;&quot; data-widthpercent=&quot;44.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Q6fe/dJMb9N9DrFm/nfiZqbf22r6vSuvUrxWJZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Q6fe%2FdJMb9N9DrFm%2FnfiZqbf22r6vSuvUrxWJZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1463&quot; height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0hKQT/dJMb9Xj15G9/6p924KHb1VI9zEUDiw1gk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0hKQT/dJMb9Xj15G9/6p924KHb1VI9zEUDiw1gk1/img.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;774&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.6815%;&quot; data-widthpercent=&quot;27.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0hKQT/dJMb9Xj15G9/6p924KHb1VI9zEUDiw1gk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0hKQT%2FdJMb9Xj15G9%2F6p924KHb1VI9zEUDiw1gk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DRC result&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Error 가 있을 경우 위와 같이 메시지 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 더블 클릭 시 해당 위치 하이라이트 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Error를 고치기 위해서는 Size 또는 해당 부분만 옮겨서 DRC 문제 해결&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; P&amp;amp;R: Check LVS&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; PVS 설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyxol5/dJMb9Xxzih5/GQC3yg9mlbYPZR9Kpilo0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyxol5/dJMb9Xxzih5/GQC3yg9mlbYPZR9Kpilo0k/img.png&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;373&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5146%; margin-right: 10px;&quot; data-widthpercent=&quot;33.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyxol5/dJMb9Xxzih5/GQC3yg9mlbYPZR9Kpilo0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyxol5%2FdJMb9Xxzih5%2FGQC3yg9mlbYPZR9Kpilo0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;205&quot; height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blAwYP/dJMb9Wk7Qij/ckks4jjJnJbgnTeW3pWLfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blAwYP/dJMb9Wk7Qij/ckks4jjJnJbgnTeW3pWLfk/img.png&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;742&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.2115%; margin-right: 10px;&quot; data-widthpercent=&quot;32.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blAwYP/dJMb9Wk7Qij/ckks4jjJnJbgnTeW3pWLfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblAwYP%2FdJMb9Wk7Qij%2Fckks4jjJnJbgnTeW3pWLfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PCun3/dJMb9PM9ekb/YI1wtgWybr5OfsNl8Jr7Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PCun3/dJMb9PM9ekb/YI1wtgWybr5OfsNl8Jr7Ak/img.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;808&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.9484%;&quot; data-widthpercent=&quot;33.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PCun3/dJMb9PM9ekb/YI1wtgWybr5OfsNl8Jr7Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPCun3%2FdJMb9PM9ekb%2FYI1wtgWybr5OfsNl8Jr7Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Black Box 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pX5L6/dJMb9dAqcWF/3LEqUwWrRJ4KSuqaY9E8w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pX5L6/dJMb9dAqcWF/3LEqUwWrRJ4KSuqaY9E8w0/img.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;577&quot; data-is-animation=&quot;false&quot; style=&quot;width: 79.1945%; margin-right: 10px;&quot; data-widthpercent=&quot;80.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pX5L6/dJMb9dAqcWF/3LEqUwWrRJ4KSuqaY9E8w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpX5L6%2FdJMb9dAqcWF%2F3LEqUwWrRJ4KSuqaY9E8w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWUub1/dJMb9N2RFTF/GHNlVpJenAAvBxWbo5UKfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWUub1/dJMb9N2RFTF/GHNlVpJenAAvBxWbo5UKfK/img.png&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;724&quot; data-is-animation=&quot;false&quot; style=&quot;width: 19.6427%;&quot; data-widthpercent=&quot;19.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWUub1/dJMb9N2RFTF/GHNlVpJenAAvBxWbo5UKfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWUub1%2FdJMb9N2RFTF%2FGHNlVpJenAAvBxWbo5UKfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;380&quot; height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Power Net 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UXGRG/dJMb9VGwmda/3t0jKvRjoAJ8WMFAiufj50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UXGRG/dJMb9VGwmda/3t0jKvRjoAJ8WMFAiufj50/img.png&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;466&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.7281%; margin-right: 10px;&quot; data-widthpercent=&quot;46.27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UXGRG/dJMb9VGwmda/3t0jKvRjoAJ8WMFAiufj50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUXGRG%2FdJMb9VGwmda%2F3t0jKvRjoAJ8WMFAiufj50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db504t/dJMb9MplE18/ksJlQZuaDbZAQoms5zEPIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db504t/dJMb9MplE18/ksJlQZuaDbZAQoms5zEPIK/img.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;768&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.1091%;&quot; data-widthpercent=&quot;53.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db504t/dJMb9MplE18/ksJlQZuaDbZAQoms5zEPIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb504t%2FdJMb9MplE18%2FksJlQZuaDbZAQoms5zEPIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;802&quot; height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Timing Report 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Time Report 추출&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw3WY2/dJMb9MplE3c/tOBrioidkZ4BN1NoZkgPkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw3WY2/dJMb9MplE3c/tOBrioidkZ4BN1NoZkgPkK/img.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;423&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.7058%; margin-right: 10px;&quot; data-widthpercent=&quot;32.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw3WY2/dJMb9MplE3c/tOBrioidkZ4BN1NoZkgPkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw3WY2%2FdJMb9MplE3c%2FtOBrioidkZ4BN1NoZkgPkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDuDi4/dJMb9MplE3Y/wh3JAl1sdNK1N9EmxrE4s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDuDi4/dJMb9MplE3Y/wh3JAl1sdNK1N9EmxrE4s0/img.png&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;546&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.1021%; margin-right: 10px;&quot; data-widthpercent=&quot;40.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDuDi4/dJMb9MplE3Y/wh3JAl1sdNK1N9EmxrE4s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDuDi4%2FdJMb9MplE3Y%2Fwh3JAl1sdNK1N9EmxrE4s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcbq9E/dJMb862mN40/SFEemlJbWR63Gh7yoRzjs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcbq9E/dJMb862mN40/SFEemlJbWR63Gh7yoRzjs1/img.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;568&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.8665%;&quot; data-widthpercent=&quot;27.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcbq9E/dJMb862mN40/SFEemlJbWR63Gh7yoRzjs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcbq9E%2FdJMb862mN40%2FSFEemlJbWR63Gh7yoRzjs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Report분석&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 파일위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; ./ pwm/2innovus/timingReports/pwm_preCTS_all.tarpt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Begin point: 경로의 시작점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; End point: 경로의 종료점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Path Group: 경로의 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Analysis View: 분석 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Slack: 타이밍 여유(Required Time -Arrival Time)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Timing Path: 실제 신호가 거치는 셀 / 넷 / 핀의 리스트와 각 단계 별 propagation delay&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; P&amp;amp;R: Post Layout Simulation&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SDF &amp;amp; Netlist 추출&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC2Cnf/dJMb9d8gcqR/hDjhpkDBJre5yzpUuOnoH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC2Cnf/dJMb9d8gcqR/hDjhpkDBJre5yzpUuOnoH0/img.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;600&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.115%; margin-right: 10px;&quot; data-widthpercent=&quot;33.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC2Cnf/dJMb9d8gcqR/hDjhpkDBJre5yzpUuOnoH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC2Cnf%2FdJMb9d8gcqR%2FhDjhpkDBJre5yzpUuOnoH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzFOP/dJMb9PsQqrk/O4k7KX32Twvyd5Y0OqMkb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzFOP/dJMb9PsQqrk/O4k7KX32Twvyd5Y0OqMkb0/img.png&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;615&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.2461%; margin-right: 10px;&quot; data-widthpercent=&quot;33.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzFOP/dJMb9PsQqrk/O4k7KX32Twvyd5Y0OqMkb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzFOP%2FdJMb9PsQqrk%2FO4k7KX32Twvyd5Y0OqMkb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVIUHV/dJMb9MQpOqU/K1AbrgHKzYj8IKwqaSSdV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVIUHV/dJMb9MQpOqU/K1AbrgHKzYj8IKwqaSSdV1/img.png&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;644&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.3133%;&quot; data-widthpercent=&quot;33.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVIUHV/dJMb9MQpOqU/K1AbrgHKzYj8IKwqaSSdV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVIUHV%2FdJMb9MQpOqU%2FK1AbrgHKzYj8IKwqaSSdV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Simulation Setting&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnfnyH/dJMb9iuXIfT/CYyCKkYHOjgkIu7UQK98zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnfnyH/dJMb9iuXIfT/CYyCKkYHOjgkIu7UQK98zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnfnyH/dJMb9iuXIfT/CYyCKkYHOjgkIu7UQK98zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnfnyH%2FdJMb9iuXIfT%2FCYyCKkYHOjgkIu7UQK98zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;310&quot; height=&quot;28&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; cd ../1genus/ rtl 폴더로이동 &amp;bull; Innovus에서추출한netlist, sdf파일을PLS 폴더로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Test bench 작성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWSrzV/dJMb9iuXIgr/3Z8uZLYjklI7zNPdjJiyl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWSrzV/dJMb9iuXIgr/3Z8uZLYjklI7zNPdjJiyl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWSrzV/dJMb9iuXIgr/3Z8uZLYjklI7zNPdjJiyl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWSrzV%2FdJMb9iuXIgr%2F3Z8uZLYjklI7zNPdjJiyl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;330&quot; height=&quot;504&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; PLS 폴더에작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Netlist 수정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NXFaM/dJMb82r7Zhy/q1ghiKQKaYPEsONKck6UA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NXFaM/dJMb82r7Zhy/q1ghiKQKaYPEsONKck6UA0/img.png&quot; data-origin-width=&quot;211&quot; data-origin-height=&quot;62&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;56.43&quot; style=&quot;width: 55.7715%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NXFaM/dJMb82r7Zhy/q1ghiKQKaYPEsONKck6UA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNXFaM%2FdJMb82r7Zhy%2Fq1ghiKQKaYPEsONKck6UA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;211&quot; height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfPtJI/dJMb9PM9fsi/8OVh3vy0Bj5ckkWdkkJAfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfPtJI/dJMb9PM9fsi/8OVh3vy0Bj5ckkWdkkJAfK/img.png&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;86&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.0657%;&quot; data-widthpercent=&quot;43.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfPtJI/dJMb9PM9fsi/8OVh3vy0Bj5ckkWdkkJAfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfPtJI%2FdJMb9PM9fsi%2F8OVh3vy0Bj5ckkWdkkJAfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;226&quot; height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1genus/ filelist &amp;rarr; pwm_layout.v HiCSL 로수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Xcelium 실행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VdWyT/dJMb9NBNwVl/72Hlek3avErOyPYEmIO7t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VdWyT/dJMb9NBNwVl/72Hlek3avErOyPYEmIO7t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VdWyT/dJMb9NBNwVl/72Hlek3avErOyPYEmIO7t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVdWyT%2FdJMb9NBNwVl%2F72Hlek3avErOyPYEmIO7t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;194&quot; height=&quot;28&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Waveform window 띄우기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xI8qe/dJMb9M3XDBg/bczk0KS6zc6kcKBXiGKPv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xI8qe/dJMb9M3XDBg/bczk0KS6zc6kcKBXiGKPv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xI8qe/dJMb9M3XDBg/bczk0KS6zc6kcKBXiGKPv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxI8qe%2FdJMb9M3XDBg%2Fbczk0KS6zc6kcKBXiGKPv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;537&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Simulation 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB0XeJ/dJMb9M3XDBr/yRFoT0dkAVy8XII7gJHigK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB0XeJ/dJMb9M3XDBr/yRFoT0dkAVy8XII7gJHigK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB0XeJ/dJMb9M3XDBr/yRFoT0dkAVy8XII7gJHigK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB0XeJ%2FdJMb9M3XDBr%2FyRFoT0dkAVy8XII7gJHigK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1610&quot; height=&quot;374&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Top Verilog 작성&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1760867967541&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module top_pwm (clk, reset, htime, ltime, pwmout,VDD, VSS);
    input clk;
    input reset;
    input [6:0] htime, ltime;
    input VDD;
    input VSS;
    output pwmout;
    
    PADI_ESD_Metal9 pad_clk (.PAD(clk));
    PADI_ESD_Metal9 pad_reset (.PAD(reset));
    PADI_ESD_Metal9 pad_htime0 (.PAD(htime[0]));
    PADI_ESD_Metal9 pad_htime1 (.PAD(htime[1]));
    PADI_ESD_Metal9 pad_htime2 (.PAD(htime[2]));
    PADI_ESD_Metal9 pad_htime3 (.PAD(htime[3]));
    PADI_ESD_Metal9 pad_htime4 (.PAD(htime[4]));
    PADI_ESD_Metal9 pad_htime5 (.PAD(htime[5]));
    PADI_ESD_Metal9 pad_htime6 (.PAD(htime[6]));
    PADI_ESD_Metal9 pad_ltime0 (.PAD(ltime[0]));        
    PADI_ESD_Metal9 pad_ltime1 (.PAD(ltime[1]));        
    PADI_ESD_Metal9 pad_ltime2 (.PAD(ltime[2]));        
    PADI_ESD_Metal9 pad_ltime3 (.PAD(ltime[3]));        
    PADI_ESD_Metal9 pad_ltime4 (.PAD(ltime[4]));        
    PADI_ESD_Metal9 pad_ltime5 (.PAD(ltime[5]));        
    PADI_ESD_Metal9 pad_ltime6 (.PAD(ltime[6]));  PADO_ESD_Metal9 pad_pwmout (.PAD(pwmout));
    PVDD_Metal9 pad_vdd(.VDD(VDD));
    PVSS_Metal9 pad_vss(.VSS(VSS));
    PCORNER_TL_Metal9 corner_TL();
    PCORNER_TR_Metal9 corner_TR();
    PCORNER_BL_Metal9 corner_BL();
    PCORNER_BR_Metal9 corner_BR();
    pwm pwm1(
         .clk(clk),
         .reset(reset),
         .htime(htime),
         .ltime(ltime),
         .pwmout(pwmout)
		);
 endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Top 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Pad 포함해서작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; ../1genus/ outputs_pwm/top_pwm_syn.v 저장&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Top Innovus 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Innouvs세팅&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGNbP/dJMb9eF5Y99/oUCkDyJKscv9gkv4UP7NqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGNbP/dJMb9eF5Y99/oUCkDyJKscv9gkv4UP7NqK/img.png&quot; style=&quot;width: 37.7525%; margin-right: 10px;&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;781&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;38.65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGNbP/dJMb9eF5Y99/oUCkDyJKscv9gkv4UP7NqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGNbP%2FdJMb9eF5Y99%2FoUCkDyJKscv9gkv4UP7NqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf53Lg/dJMb9N2RGPu/C2BhCWjLU5CJFVz9eDqRg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf53Lg/dJMb9N2RGPu/C2BhCWjLU5CJFVz9eDqRg1/img.png&quot; style=&quot;width: 25.3245%; margin-right: 10px;&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;782&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;25.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf53Lg/dJMb9N2RGPu/C2BhCWjLU5CJFVz9eDqRg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf53Lg%2FdJMb9N2RGPu%2FC2BhCWjLU5CJFVz9eDqRg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mMbGZ/dJMb9Mv7xsh/XzFFMnrvZja207oFtXHsdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mMbGZ/dJMb9Mv7xsh/XzFFMnrvZja207oFtXHsdk/img.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;829&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.5975%;&quot; data-widthpercent=&quot;35.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mMbGZ/dJMb9Mv7xsh/XzFFMnrvZja207oFtXHsdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmMbGZ%2FdJMb9Mv7xsh%2FXzFFMnrvZja207oFtXHsdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; P&amp;amp;R: Top Flooorplan&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Floorplan &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyUCDY/dJMb88lzMg6/M2fqY5Ca9N96LqPpGPMAk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyUCDY/dJMb88lzMg6/M2fqY5Ca9N96LqPpGPMAk0/img.png&quot; style=&quot;width: 31.1916%; margin-right: 10px;&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;659&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;31.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyUCDY/dJMb88lzMg6/M2fqY5Ca9N96LqPpGPMAk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyUCDY%2FdJMb88lzMg6%2FM2fqY5Ca9N96LqPpGPMAk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2OJ7a/dJMb9Mv7xsP/shtCRbnaK7tZiyXJKg3wvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2OJ7a/dJMb9Mv7xsP/shtCRbnaK7tZiyXJKg3wvK/img.png&quot; style=&quot;width: 32.3113%; margin-right: 10px;&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;659&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.08&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2OJ7a/dJMb9Mv7xsP/shtCRbnaK7tZiyXJKg3wvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2OJ7a%2FdJMb9Mv7xsP%2FshtCRbnaK7tZiyXJKg3wvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by5YFA/dJMb9Mv7xsY/U4KoSHbbOhNLp4wDLUyKg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by5YFA/dJMb9Mv7xsY/U4KoSHbbOhNLp4wDLUyKg0/img.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;655&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.1716%;&quot; data-widthpercent=&quot;34.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by5YFA/dJMb9Mv7xsY/U4KoSHbbOhNLp4wDLUyKg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby5YFA%2FdJMb9Mv7xsY%2FU4KoSHbbOhNLp4wDLUyKg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wn8ne/dJMb9LDYCUP/zis5dV5EKyCKBXnfUvYMkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wn8ne/dJMb9LDYCUP/zis5dV5EKyCKBXnfUvYMkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wn8ne/dJMb9LDYCUP/zis5dV5EKyCKBXnfUvYMkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWn8ne%2FdJMb9LDYCUP%2Fzis5dV5EKyCKBXnfUvYMkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;720&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: Top IO Filler&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; IO Filler 추가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dR9xbF/dJMb9OgoQjt/zo8fGotoP9gnrKLrGpbWH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dR9xbF/dJMb9OgoQjt/zo8fGotoP9gnrKLrGpbWH1/img.png&quot; style=&quot;width: 25.8119%; margin-right: 10px;&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;526&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;26.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dR9xbF/dJMb9OgoQjt/zo8fGotoP9gnrKLrGpbWH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdR9xbF%2FdJMb9OgoQjt%2Fzo8fGotoP9gnrKLrGpbWH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxDwq/dJMb9QedJsi/y3O2pbI9UqVEI9HD2TDHAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxDwq/dJMb9QedJsi/y3O2pbI9UqVEI9HD2TDHAK/img.png&quot; style=&quot;width: 36.4132%; margin-right: 10px;&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;662&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;37.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxDwq/dJMb9QedJsi/y3O2pbI9UqVEI9HD2TDHAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxDwq%2FdJMb9QedJsi%2Fy3O2pbI9UqVEI9HD2TDHAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6DE1U/dJMb9MJEjhe/oaap4yizzGG6uXCmiIeQD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6DE1U/dJMb9MJEjhe/oaap4yizzGG6uXCmiIeQD1/img.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;720&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.4493%;&quot; data-widthpercent=&quot;36.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6DE1U/dJMb9MJEjhe/oaap4yizzGG6uXCmiIeQD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6DE1U%2FdJMb9MJEjhe%2Foaap4yizzGG6uXCmiIeQD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzJC0P/dJMb9LDYCUd/h4oloCidZFPg6PK3KCGlC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzJC0P/dJMb9LDYCUd/h4oloCidZFPg6PK3KCGlC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzJC0P/dJMb9LDYCUd/h4oloCidZFPg6PK3KCGlC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzJC0P%2FdJMb9LDYCUd%2Fh4oloCidZFPg6PK3KCGlC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;615&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Power Stripe 추가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DfQ5j/dJMb9V7AzXe/tiEDwK9vdWI3W7SCxVq0gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DfQ5j/dJMb9V7AzXe/tiEDwK9vdWI3W7SCxVq0gK/img.png&quot; style=&quot;width: 49.0353%; margin-right: 10px;&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;166&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DfQ5j/dJMb9V7AzXe/tiEDwK9vdWI3W7SCxVq0gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDfQ5j%2FdJMb9V7AzXe%2FtiEDwK9vdWI3W7SCxVq0gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUdOw6/dJMb87trbOY/kKWuJMcgRJKZUyVk47u6I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUdOw6/dJMb87trbOY/kKWuJMcgRJKZUyVk47u6I1/img.png&quot; style=&quot;width: 24.1792%; margin-right: 10px;&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;395&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;24.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUdOw6/dJMb87trbOY/kKWuJMcgRJKZUyVk47u6I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUdOw6%2FdJMb87trbOY%2FkKWuJMcgRJKZUyVk47u6I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS4FDl/dJMb87trbO2/ziQcVLjJqVLM4gHTCIP880/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS4FDl/dJMb87trbO2/ziQcVLjJqVLM4gHTCIP880/img.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;741&quot; data-is-animation=&quot;false&quot; style=&quot;width: 24.4599%;&quot; data-widthpercent=&quot;25.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS4FDl/dJMb87trbO2/ziQcVLjJqVLM4gHTCIP880/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS4FDl%2FdJMb87trbO2%2FziQcVLjJqVLM4gHTCIP880%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Cell 을위한Power line 추가 &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boLnnt/dJMb81Uiakn/JWzMBGVjraXKc8Yu9Qr1g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boLnnt/dJMb81Uiakn/JWzMBGVjraXKc8Yu9Qr1g0/img.png&quot; style=&quot;width: 25.8811%; margin-right: 10px;&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;208&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;26.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boLnnt/dJMb81Uiakn/JWzMBGVjraXKc8Yu9Qr1g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboLnnt%2FdJMb81Uiakn%2FJWzMBGVjraXKc8Yu9Qr1g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;203&quot; height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpVEXN/dJMb9LYhvkx/CV15O2n2NRSrlZLwTgHsf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpVEXN/dJMb9LYhvkx/CV15O2n2NRSrlZLwTgHsf0/img.png&quot; style=&quot;width: 46.8692%; margin-right: 10px;&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;761&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;47.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpVEXN/dJMb9LYhvkx/CV15O2n2NRSrlZLwTgHsf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpVEXN%2FdJMb9LYhvkx%2FCV15O2n2NRSrlZLwTgHsf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1345&quot; height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwDm7/dJMb81Uiakx/FGvariM5groeNZmqLxg061/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwDm7/dJMb81Uiakx/FGvariM5groeNZmqLxg061/img.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;632&quot; data-is-animation=&quot;false&quot; style=&quot;width: 24.9241%;&quot; data-widthpercent=&quot;25.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwDm7/dJMb81Uiakx/FGvariM5groeNZmqLxg061/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwDm7%2FdJMb81Uiakx%2FFGvariM5groeNZmqLxg061%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P&amp;amp;R: TopCell 배치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Standard cell 배치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQhgmD/dJMb9bWUjhN/ILLUqOqKX0qNONZ64RbZnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQhgmD/dJMb9bWUjhN/ILLUqOqKX0qNONZ64RbZnk/img.png&quot; data-origin-width=&quot;169&quot; data-origin-height=&quot;133&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.0066%; margin-right: 10px;&quot; data-widthpercent=&quot;31.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQhgmD/dJMb9bWUjhN/ILLUqOqKX0qNONZ64RbZnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQhgmD%2FdJMb9bWUjhN%2FILLUqOqKX0qNONZ64RbZnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;169&quot; height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb6hML/dJMb9N9DstA/EzpOhFPdgboJKJPbj2Rmtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb6hML/dJMb9N9DstA/EzpOhFPdgboJKJPbj2Rmtk/img.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;168&quot; data-is-animation=&quot;false&quot; style=&quot;width: 67.8307%;&quot; data-widthpercent=&quot;68.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb6hML/dJMb9N9DstA/EzpOhFPdgboJKJPbj2Rmtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb6hML%2FdJMb9N9DstA%2FEzpOhFPdgboJKJPbj2Rmtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Routing&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n2E8F/dJMb9PsQrc3/DPblXwKPPzE2thqlpBwRnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n2E8F/dJMb9PsQrc3/DPblXwKPPzE2thqlpBwRnK/img.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;517&quot; data-is-animation=&quot;false&quot; style=&quot;width: 65.4897%; margin-right: 10px;&quot; data-widthpercent=&quot;66.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n2E8F/dJMb9PsQrc3/DPblXwKPPzE2thqlpBwRnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn2E8F%2FdJMb9PsQrc3%2FDPblXwKPPzE2thqlpBwRnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;847&quot; height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/780XU/dJMb9PsQrcz/eTfBBmEhYsdQj1XoBuYti0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/780XU/dJMb9PsQrcz/eTfBBmEhYsdQj1XoBuYti0/img.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;561&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.3475%;&quot; data-widthpercent=&quot;33.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/780XU/dJMb9PsQrcz/eTfBBmEhYsdQj1XoBuYti0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F780XU%2FdJMb9PsQrcz%2FeTfBBmEhYsdQj1XoBuYti0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Top Cell &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qm5ls/dJMb9MiAGCW/fWy7fkp4ZvG8QkKMxTXuK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qm5ls/dJMb9MiAGCW/fWy7fkp4ZvG8QkKMxTXuK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qm5ls/dJMb9MiAGCW/fWy7fkp4ZvG8QkKMxTXuK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqm5ls%2FdJMb9MiAGCW%2FfWy7fkp4ZvG8QkKMxTXuK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;829&quot; height=&quot;806&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;334&quot; data-start=&quot;101&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번에 들은 디지털 집적회로 기초 설계 실습은 &lt;b&gt;Verilog를 이용해 실제 IC 설계 과정을 처음부터 끝까지 경험해보는 수업&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-end=&quot;334&quot; data-start=&quot;101&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;PWM 회로를 직접 설계하면서 Vivado로 &lt;b&gt;RTL 코드를 작성하고 시뮬레이션을 통해 동작을 검증&lt;/b&gt;했습니다. 이후에는 Cadence의 Genus로 논리 합성(Synthesis)을 진행해, RTL 코드가 게이트 레벨 회로로 바뀌는 과정을 직접 확인했습니다.&lt;/p&gt;
&lt;p data-end=&quot;334&quot; data-start=&quot;101&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;512&quot; data-start=&quot;336&quot; data-ke-size=&quot;size16&quot;&gt;그 다음 Innovus를 사용해서 &lt;b&gt;Place &amp;amp; Route 단계&lt;/b&gt;까지 수행하면서, 회로를 실제 실리콘 위에 배치하고 배선하는 과정도 실습했어요. 마지막에는 **Post Layout Simulation(PLS)**을 통해 합성 전후의 지연 차이를 비교하며, 물리적 설계가 회로 동작에 미치는 영향을 배웠습니다.&lt;/p&gt;
&lt;p data-end=&quot;512&quot; data-start=&quot;336&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;692&quot; data-start=&quot;514&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 과정을 통해 단순히 코드를 짜는 것뿐 아니라, &lt;b&gt;하드웨어 설계가 실제 칩으로 구현되기까지의 전체 흐름&lt;/b&gt;을 이해할 수 있었고, 각 툴의 역할과 설계 데이터의 연결 구조를 명확히 배울 수 있었습니다.&lt;br /&gt;무엇보다 FPGA 수준이 아니라 &lt;b&gt;ASIC 수준의 설계 절차를 직접 경험해본 게 큰 도움이 되었습니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>IEDC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/139</guid>
      <comments>https://juniha.tistory.com/139#entry139comment</comments>
      <pubDate>Sun, 19 Oct 2025 20:19:30 +0900</pubDate>
    </item>
    <item>
      <title>[디지털 집적회로 기초 설계 실습]_RTL부터 P&amp;amp;R 까지 통합 플로우_1</title>
      <link>https://juniha.tistory.com/138</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;강의 목표&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본 강의는 디지털 IC 설계 입문자를 대상으로 한다. Cadence사의 Xcelium, Genus, Innovus를 활용해 RTL 설계, 합성, P&amp;amp;R에 이르는 전 과정을 단계별 실습으로 다룬다.&lt;/li&gt;
&lt;li&gt;이를 통해 디지털 IC 설계의 전체적인 흐름을 파악하고 실무에 빠르게 적응할 수 있는 역량을 키운다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;강의 개요&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PWM(Pulse Width Modulation)를 예제로 삼아 디지털 IC 설계에 필수적인 Cadence Xcelium, Genus, Innovus의 기본적인 사용법을 익힌다. Verilog RTL을 작성한 뒤 Xcelium으로 테스트벤치 기반 기능 검증을 수행하고, Genus로 제약(클록/타이밍) 설정 및 합성을 진행한다.&lt;/li&gt;
&lt;li&gt;이후, Innovus에서 배치, 배선을 수행하고 Post-Layout RC 추출을 거쳐, 최종적으로 SDF을 적용한 Gate-Level Simulation으로 최종 동작을 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg8AXW/dJMb9WrS3gw/jFhGsdLltD1OMBNsa2hOm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg8AXW/dJMb9WrS3gw/jFhGsdLltD1OMBNsa2hOm1/img.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;290&quot; data-is-animation=&quot;false&quot; style=&quot;width: 62.8976%; margin-right: 10px;&quot; data-widthpercent=&quot;63.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg8AXW/dJMb9WrS3gw/jFhGsdLltD1OMBNsa2hOm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg8AXW%2FdJMb9WrS3gw%2FjFhGsdLltD1OMBNsa2hOm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvPwWs/dJMb9WrS3gx/2TRyZQuxxRaQo0kZpzFspk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvPwWs/dJMb9WrS3gx/2TRyZQuxxRaQo0kZpzFspk/img.png&quot; data-origin-width=&quot;245&quot; data-origin-height=&quot;396&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.9396%;&quot; data-widthpercent=&quot;36.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvPwWs/dJMb9WrS3gx/2TRyZQuxxRaQo0kZpzFspk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvPwWs%2FdJMb9WrS3gx%2F2TRyZQuxxRaQo0kZpzFspk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;245&quot; height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; Behavioral Simulation&lt;/b&gt; : 작성한&amp;nbsp; RTL 코드가 의도한대로 동작하는지 시뮬레이션&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; Synthesis&lt;/b&gt; : RTL 코드를 논리게이트(Netlist) 수준으로 변환하는 과정&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; Place and Route (P&amp;amp;R)&lt;/b&gt; : 논리 게이트를 실제 실리콘 상에서 배치 및 연결하는 과정&lt;/li&gt;
&lt;li&gt;&lt;b&gt; Behavioral Modeling&amp;nbsp;&lt;/b&gt; &lt;br /&gt;&amp;nbsp;&amp;bull; 동작형태로구현&lt;br /&gt;&amp;nbsp;&amp;bull; 사람이이해하기쉽게표현&lt;br /&gt;&amp;nbsp;&amp;bull; 알고리즘/동작을 절차적으로표현&amp;rarr; 이해가쉽고 구현이 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RTL 설계 : Verilog 코드 작성&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1760701324016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module pwm(
    input wire clk,             // 기준 클록 입력
    input wire [6:0] htime,     // PWM의 High 구간 길이 (클록 개수 단위)
    input wire [6:0] ltime,     // PWM의 Low 구간 길이 (클록 개수 단위)
    input wire reset,           // 비동기 리셋 신호 (1이면 초기화)
    output reg pwmout           // PWM 출력 신호
    );
    
    // 9비트 카운터 (최대 511까지 카운트 가능)
    // High/Low 구간의 총 길이(htime + ltime)만큼 카운트함
    reg [8:0] counter;
    
    //============================================================
    // 메인 동작 블록
    // - clk의 상승 엣지마다 counter를 증가시키며,
    //   counter 값에 따라 pwmout을 1 또는 0으로 출력한다.
    // - reset 신호가 들어오면 pwmout과 counter를 초기화한다.
    //============================================================
    always @(posedge clk or posedge reset) begin
        if (reset) begin 
            // 리셋이 들어올 경우 모든 상태 초기화
            pwmout  &amp;lt;= 1'b0;     // PWM 출력 Low로 초기화
            counter &amp;lt;= 9'b0;     // 카운터 0으로 초기화
        end else begin
            // 전체 주기 내에서 카운트 진행
            if (counter &amp;lt; (htime + ltime - 7'd1)) begin
                // 현재 counter가 htime보다 작으면 High 구간
                if (counter &amp;lt; htime) begin
                    pwmout &amp;lt;= 1'd1;   // High 출력
                end else begin
                    pwmout &amp;lt;= 1'd0;   // Low 출력
                end
                // 클록마다 카운터 증가
                counter &amp;lt;= counter + 9'd1;
            end else begin
                // 한 주기(htime + ltime) 종료 시점 &amp;rarr; 카운터 리셋
                counter &amp;lt;= 9'd0;
            end
        end
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; PWM Module &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; High 시간과Low 시간을조절할수있는PWM 출력신호생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Input ports: clk, htime[6:0], ltime[6:0], reset&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Output ports : pwmout&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동작 설명&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drBqSR/dJMb9O1LFQK/O0XK717ZjtGyTgb4XECM9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drBqSR/dJMb9O1LFQK/O0XK717ZjtGyTgb4XECM9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drBqSR/dJMb9O1LFQK/O0XK717ZjtGyTgb4XECM9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrBqSR%2FdJMb9O1LFQK%2FO0XK717ZjtGyTgb4XECM9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;294&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/48gaA/dJMb9Xj1LOE/b6sHBkjDVLk9TEIvt51es1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/48gaA/dJMb9Xj1LOE/b6sHBkjDVLk9TEIvt51es1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/48gaA/dJMb9Xj1LOE/b6sHBkjDVLk9TEIvt51es1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F48gaA%2FdJMb9Xj1LOE%2Fb6sHBkjDVLk9TEIvt51es1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;309&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Board 정보입력 :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt; Zynq 7000 &lt;/u&gt;&lt;/b&gt;&lt;b&gt;&lt;u&gt;ZC702 Evaluation Board HiCSL&lt;/u&gt; 선택&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RTL 설계 : Testbench 코드 작성&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1760703137263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module pwm_tb();

    //============================================================
    // 입력 신호 정의
    //============================================================
    reg clk = 0;             // 클록 신호 (25ns 주기 &amp;rarr; 40MHz)
    reg [6:0] htime;         // PWM High 구간 길이
    reg [6:0] ltime;         // PWM Low 구간 길이
    reg reset;               // 리셋 신호
    wire pwmout;             // PWM 출력 (테스트 대상 모듈의 출력)

    //============================================================
    // 클록 생성 블록
    //============================================================
    // 12.5ns마다 clk 반전 &amp;rarr; 전체 주기 25ns (40MHz)
    always begin
        #12.5 clk = ~clk;
    end

    //============================================================
    // Reset 신호 생성 블록
    //============================================================
    // 시간 흐름에 따라 리셋 신호를 여러 번 활성화/비활성화하여
    // 모듈 초기화 동작을 테스트한다.
    initial begin
        reset = 1;    // 시작 시점에서 리셋 ON
        #10  reset = 0; // 10ns 후 리셋 OFF (정상 동작 시작)
        #50  reset = 1; // 50ns 뒤 다시 리셋 ON
        #10  reset = 0; // 10ns 후 리셋 OFF
    end

    //============================================================
    // 입력 파라미터 설정
    //============================================================
    // PWM의 High, Low 시간을 설정
    // &amp;rarr; htime=3, ltime=7 이면 주기 10클록(250ns), 듀티비 30%
    initial begin 
        htime = 7'd3;    // High 구간: 3클록 (3 &amp;times; 25ns = 75ns)
        ltime = 7'd7;    // Low 구간 : 7클록 (7 &amp;times; 25ns = 175ns)
    end

    //============================================================
    // 시뮬레이션 종료 조건
    //============================================================
    // 1000ns(=1us) 후 자동 종료
    initial begin
        #1000;
        $finish;         // 시뮬레이션 강제 종료
    end

    //============================================================
    // DUT (Device Under Test) 인스턴스화
    //============================================================
    // 실제 PWM 모듈을 불러와 입력 신호를 연결
    pwm dut(
        .clk(clk),        // 클록 입력
        .htime(htime),    // High 구간 길이 입력
        .ltime(ltime),    // Low 구간 길이 입력
        .reset(reset),    // 리셋 입력
        .pwmout(pwmout)   // PWM 출력
    );
     
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Pwm_tb module&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;bull;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;PWM 회로의테스트벤치Verilog 코드작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; clk, htime[6:0], ltime[6:0], reset&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; pwmout(출력)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 동작설명 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull;  &amp;nbsp; =&amp;nbsp; 2 &amp;times; 12.5 &amp;times; 1 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 25ns 의 주기를 갖는 clk 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; reset 신호 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; htime, ltime 변수에 특정값 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 시뮬레이션 종료 시간1000ns 로 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; pwmmodule 불러오기&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RTL 설계: Testbench Simulation&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JqTRQ/dJMb9PTT8Af/Vz8KfzLSMERsipkNNnYUa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JqTRQ/dJMb9PTT8Af/Vz8KfzLSMERsipkNNnYUa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JqTRQ/dJMb9PTT8Af/Vz8KfzLSMERsipkNNnYUa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJqTRQ%2FdJMb9PTT8Af%2FVz8KfzLSMERsipkNNnYUa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1306&quot; height=&quot;605&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA2abm/dJMb9XxyYTd/kLZKQINU0JapJoUGQTHF11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA2abm/dJMb9XxyYTd/kLZKQINU0JapJoUGQTHF11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA2abm/dJMb9XxyYTd/kLZKQINU0JapJoUGQTHF11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA2abm%2FdJMb9XxyYTd%2FkLZKQINU0JapJoUGQTHF11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1302&quot; height=&quot;184&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 시뮬레이션 출력 결과 &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CcKnM/dJMb9hphtm4/3FAL2LKibimpsK4Pk7vUn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CcKnM/dJMb9hphtm4/3FAL2LKibimpsK4Pk7vUn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CcKnM/dJMb9hphtm4/3FAL2LKibimpsK4Pk7vUn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCcKnM%2FdJMb9hphtm4%2F3FAL2LKibimpsK4Pk7vUn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;86&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;RTL 설계: Xcelium툴 시뮬레이션을 위한 코드작성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yts8P/dJMb9Mpk8Gf/yEIo9IiOhHa4YUrBkkW7jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yts8P/dJMb9Mpk8Gf/yEIo9IiOhHa4YUrBkkW7jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yts8P/dJMb9Mpk8Gf/yEIo9IiOhHa4YUrBkkW7jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyts8P%2FdJMb9Mpk8Gf%2FyEIo9IiOhHa4YUrBkkW7jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;214&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; RTL 설계: Xcelium툴 시뮬레이션을 위한 코드작성 &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3QWxa/dJMb9WFqfPL/poKgaAuPK0LTKPIGwJVMzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3QWxa/dJMb9WFqfPL/poKgaAuPK0LTKPIGwJVMzK/img.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;805&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.7285%; margin-right: 10px;&quot; data-widthpercent=&quot;59.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3QWxa/dJMb9WFqfPL/poKgaAuPK0LTKPIGwJVMzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3QWxa%2FdJMb9WFqfPL%2FpoKgaAuPK0LTKPIGwJVMzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djxn4b/dJMb9PTT8Tj/bdyC3JvR0D2talacxDqLmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djxn4b/dJMb9PTT8Tj/bdyC3JvR0D2talacxDqLmK/img.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;684&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;40.58&quot; style=&quot;width: 40.1087%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djxn4b/dJMb9PTT8Tj/bdyC3JvR0D2talacxDqLmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjxn4b%2FdJMb9PTT8Tj%2FbdyC3JvR0D2talacxDqLmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; RTL 설계: Xcelium을 위한 실행 파일 작성 &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBVZhH/dJMb9MQpjAr/dPeyYqh2AERSdWzZRFz9dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBVZhH/dJMb9MQpjAr/dPeyYqh2AERSdWzZRFz9dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBVZhH/dJMb9MQpjAr/dPeyYqh2AERSdWzZRFz9dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBVZhH%2FdJMb9MQpjAr%2FdPeyYqh2AERSdWzZRFz9dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;32&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;filelist&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760705138478&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rtl/pwm.v
rtl/pwm_tb.v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;run_xcelium.csh&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760705177074&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xrun -64bit -gui -f ./filelist -access +rwc -timescale 1ns/1ps&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Xcelium 실행 옵션 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull;&amp;nbsp; xrun : Xcelium 실행 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; -64bit : 64비트 환경에서 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; -gui : gui 모드로 시뮬레이터 실행(Simvision)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; -ffilelist : 필요한 파일 목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; -access + rwc : 변수 접근 권한(read,write,create)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; -timescale 1ns / 1ps : 시뮬레이션의 시간단위 / 정밀도&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; RTL 설계 : Xcelium Waveform Window &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cICcF1/dJMb9XxyY5e/LJki0oV2xjfOqW4Uoz5lRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cICcF1/dJMb9XxyY5e/LJki0oV2xjfOqW4Uoz5lRk/img.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;457&quot; data-is-animation=&quot;false&quot; style=&quot;width: 19.7013%; margin-right: 10px;&quot; data-widthpercent=&quot;19.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cICcF1/dJMb9XxyY5e/LJki0oV2xjfOqW4Uoz5lRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcICcF1%2FdJMb9XxyY5e%2FLJki0oV2xjfOqW4Uoz5lRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNKW5/dJMb9Om9Oll/iQIx5ktyTngQQQkrbKCa70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNKW5/dJMb9Om9Oll/iQIx5ktyTngQQQkrbKCa70/img.png&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;349&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;80.07&quot; style=&quot;width: 79.1359%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNKW5/dJMb9Om9Oll/iQIx5ktyTngQQQkrbKCa70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNKW5%2FdJMb9Om9Oll%2FiQIx5ktyTngQQQkrbKCa70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시뮬레이션 출력값&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEP0M/dJMb9PTT81m/uJIKpSeQZkFKXTTvt2mP8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEP0M/dJMb9PTT81m/uJIKpSeQZkFKXTTvt2mP8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEP0M/dJMb9PTT81m/uJIKpSeQZkFKXTTvt2mP8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEP0M%2FdJMb9PTT81m%2FuJIKpSeQZkFKXTTvt2mP8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;299&quot; height=&quot;70&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; Vivado에서 검증한 값과 동일함을 확인&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Synthesis &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Synthesis :&amp;nbsp; HDL 을 최적화된 게이트레벨 표현으로 변환하는 과정 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Synthesis Design Flow &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ubzKZ/dJMb9NV5tp6/YLKDP4KkUwKwkKwrGWD8hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ubzKZ/dJMb9NV5tp6/YLKDP4KkUwKwkKwrGWD8hK/img.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;466&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.5072%; margin-right: 10px;&quot; data-widthpercent=&quot;46.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ubzKZ/dJMb9NV5tp6/YLKDP4KkUwKwkKwrGWD8hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FubzKZ%2FdJMb9NV5tp6%2FYLKDP4KkUwKwkKwrGWD8hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfk92t/dJMb9WelW6N/N1pK7QXKxOHeQZEVQ1a6J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfk92t/dJMb9WelW6N/N1pK7QXKxOHeQZEVQ1a6J1/img.png&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;362&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.33%;&quot; data-widthpercent=&quot;53.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfk92t/dJMb9WelW6N/N1pK7QXKxOHeQZEVQ1a6J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfk92t%2FdJMb9WelW6N%2FN1pK7QXKxOHeQZEVQ1a6J1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1107&quot; height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Synthesis Transformations &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; RTL source 입력 및 변환: Verilog/VHDL 등으로 작성된 설계 소스준비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Timing Constraints 입력: 타이밍, 전력, 면적 등 설계 목표를 SDC 파일 등으로입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 합성및최적화: 논리최적화와standard cell 라이브러리매핑을동시에수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 합성결과저장: .v , .sdf, .sdc 등 다양한 포맷의결과를저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Synthesis : Timing Constraints 파일 작성 &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wdcHv/dJMb9YpHHIr/0wFEDQve9lPnGFf2Hn6CN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wdcHv/dJMb9YpHHIr/0wFEDQve9lPnGFf2Hn6CN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wdcHv/dJMb9YpHHIr/0wFEDQve9lPnGFf2Hn6CN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwdcHv%2FdJMb9YpHHIr%2F0wFEDQve9lPnGFf2Hn6CN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;716&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Synthesis: tcl 파일 작성 &amp;lt;tggenus_syn.tcl&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mGV0p/dJMb9XK58Os/cK9s8gdg1ifjvflhakKin0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mGV0p/dJMb9XK58Os/cK9s8gdg1ifjvflhakKin0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mGV0p/dJMb9XK58Os/cK9s8gdg1ifjvflhakKin0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmGV0p%2FdJMb9XK58Os%2FcK9s8gdg1ifjvflhakKin0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;869&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; tclfile (Tool Command Language)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 터미널 &amp;rarr;vi tggenus_syn.tcl 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Genus에서 쓰는 명령을 스크립트로 정리해 반복작업을 자동화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 환경 변수부터 합성,&amp;nbsp; 출력 파일까지 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 1genus HiCSL 폴더에 배치&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Synthesis: Genus 실행을 위한 csh 파일 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB7WXP/dJMb9WFqfTJ/CROI7bhVAcoi6ZwhfnCOik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB7WXP/dJMb9WFqfTJ/CROI7bhVAcoi6ZwhfnCOik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB7WXP/dJMb9WFqfTJ/CROI7bhVAcoi6ZwhfnCOik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB7WXP%2FdJMb9WFqfTJ%2FCROI7bhVAcoi6ZwhfnCOik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1089&quot; height=&quot;44&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760706687258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod_755 ./run_genus.csh 
./run_genus.csh&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Synthesis: 출력된 Report 분석&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Report_are&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTCPiE/dJMb9LYgZwP/yOPUyz6Z7JPPgye072zQp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTCPiE/dJMb9LYgZwP/yOPUyz6Z7JPPgye072zQp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTCPiE/dJMb9LYgZwP/yOPUyz6Z7JPPgye072zQp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTCPiE%2FdJMb9LYgZwP%2FyOPUyz6Z7JPPgye072zQp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;72&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 터미널 &amp;rarr;v i ./reports_pwm / report_area.rpt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Standard cell 을 기준으로 면적 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 총면적 = 408.737 mm^2&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Report_power &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mUK5g/dJMb9N9CVtu/XKRiMjvSvDZkt0cAREae4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mUK5g/dJMb9N9CVtu/XKRiMjvSvDZkt0cAREae4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mUK5g/dJMb9N9CVtu/XKRiMjvSvDZkt0cAREae4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmUK5g%2FdJMb9N9CVtu%2FXKRiMjvSvDZkt0cAREae4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;308&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; v i ./reports_pwm/report_power.rpt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 소모전력= 4.6 mW&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Report_qor (Quality of Results)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkTrtS/dJMb9Wk7wkU/SQKp1XWEw11FUofDEjOBQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkTrtS/dJMb9Wk7wkU/SQKp1XWEw11FUofDEjOBQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkTrtS/dJMb9Wk7wkU/SQKp1XWEw11FUofDEjOBQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkTrtS%2FdJMb9Wk7wkU%2FSQKp1XWEw11FUofDEjOBQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;384&quot; height=&quot;644&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; v i ./reports_pwm/report_qor.rpt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 설계 핵심 지표를 요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Report_timing&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lKnLj/dJMb9Qeda3b/jePu9KqKRyoyWLqFlgsDf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lKnLj/dJMb9Qeda3b/jePu9KqKRyoyWLqFlgsDf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lKnLj/dJMb9Qeda3b/jePu9KqKRyoyWLqFlgsDf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlKnLj%2FdJMb9Qeda3b%2FjePu9KqKRyoyWLqFlgsDf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;326&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 각 net 별로 도작 시간 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Slack을 통해 Timing error 분석&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Synthesis : Genus에서 Schematic 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4M5k/dJMb9VT2809/19xRMz8sSnZ83YjjELel7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4M5k/dJMb9VT2809/19xRMz8sSnZ83YjjELel7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4M5k/dJMb9VT2809/19xRMz8sSnZ83YjjELel7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4M5k%2FdJMb9VT2809%2F19xRMz8sSnZ83YjjELel7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2380&quot; height=&quot;717&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Genus Main Window &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; Genus 메인화면에서 PWM 회로도확인가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;bull; 확대하면 각 논리소자가 해당 표준 셀인스턴스로 매핑되어 표시&lt;/p&gt;</description>
      <category>IEDC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/138</guid>
      <comments>https://juniha.tistory.com/138#entry138comment</comments>
      <pubDate>Fri, 17 Oct 2025 22:38:26 +0900</pubDate>
    </item>
    <item>
      <title>[대한 상공 회의소] 광주 인력개발원_ 프로젝트 발표회</title>
      <link>https://juniha.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;1542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNDph/btsQaf6CtcX/RBfyQFGU0eSD8fAL3PWRo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNDph/btsQaf6CtcX/RBfyQFGU0eSD8fAL3PWRo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNDph/btsQaf6CtcX/RBfyQFGU0eSD8fAL3PWRo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNDph%2FbtsQaf6CtcX%2FRBfyQFGU0eSD8fAL3PWRo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;1169&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;1542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;152&quot; data-start=&quot;126&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;행사 소개&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;275&quot; data-start=&quot;153&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;193&quot; data-start=&quot;153&quot;&gt;행사명: &lt;b&gt;AX 실무인재양성 협의체 출범 및 프로젝트 발표회&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;223&quot; data-start=&quot;194&quot;&gt;일시: 2025년 8월 7일 (목) 14:00&lt;/li&gt;
&lt;li data-end=&quot;251&quot; data-start=&quot;224&quot;&gt;장소: 대한상공회의소 광주인력개발원 대강당&lt;/li&gt;
&lt;li data-end=&quot;275&quot; data-start=&quot;252&quot;&gt;주최: 대한상공회의소 광주인력개발원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mnftf/btsP863qWk8/4p2kynVbtYcKwGFO3w4R01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mnftf/btsP863qWk8/4p2kynVbtYcKwGFO3w4R01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mnftf/btsP863qWk8/4p2kynVbtYcKwGFO3w4R01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmnftf%2FbtsP863qWk8%2F4p2kynVbtYcKwGFO3w4R01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1821&quot; height=&quot;895&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T4urB/btsP8DN05se/DNhbuBkKgyeMmb6Vpmmnn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T4urB/btsP8DN05se/DNhbuBkKgyeMmb6Vpmmnn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T4urB/btsP8DN05se/DNhbuBkKgyeMmb6Vpmmnn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT4urB%2FbtsP8DN05se%2FDNhbuBkKgyeMmb6Vpmmnn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1783&quot; height=&quot;745&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c89dr7/btsQaflhlp3/kmCdm4YIiB7xgsK39371L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c89dr7/btsQaflhlp3/kmCdm4YIiB7xgsK39371L1/img.png&quot; data-origin-width=&quot;1411&quot; data-origin-height=&quot;1058&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.2612%; margin-right: 10px;&quot; data-widthpercent=&quot;64.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c89dr7/btsQaflhlp3/kmCdm4YIiB7xgsK39371L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc89dr7%2FbtsQaflhlp3%2FkmCdm4YIiB7xgsK39371L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1411&quot; height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VY6mX/btsP9KZ9cc5/MqKjPaKIRc6zZUQGJwPI01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VY6mX/btsP9KZ9cc5/MqKjPaKIRc6zZUQGJwPI01/img.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.576%;&quot; data-widthpercent=&quot;35.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VY6mX/btsP9KZ9cc5/MqKjPaKIRc6zZUQGJwPI01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVY6mX%2FbtsP9KZ9cc5%2FMqKjPaKIRc6zZUQGJwPI01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;348&quot; data-start=&quot;324&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;행사 주요 내용 요약&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;453&quot; data-start=&quot;349&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;388&quot; data-start=&quot;349&quot;&gt;AI, 반도체 등 &lt;b&gt;첨단산업 인재 양성을 위한 협의체 출범&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;389&quot;&gt;지역 산업 주도의 실무인재 양성 시작을 알리는 자리&lt;/li&gt;
&lt;li data-end=&quot;453&quot; data-start=&quot;422&quot;&gt;여러 프로젝트 성과 발표 및 향후 협력 방향 논의&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpKSPM/btsQahJ9aA6/TbR7O90B9VYScELNbxNCHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpKSPM/btsQahJ9aA6/TbR7O90B9VYScELNbxNCHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpKSPM/btsQahJ9aA6/TbR7O90B9VYScELNbxNCHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpKSPM%2FbtsQahJ9aA6%2FTbR7O90B9VYScELNbxNCHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;801&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZZeco/btsP9KMCHgV/znoiAI25za0KKNPe4vnmx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZZeco/btsP9KMCHgV/znoiAI25za0KKNPe4vnmx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZZeco/btsP9KMCHgV/znoiAI25za0KKNPe4vnmx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZZeco%2FbtsP9KMCHgV%2FznoiAI25za0KKNPe4vnmx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1710&quot; height=&quot;627&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYFVHf/btsP9MwTWJh/agXKyjqJeG3ekEysOTcQg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYFVHf/btsP9MwTWJh/agXKyjqJeG3ekEysOTcQg1/img.png&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;801&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYFVHf/btsP9MwTWJh/agXKyjqJeG3ekEysOTcQg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYFVHf%2FbtsP9MwTWJh%2FagXKyjqJeG3ekEysOTcQg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mq5Xm/btsQaKrL3Aw/CvCazt7E4ukDMuHQeLd3Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mq5Xm/btsQaKrL3Aw/CvCazt7E4ukDMuHQeLd3Q0/img.png&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;801&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mq5Xm/btsQaKrL3Aw/CvCazt7E4ukDMuHQeLd3Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMq5Xm%2FbtsQaKrL3Aw%2FCvCazt7E4ukDMuHQeLd3Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHL55/btsP9CgWbJY/gko2w8k1ALU9Vys0gRMaj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHL55/btsP9CgWbJY/gko2w8k1ALU9Vys0gRMaj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHL55/btsP9CgWbJY/gko2w8k1ALU9Vys0gRMaj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHL55%2FbtsP9CgWbJY%2Fgko2w8k1ALU9Vys0gRMaj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;383&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;548&quot; data-start=&quot;525&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;참여 후기&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;717&quot; data-start=&quot;549&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;717&quot; data-start=&quot;691&quot;&gt;지난 6개월 동안 광주 인력개발원에서 배운 내용을 바탕으로, 마지막 2인 프로젝트인 &lt;b&gt;Smart Mobility Platform&lt;/b&gt;을 준비하여 발표할 기회를 가졌습니다. 단 5일이라는 짧은 준비 기간이었지만, 기업인사분들이 직접 참석한 자리에서 프로젝트를 소개하고 설명할 수 있었다는 점이 매우 뜻깊었습니다.학생의 시각에서 프로젝트를 바라봤을 때는 아이디어가 한정적이었지만, 이번 기회를 통해 기업인분들이 주신 여러 의견과 확장 아이디어를 접하면서 새로운 관점을 배울 수 있었습니다. &lt;b&gt;&amp;ldquo;이런 방향으로 발전시켜보면 어떨까?&amp;rdquo;&lt;/b&gt; 하는 생각들이 떠오르면서 제 시야가 훨씬 넓어진 소중한 시간이었습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li data-end=&quot;781&quot; data-start=&quot;664&quot;&gt;이번 경험을 통해 단순한 기술 구현을 넘어, &lt;b&gt;현장에서 요구되는 실질적인 가치와 확장 가능성&lt;/b&gt;을 고민하는 태도의 중요성을 깨달았습니다. 앞으로도 이런 기회를 발판 삼아 더 배우고 성장해 나가고 싶습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li data-end=&quot;494&quot; data-start=&quot;323&quot;&gt;발표 과정에서는 긴장도 많이 했지만, 실제 기업 관계자분들 앞에서 설명하는 경험은 앞으로 취업 시장을 준비하는 데에 있어 큰 자산이 될 것이라 생각합니다. 특히 기업인분들의 다양한 질문과 관심이 처음에는 부담스럽게 느껴졌지만, 설명을 이어가면서 점점 제 발표 능력이 향상되는 것을 체감할 수 있었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/136</guid>
      <comments>https://juniha.tistory.com/136#entry136comment</comments>
      <pubDate>Wed, 27 Aug 2025 15:24:00 +0900</pubDate>
    </item>
    <item>
      <title>[Project]Smart Mobility platform</title>
      <link>https://juniha.tistory.com/135</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; Main Title &amp;nbsp;: Smart Mobility platform&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Subtitle&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/b&gt;AXI-based Real - time Attitude Stabilization and Autonomous Obstacle Avoidance SoC Platform via 2D Distance Mapping&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;139&quot; data-start=&quot;99&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Development Environment &amp;amp; Tools&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;468&quot; data-start=&quot;140&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;236&quot; data-start=&quot;140&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;FPGA (Basys3): Xilinx Vivado&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;236&quot; data-start=&quot;183&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;236&quot; data-start=&quot;183&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Block Design, IP Integration, Verilog Compilation&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;325&quot; data-start=&quot;237&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Embedded SW Development: Xilinx Vitis&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;325&quot; data-start=&quot;289&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;325&quot; data-start=&quot;289&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Platform Creation, C Application&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;326&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Simulation &amp;amp; Debugging:&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;425&quot; data-start=&quot;360&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;360&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Vivado Simulator, Logic Analyzer, UART Monitor (&lt;b&gt;CoolTerm&lt;/b&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;468&quot; data-start=&quot;426&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Python &amp;amp; Scripting: LUT Generation&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;500&quot; data-start=&quot;470&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;Programming Languages&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;687&quot; data-start=&quot;501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;571&quot; data-start=&quot;501&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Verilog HDL&lt;/b&gt;: Custom MyIP (FSM, Cartesian Transform, PWM, etc.)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;636&quot; data-start=&quot;572&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;C&lt;/b&gt;: I&amp;sup2;C Control, AXI Register Access, LCD/OLED/UART Logic&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;687&quot; data-start=&quot;637&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Python&lt;/b&gt;: Sin/Cos LUT Auto-Generation Script&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AXI4_Lite Interface &lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOiRmD/btsP6YLRbKR/aTSfaYYk59O99cdgKt8vTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOiRmD/btsP6YLRbKR/aTSfaYYk59O99cdgKt8vTK/img.png&quot; data-alt=&quot;[그림 1] AXI Read &amp;amp;amp; Write Channels&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOiRmD/btsP6YLRbKR/aTSfaYYk59O99cdgKt8vTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOiRmD%2FbtsP6YLRbKR%2FaTSfaYYk59O99cdgKt8vTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;268&quot; height=&quot;1026&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] AXI Read &amp;amp; Write Channels&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AXI4-Lite &lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; For simple, low-throughput memory-mapped communication&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Example: to and from control and status registers)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Transfer Timing Diagram &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rs6W5/btsP8Ba8knL/51ej2OyYlkhrMVCmsgjb7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rs6W5/btsP8Ba8knL/51ej2OyYlkhrMVCmsgjb7k/img.png&quot; data-alt=&quot;[그림 2] Transfer Timing Diagram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rs6W5/btsP8Ba8knL/51ej2OyYlkhrMVCmsgjb7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRs6W5%2FbtsP8Ba8knL%2F51ej2OyYlkhrMVCmsgjb7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;180&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] Transfer Timing Diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AXI4_Transactions&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vjtkx/btsP8OuEKKx/zLgvkIi46H6pOijfKiPK50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vjtkx/btsP8OuEKKx/zLgvkIi46H6pOijfKiPK50/img.png&quot; data-alt=&quot;[그림 3] AXI Read Transactions&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vjtkx/btsP8OuEKKx/zLgvkIi46H6pOijfKiPK50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvjtkx%2FbtsP8OuEKKx%2FzLgvkIi46H6pOijfKiPK50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;192&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] AXI Read Transactions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzdn17/btsP7nEFCsR/Up6X8njNjo9mVBDBBuRkT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzdn17/btsP7nEFCsR/Up6X8njNjo9mVBDBBuRkT1/img.png&quot; data-alt=&quot;[그림 4] AXI Write Transactions&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzdn17/btsP7nEFCsR/Up6X8njNjo9mVBDBBuRkT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdzdn17%2FbtsP7nEFCsR%2FUp6X8njNjo9mVBDBBuRkT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;184&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] AXI Write Transactions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsa2aI/btsP9InkxK6/fxfpHsELUK7Ck8a4tPnVsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsa2aI/btsP9InkxK6/fxfpHsELUK7Ck8a4tPnVsK/img.png&quot; data-alt=&quot;[그림 5] AXI4 Signals&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsa2aI/btsP9InkxK6/fxfpHsELUK7Ck8a4tPnVsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsa2aI%2FbtsP9InkxK6%2FfxfpHsELUK7Ck8a4tPnVsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;388&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] AXI4 Signals&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;128&quot; data-start=&quot;102&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;nbsp;System Architecture&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2510&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGai2/btsP7o4Jhru/ez7Vzs2MQCu37M8AHePgik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGai2/btsP7o4Jhru/ez7Vzs2MQCu37M8AHePgik/img.png&quot; data-alt=&quot;[그림 6] &amp;amp;nbsp;System Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGai2/btsP7o4Jhru/ez7Vzs2MQCu37M8AHePgik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGai2%2FbtsP7o4Jhru%2Fez7Vzs2MQCu37M8AHePgik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2510&quot; height=&quot;1158&quot; data-origin-width=&quot;2510&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] &amp;nbsp;System Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;PWM (DC 모터) &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;86&quot; data-start=&quot;57&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Forward Mode&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;151&quot; data-start=&quot;87&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;123&quot; data-start=&quot;87&quot;&gt;&lt;b&gt;Start 버튼&lt;/b&gt;을 누르면 차량이 앞으로 이동합니다.&lt;/li&gt;
&lt;li data-end=&quot;151&quot; data-start=&quot;124&quot;&gt;&lt;b&gt;Stop 버튼&lt;/b&gt;을 누르면 정지합니다.&lt;/li&gt;
&lt;/ul&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h4 data-end=&quot;187&quot; data-start=&quot;158&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Turning Mode&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;243&quot; data-start=&quot;188&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;243&quot; data-start=&quot;188&quot;&gt;&lt;b&gt;Left / Right 버튼&lt;/b&gt;을 누르면 한쪽 바퀴가 회전하여 차량의 방향을 전환합니다.&lt;/li&gt;
&lt;/ul&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Precise Angle Control&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;406&quot; data-start=&quot;292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;338&quot; data-start=&quot;292&quot;&gt;모터의 회전 시간을 기준으로 &lt;b&gt;PWM 듀티 비율&lt;/b&gt;을 세밀하게 조정합니다.&lt;/li&gt;
&lt;li data-end=&quot;406&quot; data-start=&quot;339&quot;&gt;일정하고 짧은 회전 시간 동안 동작하여 차량은 매번 약 &lt;b&gt;10도씩 회전&lt;/b&gt;하며, 정확한 방향 제어가 가능합니다.&lt;/li&gt;
&lt;li data-end=&quot;406&quot; data-start=&quot;339&quot;&gt;10도씩 회전하는 이유는 &lt;b&gt;초음파 센서&lt;/b&gt;와 &lt;b&gt;동일한 각도&lt;/b&gt;로 움직이기 위해 &lt;b&gt;10도씩 회전&lt;/b&gt;하도록 설정하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; PWM (Servo_Motor) &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;942&quot; data-start=&quot;882&quot;&gt;원하는 각도는 스위치를 통해 선택되며, FND에는 현재 서보 각도가 &lt;b&gt;10&amp;deg; 단위&lt;/b&gt;로 표시됩니다.&lt;/li&gt;
&lt;li data-end=&quot;995&quot; data-start=&quot;943&quot;&gt;Enable 신호가 활성화되면 서보 모터는 &lt;b&gt;10&amp;deg;씩 단계적으로 연속 회전&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3AG4M/btsP9957yNO/J5sqbqZAwd1Vk1X1KvEfEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3AG4M/btsP9957yNO/J5sqbqZAwd1Vk1X1KvEfEk/img.png&quot; data-alt=&quot;[그림 7 Servo_Motor ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3AG4M/btsP9957yNO/J5sqbqZAwd1Vk1X1KvEfEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3AG4M%2FbtsP9957yNO%2FJ5sqbqZAwd1Vk1X1KvEfEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;370&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7 Servo_Motor ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;250&quot; data-end=&quot;291&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Servo Motor 1 &lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1067&quot; data-start=&quot;1018&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1042&quot; data-start=&quot;1018&quot;&gt;회전 범위: &lt;b&gt;0&amp;deg; ~ 180&amp;deg;&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1067&quot; data-start=&quot;1043&quot;&gt;환경 스캐닝(거리 측정) 용도로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;250&quot; data-end=&quot;291&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Servo Motor 2 &lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1188&quot; data-start=&quot;1085&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1124&quot; data-start=&quot;1085&quot;&gt;프로토타입 구조상 회전 범위가 **0&amp;deg; ~ 140&amp;deg;**로 제한됨&lt;/li&gt;
&lt;li data-end=&quot;1150&quot; data-start=&quot;1125&quot;&gt;초음파 센서와 결합되어 방향 제어 수행&lt;/li&gt;
&lt;li data-end=&quot;1188&quot; data-start=&quot;1151&quot;&gt;최종 각도는 &lt;b&gt;MPU6050 자세 데이터&lt;/b&gt;에 따라 보정됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;250&quot; data-end=&quot;291&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Auto-Leveling Behavior &lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1299&quot; data-start=&quot;1210&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1261&quot; data-start=&quot;1210&quot;&gt;자이로스코프가 수평 상태를 감지하면, Servo 2는 자동으로 **70&amp;deg;**로 설정됨&lt;/li&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1262&quot;&gt;초음파 센서가 항상 &lt;b&gt;수평 정렬 상태&lt;/b&gt;를 유지하도록 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Ultrasonic Sensor (HC-SR04) &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;699&quot; data-start=&quot;657&quot;&gt;초기 상태에서는 현재 서보 모터의 각도가 &lt;b&gt;FND&lt;/b&gt;에 표시됩니다.&lt;/li&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;700&quot;&gt;모드가 변경되면 &lt;b&gt;FND&lt;/b&gt;에 초음파 센서로부터의 실시간 거리 값이 표시됩니다.&lt;/li&gt;
&lt;li data-end=&quot;786&quot; data-start=&quot;750&quot;&gt;리셋 후 서보 모터는 &lt;b&gt;0&amp;deg; 초기 위치&lt;/b&gt;로 복귀합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Direction Selection Based on Distance Data &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;858&quot; data-start=&quot;817&quot;&gt;총 &lt;b&gt;19개 방향&lt;/b&gt;(10&amp;deg; 간격)에서 거리 데이터를 수집합니다.&lt;/li&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;859&quot;&gt;가장 먼 거리를 가진 방향을 식별합니다.&lt;/li&gt;
&lt;li data-end=&quot;926&quot; data-start=&quot;886&quot;&gt;초음파 센서는 자동으로 회전하여 &lt;b&gt;가장 먼 방향&lt;/b&gt;을 향합니다.&lt;/li&gt;
&lt;/ul&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Temperature and Humidity Sensor (DHT11)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1298&quot; data-start=&quot;1235&quot;&gt;&lt;b&gt;DHT11 센서&lt;/b&gt;를 이용해 주변 온도를 측정하고, 이를 초음파 거리 보정에 적용하여 오차를 줄입니다.&lt;/li&gt;
&lt;li data-end=&quot;1328&quot; data-start=&quot;1299&quot;&gt;보정된 거리 값은 &lt;b&gt;FND&lt;/b&gt;에 표시됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Distance Adjustment Values per Temperature&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ruGHG/btsP8Dz90Lq/63ggAUx6Wyy7kKYgRwSFLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ruGHG/btsP8Dz90Lq/63ggAUx6Wyy7kKYgRwSFLk/img.png&quot; data-alt=&quot;[그림 7] Distance Adjustment Values per Temperature&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ruGHG/btsP8Dz90Lq/63ggAUx6Wyy7kKYgRwSFLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FruGHG%2FbtsP8Dz90Lq%2F63ggAUx6Wyy7kKYgRwSFLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;246&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] Distance Adjustment Values per Temperature&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Equdation&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RUviE/btsQaacT5mX/j775rIQWj7MBcG6MKo3fHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RUviE/btsQaacT5mX/j775rIQWj7MBcG6MKo3fHK/img.png&quot; data-alt=&quot;[그림 8] Equation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RUviE/btsQaacT5mX/j775rIQWj7MBcG6MKo3fHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRUviE%2FbtsQaacT5mX%2Fj775rIQWj7MBcG6MKo3fHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;176&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Equation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; I2C Communication Protocol&lt;/b&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;I2C OLED Display&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;467&quot; data-start=&quot;427&quot;&gt;&lt;b&gt;MPU6050 센서 데이터&lt;/b&gt;를 I2C를 통해 OLED에 표시&lt;/li&gt;
&lt;li data-end=&quot;510&quot; data-start=&quot;468&quot;&gt;자세(Attitude) 데이터를 &lt;b&gt;실시간 OLED 화면&lt;/b&gt;으로 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;UART Serial Output&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;562&quot; data-start=&quot;530&quot;&gt;&lt;b&gt;MPU6050 센서 데이터&lt;/b&gt;를 UART로 출력&lt;/li&gt;
&lt;li data-end=&quot;604&quot; data-start=&quot;563&quot;&gt;자세(Attitude) 데이터를 &lt;b&gt;UART 직렬 통신&lt;/b&gt;으로 전송&lt;/li&gt;
&lt;/ul&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Python Script Automation&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Purpose&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;230&quot; data-start=&quot;143&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;230&quot; data-start=&quot;143&quot;&gt;FPGA 메모리 IP에서 사용할 &lt;b&gt;사인/코사인 값(.coe 파일)&lt;/b&gt; 을 자동 생성&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Key Features&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;1251&quot; data-end=&quot;1300&quot;&gt;&lt;b&gt;0&amp;deg; ~ 180&amp;deg;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구간에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;10&amp;deg; 간격&lt;/b&gt;으로 총 19개 포인트 샘플링&lt;/li&gt;
&lt;li data-start=&quot;1301&quot; data-end=&quot;1361&quot;&gt;&lt;b&gt;sin(&amp;theta;), cos(&amp;theta;)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;값을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Q1.15 형식(16비트 signed 정수)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 변환&lt;/li&gt;
&lt;li data-start=&quot;1362&quot; data-end=&quot;1424&quot;&gt;Vivado Block Memory Generator에서 사용할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;.coe 파일 자동 생성&lt;/b&gt;&lt;/li&gt;
&lt;li data-start=&quot;1425&quot; data-end=&quot;1467&quot;&gt;생성 예시 파일:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sin_lut.coe, cos_lut.coe&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB5qVY/btsP8xmCuWB/NqywkDMbMk3VvkwU39sEbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB5qVY/btsP8xmCuWB/NqywkDMbMk3VvkwU39sEbK/img.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;562&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;62.97&quot; width=&quot;411&quot; height=&quot;441&quot; style=&quot;width: 62.2427%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB5qVY/btsP8xmCuWB/NqywkDMbMk3VvkwU39sEbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB5qVY%2FbtsP8xmCuWB%2FNqywkDMbMk3VvkwU39sEbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/89dmQ/btsP65LsS5G/gYch5ZGj0EWikF6UAoKpWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/89dmQ/btsP65LsS5G/gYch5ZGj0EWikF6UAoKpWk/img.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;467&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;37.03&quot; style=&quot;width: 36.5945%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/89dmQ/btsP65LsS5G/gYch5ZGj0EWikF6UAoKpWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F89dmQ%2FbtsP65LsS5G%2FgYch5ZGj0EWikF6UAoKpWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[그림 9] sin &amp;amp; cos Value Generator / .coe&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; Proto Type &lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pvPqn/btsP8glbL0z/rdOkxfJcKel3ZPry3kB5N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pvPqn/btsP8glbL0z/rdOkxfJcKel3ZPry3kB5N1/img.png&quot; data-alt=&quot;[그림 10 ] Proto Type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pvPqn/btsP8glbL0z/rdOkxfJcKel3ZPry3kB5N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpvPqn%2FbtsP8glbL0z%2FrdOkxfJcKel3ZPry3kB5N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;523&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 10 ] Proto Type&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;291&quot; data-start=&quot;250&quot; data-ke-size=&quot;size20&quot;&gt; &lt;b&gt;Specific&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1441&quot; data-start=&quot;1274&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1274&quot;&gt;&lt;b&gt;MPU6050&lt;/b&gt; 기반 자세 안정화&lt;/li&gt;
&lt;li data-end=&quot;1332&quot; data-start=&quot;1300&quot;&gt;&lt;b&gt;0&amp;deg;~180&amp;deg; 스윕&lt;/b&gt;을 통한 장애물 거리 스캔&lt;/li&gt;
&lt;li data-end=&quot;1373&quot; data-start=&quot;1333&quot;&gt;&lt;b&gt;HC-SR04 &amp;amp; DHT11&lt;/b&gt;을 활용한 온도 보정 거리 측정&lt;/li&gt;
&lt;li data-end=&quot;1417&quot; data-start=&quot;1374&quot;&gt;(각도, 거리) 데이터를 &lt;b&gt;(X, Y) 좌표로 변환&lt;/b&gt;하여 2D 매핑&lt;/li&gt;
&lt;li data-end=&quot;1441&quot; data-start=&quot;1418&quot;&gt;&lt;b&gt;자율 장애물 회피 기능&lt;/b&gt; 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Implemented Code&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDYV4v/btsQan4mEVl/ED1Dt1wr8T0rOjeFGfbZu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDYV4v/btsQan4mEVl/ED1Dt1wr8T0rOjeFGfbZu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDYV4v/btsQan4mEVl/ED1Dt1wr8T0rOjeFGfbZu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDYV4v%2FbtsQan4mEVl%2FED1Dt1wr8T0rOjeFGfbZu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://juniha.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://juniha.tistory.com/134&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756270512859&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Smart Mobility platform] Implemented Code&quot; data-og-description=&quot;AXI_Sensor IP 1. 사용 코드 _ Ultrasonic_DHT11// ============================================================================// module: ultrasonic_correction_dht11// - 초음파(raw) + DHT11(온도) &amp;rarr; 보정된 거리(dist_corr)// - 나눗셈을 순&quot; data-og-host=&quot;juniha.tistory.com&quot; data-og-source-url=&quot;https://juniha.tistory.com/134&quot; data-og-url=&quot;https://juniha.tistory.com/134&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAXLxp/hyZGjxyJ4R/8YqmIVGltJrdk0UDFprHG0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dSBvu8/hyZDKpq9nE/KdxRkafJTlv56hXjRm1Lkk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/oe3Hg/hyZGhGvxdm/OLdCxQC4Oqej7njBljEIP0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://juniha.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://juniha.tistory.com/134&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAXLxp/hyZGjxyJ4R/8YqmIVGltJrdk0UDFprHG0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dSBvu8/hyZDKpq9nE/KdxRkafJTlv56hXjRm1Lkk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/oe3Hg/hyZGhGvxdm/OLdCxQC4Oqej7njBljEIP0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Smart Mobility platform] Implemented Code&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AXI_Sensor IP 1. 사용 코드 _ Ultrasonic_DHT11// ============================================================================// module: ultrasonic_correction_dht11// - 초음파(raw) + DHT11(온도) &amp;rarr; 보정된 거리(dist_corr)// - 나눗셈을 순&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;juniha.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Summary &amp;amp; Conclusion&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현 과정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHh9Ye/btsQai95hCq/uwiBBoF10vQQ4pPb9PiJok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHh9Ye/btsQai95hCq/uwiBBoF10vQQ4pPb9PiJok/img.png&quot; style=&quot;width: 30.9872%; margin-right: 10px;&quot; data-widthpercent=&quot;31.72&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1050&quot; data-origin-width=&quot;1400&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHh9Ye/btsQai95hCq/uwiBBoF10vQQ4pPb9PiJok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHh9Ye%2FbtsQai95hCq%2FuwiBBoF10vQQ4pPb9PiJok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Weixe/btsP88tsev4/wl1RTsnOFNKKubcmr8k410/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Weixe/btsP88tsev4/wl1RTsnOFNKKubcmr8k410/img.png&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;263&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.7001%; margin-right: 10px;&quot; data-widthpercent=&quot;36.55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Weixe/btsP88tsev4/wl1RTsnOFNKKubcmr8k410/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWeixe%2FbtsP88tsev4%2Fwl1RTsnOFNKKubcmr8k410%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blulT7/btsP87aeqxR/7WtgsU8nmkXXTrifUdNkD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blulT7/btsP87aeqxR/7WtgsU8nmkXXTrifUdNkD1/img.png&quot; style=&quot;width: 30.9872%;&quot; data-widthpercent=&quot;31.73&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1125&quot; data-origin-width=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blulT7/btsP87aeqxR/7WtgsU8nmkXXTrifUdNkD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblulT7%2FbtsP87aeqxR%2F7WtgsU8nmkXXTrifUdNkD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxvzbO/btsP8EF8KDW/RYls52rZPiMdKkW3CoVLO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxvzbO/btsP8EF8KDW/RYls52rZPiMdKkW3CoVLO0/img.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1400&quot; data-origin-width=&quot;1050&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxvzbO/btsP8EF8KDW/RYls52rZPiMdKkW3CoVLO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxvzbO%2FbtsP8EF8KDW%2FRYls52rZPiMdKkW3CoVLO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmqt9R/btsP7vCVt3l/bUy1JgbHoJgMv6pA3Knrxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmqt9R/btsP7vCVt3l/bUy1JgbHoJgMv6pA3Knrxk/img.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1400&quot; data-origin-width=&quot;1050&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmqt9R/btsP7vCVt3l/bUy1JgbHoJgMv6pA3Knrxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmqt9R%2FbtsP7vCVt3l%2FbUy1JgbHoJgMv6pA3Knrxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Summary &amp;amp; Conclusion&lt;/b&gt;&lt;/h3&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boTZcc/btsP89FF8gY/KXJold8vrL1lo8pA9EMig0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boTZcc/btsP89FF8gY/KXJold8vrL1lo8pA9EMig0/img.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;339&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.8607%; margin-right: 10px;&quot; data-widthpercent=&quot;57.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boTZcc/btsP89FF8gY/KXJold8vrL1lo8pA9EMig0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboTZcc%2FbtsP89FF8gY%2FKXJold8vrL1lo8pA9EMig0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NNhPe/btsP9JmB8af/lFQYiFe1mx2qCXT1yHDmIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NNhPe/btsP9JmB8af/lFQYiFe1mx2qCXT1yHDmIk/img.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;467&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.9765%;&quot; data-widthpercent=&quot;42.47&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NNhPe/btsP9JmB8af/lFQYiFe1mx2qCXT1yHDmIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNNhPe%2FbtsP9JmB8af%2FlFQYiFe1mx2qCXT1yHDmIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;[그림 12] I2C_LCD / OLED 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/135</guid>
      <comments>https://juniha.tistory.com/135#entry135comment</comments>
      <pubDate>Wed, 27 Aug 2025 14:47:06 +0900</pubDate>
    </item>
    <item>
      <title>[Smart Mobility platform] Implemented Code</title>
      <link>https://juniha.tistory.com/134</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AXI_Sensor IP&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;1. 사용 코드 _ Ultrasonic_DHT11&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754528961337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ============================================================================
// module: ultrasonic_correction_dht11
//  - 초음파(raw) + DHT11(온도) &amp;rarr; 보정된 거리(dist_corr)
//  - 나눗셈을 순차 서브트랙터(divider)로, 곱셈&amp;middot;나눗셈 파이프라이닝 적용
//  - 원 구조와 제어 흐름은 그대로 유지
// ============================================================================
module ultrasonic_correction_dht11 (
    input          iCLK,        // 시스템 클럭 (100MHz 가정)
    input          iRSTn,       // Active-low 리셋
    input          iEN,         // 초음파 측정 트리거(1clk 엣지)
    inout          ioDATA_DHT11,// DHT11 데이터 라인
    input          iECHO,       // 초음파 Echo 입력
    output         oTRIG,       // 초음파 Trig 출력
    output [11:0]  oDIST_CORR   // 보정된 거리(cm)
);

    //==========================================================================
    // 1) 내부 신호 선언
    //==========================================================================
    wire  [11:0] dist_raw;        // raw 거리(cm)
    wire   [7:0] temperature;     // DHT11 온도(&amp;deg;C)
    reg   [11:0] dist_corr;       // 보정 거리 출력

    // 파이프 스테이지 #1: 음속 인자 (0.1m/s 단위)
    reg   [11:0] factor_reg;
    // 파이프 스테이지 #2: 거리&amp;times;인자 (24비트)
    reg   [23:0] mult_reg;
    // 파이프 스테이지 #3: 순차 뺄셈 나눗셈
    reg   [23:0] div_reg;
    reg   [11:0] quot_reg;
    reg          div_busy;

    //==========================================================================
    // 2) 출력 매핑
    //==========================================================================
    assign oDIST_CORR = dist_corr;

    //==========================================================================
    // 3) 하위 모듈 인스턴스화
    //==========================================================================
    ultrasonic_sensor u_us (
        .iCLK   (iCLK),
        .iRSTn  (iRSTn),
        .iEN    (iEN),
        .iECHO  (iECHO),
        .oTRIG  (oTRIG),
        .oDIST  (dist_raw),
        .oLED_DEBUG()
    );

    dht11_cntr u_dht (
        .iCLK        (iCLK),
        .iRSTn       (iRSTn),
        .ioDATA_DHT11(ioDATA_DHT11),
        .oHUMI       (),
        .oTEMP       (temperature),
        .oLED_DEBUG  ()
    );

    //==========================================================================
    // 4) 파이프라인 스테이지 #1: factor = (3310 + 6*T)/10  &amp;rarr; 0.1m/s 단위
    //    6*T = (T&amp;lt;&amp;lt;2)+(T&amp;lt;&amp;lt;1), 3310는 상수
    //==========================================================================
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            factor_reg &amp;lt;= 12'd0;
        end else begin
            // 온도 기반 음속 인자 계산 (0.1m/s 단위)
            // 331.0m/s &amp;rarr; 3310(0.1m/s), 0.6*T &amp;rarr; 6*T
            factor_reg &amp;lt;= 12'd3310
                        + (temperature &amp;lt;&amp;lt; 2)
                        + (temperature &amp;lt;&amp;lt; 1);
        end
    end


    //==========================================================================
    // 5) 파이프라인 스테이지 #2: raw(cm) &amp;times; factor(0.1m/s 단위): 시프트+덧셈 누적
    //==========================================================================
    integer i;
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            mult_reg &amp;lt;= 24'd0;
        end else begin
            for (i = 0; i &amp;lt; 12; i = i + 1) begin
                if (factor_reg[i])
                    mult_reg = mult_reg + ({12'd0, dist_raw} &amp;lt;&amp;lt; i);
            end
        end
    end

    //==========================================================================
    // 6) 파이프라인 스테이지 #3: 순차적 나눗셈(div_reg &amp;divide; 3430) &amp;rarr; quot_reg
    //    - iEN 펄스가 오면 mult_reg 적재 후 busy 시작
    //    - 매 클럭 div_reg&amp;gt;=3430 이면 빼고 quot_reg++
    //    - div_reg&amp;lt;3430 이면 종료하고 결과 저장
    //==========================================================================
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            div_reg   &amp;lt;= 24'd0;
            quot_reg  &amp;lt;= 12'd0;
            dist_corr &amp;lt;= 12'd0;
            div_busy  &amp;lt;= 1'b0;
        end
        else if (iEN) begin
            // 새로운 측정 트리거
            div_reg   &amp;lt;= mult_reg;
            quot_reg  &amp;lt;= 12'd0;
            div_busy  &amp;lt;= 1'b1;
        end
        else if (div_busy) begin
            if (div_reg &amp;gt;= 24'd3430) begin
                // 빼기 반복
                div_reg  &amp;lt;= div_reg - 24'd3430;
                quot_reg &amp;lt;= quot_reg + 12'd1;
            end else begin
                // 나눗셈 완료
                div_busy  &amp;lt;= 1'b0;
                dist_corr &amp;lt;= quot_reg;
            end
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;2. &lt;/b&gt;&lt;b&gt;사용코드 _Servo _tilt&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754529072817&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//==============================================================================
// module: servo2_tilt_ctrl.v
//  - iSET_ANGLE 을 통한 단일 위치 이동 기능 추가
//  - FSM: S_IDLE &amp;rarr; S_MOVE_SET &amp;rarr; S_ADJUST &amp;rarr; S_DONE &amp;rarr; S_IDLE
//==============================================================================
module servo2_tilt_ctrl (
    input                   iCLK,         // 100 MHz 시스템 클럭
    input                   iRSTn,        // Active-low 리셋
    input                   iEN,          // 자동 보정 트리거(상승 엣지)
    input           [3:0]   iSET_ANGLE,   // 임의 이동 스텝(0~14)
    input   signed  [15:0]   iPITCH,       // MPU6050 피치 값(&amp;deg; 단위)
    output                  oSERVO_2,      // 서보2 PWM 출력
    output                  oEN_SERVO_1,  // Servo 1 트리거 신호로 재사용
    output          [7:0]   oANGLE2_CUR,  // 현재 서보2 각도(&amp;deg;)
    output          [15:0]  oLED_DEBUG    // 디버그용(상태 표시)
);

    //--------------------------------------------------------------------------
    // 1) 파라미터 선언
    //--------------------------------------------------------------------------
    localparam SYS_CLK_FREQ     = 100_000_000;   // 100 MHz
    localparam MYCLK_FREQ       = 2;             // 0.5 s 토글
    localparam VALUE_COUNT_SEC  = SYS_CLK_FREQ/(2*MYCLK_FREQ);
    localparam WIDTH_SEC        = $clog2(VALUE_COUNT_SEC);

    localparam CNT_MIN          = 4;   // 0&amp;deg; 듀티 (0.44 ms)
    localparam MAX_STEP         = 14;  // 0~14 &amp;rarr; 0&amp;deg;~140&amp;deg;, 10&amp;deg; 단위

    //--------------------------------------------------------------------------
    // 2) 0.5 s 클럭 생성 &amp;amp; 네거티브 엣지 검출
    //--------------------------------------------------------------------------
    reg [WIDTH_SEC-1:0] rCnt_sec;
    reg                 rClk_sec;
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            rCnt_sec &amp;lt;= 0;
            rClk_sec &amp;lt;= 0;
        end
        else if (rCnt_sec == VALUE_COUNT_SEC-1) begin
            rCnt_sec &amp;lt;= 0;
            rClk_sec &amp;lt;= ~rClk_sec;
        end else
            rCnt_sec &amp;lt;= rCnt_sec + 1;
    end

    wire wClk_sec_neg;
    edge_detector u_edge_sec (
        .iCLK      (iCLK),
        .iRSTn     (iRSTn),
        .iSIG      (rClk_sec),
        .oEDGE_NEG (wClk_sec_neg)
    );
    
    wire wCLK_1M_neg;
    clock_div_1ms (
        .iCLK(iCLK),
        .iRSTn(iRSTn),
        .oEDGEn_DIV_1000(wCLK_1M_neg)
    );
    
    reg en_servo_1;
    assign oEN_SERVO_1 = en_servo_1;  // Servo_1 트리거로 재활용

    //--------------------------------------------------------------------------
    // 3) PWM 서보 IP 인스턴스
    //--------------------------------------------------------------------------
    reg  [3:0] rStep;                 // 0~14 스텝
    wire [7:0] wDuty2 = CNT_MIN + rStep;
    pwm_servo_180 u_pwm2 (
        .iCLK  (iCLK),
        .iRSTn (iRSTn),
        .iDUTY (wDuty2),
        .oPWM  (oSERVO_2)
    );

    //--------------------------------------------------------------------------
    // 4) 현재 각도(&amp;deg;) 출력
    //--------------------------------------------------------------------------
    assign oANGLE2_CUR = rStep * 10;

    //--------------------------------------------------------------------------
    // 5) prevEN, prevSET 샘플링
    //--------------------------------------------------------------------------
    reg       prevEN;
    reg [3:0] prevSET;
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            prevEN  &amp;lt;= 1'b0;
            prevSET &amp;lt;= 4'd0;
        end else begin
            prevEN  &amp;lt;= iEN;
            prevSET &amp;lt;= iSET_ANGLE;
        end
    end

    //--------------------------------------------------------------------------
    // 6) FSM 정의
    //--------------------------------------------------------------------------
    localparam [3:0]
        S_IDLE      = 4'b0001,
        S_MOVE_SET  = 4'b0010,  // ★ 임의 위치 이동
        S_ADJUST    = 4'b0100,  // 자동 보정
        S_DONE      = 4'b1000;

    reg [3:0] state, next_state;
    assign oLED_DEBUG = {en_servo_1, 11'd0, ~state};

    // Next-state 로직
    always @(*) begin
        next_state = state;
        case (state)
            S_IDLE: begin
                if (prevSET != iSET_ANGLE)
                    next_state = S_MOVE_SET;
                else if (!prevEN &amp;amp;&amp;amp; iEN)
                    next_state = S_ADJUST;
            end

            S_MOVE_SET: begin
                // 0.5 s 후 완료
                if (wClk_sec_neg)
                    next_state = S_IDLE;
            end

            S_ADJUST: begin
                // 수평(스텝7) 도달 후 완료
                if ((rStep == 7) &amp;amp;&amp;amp; wCLK_1M_neg)
                    next_state = S_DONE;
            end

            S_DONE: begin
                // DONE 후 바로 IDLE 복귀
                next_state = S_IDLE;
            end
        endcase
    end

    // State 레지스터 + rStep 제어
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            state &amp;lt;= S_IDLE;
            rStep &amp;lt;= 4'd7;  // 초기 수평(70&amp;deg;)
            en_servo_1 &amp;lt;= 0;
        end
        else begin
            state &amp;lt;= next_state;
            case (state)
                S_IDLE: begin
                    
                end

                S_MOVE_SET: begin
                    // ★ iSET_ANGLE 위치로 단일 이동
                    if (wClk_sec_neg &amp;amp;&amp;amp; iSET_ANGLE &amp;lt;= MAX_STEP)
                        rStep &amp;lt;= iSET_ANGLE;
                end

                S_ADJUST: begin
                    // ★ iPITCH 기반 자동 보정
                    en_servo_1 &amp;lt;= 0;
                    if (wClk_sec_neg) begin
                        if (iPITCH &amp;gt;  3 &amp;amp;&amp;amp; rStep &amp;lt; MAX_STEP)
                            rStep &amp;lt;= rStep + 1;
                        else if (iPITCH &amp;lt; -3 &amp;amp;&amp;amp; rStep &amp;gt; 0)
                            rStep &amp;lt;= rStep - 1;
                        else
                            rStep &amp;lt;= 7;
                    end
                end

                S_DONE: begin
                    en_servo_1 &amp;lt;= 1;
                end
            endcase
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3. 사용 코드_Servo1_PWM&lt;/p&gt;
&lt;pre id=&quot;code_1754529137181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module servo_pwm_top (
    input          iCLK,        // 100MHz 시스템 클럭
    input          iRSTn,       // Active-low 리셋
    input          iEN,         // ★ 스윕 트리거 (상승 엣지)
    input   [4:0]  iSET_ANGLE,  // ★ 설정 각도 인덱스(0~18)
    output         oEN_SONIC,   // 거리 센서 트리거 신호로 재사용
    output         oSERVO,      // 서보 PWM 출력
    output  [4:0]  oANGLE_CUR,  // 현재 각도(&amp;deg;)
    output  [15:0] oLED_DEBUG
);

    //======================================================================
    // 1) 파라미터 선언
    //======================================================================
    localparam SYS_CLK_FREQ   = 100_000_000;
    localparam MYCLK_FREQ     = 2;                    // 0.5s 토글
    localparam VALUE_COUNT_SEC= SYS_CLK_FREQ/(2*MYCLK_FREQ);
    localparam WIDTH_SEC      = $clog2(VALUE_COUNT_SEC);

    localparam CNT_MIN        = 4;    // 0도 대응 (0.44ms)
    localparam CNT_MAX        = 22;   // 180도 대응 (2.44ms)
    localparam MAX_STEP       = 18;   // 0~18 &amp;rarr; 0~180&amp;deg; (10&amp;deg; 단위)

    //======================================================================
    // 2) 500ms 타이밍 생성 &amp;amp; 네거티브 엣지 검출
    //======================================================================
    reg [WIDTH_SEC-1:0] rCnt_sec;
    reg                 rClk_sec;
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            rCnt_sec &amp;lt;= 0;
            rClk_sec &amp;lt;= 0;
        end else if (rCnt_sec == VALUE_COUNT_SEC-1) begin
            rCnt_sec &amp;lt;= 0;
            rClk_sec &amp;lt;= ~rClk_sec;
        end else
            rCnt_sec &amp;lt;= rCnt_sec + 1;
    end

    wire wClk_sec_neg;
    edge_detector UED (
        .iCLK    (iCLK),
        .iRSTn   (iRSTn),
        .iSIG    (rClk_sec),
        .oEDGE_NEG(wClk_sec_neg)
    );

    assign oEN_SONIC = wClk_sec_neg;  // 거리 센서 트리거로 재활용

    //======================================================================
    // 3) PWM 서보 드라이버 인스턴스
    //======================================================================
    // ★ FSM 출력 rDUTY (0~18)에 CNT_MIN 더해서 실제 듀티 생성
    reg  [7:0]    rDUTY;
    wire [4:0]    wPWM_DUTY = CNT_MIN + rDUTY;
    pwm_servo_180 U_SERVO (
        .iCLK    (iCLK),
        .iRSTn   (iRSTn),
        .iDUTY   (wPWM_DUTY),
        .oPWM    (oSERVO)
    );

    //======================================================================
    // 4) 현재 각도 &amp;amp; FND 표시
    //======================================================================
    // 10도 단위 &amp;rarr; 실제 각도(&amp;deg;)
    assign oANGLE_CUR = rDUTY;

    //======================================================================
    // 5) FSM: IDLE &amp;rarr; MOVE_SET &amp;rarr; SWEEP &amp;rarr; DONE &amp;rarr; IDLE
    //======================================================================
    // ★ 상승 엣지/값 변경 감지용 레지스터
    reg       prevEN;
    reg [4:0] prevSET;
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            prevEN  &amp;lt;= 1'b0;
            prevSET &amp;lt;= 5'd0;
        end else begin
            prevEN  &amp;lt;= iEN;
            prevSET &amp;lt;= iSET_ANGLE;
        end
    end

    // 상태 정의
    localparam [3:0]
        S_IDLE     = 4'b0001,
        S_MOVE_SET = 4'b0010,
        S_SWEEP    = 4'b0100,
        S_DONE     = 4'b1000;

    reg [3:0] state, next_state;
    reg [4:0] rStep;  // 스윕 카운터 (0~18)

    assign oLED_DEBUG = ~state;

    // Next-State 로직
    always @(*) begin
        next_state = state;
        case (state)
            S_IDLE:
                // SET 값이 바뀌면 단일 이동
                if (prevSET != iSET_ANGLE)
                    next_state = S_MOVE_SET;
                // iEN 상승 엣지 시 전체 스윕
                else if (!prevEN &amp;amp;&amp;amp; iEN)
                    next_state = S_SWEEP;
            S_MOVE_SET:
                // 1회 이동 후 바로 IDLE 복귀
                if (wClk_sec_neg)
                    next_state = S_IDLE;
            S_SWEEP:
                // 스텝 끝나면 DONE
                if (wClk_sec_neg &amp;amp;&amp;amp; rStep == MAX_STEP)
                    next_state = S_DONE;
            S_DONE:
                // DONE 후 IDLE
                next_state = S_IDLE;
        endcase
    end

    // State 레지스터 + 출력 제어
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            state &amp;lt;= S_IDLE;
            rDUTY  &amp;lt;= 8'd0;
            rStep  &amp;lt;= 5'd0;
        end else begin
            state &amp;lt;= next_state;

            case (state)
                S_IDLE: begin
                    // 스윕 시작 시 스텝 카운터 리셋
                    if (!prevEN &amp;amp;&amp;amp; iEN)
                        rStep &amp;lt;= 5'd0;
                end

                S_MOVE_SET: begin
                    // 단일 위치 이동: wClk_sec_neg 타이밍에 iSET_ANGLE 적용
                    if (wClk_sec_neg)
                        rDUTY &amp;lt;= iSET_ANGLE;
                end

                S_SWEEP: begin
                    // 전체 스윕: wClk_sec_neg마다 rStep&amp;rarr;rDUTY
                    if (wClk_sec_neg) begin
                        rDUTY &amp;lt;= rStep;
                        rStep &amp;lt;= rStep + 1;
                    end
                end

                S_DONE: begin
                    rDUTY &amp;lt;= 9;
                end
            endcase
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4. 사용 코드 _좌표 변환&lt;/p&gt;
&lt;pre id=&quot;code_1754529227937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module cartesian_transform (
    input                               clk,        // 시스템 클럭
    input                               rstn,       // Active-low reset
    input      [4:0]                    angle_idx,  // 0&amp;rarr;0&amp;deg;, 1&amp;rarr;10&amp;deg; &amp;hellip; 18&amp;rarr;180&amp;deg;
    input      [11:0]                   dist_in,    // 보정된 거리(cm)
    output reg                          oREADY,
    output reg signed [11:0]            x_out,      // 변환된 X (cm)
    output reg signed [11:0]            y_out       // 변환된 Y (cm)
);

    // 고정소수점 폭
    localparam FP_BITS = 16;

    // 정수&amp;times;고정소수점 곱셈 결과 폭
    wire signed [12+FP_BITS-1:0] mult_x;  
    wire signed [12+FP_BITS-1:0] mult_y;  

    // ★ sin/cos 값을 직접 할당할 레지스터
    reg signed [FP_BITS-1:0] sin_val;     // Q1.15
    reg signed [FP_BITS-1:0] cos_val;     // Q1.15

    // ① angle_idx 혹은 dist_in 이 바뀌면 새로운 좌표를 계산하고,
    //    그 계산값이 register에 승격되는 클럭 타이밍에 coord_valid 를 1로.
    wire new_input = (angle_idx != prev_angle_idx) || (dist_in != prev_dist_in);
    
    // ② prev_angle_idx, prev_dist_in 저장
    reg [4:0]  prev_angle_idx;
    reg [11:0] prev_dist_in;
    always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
        prev_angle_idx &amp;lt;= 0;
        prev_dist_in   &amp;lt;= 0;
      end else begin
        prev_angle_idx &amp;lt;= angle_idx;
        prev_dist_in   &amp;lt;= dist_in;
      end
    end
    
    // ③ coord_valid 펄스 생성
    reg coord_valid;
    always @(posedge clk or negedge rstn) begin
      if (!rstn)           coord_valid &amp;lt;= 1'b0;
      else if (new_input)  coord_valid &amp;lt;= 1'b1;
      else                  coord_valid &amp;lt;= 1'b0;
    end
    
    // ④ 바로 위 방법대로 oCOORD_RDY 펄스 만들기
    reg prev_coord_valid;
    always @(posedge clk or negedge rstn) begin
      if (!rstn)            prev_coord_valid &amp;lt;= 1'b0;
      else                  prev_coord_valid &amp;lt;= coord_valid;
    end
    
    always @(posedge clk or negedge rstn) begin
      if (!rstn)            oREADY &amp;lt;= 1'b0;
      else                  oREADY &amp;lt;= coord_valid &amp;amp; ~prev_coord_valid;
    end

    //--------------------------------------------------------------------------
    // 1) combinational LUT: angle_idx &amp;rarr; sin_val, cos_val
    //--------------------------------------------------------------------------
    always @* begin
        case(angle_idx)
            // -- sin 테이블 (Q1.15)
            5'd0 :  sin_val = 16'h0000;
            5'd1 :  sin_val = 16'h163A;
            5'd2 :  sin_val = 16'h2BC7;
            5'd3 :  sin_val = 16'h4000;
            5'd4 :  sin_val = 16'h5247;
            5'd5 :  sin_val = 16'h620E;
            5'd6 :  sin_val = 16'h6EDA;
            5'd7 :  sin_val = 16'h7848;
            5'd8 :  sin_val = 16'h7E0E;
            5'd9 :  sin_val = 16'h8000;
           5'd10 :  sin_val = 16'h7E0E;
           5'd11 :  sin_val = 16'h7848;
           5'd12 :  sin_val = 16'h6EDA;
           5'd13 :  sin_val = 16'h620E;
           5'd14 :  sin_val = 16'h5247;
           5'd15 :  sin_val = 16'h4000;
           5'd16 :  sin_val = 16'h2BC7;
           5'd17 :  sin_val = 16'h163A;
           5'd18 :  sin_val = 16'h0000;
            default: sin_val = 16'h0000;
        endcase
    end

    always @* begin
        case(angle_idx)
            // -- cos 테이블 (Q1.15)
            5'd0 :  cos_val = 16'h8000;
            5'd1 :  cos_val = 16'h7E0E;
            5'd2 :  cos_val = 16'h7848;
            5'd3 :  cos_val = 16'h6EDA;
            5'd4 :  cos_val = 16'h620E;
            5'd5 :  cos_val = 16'h5247;
            5'd6 :  cos_val = 16'h4000;
            5'd7 :  cos_val = 16'h2BC7;
            5'd8 :  cos_val = 16'h163A;
            5'd9 :  cos_val = 16'h0000;
           5'd10 :  cos_val = 16'hE9C6;
           5'd11 :  cos_val = 16'hD439;
           5'd12 :  cos_val = 16'hC000;
           5'd13 :  cos_val = 16'hADB9;
           5'd14 :  cos_val = 16'h9DF2;
           5'd15 :  cos_val = 16'h9126;
           5'd16 :  cos_val = 16'h87B8;
           5'd17 :  cos_val = 16'h81F2;
           5'd18 :  cos_val = 16'h8000;
            default: cos_val = 16'h8000;
        endcase
    end

    //--------------------------------------------------------------------------
    // 2) 곱셈
    //    dist_in: unsigned[11:0], sin_val/cos_val: signed[15:0]
    //    &amp;rarr; signed[27:0] 결과
    //--------------------------------------------------------------------------
    assign mult_x = $signed({1'b0, dist_in}) * sin_val;
    assign mult_y = $signed({1'b0, dist_in}) * cos_val;

    //--------------------------------------------------------------------------
    // 3) Q1.15 &amp;rarr; 정수(cm) 변환: 위 곱셈 결과의 상위 비트 취함
    //    mult_x[27:15]  &amp;rarr; signed[12:0] &amp;rarr; x_out[11:0]으로 트렁케이트
    //--------------------------------------------------------------------------
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            x_out &amp;lt;= 0;
            y_out &amp;lt;= 0;
        end else begin
            x_out &amp;lt;= mult_x[27:16];  // (11+16-1 down to 16)
            y_out &amp;lt;= mult_y[27:16];
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AXI_VIHICLE_IP&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 1. 사용 코드 _DCMotor&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754529331276&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ============================================================================
// motor_autonomous_ctrl.v
//  - one-hot 5상태 FSM
//  - ST_IDLE &amp;rarr; ST_FWD(지속) &amp;rarr; ST_LEFT/RIGHT(0.245s) &amp;rarr; ST_STOP(1clk) &amp;rarr; ST_IDLE
// ============================================================================
module motor_autonomous_ctrl (
    input          iCLK,        // 100 MHz 시스템 클럭
    input          iRSTn,       // Active-low 리셋
    input          iEN_START,  // 전진 버튼 (펄스)
    input          iEN_STOP,   // 정지 버튼 (펄스)
    input          iEN_LEFT,   // 좌회전 버튼 (펄스)
    input          iEN_RIGHT,  // 우회전 버튼 (펄스)
    output         oMOTOR_A1,   // 왼쪽 모터 전진
    output         oMOTOR_A2,   // 왼쪽 모터 후진 (사용 안 함)
    output         oMOTOR_B1,   // 오른쪽 모터 전진
    output         oMOTOR_B2,   // 오른쪽 모터 후진 (사용 안 함)
    output [15:0]  oLED_DEBUG
);

    //--------------------------------------------------------------------------
    // 1) 상태(one-hot 5비트) 정의
    //--------------------------------------------------------------------------
    localparam [4:0]
        S_IDLE  = 5'b00001,  // 대기
        S_FWD   = 5'b00010,  // 전진(지속)
        S_STOP  = 5'b00100,  // 정지(1clk)
        S_LEFT  = 5'b01000,  // 좌회전(0.245s)
        S_RIGHT = 5'b10000;  // 우회전(0.245s)

    //--------------------------------------------------------------------------
    // 2) 0.245 s 타이머 (100 MHz &amp;rarr; 24_500_000 클럭)
    //--------------------------------------------------------------------------
    localparam  ROTATE_TIME = 24_500_000;  // 10도 회전
    localparam  WIDTH_RT    = $clog2(ROTATE_TIME);

    //--------------------------------------------------------------------------
    // 3) 내부 신호
    //--------------------------------------------------------------------------
    wire                      wStartEdge, wStopEdge, wLeftEdge, wRightEdge;
    reg   [4:0]               rState, rNext;
    reg   [WIDTH_RT-1:0]      rTimerCnt;

    //--------------------------------------------------------------------------
    // 4) 버튼 엣지 검출 인스턴스
    //--------------------------------------------------------------------------
    edge_detector uED_START (
        .iCLK      (iCLK),
        .iRSTn     (iRSTn),
        .iSIG      (iEN_START),
        .oEDGE_NEG (wStartEdge)
    );
    
    edge_detector uED_STOP (
        .iCLK      (iCLK),
        .iRSTn     (iRSTn),
        .iSIG      (iEN_STOP),
        .oEDGE_NEG (wStopEdge)
    );
    
    edge_detector uED_LEFT (
        .iCLK      (iCLK),
        .iRSTn     (iRSTn),
        .iSIG      (iEN_LEFT),
        .oEDGE_NEG (wLeftEdge)
    );
    
    edge_detector uED_RIGHT (
        .iCLK      (iCLK),
        .iRSTn     (iRSTn),
        .iSIG      (iEN_RIGHT),
        .oEDGE_NEG (wRightEdge)
    );

    //--------------------------------------------------------------------------
    // 5) FSM Next-State 로직 (combinational)
    //--------------------------------------------------------------------------
    always @(*) begin
        rNext = rState;
        case (rState)

            // IDLE: START만 받아서 전진으로
            S_IDLE: begin
                if      (wStartEdge)   rNext = S_FWD;
                else                   rNext = S_IDLE;
            end

            // FWD: STOP/LEFT/RIGHT 에만 반응, 아니면 계속 전진
            S_FWD: begin
                if      (wStopEdge)    rNext = S_STOP;
                else if (wLeftEdge)    rNext = S_LEFT;
                else if (wRightEdge)   rNext = S_RIGHT;
                else                   rNext = S_FWD;
            end

            // STOP: 1clk 만 유지 후 IDLE
            S_STOP: rNext = S_IDLE;

            // LEFT: 0.245s 타이머 끝나면 IDLE, 아니면 계속 LEFT
            S_LEFT: begin
                if (rTimerCnt &amp;gt;= ROTATE_TIME)  rNext = S_IDLE;
                else                           rNext = S_LEFT;
            end

            // RIGHT: 0.245s 타이머 끝나면 IDLE, 아니면 계속 RIGHT
            S_RIGHT: begin
                if (rTimerCnt &amp;gt;= ROTATE_TIME)  rNext = S_IDLE;
                else                           rNext = S_RIGHT;
            end

            // 기본 복귀
            default: rNext = S_IDLE;
        endcase
    end

    //--------------------------------------------------------------------------
    // 6) FSM 상태 &amp;amp; 타이머 업데이트 (sequential)
    //--------------------------------------------------------------------------
    always @(posedge iCLK or negedge iRSTn) begin
        if (!iRSTn) begin
            rState    &amp;lt;= S_IDLE;
            rTimerCnt &amp;lt;= 0;
        end else begin
            rState &amp;lt;= rNext;

            // 좌/우 회전 중일 때만 카운터 &amp;uarr;, entry 시 리셋
            if (rState == S_LEFT || rState == S_RIGHT) begin
                if (rState != rNext)
                    rTimerCnt &amp;lt;= 0;
                else
                    rTimerCnt &amp;lt;= rTimerCnt + 1;
            end
            else
                rTimerCnt &amp;lt;= 0;
        end
    end

    //--------------------------------------------------------------------------
    // 7) 모터 드라이브 (combinational)
    //--------------------------------------------------------------------------
    // 전진: A1,B1 = 1
    // 정지/IDLE: 모두 0
    // 좌회전: 왼쪽 A1만 =1
    // 우회전: 오른쪽 B1만 =1
    assign oMOTOR_A1 = (rState == S_FWD) || (rState == S_LEFT);
    assign oMOTOR_A2 = 0;
    assign oMOTOR_B1 = (rState == S_FWD) || (rState == S_RIGHT);
    assign oMOTOR_B2 = 0;

    //--------------------------------------------------------------------------
    // 8) 상태 디버그 출력
    //--------------------------------------------------------------------------
    assign oLED_DEBUG[4:0] = ~rState;

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;VITIS_I2C_Control&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 사용코드 _I2c 3 Sensor (MPU6050, TXT LCD, OLED)&lt;/p&gt;
&lt;pre id=&quot;code_1754529516395&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &quot;platform.h&quot;
#include &quot;xil_printf.h&quot;
#include &quot;xparameters.h&quot;
#include &quot;xiic.h&quot;
#include &quot;sleep.h&quot;
#include &quot;font8x8_basic.h&quot;

//------------------------------------------------------------------------------
// I&amp;sup2;C 마스터 &amp;amp; 채널
//------------------------------------------------------------------------------
static XIic   iic_inst;
#define IIC_CHNL    XPAR_AXI_IIC_0_BASEADDR

//------------------------------------------------------------------------------
// 장치 7-bit 주소
//------------------------------------------------------------------------------
#define LCD_ADDR    0x3F    // Text LCD (PCF8574 기반)
#define OLED_ADDR   0x3C    // SSD1306 OLED
#define MPU_ADDR   0x68    // MPU6050

//------------------------------------------------------------------------------
// MPU6050 레지스터
//------------------------------------------------------------------------------
#define REG_PWR_MGMT1    0x6B
#define REG_SMPLRT_DIV   0x19
#define REG_CONFIG       0x1A
#define REG_GYRO_CONFIG  0x1B
#define REG_ACCEL_CONFIG 0x1C
#define REG_ACCEL_X_H    0x3B

//------------------------------------------------------------------------------
// OLED Control 바이트
//------------------------------------------------------------------------------
#define OLED_CTL_CMD   0x00
#define OLED_CTL_DAT   0x40

//------------------------------------------------------------------------------
// ASCII 폰트 (0x20~0x7F) extern 선언
// 반드시 font8x8_basic.h 를 프로젝트에 포함해야 합니다.
extern const uint8_t font8x8_basic[96][8];

//==============================================================================
// 전역 버퍼: OLED GDDRAM 에 대응 (페이지 0~7 &amp;times; 컬럼 0~127)
//==============================================================================
static uint8_t oled_buf[8][128];

//------------------------------------------------------------------------------
// mpu 함수 선언
//------------------------------------------------------------------------------
void mpu_write_reg(uint8_t reg, uint8_t val);
void mpu_read_regs(uint8_t start_reg, uint8_t *dst, int len);
static int16_t compute_mpu_pitch(int16_t ax,int16_t ay,int16_t az);

//------------------------------------------------------------------------------
// lcd 함수 선언
//------------------------------------------------------------------------------
void LCD_WriteCommand(uint8_t cmd);
void LCD_WriteData(uint8_t d);
void LCD_Init(void);
void LCD_GotoXY(uint8_t row, uint8_t col);
void LCD_WriteSignedInt(int16_t v);

//------------------------------------------------------------------------------
// oled 함수 선언
//------------------------------------------------------------------------------
void oled_write_cmd(uint8_t cmd);
void oled_write_data(uint8_t d);
void oled_init(void);
void oled_clear(void);
void oled_puts_str(int page, int col, const char *s);

//------------------------------------------------------------------------------
// oled 픽셀 그리기 &amp;amp; 버퍼 업데이트 함수 선언
//------------------------------------------------------------------------------
void oled_update_column(int page, int col); 
void oled_draw_pixel(int x, int y);

//==============================================================================
// main: 초기화 &amp;rarr; 루프(읽기&amp;rarr;UART/LCD/OLED 출력)
//==============================================================================
int main(void) {
    uint8_t buf[14];
    int16_t ax, ay, az, gx, gy, gz;

    init_platform();
    xil_printf(&quot;\n\r=== I2C 3-Sensor Integrated test ===\n\r&quot;);

    // 1) I&amp;sup2;C 마스터 초기화&amp;middot;시작
    XIic_Initialize(&amp;amp;iic_inst, IIC_CHNL);
    XIic_Start     (&amp;amp;iic_inst);
    msleep(10);

    // 2) LCD 초기화
    LCD_Init();
    msleep(10);

    // 3) OLED 초기화&amp;middot;클리어
    oled_init();
    oled_clear();
    msleep(10);

    // 4) MPU6050 슬립 해제&amp;middot;감도 설정
    mpu_write_reg(REG_PWR_MGMT1,    0x00);
    mpu_write_reg(REG_SMPLRT_DIV,   0x07);
    mpu_write_reg(REG_CONFIG,       0x06);
    mpu_write_reg(REG_GYRO_CONFIG,  0x18);
    mpu_write_reg(REG_ACCEL_CONFIG, 0x10);
    msleep(10);

    // 5) 메인 루프: 250 ms 간격으로 읽고 출력
    while (1) {
        // &amp;mdash; MPU6050 6축 읽기 &amp;mdash;
        mpu_read_regs(REG_ACCEL_X_H, buf, 14);
        ax = (buf[0]&amp;lt;&amp;lt;8)|buf[1];
        ay = (buf[2]&amp;lt;&amp;lt;8)|buf[3];
        az = (buf[4]&amp;lt;&amp;lt;8)|buf[5];
        gx = (buf[8]&amp;lt;&amp;lt;8)|buf[9];
        gy = (buf[10]&amp;lt;&amp;lt;8)|buf[11];
        gz = (buf[12]&amp;lt;&amp;lt;8)|buf[13];

        int16_t pitch = compute_mpu_pitch(ax, ay, az);

        // &amp;mdash; UART 출력 &amp;mdash;
        xil_printf(&quot;AX=%6d AY=%6d AZ=%6d  pitch =%4d\n\r&quot;, ax, ay, az, pitch);

        // &amp;mdash; LCD: 2행에 AX~GZ 한 줄씩 &amp;mdash;
        LCD_GotoXY(0,0);
        LCD_WriteSignedInt(ax);
        LCD_WriteSignedInt(ay);
        LCD_WriteSignedInt(az);
        LCD_GotoXY(1,0);
        LCD_WriteSignedInt(gx);
        LCD_WriteSignedInt(gy);
        LCD_WriteSignedInt(gz);

        // &amp;mdash; OLED: 페이지0~5 에 AX~GZ 한 줄씩 출력 &amp;mdash;
        char tmp[7];
        // 6자리 문자열: 부호+4숫자 + 널
        sprintf(tmp, &quot;%+5d&quot;, ax);
        oled_puts_str(0, 0, tmp);
        sprintf(tmp, &quot;%+5d&quot;, ay);
        oled_puts_str(1, 0, tmp);
        sprintf(tmp, &quot;%+5d&quot;, az);
        oled_puts_str(2, 0, tmp);
        sprintf(tmp, &quot;%+5d&quot;, gx);
        oled_puts_str(3, 0, tmp);
        sprintf(tmp, &quot;%+5d&quot;, gy);
        oled_puts_str(4, 0, tmp);
        sprintf(tmp, &quot;%+5d&quot;, gz);
        oled_puts_str(5, 0, tmp);

        sleep(1);

        // &amp;mdash; (x=64,y=32)에 점 하나 찍기 &amp;mdash;
        oled_draw_pixel(0, 0);
        sleep(1);
        oled_draw_pixel(120, 0);
        sleep(1);
        oled_draw_pixel(120, 60);
        sleep(1);
        oled_draw_pixel(0, 60);
        sleep(1);
        oled_draw_pixel(60, 30); 
        sleep(1);
    }

    cleanup_platform();
    return 0;
}

//------------------------------------------------------------------------------
// MPU6050 I&amp;sup2;C 쓰기 헬퍼
//------------------------------------------------------------------------------
void mpu_write_reg(uint8_t reg, uint8_t val) {
    uint8_t buf[2] = { reg, val };
    XIic_Send(iic_inst.BaseAddress, MPU_ADDR, buf, 2, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

//------------------------------------------------------------------------------
// MPU6050 I&amp;sup2;C 연속 읽기 헬퍼
//------------------------------------------------------------------------------
void mpu_read_regs(uint8_t start_reg, uint8_t *dst, int len) {
    // 1) 읽을 레지스터 주소 전송 (Repeated Start 유지)
    XIic_Send(iic_inst.BaseAddress, MPU_ADDR, &amp;amp;start_reg, 1, 0);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
    // 2) 바로 읽기 &amp;rarr; STOP
    XIic_Recv(iic_inst.BaseAddress, MPU_ADDR, dst, len, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

//------------------------------------------------------------------------------
// @brief 근사: raw&amp;rarr;pitch(&amp;deg;) 정수
//    sqrt&amp;asymp;max+0.5&amp;middot;min, atan2&amp;asymp;x/(1+0.28x&amp;sup2;)
//------------------------------------------------------------------------------
static int16_t compute_mpu_pitch(int16_t ax,int16_t ay,int16_t az) {
    const float G=4096.0f;
    float x=(float)ax/G, y=(float)ay/G, z=(float)az/G;
    float ay0=y&amp;lt;0?-y:y, az0=z&amp;lt;0?-z:z;
    float vmax= ay0&amp;gt;az0? ay0:az0;
    float vmin= ay0&amp;gt;az0? az0:ay0;
    float denom = vmax + 0.5f*vmin + 1e-6f;
    float r = x/denom;
    float rad = r/(1.0f + 0.28f*r*r);
    float deg = rad * 57.2957795f;
    return (int16_t)(deg + (deg&amp;gt;=0?0.5f:-0.5f));
}

//------------------------------------------------------------------------------
// Text LCD 제어 함수들 (기존 코드 그대로)
//------------------------------------------------------------------------------
void LCD_WriteCommand(uint8_t cmd) {
    uint8_t high =  cmd   &amp;amp; 0xF0;
    uint8_t low  = (cmd&amp;lt;&amp;lt;4)&amp;amp; 0xF0;
    uint8_t seq[4] = {
        high|0x0C, high|0x08,
        low |0x0C, low |0x08
    };
    XIic_Send(iic_inst.BaseAddress, LCD_ADDR, seq, 4, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

void LCD_WriteData(uint8_t d) {
    uint8_t high =  d     &amp;amp; 0xF0;
    uint8_t low  = (d &amp;lt;&amp;lt;4)&amp;amp; 0xF0;
    uint8_t seq[4] = {
        high|0x0D, high|0x08,
        low |0x0D, low |0x08
    };
    XIic_Send(iic_inst.BaseAddress, LCD_ADDR, seq, 4, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

void LCD_Init(void) {
    msleep(50);
    LCD_WriteCommand(0x33); msleep(5);
    LCD_WriteCommand(0x32);
    LCD_WriteCommand(0x28);
    LCD_WriteCommand(0x0F);
    LCD_WriteCommand(0x06);
    LCD_WriteCommand(0x01); msleep(5);
}

void LCD_GotoXY(uint8_t row, uint8_t col) {
    uint8_t addr = 0x80 | (row&amp;lt;&amp;lt;6) | col;
    LCD_WriteCommand(addr);
}

// 부호 포함 5자리 찍기
void LCD_WriteSignedInt(int16_t v) {
    char tmp[6];
    // &quot;%+5d&quot; &amp;rarr; 항상 부호, 총 5칸
    sprintf(tmp, &quot;%+5d&quot;, v);
    for (int i = 0; i &amp;lt; 5; i++) {
        LCD_WriteData((uint8_t)tmp[i]);
    }
}

//------------------------------------------------------------------------------
// OLED 제어 함수들
//------------------------------------------------------------------------------
// Control + 명령어 1바이트
void oled_write_cmd(uint8_t cmd) {
    uint8_t buf[2] = { OLED_CTL_CMD, cmd };
    XIic_Send(iic_inst.BaseAddress, OLED_ADDR, buf, 2, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

// Control + 데이터 1바이트
void oled_write_data(uint8_t d) {
    uint8_t buf[2] = { OLED_CTL_DAT, d };
    XIic_Send(iic_inst.BaseAddress, OLED_ADDR, buf, 2, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

// SSD1306 초기화 (페이지 주소 모드 포함)
void oled_init(void) {
    const uint8_t seq[] = {
      0xAE,           // display off
      0x20,0x02,      // page addressing mode
      0xB0,           // page0
      0x00,0x10,      // col addr = 0
      0x40,           // start line = 0
      0x81,0x7F,      // contrast
      0xA1,           // seg remap
      0xC8,           // com scan dec
      0xA6,           // normal display
      0xA8,0x3F,      // multiplex 1/64
      0xD3,0x00,      // display offset
      0xD5,0x80,      // clk div
      0xD9,0x22,      // pre-charge
      0xDA,0x12,      // com pins
      0xDB,0x20,      // vcomh
      0x8D,0x14,      // charge pump on
      0xAF            // display on
    };
    for (int i = 0; i &amp;lt; (int)sizeof(seq); i++) {
        oled_write_cmd(seq[i]);
    }
}

// 전체 화면 클리어
void oled_clear(void) {
    for (int p = 0; p &amp;lt; 8; p++) {
        oled_write_cmd(0xB0 | p);
        oled_write_cmd(0x00);
        oled_write_cmd(0x10);
        for (int c = 0; c &amp;lt; 128; c++) {
            oled_write_data(0x00);
        }
    }
}

//------------------------------------------------------------------------------
// 문자열(부호 포함 숫자) 출력 helper
//------------------------------------------------------------------------------
// page: 0~7, col: 문자 단위(0~15), s: null-terminated 문자열
void oled_puts_str(int page, int col, const char *s) {
    // 1) 페이지&amp;middot;컬럼 설정
    oled_write_cmd(0xB0 | page);
    uint8_t x = col * 8;
    oled_write_cmd(0x00 | (x &amp;amp; 0x0F));
    oled_write_cmd(0x10 | ((x &amp;gt;&amp;gt; 4) &amp;amp; 0x0F));
    // 2) 글자별 8바이트 폰트 전송
    while (*s) {
        uint8_t buf[9];
        buf[0] = OLED_CTL_DAT;
        // ASCII 0x20~0x7F 대응
        memcpy(buf+1, font8x8_basic[(uint8_t)*s - 0x20], 8);
        XIic_Send(iic_inst.BaseAddress, OLED_ADDR, buf, 9, XIIC_STOP);
        while (XIic_IsIicBusy(iic_inst.BaseAddress));
        s++;
    }
}

//------------------------------------------------------------------------------
// OLED 픽셀 업데이트: 버퍼&amp;rarr;실제 GDDRAM (한 컬럼만 갱신)
//------------------------------------------------------------------------------
void oled_update_column(int page, int col) { 
    oled_write_cmd(0xB0 | page);              // page 설정
    oled_write_cmd(0x00 | (col &amp;amp; 0x0F));      // col low
    oled_write_cmd(0x10 | ((col&amp;gt;&amp;gt;4)&amp;amp;0x0F));   // col high
    oled_write_data(oled_buf[page][col]);     // 버퍼값 전송
}

//------------------------------------------------------------------------------
// (x,y) 에 1픽셀 그리기 (버퍼 갱신 + 해당 컬럼만 갱신)
//------------------------------------------------------------------------------
void oled_draw_pixel(int x, int y) {       
    if (x&amp;lt;0||x&amp;gt;127||y&amp;lt;0||y&amp;gt;63) return;
    int page = y / 8;
    int bit  = y % 8;
    oled_buf[page][x] |= (1&amp;lt;&amp;lt;bit);            // 버퍼에 비트 세팅
    oled_update_column(page, x);              // 실제 화면에 바로 반영
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Final System Control ( Vitis C )&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 1. 사용 코드_ Final C 동작제어 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754529604708&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &quot;platform.h&quot;
#include &quot;xil_printf.h&quot;
#include &quot;xparameters.h&quot;
#include &quot;xiic.h&quot;
#include &quot;sleep.h&quot;
#include &quot;font8x8_basic.h&quot;
#include &amp;lt;math.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

//------------------------------------------------------------------------------
// I&amp;sup2;C 마스터 &amp;amp; 채널
//------------------------------------------------------------------------------
XIic   iic_inst;
#define IIC_CHNL    XPAR_AXI_IIC_0_BASEADDR

//------------------------------------------------------------------------------
// AXI-Sensor-Hub MMIO 베이스 주소 &amp;amp; 레지스터 오프셋
//------------------------------------------------------------------------------
#define HUB_BASE    XPAR_AXI_SENSOR_HUB_0_BASEADDR

//------------------------------------------------------------------------------
// 장치 7-bit 주소
//------------------------------------------------------------------------------
#define LCD_ADDR    0x3F    // Text LCD (PCF8574 기반)
#define OLED_ADDR   0x3C    // SSD1306 OLED
#define MPU_ADDR    0x68    // MPU6050

//------------------------------------------------------------------------------
// MPU6050 레지스터
//------------------------------------------------------------------------------
#define REG_PWR_MGMT1    0x6B
#define REG_SMPLRT_DIV   0x19
#define REG_CONFIG       0x1A
#define REG_GYRO_CONFIG  0x1B
#define REG_ACCEL_CONFIG 0x1C
#define REG_ACCEL_X_H    0x3B

//------------------------------------------------------------------------------
// OLED Control 바이트
//------------------------------------------------------------------------------
#define OLED_CTL_CMD   0x00
#define OLED_CTL_DAT   0x40

//------------------------------------------------------------------------------
// ASCII 폰트 (0x20~0x7F) extern 선언
// 반드시 font8x8_basic.h 를 프로젝트에 포함해야 합니다.
extern const uint8_t font8x8_basic[96][8];

//==============================================================================
// 전역 버퍼: OLED GDDRAM 에 대응 (페이지 0~7 &amp;times; 컬럼 0~127)
//==============================================================================
static uint8_t oled_buf[8][128];

//------------------------------------------------------------------------------
// mpu 함수 선언
//------------------------------------------------------------------------------
void mpu_write_reg(uint8_t reg, uint8_t val);
void mpu_read_regs(uint8_t start_reg, uint8_t *dst, int len);
static int16_t compute_mpu_pitch(int16_t ax,int16_t ay,int16_t az);

//------------------------------------------------------------------------------
// lcd 함수 선언
//------------------------------------------------------------------------------
void LCD_WriteCommand(uint8_t cmd);
void LCD_WriteData(uint8_t d);
void LCD_Init(void);
void LCD_GotoXY(uint8_t row, uint8_t col);
void LCD_WriteSignedInt(int16_t v);

//------------------------------------------------------------------------------
// oled 함수 선언
//------------------------------------------------------------------------------
void oled_write_cmd(uint8_t cmd);
void oled_write_data(uint8_t d);
void oled_init(void);
void oled_clear(void);
void oled_puts_str(int page, int col, const char *s);

//------------------------------------------------------------------------------
// oled 픽셀 그리기 &amp;amp; 버퍼 업데이트 함수 선언
//------------------------------------------------------------------------------
void oled_update_column(int page, int col); 
void oled_draw_pixel(int x, int y);

//==============================================================================
// main: 초기화 &amp;rarr; 2D 매핑 &amp;rarr; 최적 각도로 서보1 회전
//==============================================================================
int main(void) {
    uint8_t buf[14];
    int16_t ax, ay, az;

    init_platform();
    xil_printf(&quot;\n\r=== I2C Stabilization &amp;amp; Avoidance Test ===\n\r&quot;);

    volatile unsigned int *hub_reg = (volatile unsigned int *)HUB_BASE;
    //hub_reg[0] -&amp;gt; set_angle_1(wd)
    //hub_reg[1] -&amp;gt; set_angle_2(wd)
    //hub_reg[2] -&amp;gt; en_servo_2(wd)
    //hub_reg[3] -&amp;gt; mpu_pitch(wd)
    //hub_reg[4] -&amp;gt; x_out(rd)
    //hub_reg[5] -&amp;gt; y_out(rd)
    //hub_reg[6] -&amp;gt; ready(rd)

    // 1) I&amp;sup2;C 마스터 초기화&amp;middot;시작
    XIic_Initialize(&amp;amp;iic_inst, IIC_CHNL);
    XIic_Start     (&amp;amp;iic_inst);
 //   msleep(10);

    // 2) LCD 초기화
    LCD_Init();
  //  msleep(10);

    // 3) OLED 초기화&amp;middot;클리어
    oled_init();
    oled_clear();
    msleep(10);

    // 4) MPU6050 슬립 해제&amp;middot;감도 설정
    mpu_write_reg(REG_PWR_MGMT1,    0x00);
    mpu_write_reg(REG_SMPLRT_DIV,   0x07);
    mpu_write_reg(REG_CONFIG,       0x06);
    mpu_write_reg(REG_GYRO_CONFIG,  0x18);
    mpu_write_reg(REG_ACCEL_CONFIG, 0x10);
 //   msleep(10);

    // 5) 메인 루프: 250 ms 간격으로 읽고 출력
    while (1) {
        hub_reg[0] = 14;
        hub_reg[1] = 3;
        hub_reg[2] = 0;
        hub_reg[3] = 0;

        const int NSTEP = 19;        // 0~18 인덱스
        int x_arr[NSTEP], y_arr[NSTEP];
        
        hub_reg[0] = 9;
        msleep(100);
        hub_reg[1] = 10;
        msleep(100);
        // &amp;mdash; MPU6050 6축 읽기 &amp;mdash;
        mpu_read_regs(REG_ACCEL_X_H, buf, 14);
        ax = (buf[0]&amp;lt;&amp;lt;8)|buf[1];
        ay = (buf[2]&amp;lt;&amp;lt;8)|buf[3];
        az = (buf[4]&amp;lt;&amp;lt;8)|buf[5];
        // gx = (buf[8]&amp;lt;&amp;lt;8)|buf[9];
        // gy = (buf[10]&amp;lt;&amp;lt;8)|buf[11];
        // gz = (buf[12]&amp;lt;&amp;lt;8)|buf[13];

        // &amp;ldquo;틸트(pitch)&amp;rdquo; 계산
        int16_t mpu_pitch = compute_mpu_pitch(ax, ay, az);

        // &amp;mdash; UART 출력 &amp;mdash;
        xil_printf(&quot;AX =%6d AY =%6d AZ =%6d     mpu_pitch =%4d\n\r&quot;, ax, ay, az, mpu_pitch);
//        msleep(100);

        LCD_GotoXY(0,0);
        LCD_WriteSignedInt(ax);
        LCD_WriteSignedInt(ay);
        LCD_WriteSignedInt(az);
print(&quot;1&quot;);
        hub_reg[2] = 1;
        usleep(1);

        print(&quot;2&quot;);


         msleep(10);
         hub_reg[3] = mpu_pitch;
print(&quot;3&quot;);

        oled_clear();
print(&quot;4&quot;);

        for (int idx = 0; idx &amp;lt; NSTEP; idx++) {
            // 1) trigger servomove/setangle 은 이미 밖에서 함
            // 2) hub_reg[6] 이 1 될 때까지 기다린다
            xil_printf(&quot;idx = %d&quot;, idx);

            while ((hub_reg[6] &amp;amp; 0x1) == 0) {
                usleep(1);
            }
            // 3) 1 이 올라왔으면 단 한 번만 읽고
            x_arr[idx] = (int)hub_reg[4];
            y_arr[idx] = (int)hub_reg[5];
            oled_draw_pixel(x_arr[idx], y_arr[idx]);
            // 4) flag clear
            hub_reg[6] = 0;
        }
        print(&quot;1&quot;);
print(&quot;20&quot;);

        msleep(100);

        // 최장 거리 좌표 찾기
        int sel_idx  = 0;
        int max_dsq  = 0;
        for (int idx = 0; idx &amp;lt; NSTEP; ++idx) {
            int dsq = x_arr[idx]*x_arr[idx] + y_arr[idx]*y_arr[idx];
            if (dsq &amp;gt; max_dsq) {
                max_dsq = dsq;
                sel_idx = idx;
            }
        }

        // 최장 거리 쪽으로 서보1 회전
        hub_reg[0] = sel_idx;
        msleep(500);

        // LCD 에 선택 각도(&amp;deg;) 표시
        LCD_GotoXY(1, 0);
        LCD_WriteSignedInt(sel_idx * 10);   // 인덱스&amp;rarr;&amp;deg; (10&amp;deg; 단위)
        msleep(500);
    }

    cleanup_platform();
    return 0;
}

//------------------------------------------------------------------------------
// MPU6050 I&amp;sup2;C 쓰기 헬퍼
//------------------------------------------------------------------------------
void mpu_write_reg(uint8_t reg, uint8_t val) {
    uint8_t buf[2] = { reg, val };
    XIic_Send(iic_inst.BaseAddress, MPU_ADDR, buf, 2, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

//------------------------------------------------------------------------------
// MPU6050 I&amp;sup2;C 연속 읽기 헬퍼
//------------------------------------------------------------------------------
void mpu_read_regs(uint8_t start_reg, uint8_t *dst, int len) {
    // 1) 읽을 레지스터 주소 전송 (Repeated Start 유지)
    XIic_Send(iic_inst.BaseAddress, MPU_ADDR, &amp;amp;start_reg, 1, 0);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
    // 2) 바로 읽기 &amp;rarr; STOP
    XIic_Recv(iic_inst.BaseAddress, MPU_ADDR, dst, len, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}


//------------------------------------------------------------------------------
// @brief 근사: raw&amp;rarr;pitch(&amp;deg;) 정수
//    sqrt&amp;asymp;max+0.5&amp;middot;min, atan2&amp;asymp;x/(1+0.28x&amp;sup2;)
//------------------------------------------------------------------------------
static int16_t compute_mpu_pitch(int16_t ax,int16_t ay,int16_t az) {
    const float G=4096.0f;
    float x=(float)ax/G, y=(float)ay/G, z=(float)az/G;
    float ay0=y&amp;lt;0?-y:y, az0=z&amp;lt;0?-z:z;
    float vmax= ay0&amp;gt;az0? ay0:az0;
    float vmin= ay0&amp;gt;az0? az0:ay0;
    float denom = vmax + 0.5f*vmin + 1e-6f;
    float r = x/denom;
    float rad = r/(1.0f + 0.28f*r*r);
    float deg = rad * 57.2957795f;
    return (int16_t)(deg + (deg&amp;gt;=0?0.5f:-0.5f));
}


//------------------------------------------------------------------------------
// Text LCD 제어 함수들 (기존 코드 그대로)
//------------------------------------------------------------------------------
void LCD_WriteCommand(uint8_t cmd) {
    uint8_t high =  cmd   &amp;amp; 0xF0;
    uint8_t low  = (cmd&amp;lt;&amp;lt;4)&amp;amp; 0xF0;
    uint8_t seq[4] = {
        high|0x0C, high|0x08,
        low |0x0C, low |0x08
    };
    XIic_Send(iic_inst.BaseAddress, LCD_ADDR, seq, 4, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

void LCD_WriteData(uint8_t d) {
    uint8_t high =  d     &amp;amp; 0xF0;
    uint8_t low  = (d &amp;lt;&amp;lt;4)&amp;amp; 0xF0;
    uint8_t seq[4] = {
        high|0x0D, high|0x08,
        low |0x0D, low |0x08
    };
    XIic_Send(iic_inst.BaseAddress, LCD_ADDR, seq, 4, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

void LCD_Init(void) {
    msleep(50);
    LCD_WriteCommand(0x33); msleep(5);
    LCD_WriteCommand(0x32);
    LCD_WriteCommand(0x28);
    LCD_WriteCommand(0x0F);
    LCD_WriteCommand(0x06);
    LCD_WriteCommand(0x01); msleep(5);
}

void LCD_GotoXY(uint8_t row, uint8_t col) {
    uint8_t addr = 0x80 | (row&amp;lt;&amp;lt;6) | col;
    LCD_WriteCommand(addr);
}

// 부호 포함 5자리 찍기
void LCD_WriteSignedInt(int16_t v) {
    char tmp[6];
    // &quot;%+5d&quot; &amp;rarr; 항상 부호, 총 5칸
    sprintf(tmp, &quot;%+5d&quot;, v);
    for (int i = 0; i &amp;lt; 5; i++) {
        LCD_WriteData((uint8_t)tmp[i]);
    }
}

//------------------------------------------------------------------------------
// OLED 제어 함수들
//------------------------------------------------------------------------------
// Control + 명령어 1바이트
void oled_write_cmd(uint8_t cmd) {
    uint8_t buf[2] = { OLED_CTL_CMD, cmd };
    XIic_Send(iic_inst.BaseAddress, OLED_ADDR, buf, 2, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

// Control + 데이터 1바이트
void oled_write_data(uint8_t d) {
    uint8_t buf[2] = { OLED_CTL_DAT, d };
    XIic_Send(iic_inst.BaseAddress, OLED_ADDR, buf, 2, XIIC_STOP);
    while (XIic_IsIicBusy(iic_inst.BaseAddress));
}

// SSD1306 초기화 (페이지 주소 모드 포함)
void oled_init(void) {
    const uint8_t seq[] = {
      0xAE,           // display off
      0x20,0x02,      // page addressing mode
      0xB0,           // page0
      0x00,0x10,      // col addr = 0
      0x40,           // start line = 0
      0x81,0x7F,      // contrast
      0xA1,           // seg remap
      0xC8,           // com scan dec
      0xA6,           // normal display
      0xA8,0x3F,      // multiplex 1/64
      0xD3,0x00,      // display offset
      0xD5,0x80,      // clk div
      0xD9,0x22,      // pre-charge
      0xDA,0x12,      // com pins
      0xDB,0x20,      // vcomh
      0x8D,0x14,      // charge pump on
      0xAF            // display on
    };
    for (int i = 0; i &amp;lt; (int)sizeof(seq); i++) {
        oled_write_cmd(seq[i]);
    }
}

// 전체 화면 클리어
void oled_clear(void) {
    for (int p = 0; p &amp;lt; 8; p++) {
        oled_write_cmd(0xB0 | p);
        oled_write_cmd(0x00);
        oled_write_cmd(0x10);
        for (int c = 0; c &amp;lt; 128; c++) {
            oled_write_data(0x00);
        }
    }
}

//------------------------------------------------------------------------------
// 문자열(부호 포함 숫자) 출력 helper
//------------------------------------------------------------------------------
// page: 0~7, col: 문자 단위(0~15), s: null-terminated 문자열
void oled_puts_str(int page, int col, const char *s) {
    // 1) 페이지&amp;middot;컬럼 설정
    oled_write_cmd(0xB0 | page);
    uint8_t x = col * 8;
    oled_write_cmd(0x00 | (x &amp;amp; 0x0F));
    oled_write_cmd(0x10 | ((x &amp;gt;&amp;gt; 4) &amp;amp; 0x0F));
    // 2) 글자별 8바이트 폰트 전송
    while (*s) {
        uint8_t buf[9];
        buf[0] = OLED_CTL_DAT;
        // ASCII 0x20~0x7F 대응
        memcpy(buf+1, font8x8_basic[(uint8_t)*s - 0x20], 8);
        XIic_Send(iic_inst.BaseAddress, OLED_ADDR, buf, 9, XIIC_STOP);
        while (XIic_IsIicBusy(iic_inst.BaseAddress));
        s++;
    }
}

//------------------------------------------------------------------------------
// OLED 픽셀 업데이트: 버퍼&amp;rarr;실제 GDDRAM (한 컬럼만 갱신)
//------------------------------------------------------------------------------
void oled_update_column(int page, int col) { 
    oled_write_cmd(0xB0 | page);              // page 설정
    oled_write_cmd(0x00 | (col &amp;amp; 0x0F));      // col low
    oled_write_cmd(0x10 | ((col&amp;gt;&amp;gt;4)&amp;amp;0x0F));   // col high
    oled_write_data(oled_buf[page][col]);     // 버퍼값 전송
}

//------------------------------------------------------------------------------
// (x,y) 에 1픽셀 그리기 (버퍼 갱신 + 해당 컬럼만 갱신)
//------------------------------------------------------------------------------
void oled_draw_pixel(int x, int y) {       
    if (x&amp;lt;0||x&amp;gt;127||y&amp;lt;0||y&amp;gt;63) return;
    int page = y / 8;
    int bit  = y % 8;
    oled_buf[page][x] |= (1&amp;lt;&amp;lt;bit);            // 버퍼에 비트 세팅
    oled_update_column(page, x);              // 실제 화면에 바로 반영
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/134</guid>
      <comments>https://juniha.tistory.com/134#entry134comment</comments>
      <pubDate>Thu, 7 Aug 2025 10:24:09 +0900</pubDate>
    </item>
    <item>
      <title>[MicroBlaze] DHT11_iic</title>
      <link>https://juniha.tistory.com/132</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DHT11 온습도 센서를 MicroBlaze RISC-V 기반 SoC 시스템에서 AXI-Lite 인터페이스를 통해 제어하고, 습도 및 온도 데이터를 읽어 UART로 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Diagram&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTrsI/btsPDrmpEGI/YvXhyUrhOrKREn9BeUvsg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTrsI/btsPDrmpEGI/YvXhyUrhOrKREn9BeUvsg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTrsI/btsPDrmpEGI/YvXhyUrhOrKREn9BeUvsg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTrsI%2FbtsPDrmpEGI%2FYvXhyUrhOrKREn9BeUvsg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1566&quot; height=&quot;527&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드_myip_dht11_iic&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753784305017&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;`timescale 1 ns / 1 ps

	module myip_dht11_iic #
	(
		// Users to add parameters here

		// User parameters ends
		// Do not modify the parameters beyond this line


		// Parameters of Axi Slave Bus Interface S00_AXI
		parameter integer C_S00_AXI_DATA_WIDTH	= 32,
		parameter integer C_S00_AXI_ADDR_WIDTH	= 5
	)
	(
		// Users to add ports here
        inout dht11_data,
		output [15:0] debug_led,
		// User ports ends
		// Do not modify the ports beyond this line


		// Ports of Axi Slave Bus Interface S00_AXI
		input wire  s00_axi_aclk,
		input wire  s00_axi_aresetn,
		input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
		input wire [2 : 0] s00_axi_awprot,
		input wire  s00_axi_awvalid,
		output wire  s00_axi_awready,
		input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
		input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
		input wire  s00_axi_wvalid,
		output wire  s00_axi_wready,
		output wire [1 : 0] s00_axi_bresp,
		output wire  s00_axi_bvalid,
		input wire  s00_axi_bready,
		input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
		input wire [2 : 0] s00_axi_arprot,
		input wire  s00_axi_arvalid,
		output wire  s00_axi_arready,
		output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
		output wire [1 : 0] s00_axi_rresp,
		output wire  s00_axi_rvalid,
		input wire  s00_axi_rready
	);
// Instantiation of Axi Bus Interface S00_AXI
	myip_dht11_iic_slave_lite_v1_0_S00_AXI # ( 
		.C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH),
		.C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH)
	) myip_dht11_iic_slave_lite_v1_0_S00_AXI_inst (
	   .dht11_data(dht11_data),
		.debug_led(debug_led),

		.S_AXI_ACLK(s00_axi_aclk),
		.S_AXI_ARESETN(s00_axi_aresetn),
		.S_AXI_AWADDR(s00_axi_awaddr),
		.S_AXI_AWPROT(s00_axi_awprot),
		.S_AXI_AWVALID(s00_axi_awvalid),
		.S_AXI_AWREADY(s00_axi_awready),
		.S_AXI_WDATA(s00_axi_wdata),
		.S_AXI_WSTRB(s00_axi_wstrb),
		.S_AXI_WVALID(s00_axi_wvalid),
		.S_AXI_WREADY(s00_axi_wready),
		.S_AXI_BRESP(s00_axi_bresp),
		.S_AXI_BVALID(s00_axi_bvalid),
		.S_AXI_BREADY(s00_axi_bready),
		.S_AXI_ARADDR(s00_axi_araddr),
		.S_AXI_ARPROT(s00_axi_arprot),
		.S_AXI_ARVALID(s00_axi_arvalid),
		.S_AXI_ARREADY(s00_axi_arready),
		.S_AXI_RDATA(s00_axi_rdata),
		.S_AXI_RRESP(s00_axi_rresp),
		.S_AXI_RVALID(s00_axi_rvalid),
		.S_AXI_RREADY(s00_axi_rready)
	);

	// Add user logic here

	// User logic ends

	endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드 _myip_dht11_iic_slave_lite_v1_0_S00_AXI&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753784378821&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;`timescale 1 ns / 1 ps

	module myip_dht11_iic_slave_lite_v1_0_S00_AXI #
	(
		// Users to add parameters here

		// User parameters ends
		// Do not modify the parameters beyond this line

		// Width of S_AXI data bus
		parameter integer C_S_AXI_DATA_WIDTH	= 32,
		// Width of S_AXI address bus
		parameter integer C_S_AXI_ADDR_WIDTH	= 5
	)
	(
		// Users to add ports here
        inout dht11_data,
		output [15:0] debug_led,
		// User ports ends
		// Do not modify the ports beyond this line

		// Global Clock Signal
		input wire  S_AXI_ACLK,
		// Global Reset Signal. This Signal is Active LOW
		input wire  S_AXI_ARESETN,
		// Write address (issued by master, acceped by Slave)
		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
		// Write channel Protection type. This signal indicates the
    		// privilege and security level of the transaction, and whether
    		// the transaction is a data access or an instruction access.
		input wire [2 : 0] S_AXI_AWPROT,
		// Write address valid. This signal indicates that the master signaling
    		// valid write address and control information.
		input wire  S_AXI_AWVALID,
		// Write address ready. This signal indicates that the slave is ready
    		// to accept an address and associated control signals.
		output wire  S_AXI_AWREADY,
		// Write data (issued by master, acceped by Slave) 
		input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
		// Write strobes. This signal indicates which byte lanes hold
    		// valid data. There is one write strobe bit for each eight
    		// bits of the write data bus.    
		input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
		// Write valid. This signal indicates that valid write
    		// data and strobes are available.
		input wire  S_AXI_WVALID,
		// Write ready. This signal indicates that the slave
    		// can accept the write data.
		output wire  S_AXI_WREADY,
		// Write response. This signal indicates the status
    		// of the write transaction.
		output wire [1 : 0] S_AXI_BRESP,
		// Write response valid. This signal indicates that the channel
    		// is signaling a valid write response.
		output wire  S_AXI_BVALID,
		// Response ready. This signal indicates that the master
    		// can accept a write response.
		input wire  S_AXI_BREADY,
		// Read address (issued by master, acceped by Slave)
		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,
		// Protection type. This signal indicates the privilege
    		// and security level of the transaction, and whether the
    		// transaction is a data access or an instruction access.
		input wire [2 : 0] S_AXI_ARPROT,
		// Read address valid. This signal indicates that the channel
    		// is signaling valid read address and control information.
		input wire  S_AXI_ARVALID,
		// Read address ready. This signal indicates that the slave is
    		// ready to accept an address and associated control signals.
		output wire  S_AXI_ARREADY,
		// Read data (issued by slave)
		output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
		// Read response. This signal indicates the status of the
    		// read transfer.
		output wire [1 : 0] S_AXI_RRESP,
		// Read valid. This signal indicates that the channel is
    		// signaling the required read data.
		output wire  S_AXI_RVALID,
		// Read ready. This signal indicates that the master can
    		// accept the read data and response information.
		input wire  S_AXI_RREADY
	);

    wire [7:0] humidity, temperature;

	// AXI4LITE signals
	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_awaddr;
	reg  	axi_awready;
	reg  	axi_wready;
	reg [1 : 0] 	axi_bresp;
	reg  	axi_bvalid;
	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_araddr;
	reg  	axi_arready;
	reg [1 : 0] 	axi_rresp;
	reg  	axi_rvalid;

	// Example-specific design signals
	// local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH
	// ADDR_LSB is used for addressing 32/64 bit registers/memories
	// ADDR_LSB = 2 for 32 bits (n downto 2)
	// ADDR_LSB = 3 for 64 bits (n downto 3)
	localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;
	localparam integer OPT_MEM_ADDR_BITS = 2;
	//----------------------------------------------
	//-- Signals for user logic register space example
	//------------------------------------------------
	//-- Number of Slave Registers 8
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg0;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg1;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg2;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg3;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg4;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg5;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg6;
	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg7;
	integer	 byte_index;

	// I/O Connections assignments

	assign S_AXI_AWREADY	= axi_awready;
	assign S_AXI_WREADY	= axi_wready;
	assign S_AXI_BRESP	= axi_bresp;
	assign S_AXI_BVALID	= axi_bvalid;
	assign S_AXI_ARREADY	= axi_arready;
	assign S_AXI_RRESP	= axi_rresp;
	assign S_AXI_RVALID	= axi_rvalid;
	 //state machine varibles 
	 reg [1:0] state_write;
	 reg [1:0] state_read;
	 //State machine local parameters
	 localparam Idle = 2'b00,Raddr = 2'b10,Rdata = 2'b11 ,Waddr = 2'b10,Wdata = 2'b11;
	// Implement Write state machine
	// Outstanding write transactions are not supported by the slave i.e., master should assert bready to receive response on or before it starts sending the new transaction
	always @(posedge S_AXI_ACLK)                                 
	  begin                                 
	     if (S_AXI_ARESETN == 1'b0)                                 
	       begin                                 
	         axi_awready &amp;lt;= 0;                                 
	         axi_wready &amp;lt;= 0;                                 
	         axi_bvalid &amp;lt;= 0;                                 
	         axi_bresp &amp;lt;= 0;                                 
	         axi_awaddr &amp;lt;= 0;                                 
	         state_write &amp;lt;= Idle;                                 
	       end                                 
	     else                                  
	       begin                                 
	         case(state_write)                                 
	           Idle:                                      
	             begin                                 
	               if(S_AXI_ARESETN == 1'b1)                                  
	                 begin                                 
	                   axi_awready &amp;lt;= 1'b1;                                 
	                   axi_wready &amp;lt;= 1'b1;                                 
	                   state_write &amp;lt;= Waddr;                                 
	                 end                                 
	               else state_write &amp;lt;= state_write;                                 
	             end                                 
	           Waddr:        //At this state, slave is ready to receive address along with corresponding control signals and first data packet. Response valid is also handled at this state                                 
	             begin                                 
	               if (S_AXI_AWVALID &amp;amp;&amp;amp; S_AXI_AWREADY)                                 
	                  begin                                 
	                    axi_awaddr &amp;lt;= S_AXI_AWADDR;                                 
	                    if(S_AXI_WVALID)                                  
	                      begin                                   
	                        axi_awready &amp;lt;= 1'b1;                                 
	                        state_write &amp;lt;= Waddr;                                 
	                        axi_bvalid &amp;lt;= 1'b1;                                 
	                      end                                 
	                    else                                  
	                      begin                                 
	                        axi_awready &amp;lt;= 1'b0;                                 
	                        state_write &amp;lt;= Wdata;                                 
	                        if (S_AXI_BREADY &amp;amp;&amp;amp; axi_bvalid) axi_bvalid &amp;lt;= 1'b0;                                 
	                      end                                 
	                  end                                 
	               else                                  
	                  begin                                 
	                    state_write &amp;lt;= state_write;                                 
	                    if (S_AXI_BREADY &amp;amp;&amp;amp; axi_bvalid) axi_bvalid &amp;lt;= 1'b0;                                 
	                   end                                 
	             end                                 
	          Wdata:        //At this state, slave is ready to receive the data packets until the number of transfers is equal to burst length                                 
	             begin                                 
	               if (S_AXI_WVALID)                                 
	                 begin                                 
	                   state_write &amp;lt;= Waddr;                                 
	                   axi_bvalid &amp;lt;= 1'b1;                                 
	                   axi_awready &amp;lt;= 1'b1;                                 
	                 end                                 
	                else                                  
	                 begin                                 
	                   state_write &amp;lt;= state_write;                                 
	                   if (S_AXI_BREADY &amp;amp;&amp;amp; axi_bvalid) axi_bvalid &amp;lt;= 1'b0;                                 
	                 end                                              
	             end                                 
	          endcase                                 
	        end                                 
	      end                                 

	// Implement memory mapped register select and write logic generation
	// The write data is accepted and written to memory mapped registers when
	// axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
	// select byte enables of slave registers while writing.
	// These registers are cleared when reset (active low) is applied.
	// Slave register write enable is asserted when valid address and data are available
	// and the slave is ready to accept the write address and write data.
	 

	always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      slv_reg0 &amp;lt;= 0;
	      slv_reg1 &amp;lt;= 0;
	      slv_reg2 &amp;lt;= 0;
	      slv_reg3 &amp;lt;= 0;
	      slv_reg4 &amp;lt;= 0;
	      slv_reg5 &amp;lt;= 0;
	      slv_reg6 &amp;lt;= 0;
	      slv_reg7 &amp;lt;= 0;
	    end 
	  else begin
	    if (S_AXI_WVALID)
	      begin
	        case ( (S_AXI_AWVALID) ? S_AXI_AWADDR[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] : axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
	          3'h0:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 0
	                slv_reg0[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h1:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 1
	                slv_reg1[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h2:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 2
	                slv_reg2[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h3:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 3
	                slv_reg3[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h4:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 4
	                slv_reg4[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h5:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 5
	                slv_reg5[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h6:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 6
	                slv_reg6[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          3'h7:
	            for ( byte_index = 0; byte_index &amp;lt;= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
	                // Respective byte enables are asserted as per write strobes 
	                // Slave register 7
	                slv_reg7[(byte_index*8) +: 8] &amp;lt;= S_AXI_WDATA[(byte_index*8) +: 8];
	              end  
	          default : begin
	                      slv_reg0 &amp;lt;= slv_reg0;
	                      slv_reg1 &amp;lt;= slv_reg1;
	                      slv_reg2 &amp;lt;= slv_reg2;
	                      slv_reg3 &amp;lt;= slv_reg3;
	                      slv_reg4 &amp;lt;= slv_reg4;
	                      slv_reg5 &amp;lt;= slv_reg5;
	                      slv_reg6 &amp;lt;= slv_reg6;
	                      slv_reg7 &amp;lt;= slv_reg7;
	                    end
	        endcase
	      end
	  end
	end    

	// Implement read state machine
	  always @(posedge S_AXI_ACLK)                                       
	    begin                                       
	      if (S_AXI_ARESETN == 1'b0)                                       
	        begin                                       
	         //asserting initial values to all 0's during reset                                       
	         axi_arready &amp;lt;= 1'b0;                                       
	         axi_rvalid &amp;lt;= 1'b0;                                       
	         axi_rresp &amp;lt;= 1'b0;                                       
	         state_read &amp;lt;= Idle;                                       
	        end                                       
	      else                                       
	        begin                                       
	          case(state_read)                                       
	            Idle:     //Initial state inidicating reset is done and ready to receive read/write transactions                                       
	              begin                                                
	                if (S_AXI_ARESETN == 1'b1)                                        
	                  begin                                       
	                    state_read &amp;lt;= Raddr;                                       
	                    axi_arready &amp;lt;= 1'b1;                                       
	                  end                                       
	                else state_read &amp;lt;= state_read;                                       
	              end                                       
	            Raddr:        //At this state, slave is ready to receive address along with corresponding control signals                                       
	              begin                                       
	                if (S_AXI_ARVALID &amp;amp;&amp;amp; S_AXI_ARREADY)                                       
	                  begin                                       
	                    state_read &amp;lt;= Rdata;                                       
	                    axi_araddr &amp;lt;= S_AXI_ARADDR;                                       
	                    axi_rvalid &amp;lt;= 1'b1;                                       
	                    axi_arready &amp;lt;= 1'b0;                                       
	                  end                                       
	                else state_read &amp;lt;= state_read;                                       
	              end                                       
	            Rdata:        //At this state, slave is ready to send the data packets until the number of transfers is equal to burst length                                       
	              begin                                           
	                if (S_AXI_RVALID &amp;amp;&amp;amp; S_AXI_RREADY)                                       
	                  begin                                       
	                    axi_rvalid &amp;lt;= 1'b0;                                       
	                    axi_arready &amp;lt;= 1'b1;                                       
	                    state_read &amp;lt;= Raddr;                                       
	                  end                                       
	                else state_read &amp;lt;= state_read;                                       
	              end                                       
	           endcase                                       
	          end                                       
	        end                                         
	// Implement memory mapped register select and read logic generation
	  assign S_AXI_RDATA = (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h0) ? humidity : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h1) ? temperature : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h2) ? slv_reg2 : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h3) ? slv_reg3 : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h4) ? slv_reg4 : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h5) ? slv_reg5 : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h6) ? slv_reg6 : 
	       (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 3'h7) ? 32'h1234 : 0; 
	// Add user logic here
    dht11_cntr dht11(      //fsm, asm은 알고리즘대로 그래서 상태가 많아서, fsm유한 상태 머신 
        .clk(S_AXI_ACLK), 
        .reset_p(~S_AXI_ARESETN),          //input도 reg선언이 안된다. inout도 입력이 있기 때문에 wire만 된다.
        .dht11_data(dht11_data),       //inout 포트는 reg선언이 안된다.
        .humidity(humidity), 
        .temperature(temperature),
        .debug_led(debug_led)   );
	// User logic ends

	endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드_ Vitis&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753784753074&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;               // 표준 입출력 함수 사용
#include &quot;platform.h&quot;           // 플랫폼 초기화 및 종료 함수 포함
#include &quot;xil_printf.h&quot;         // Xilinx 전용 출력 함수 (xil_printf)
#include &quot;xparameters.h&quot;        // 하드웨어 주소 등 시스템 파라미터 정의
#include &quot;sleep.h&quot;              // sleep 함수 사용을 위한 헤더

// DHT11 IP 코어의 베이스 주소를 정의 (xparameters.h에서 자동 정의된 매크로 사용)
#define dht_addr XPAR_MYIP_DHT11_IIC_0_BASEADDR

int main()
{
    // 플랫폼 초기화 (UART 설정 등 기본 하드웨어 설정)
    init_platform();
    
    // UART를 통해 간단한 출력 확인
    print(&quot;Hello World\n\r&quot;);
    print(&quot;Successfully ran Hello World application&quot;);

    // DHT11 센서 데이터를 읽을 수 있는 메모리 주소 포인터 생성
    // 이 주소는 사용자 정의 IP 코어가 메모리 맵에 매핑된 위치
    volatile unsigned int *dht11_instance = (volatile unsigned int*) dht_addr;

    while(1){
        // DHT11 센서의 습도 값을 읽어 UART로 출력 (레지스터 0번)
        xil_printf(&quot;Humidity : %d\n\r&quot;, dht11_instance[0]);

        // DHT11 센서의 온도 값을 읽어 UART로 출력 (레지스터 1번)
        xil_printf(&quot;Temperature : %d\n\r&quot;, dht11_instance[1]);

        // 3초 대기 (센서 업데이트 주기에 맞춰 딜레이)
        sleep(3);
    }

    // 플랫폼 종료 처리 (자원 정리 등)
    cleanup_platform();
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동작 영상&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;462&quot; data-start=&quot;372&quot; data-ke-size=&quot;size16&quot;&gt;사용자 정의 IP(myip_dht11_iic_0) 내부에 구현된 FSM(dht11_cntr)이 DHT11 센서에 대해 아래 프로토콜을 자동으로 수행합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;561&quot; data-start=&quot;465&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;474&quot; data-start=&quot;465&quot;&gt;센서 초기화한다.&lt;/li&gt;
&lt;li data-end=&quot;492&quot; data-start=&quot;477&quot;&gt;데이터 요청 신호 전송한다.&lt;/li&gt;
&lt;li data-end=&quot;515&quot; data-start=&quot;495&quot;&gt;센서 응답 대기 및 데이터 수신한다.&lt;/li&gt;
&lt;li data-end=&quot;561&quot; data-start=&quot;518&quot;&gt;습도 및 온도 값 저장 (humidity, temperature)한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;672&quot; data-end=&quot;773&quot;&gt;
&lt;li data-start=&quot;672&quot; data-end=&quot;709&quot;&gt;dht11_instance[0]에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;습도 값&lt;/b&gt;을 읽는다,&lt;/li&gt;
&lt;li data-start=&quot;710&quot; data-end=&quot;749&quot;&gt;dht11_instance[1]에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;온도 값&lt;/b&gt;을 읽는다.&lt;/li&gt;
&lt;li data-start=&quot;750&quot; data-end=&quot;773&quot;&gt;두 값을 UART로 PC에 출력되는 것을 확인 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/132</guid>
      <comments>https://juniha.tistory.com/132#entry132comment</comments>
      <pubDate>Tue, 29 Jul 2025 19:39:39 +0900</pubDate>
    </item>
    <item>
      <title>[MicroBlaze] Button_control</title>
      <link>https://juniha.tistory.com/131</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MicroBlaze에서 외부 4비트 버튼 입력을 AXI GPIO로 읽고, UART를 통해 실시간으로 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Diagram&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oa3MU/btsPCUWpKsU/3t7LjVNZwKol4UIDaUhyJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oa3MU/btsPCUWpKsU/3t7LjVNZwKol4UIDaUhyJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oa3MU/btsPCUWpKsU/3t7LjVNZwKol4UIDaUhyJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foa3MU%2FbtsPCUWpKsU%2F3t7LjVNZwKol4UIDaUhyJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1551&quot; height=&quot;507&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753700960657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;             // 표준 입출력 함수
#include &quot;platform.h&quot;          // 플랫폼 초기화 및 종료 함수
#include &quot;xil_printf.h&quot;        // UART 출력용 함수 (xil_printf)
#include &quot;xparameters.h&quot;       // 하드웨어 주소 및 파라미터 정의
#include &quot;xgpio.h&quot;             // AXI GPIO 제어용 헤더
#include &quot;sleep.h&quot;             // sleep 함수 (초 단위)

#define BTN_ADDR XPAR_XGPIO_0_BASEADDR   // AXI GPIO의 기본 주소
#define BTN_CHANNEL 1                    // 버튼이 연결된 채널 번호 (채널 1)

int main()
{
    init_platform(); // 플랫폼 초기화 (UART, 캐시, 인터럽트 등)

    print(&quot;Hello World\n\r&quot;);
    print(&quot;Successfully ran Hello World application\n\r&quot;);

    XGpio_Config *cfg_ptr;  // GPIO 설정 구조체 포인터
    XGpio btn_device;       // 버튼용 GPIO 인스턴스
    u16 data = 0;           // 버튼 입력값 저장 변수 (최대 16비트)

    // GPIO 디바이스 설정 정보를 가져옴
    cfg_ptr = XGpio_LookupConfig(BTN_ADDR);

    // GPIO 디바이스 초기화
    XGpio_CfgInitialize(&amp;amp;btn_device, cfg_ptr, cfg_ptr-&amp;gt;BaseAddress);

    // 채널 1을 입력으로 설정 (0: 출력, 1: 입력 &amp;rarr; 0b1111 = 4비트 모두 입력)
    XGpio_SetDataDirection(&amp;amp;btn_device, BTN_CHANNEL, 0b1111);

    while(1){
        // 버튼 상태 읽기 (AXI GPIO에서 4비트 입력 읽음)
        data = XGpio_DiscreteRead(&amp;amp;btn_device, BTN_CHANNEL);

        // UART로 버튼 값 출력 (터미널에서 확인 가능)
        xil_printf(&quot;Button : %d\n\r&quot;, data);

        // 1초 대기 (버튼 polling 주기)
        sleep(1);
    }

    cleanup_platform(); // 플랫폼 정리 (실제로는 도달하지 않음)
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동작 영상&lt;/b&gt;&lt;/h3&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;버튼비트 위치바이너리 값UART 출력 (%d)&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;382&quot; data-start=&quot;148&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;382&quot; data-start=&quot;247&quot;&gt;
&lt;tr data-end=&quot;280&quot; data-start=&quot;247&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;256&quot; data-start=&quot;247&quot;&gt;btn[0]&lt;/td&gt;
&lt;td data-end=&quot;264&quot; data-start=&quot;256&quot; data-col-size=&quot;sm&quot;&gt;bit 0&lt;/td&gt;
&lt;td data-end=&quot;273&quot; data-start=&quot;264&quot; data-col-size=&quot;sm&quot;&gt;0001&lt;/td&gt;
&lt;td data-end=&quot;280&quot; data-start=&quot;273&quot; data-col-size=&quot;sm&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;314&quot; data-start=&quot;281&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;290&quot; data-start=&quot;281&quot;&gt;btn[1]&lt;/td&gt;
&lt;td data-end=&quot;298&quot; data-start=&quot;290&quot; data-col-size=&quot;sm&quot;&gt;bit 1&lt;/td&gt;
&lt;td data-end=&quot;307&quot; data-start=&quot;298&quot; data-col-size=&quot;sm&quot;&gt;0010&lt;/td&gt;
&lt;td data-end=&quot;314&quot; data-start=&quot;307&quot; data-col-size=&quot;sm&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;348&quot; data-start=&quot;315&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;324&quot; data-start=&quot;315&quot;&gt;btn[2]&lt;/td&gt;
&lt;td data-end=&quot;332&quot; data-start=&quot;324&quot; data-col-size=&quot;sm&quot;&gt;bit 2&lt;/td&gt;
&lt;td data-end=&quot;341&quot; data-start=&quot;332&quot; data-col-size=&quot;sm&quot;&gt;0100&lt;/td&gt;
&lt;td data-end=&quot;348&quot; data-start=&quot;341&quot; data-col-size=&quot;sm&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;382&quot; data-start=&quot;349&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;358&quot; data-start=&quot;349&quot;&gt;btn[3]&lt;/td&gt;
&lt;td data-end=&quot;366&quot; data-start=&quot;358&quot; data-col-size=&quot;sm&quot;&gt;bit 3&lt;/td&gt;
&lt;td data-end=&quot;375&quot; data-start=&quot;366&quot; data-col-size=&quot;sm&quot;&gt;1000&lt;/td&gt;
&lt;td data-end=&quot;382&quot; data-start=&quot;375&quot; data-col-size=&quot;sm&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;누른 버튼 조합바이너리출력 값&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;643&quot; data-start=&quot;406&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;643&quot; data-start=&quot;476&quot;&gt;
&lt;tr data-end=&quot;510&quot; data-start=&quot;476&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;494&quot; data-start=&quot;476&quot;&gt;btn[0] + btn[1]&lt;/td&gt;
&lt;td data-end=&quot;503&quot; data-start=&quot;494&quot; data-col-size=&quot;sm&quot;&gt;0011&lt;/td&gt;
&lt;td data-end=&quot;510&quot; data-start=&quot;503&quot; data-col-size=&quot;sm&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;546&quot; data-start=&quot;511&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;529&quot; data-start=&quot;511&quot;&gt;btn[2] + btn[3]&lt;/td&gt;
&lt;td data-end=&quot;538&quot; data-start=&quot;529&quot; data-col-size=&quot;sm&quot;&gt;1100&lt;/td&gt;
&lt;td data-end=&quot;546&quot; data-start=&quot;538&quot; data-col-size=&quot;sm&quot;&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;581&quot; data-start=&quot;547&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;565&quot; data-start=&quot;547&quot;&gt;btn[0] + btn[2]&lt;/td&gt;
&lt;td data-end=&quot;574&quot; data-start=&quot;565&quot; data-col-size=&quot;sm&quot;&gt;0101&lt;/td&gt;
&lt;td data-end=&quot;581&quot; data-start=&quot;574&quot; data-col-size=&quot;sm&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;617&quot; data-start=&quot;582&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;600&quot; data-start=&quot;582&quot;&gt;btn[1] + btn[3]&lt;/td&gt;
&lt;td data-end=&quot;609&quot; data-start=&quot;600&quot; data-col-size=&quot;sm&quot;&gt;1010&lt;/td&gt;
&lt;td data-end=&quot;617&quot; data-start=&quot;609&quot; data-col-size=&quot;sm&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;643&quot; data-start=&quot;618&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;626&quot; data-start=&quot;618&quot;&gt;모두 누름&lt;/td&gt;
&lt;td data-end=&quot;635&quot; data-start=&quot;626&quot; data-col-size=&quot;sm&quot;&gt;1111&lt;/td&gt;
&lt;td data-end=&quot;643&quot; data-start=&quot;635&quot; data-col-size=&quot;sm&quot;&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;XGpio_DiscreteRead()는 각 버튼의 상태를 비트별로 읽어 정수로 반환되는 것을 확인 할 수 있다,&lt;/li&gt;
&lt;li&gt;각 버튼은 2의 제곱수 단위 값(1, 2, 4, 8)을 가지고. 따라서 단일 버튼을 눌렀을 때 출력되는 값은 해당 버튼의 비트 위치에 따라 결정되는 것을 확인 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/131</guid>
      <comments>https://juniha.tistory.com/131#entry131comment</comments>
      <pubDate>Mon, 28 Jul 2025 20:22:47 +0900</pubDate>
    </item>
    <item>
      <title>[MicroBlaze] fnd_control</title>
      <link>https://juniha.tistory.com/130</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MicroBlaze V RISC-V 프로세서를 이용하여 UART 통신을 통해 입력을 받고, 7세그먼트 디스플레이로 출력하는 임베디드 SoC 시스템을 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Diagram&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1545&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRl2jV/btsPBmsM0Xd/GxrMUSw6PqE6W1rQ8BcBf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRl2jV/btsPBmsM0Xd/GxrMUSw6PqE6W1rQ8BcBf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRl2jV/btsPBmsM0Xd/GxrMUSw6PqE6W1rQ8BcBf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRl2jV%2FbtsPBmsM0Xd%2FGxrMUSw6PqE6W1rQ8BcBf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1545&quot; height=&quot;357&quot; data-origin-width=&quot;1545&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753699042684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;`timescale 1 ps / 1 ps  // 시뮬레이션 시간 단위 및 정밀도 설정

//------------------------------------------------------------------------------
// Top-Level Wrapper Module for MicroBlaze V System
// 이 모듈은 Vivado IP Integrator로 생성된 MicroBlaze V 시스템(mblazeV_fnd)의
// 상위 래퍼로서 외부 핀과 내부 블록 디자인을 연결합니다.
//------------------------------------------------------------------------------
module mblazeV_fnd_wrapper
   (
    reset,                      // 외부 리셋 입력 (active-high)
    seven_seg_led_an_tri_o,    // 7세그먼트 애너드 제어 출력 (4비트)
    seven_seg_led_disp_tri_o,  // 7세그먼트 디스플레이 제어 출력 (8비트)
    sys_clock,                 // 외부 시스템 클록 입력
    usb_uart_rxd,              // UART 수신 데이터 (PC -&amp;gt; FPGA)
    usb_uart_txd               // UART 송신 데이터 (FPGA -&amp;gt; PC)
    );

  // 포트 선언
  input reset;
  output [3:0] seven_seg_led_an_tri_o;
  output [7:0] seven_seg_led_disp_tri_o;
  input sys_clock;
  input usb_uart_rxd;
  output usb_uart_txd;

  // 내부 배선 (포트와 동일 이름을 가진 wire로 연결됨)
  wire reset;
  wire [3:0] seven_seg_led_an_tri_o;
  wire [7:0] seven_seg_led_disp_tri_o;
  wire sys_clock;
  wire usb_uart_rxd;
  wire usb_uart_txd;

  //------------------------------------------------------------------------------
  // 인스턴스: mblazeV_fnd
  // Vivado Block Design으로 생성된 SoC 시스템 블록 인스턴스
  // MicroBlaze V 프로세서 및 AXI 기반 주변 장치(GPIO, UART 등)를 포함함
  //------------------------------------------------------------------------------
  mblazeV_fnd mblazeV_fnd_i (
        .reset(reset),
        .seven_seg_led_an_tri_o(seven_seg_led_an_tri_o),
        .seven_seg_led_disp_tri_o(seven_seg_led_disp_tri_o),
        .sys_clock(sys_clock),
        .usb_uart_rxd(usb_uart_rxd),
        .usb_uart_txd(usb_uart_txd)
  );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동작 영상&lt;/b&gt;&lt;/h3&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FPGA 보드의 MicroBlaze 시스템이 AXI GPIO를 통해 4자리 7세그먼트 FND를 제어하며, 초기값 7777에서 시작해 약 0.8초 간격으로 1씩 증가하는 것을 확인 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/130</guid>
      <comments>https://juniha.tistory.com/130#entry130comment</comments>
      <pubDate>Mon, 28 Jul 2025 20:05:16 +0900</pubDate>
    </item>
    <item>
      <title>[Project] Radar_System_사용 코드</title>
      <link>https://juniha.tistory.com/129</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드 _radar_system_top&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753604306167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module radar_system_top(
    input         clk, reset_p,
    input  [4:0]  btn,
    input         echo_1, echo_2,
    output        trig_1, trig_2,
    output        tx_uart,
    output        servo,
    output        scl, sda,
    output [7:0]  seg_7,
    output [3:0]  com,
    output [15:0] led_debug
);

    wire        btn_nedge;
    wire        en_sonic;
    wire [7:0]  angle;
    wire [11:0] dist1, dist2;
    wire        packet_sent;

    wire [15:0] bcd_angle, bcd_dist1, bcd_dist2;
    wire [15:0] sel_bcd;
    reg  [1:0]  disp_st;

    reg  [7:0]  en_graph;
    reg         data_ready, data_ready_d;
    wire        cg_pulse;

    assign led_debug = {4'b0, disp_st, en_sonic, cg_pulse, en_graph};

    // 버튼 엣지 검출
    button_cntr u_btn (
        .clk(clk),
        .reset_p(reset_p),
        .btn(btn[0]),
        .btn_pedge(),
        .btn_nedge(btn_nedge)
    );

    // 서보 PWM + 각도 생성
    servo_pwm_top u_srv (
        .clk(clk),
        .reset_p(reset_p),
        .en_sonic(en_sonic),
        .pwm(servo),
        .angle_cur(angle),
        .seg_7(),
        .com()
    );

    // 초음파 센서 1, 2
    ultrasonic_top u_s1 (
        .clk(clk),
        .reset_p(reset_p),
        .en(en_sonic),
        .echo(echo_1),
        .trig(trig_1),
        .dist(dist1),
        .seg_7(),
        .com(),
        .led_debug()
    );
    ultrasonic_top u_s2 (
        .clk(clk),
        .reset_p(reset_p),
        .en(en_sonic),
        .echo(echo_2),
        .trig(trig_2),
        .dist(dist2),
        .seg_7(),
        .com(),
        .led_debug()
    );

    // UART 송신 핸드셰이크
    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            data_ready   &amp;lt;= 1'b0;
            data_ready_d &amp;lt;= 1'b0;
        end else begin
            if (!data_ready &amp;amp;&amp;amp; (dist1 != 0) &amp;amp;&amp;amp; (dist2 != 0))
                data_ready &amp;lt;= 1'b1;
            else if (packet_sent)
                data_ready &amp;lt;= 1'b0;
            data_ready_d &amp;lt;= data_ready;
        end
    end
    assign cg_pulse = data_ready &amp;amp;&amp;amp; !data_ready_d;

    // LCD 그래프
    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            en_graph &amp;lt;= 8'd0;
        else if (dist1 &amp;lt;  15)  en_graph &amp;lt;= 8'b0000_0001;
        else if (dist1 &amp;lt;  30)  en_graph &amp;lt;= 8'b0000_0011;
        else if (dist1 &amp;lt;  45)  en_graph &amp;lt;= 8'b0000_0111;
        else if (dist1 &amp;lt;  60)  en_graph &amp;lt;= 8'b0000_1111;
        else if (dist1 &amp;lt;  75)  en_graph &amp;lt;= 8'b0001_1111;
        else if (dist1 &amp;lt;  90)  en_graph &amp;lt;= 8'b0011_1111;
        else if (dist1 &amp;lt; 105)  en_graph &amp;lt;= 8'b0111_1111;
        else                   en_graph &amp;lt;= 8'b1111_1111;
    end

    // I2C LCD
    i2c_txtlcd_top u_lcd (
        .clk(clk),
        .reset_p(reset_p),
        .btn(btn[4:1]),
        .en_cg(cg_pulse),
        .en_graph(en_graph),
        .scl(scl),
        .sda(sda)
    );

    // UART 송신
    uart_packet_sender u_uart (
        .clk(clk),
        .reset_p(reset_p),
        .angle(angle),
        .distance1(dist1),
        .distance2(dist2),
        .send_packet(data_ready),
        .tx(tx_uart),
        .packet_sent(packet_sent)
    );

    // BCD 변환
    bin_to_dec u_b2d_ang (
        .bin(angle),
        .bcd(bcd_angle)
    );
    bin_to_dec u_b2d_d1 (
        .bin(dist1),
        .bcd(bcd_dist1)
    );
    bin_to_dec u_b2d_d2 (
        .bin(dist2),
        .bcd(bcd_dist2)
    );

    // FND 디스플레이 선택
    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            disp_st &amp;lt;= 2'd0;
        else if (btn_nedge) begin
            if (disp_st == 2)
                disp_st &amp;lt;= 0;
            else
                disp_st &amp;lt;= disp_st + 1;
        end
    end

    assign sel_bcd = (disp_st == 0) ? bcd_angle :
                     (disp_st == 1) ? bcd_dist1 : bcd_dist2;

    fnd_4digit_cntr u_fnd (
        .clk(clk),
        .reset_p(reset_p),
        .value(sel_bcd),
        .seg_7(seg_7),
        .com(com)
    );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _ servo_pwm_top&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753604389717&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module servo_pwm_top (
    input        clk,
    input        reset_p,
    output       en_sonic,      // 1 system clock cycle (trigger)
    output       pwm,           // 서보 PWM
    output [7:0] angle_cur,
    output [7:0] seg_7,
    output [3:0] com
);

    parameter SYS_CLK_FREQ     = 100_000_000;
    parameter MYCLK_FREQ       = 2;     // period = 500ms
    parameter VALUE_COUNT_SEC  = SYS_CLK_FREQ / (2 * MYCLK_FREQ);
    parameter WIDTH_SEC        = $clog2(VALUE_COUNT_SEC);

    parameter CNT_MIN          = 4;     // 0.44ms
    parameter CNT_MAX          = 22;    // 2.44ms
    parameter VALUE_COUNT      = CNT_MAX - CNT_MIN;   // 18 (count) -&amp;gt; 180 (degree)

    reg   [2*VALUE_COUNT-1:0]  r_cnt;
    reg   [4:0]                r_cnt_pwm;
    reg   [WIDTH_SEC-1:0]      r_cnt_sysclk;
    reg                        r_clk_sec;

    wire  [15:0] duty_bcd;
    wire         clk_sec_nedge;

    // Sonic 트리거 펄스
    assign en_sonic = clk_sec_nedge;
    assign angle_cur = ((r_cnt_pwm - CNT_MIN) &amp;lt;&amp;lt; 3) + ((r_cnt_pwm - CNT_MIN) &amp;lt;&amp;lt; 1);

    // 0.5초 주기 펄스 생성 및 네거티브 엣지
    always @(posedge clk or posedge reset_p) begin
        if(reset_p) begin
            r_cnt_sysclk &amp;lt;= 0;
            r_clk_sec    &amp;lt;= 0;
        end else if(r_cnt_sysclk == VALUE_COUNT_SEC-1) begin
            r_cnt_sysclk &amp;lt;= 0;
            r_clk_sec    &amp;lt;= ~r_clk_sec;
        end else begin
            r_cnt_sysclk &amp;lt;= r_cnt_sysclk + 1;
        end
    end

    edge_detector ed_sec (
        .clk(clk),
        .reset_p(reset_p),
        .sig(r_clk_sec),
        .p_edge(),             // 미사용
        .n_edge(clk_sec_nedge)
    );

    // 1초 주기로 각도 변화(180도 왕복)
    always @(posedge clk or posedge reset_p) begin
        if(reset_p) begin
            r_cnt     &amp;lt;= 0;
            r_cnt_pwm &amp;lt;= CNT_MIN;
        end else if(clk_sec_nedge) begin
            if(r_cnt &amp;gt;= VALUE_COUNT*2-1) begin
                r_cnt     &amp;lt;= 0;
                r_cnt_pwm &amp;lt;= CNT_MIN;
            end else if(r_cnt &amp;gt;= VALUE_COUNT) begin
                r_cnt     &amp;lt;= r_cnt + 1;
                r_cnt_pwm &amp;lt;= r_cnt_pwm - 1;
            end else begin
                r_cnt     &amp;lt;= r_cnt + 1;
                r_cnt_pwm &amp;lt;= r_cnt_pwm + 1;
            end
        end
    end

    pwm_servo_180 servo_inst (
        .clk(clk),
        .reset_p(reset_p),
        .duty(r_cnt_pwm),
        .pwm(pwm)
    );

    bin_to_dec bcd_conv (
        .bin({4'b0000, (r_cnt_pwm - CNT_MIN)}), // 8비트
        .bcd(duty_bcd)
    );

    fnd_4digit_cntr fnd_disp (
        .clk(clk),
        .reset_p(reset_p),
        .value(duty_bcd),
        .seg_7(seg_7),
        .com(com)
    );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _ pwm_servo_180&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753604442650&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module pwm_servo_180 (
    input             clk,
    input             reset_p,
    input  [7:0]      duty,      // 0~179 입력 (180 step)
    output            pwm        // PWM 출력
);

    parameter SYS_CLK_FREQ      = 100_000_000;
    parameter PWM_FREQ          = 50;
    parameter DUTY_STEP         = 180;
    parameter VALUE_COUNT_PWM   = SYS_CLK_FREQ / (2 * PWM_FREQ) / DUTY_STEP;
    parameter WIDTH_PWM         = $clog2(VALUE_COUNT_PWM);

    reg  [WIDTH_PWM-1:0] cnt_sysclk;
    reg                  pwm_freq_180;
    reg  [7:0]           cnt_duty;
    reg                  pwm_r;

    assign pwm = pwm_r;

    // 180Hz 분주 파형 생성 (duty 마다 2번)
    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            cnt_sysclk   &amp;lt;= 0;
            pwm_freq_180 &amp;lt;= 0;
        end else if (cnt_sysclk == VALUE_COUNT_PWM-1) begin
            cnt_sysclk   &amp;lt;= 0;
            pwm_freq_180 &amp;lt;= ~pwm_freq_180;
        end else begin
            cnt_sysclk   &amp;lt;= cnt_sysclk + 1;
        end
    end

    wire pwm_freq_180_nedge;
    edge_detector ed_pwm (
        .clk(clk),
        .reset_p(reset_p),
        .sig(pwm_freq_180),
        .p_edge(),                // 미사용
        .n_edge(pwm_freq_180_nedge)
    );

    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            cnt_duty &amp;lt;= 0;
            pwm_r    &amp;lt;= 0;
        end else if (pwm_freq_180_nedge) begin
            if (cnt_duty &amp;gt;= DUTY_STEP-1)
                cnt_duty &amp;lt;= 0;
            else
                cnt_duty &amp;lt;= cnt_duty + 1;
            if (cnt_duty &amp;lt; duty)
                pwm_r &amp;lt;= 1;
            else
                pwm_r &amp;lt;= 0;
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 코드 _ fnd_4digit_cntr&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1753604924198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module fnd_4digit_cntr (
    input        clk,
    input        reset_p,
    input  [15:0] value,
    output [7:0]  seg_7,
    output [3:0]  com
);

    reg [3:0] hex_value;
    wire [3:0] com_wire;

    ring_counter u_ring_counter (
        .clk(clk),
        .reset_p(reset_p),
        .q(com_wire)
    );
    assign com = com_wire;

    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            hex_value &amp;lt;= 0;
        else begin
            case (com_wire)
                4'b1110: hex_value &amp;lt;= value[3:0];
                4'b1101: hex_value &amp;lt;= value[7:4];
                4'b1011: hex_value &amp;lt;= value[11:8];
                4'b0111: hex_value &amp;lt;= value[15:12];
                default: hex_value &amp;lt;= 0;
            endcase
        end
    end

    decoder_7seg_hex u_decoder (
        .iHEX_VALUE(hex_value),
        .oSEG_7(seg_7)
    );
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _ ring_counter&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753604959920&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module ring_counter (
    input clk, reset_p,
    output reg [3:0] q
);
    parameter CNT_VALUE = 100_000;
    parameter WIDTH = $clog2(CNT_VALUE);

    reg [WIDTH-1:0] clk_div;
    wire clk_div_msb;

    always @(posedge clk or posedge reset_p) begin
        if (reset_p) clk_div &amp;lt;= 0;
        else         clk_div &amp;lt;= clk_div + 1;
    end

    edge_detector ed (
        .clk(clk),
        .reset_p(reset_p),
        .sig(clk_div[WIDTH-1]),
        .p_edge(clk_div_msb),
        .n_edge()
    );

    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            q &amp;lt;= 4'b1110;
        else if (clk_div_msb)
            q &amp;lt;= {q[2:0], q[3]};
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _decoder_7seg&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753605025035&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module decoder_7seg(
    input      [3:0] hex_value,    // 4비트 입력 (0~F)
    output reg [7:0] seg_7         // 7세그먼트(8비트, a~g, dp)
);

    always @(*) begin
        case (hex_value)
            4'h0 : seg_7 = 8'b0000_0011; // 0
            4'h1 : seg_7 = 8'b1001_1111; // 1
            4'h2 : seg_7 = 8'b0010_0101; // 2
            4'h3 : seg_7 = 8'b0000_1101; // 3
            4'h4 : seg_7 = 8'b1001_1001; // 4
            4'h5 : seg_7 = 8'b0100_1001; // 5
            4'h6 : seg_7 = 8'b0100_0001; // 6
            4'h7 : seg_7 = 8'b0001_1011; // 7
            4'h8 : seg_7 = 8'b0000_0001; // 8
            4'h9 : seg_7 = 8'b0001_1001; // 9
            4'hA : seg_7 = 8'b0001_0001; // A
            4'hB : seg_7 = 8'b1100_0001; // b
            4'hC : seg_7 = 8'b0110_0011; // C
            4'hD : seg_7 = 8'b1000_0101; // d
            4'hE : seg_7 = 8'b0110_0001; // E
            4'hF : seg_7 = 8'b0111_0001; // F
            default: seg_7 = 8'b0000_0000;
        endcase
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드_ultrasonic_top&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753605077080&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module ultrasonic_top (
    input         clk, reset_p,
    input         en,
    input         echo,
    output        trig,
    output [11:0] dist,
    output [7:0]  seg_7,
    output [3:0]  com,
    output [15:0] led_debug
);

    wire [15:0] fnd_dist;

    ultrasonic_sensor u_sensor (
        .clk(clk),
        .reset_p(reset_p),
        .en(en),
        .echo(echo),
        .trig(trig),
        .dist(dist),
        .led_debug(led_debug)
    );

    bin_to_dec u_bcd (
        .bin(dist),
        .bcd(fnd_dist)
    );

    fnd_4digit_cntr u_fnd (
        .clk(clk),
        .reset_p(reset_p),
        .value(fnd_dist),
        .seg_7(seg_7),
        .com(com)
    );
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드_ultrasonic_sensor&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753605104101&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module ultrasonic_sensor(
    input        clk, reset_p,
    input        en, echo,
    output reg   trig,
    output reg [11:0] dist,
    output [15:0] led_debug
);

    parameter S_IDLE   = 3'd0,
              S_TRIG   = 3'd1,
              S_WAIT_R = 3'd2,
              S_WAIT_F = 3'd3,
              S_CALC   = 3'd4;

    reg [2:0] state, next_state;
    reg [15:0] cnt_us;
    reg [5:0] elap_us;
    reg [11:0] cm_cnt;
    reg prev_en;

    wire clk_us;
    clock_div_1us clkdiv(
        .clk(clk),
        .reset_p(reset_p),
        .clk_us(clk_us)  // 포트명 일치
    );

    assign led_debug[2:0] = state;
    assign led_debug[15:3] = 0;

    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            state &amp;lt;= S_IDLE;
            prev_en &amp;lt;= 1'b0;
        end else begin
            state &amp;lt;= next_state;
            prev_en &amp;lt;= en;
        end
    end

    always @(*) begin
        next_state = state;
        case(state)
            S_IDLE:   if (~prev_en &amp;amp;&amp;amp; en) next_state = S_TRIG;
            S_TRIG:   if (cnt_us &amp;gt;= 10)  next_state = S_WAIT_R;
            S_WAIT_R: if (echo)          next_state = S_WAIT_F;
            S_WAIT_F: if (~echo)         next_state = S_CALC;
            S_CALC:   next_state = S_IDLE;
        endcase
    end

    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            trig &amp;lt;= 0;
            cnt_us &amp;lt;= 0;
            elap_us &amp;lt;= 0;
            cm_cnt &amp;lt;= 0;
            dist &amp;lt;= 0;
        end else begin
            case(state)
                S_IDLE: begin
                    trig &amp;lt;= 0; cnt_us &amp;lt;= 0; elap_us &amp;lt;= 0; cm_cnt &amp;lt;= 0;
                end
                S_TRIG: begin
                    trig &amp;lt;= 1;
                    if (clk_us) cnt_us &amp;lt;= cnt_us + 1;
                end
                S_WAIT_R: begin
                    trig &amp;lt;= 0; cnt_us &amp;lt;= 0;
                end
                S_WAIT_F: begin
                    if (clk_us) begin
                        elap_us &amp;lt;= elap_us + 1;
                        if (elap_us == 57) begin
                            elap_us &amp;lt;= 0;
                            cm_cnt &amp;lt;= cm_cnt + 1;
                        end
                    end
                end
                S_CALC: begin
                    dist &amp;lt;= cm_cnt;
                end
            endcase
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _ i2c_txtlcd_top&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753605185975&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module i2c_txtlcd_top (
    input        clk, reset_p,
    input  [3:0] btn,
    input        en_cg,
    input  [7:0] en_graph,
    output       scl, sda,
    output [15:0] led_debug
);

    localparam VALUE_COUNT = 8_000_000;
    localparam WIDTH = $clog2(VALUE_COUNT);

    localparam S_IDLE    = 7'b0000001,
               S_INIT    = 7'b0000010,
               S_BYTE    = 7'b0000100,
               S_SH_R    = 7'b0001000,
               S_SH_L    = 7'b0010000,
               S_STRING  = 7'b0100000,
               S_SEND_CG = 7'b1000000;

    // --- 그래프 데이터 --- //
    reg [7:0] graph_line_0 [0:7];
    reg [7:0] graph_line_1 [0:7];
    reg [7:0] graph_line_2 [0:7];
    reg [7:0] graph_line_3 [0:7];
    reg [7:0] graph_line_4 [0:7];
    reg [7:0] graph_line_5 [0:7];
    reg [7:0] graph_line_6 [0:7];
    reg [7:0] graph_line_7 [0:7];
    integer i;
    initial begin
        for(i=0;i&amp;lt;8;i=i+1) begin
            graph_line_0[i]=8'h00; graph_line_1[i]=8'h00; graph_line_2[i]=8'h00; graph_line_3[i]=8'h00;
            graph_line_4[i]=8'h00; graph_line_5[i]=8'h00; graph_line_6[i]=8'h00; graph_line_7[i]=8'h00;
        end
        graph_line_0[7]=8'h1F;
        graph_line_1[6]=8'h1F; graph_line_1[7]=8'h1F;
        graph_line_2[5]=8'h1F; graph_line_2[6]=8'h1F; graph_line_2[7]=8'h1F;
        graph_line_3[4]=8'h1F; graph_line_3[5]=8'h1F; graph_line_3[6]=8'h1F; graph_line_3[7]=8'h1F;
        graph_line_4[3]=8'h1F; graph_line_4[4]=8'h1F; graph_line_4[5]=8'h1F; graph_line_4[6]=8'h1F; graph_line_4[7]=8'h1F;
        graph_line_5[2]=8'h1F; graph_line_5[3]=8'h1F; graph_line_5[4]=8'h1F; graph_line_5[5]=8'h1F; graph_line_5[6]=8'h1F; graph_line_5[7]=8'h1F;
        graph_line_6[1]=8'h1F; graph_line_6[2]=8'h1F; graph_line_6[3]=8'h1F; graph_line_6[4]=8'h1F; graph_line_6[5]=8'h1F; graph_line_6[6]=8'h1F; graph_line_6[7]=8'h1F;
        for(i=0;i&amp;lt;8;i=i+1) graph_line_7[i]=8'h1F;
    end

    reg  [WIDTH-1:0] cnt_clk;
    reg  [6:0]       state, next_state;
    reg              en_cnt_clk;
    reg              send, rs;
    reg  [3:0]       cnt_data, cnt_cg;
    reg              init_flag;
    reg  [7:0]       send_buffer;
    reg [39:0]       hello;
    reg  [2:0]       cnt_string;
    wire [4:0]       btn_pedge;
    wire             busy;
    reg  [3:0]       col_idx;

    assign led_debug = {7'b0, init_flag, en_cnt_clk, state};

    // 버튼 엣지 검출 인스턴스
    button_cntr u_btn0 (.clk(clk), .reset_p(reset_p), .btn(btn[0]), .btn_pedge(btn_pedge[0]), .btn_nedge());
    button_cntr u_btn1 (.clk(clk), .reset_p(reset_p), .btn(btn[1]), .btn_pedge(btn_pedge[1]), .btn_nedge());
    button_cntr u_btn2 (.clk(clk), .reset_p(reset_p), .btn(btn[2]), .btn_pedge(btn_pedge[2]), .btn_nedge());
    button_cntr u_btn3 (.clk(clk), .reset_p(reset_p), .btn(btn[3]), .btn_pedge(btn_pedge[3]), .btn_nedge());

    // I2C 송신 모듈
    i2c_lcd_send_byte u_i2c (
        .clk(clk),
        .reset_p(reset_p),
        .addr(7'h3F),
        .send_buffer(send_buffer),
        .send(send),
        .rs(rs),
        .scl(scl),
        .sda(sda),
        .busy(busy)
    );

    // 타이머 카운터
    always @(posedge clk or posedge reset_p)
        if (reset_p)         cnt_clk &amp;lt;= 0;
        else if (en_cnt_clk) cnt_clk &amp;lt;= cnt_clk + 1;
        else                 cnt_clk &amp;lt;= 0;

    // FSM 상태 전이
    always @(posedge clk or posedge reset_p)
        if (reset_p) state &amp;lt;= S_IDLE;
        else         state &amp;lt;= next_state;

    // FSM 본체
    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            next_state &amp;lt;= S_IDLE;
            en_cnt_clk &amp;lt;= 0; cnt_data &amp;lt;= 0; cnt_string &amp;lt;= 5; cnt_cg &amp;lt;= 0;
            init_flag &amp;lt;= 0; send &amp;lt;= 0; send_buffer &amp;lt;= 0; rs &amp;lt;= 0;
            hello &amp;lt;= &quot;Hello&quot;;
        end else begin
            case (state)
            S_IDLE: begin
                if (!init_flag) begin
                    if (cnt_clk == VALUE_COUNT-1) begin
                        next_state &amp;lt;= S_INIT; en_cnt_clk &amp;lt;= 0;
                    end else en_cnt_clk &amp;lt;= 1;
                end else begin
                    if (btn_pedge[0]) next_state &amp;lt;= S_BYTE;
                    if (btn_pedge[1]) next_state &amp;lt;= S_SH_R;
                    if (btn_pedge[2]) next_state &amp;lt;= S_SH_L;
                    if (btn_pedge[3]) next_state &amp;lt;= S_STRING;
                    if (en_cg) begin next_state &amp;lt;= S_SEND_CG; cnt_data &amp;lt;= 0; end
                end
            end
            S_INIT: begin
                if (busy) begin
                    send &amp;lt;= 0;
                    if (cnt_data &amp;gt;= 6) begin cnt_data &amp;lt;= 0; init_flag &amp;lt;= 1; next_state &amp;lt;= S_IDLE; end
                end else if (!send) begin
                    send &amp;lt;= 1; cnt_data &amp;lt;= cnt_data + 1;
                    case (cnt_data)
                        0: send_buffer &amp;lt;= 8'h33;
                        1: send_buffer &amp;lt;= 8'h32;
                        2: send_buffer &amp;lt;= 8'h28;
                        3: send_buffer &amp;lt;= 8'h0c;
                        4: send_buffer &amp;lt;= 8'h01;
                        5: send_buffer &amp;lt;= 8'h06;
                    endcase
                end
            end
            S_BYTE: begin
                if (busy) begin
                    next_state &amp;lt;= S_IDLE; send &amp;lt;= 0;
                    if (cnt_data &amp;gt;= 9) cnt_data &amp;lt;= 0; else cnt_data &amp;lt;= cnt_data + 1;
                end else begin
                    rs &amp;lt;= 1; send_buffer &amp;lt;= &quot;0&quot; + cnt_data; send &amp;lt;= 1;
                end
            end
            S_SH_R: begin
                if (busy) begin next_state &amp;lt;= S_IDLE; send &amp;lt;= 0; end
                else begin rs &amp;lt;= 0; send_buffer &amp;lt;= 8'h1c; send &amp;lt;= 1; end
            end
            S_SH_L: begin
                if (busy) begin next_state &amp;lt;= S_IDLE; send &amp;lt;= 0; end
                else begin rs &amp;lt;= 0; send_buffer &amp;lt;= 8'h18; send &amp;lt;= 1; end
            end
            S_STRING: begin
                if (busy) begin
                    send &amp;lt;= 0;
                    if (!cnt_string) begin cnt_string &amp;lt;= 5; next_state &amp;lt;= S_IDLE; end
                end else if (!send) begin
                    rs &amp;lt;= 1; send &amp;lt;= 1; cnt_string &amp;lt;= cnt_string - 1;
                    case (cnt_string)
                        5: send_buffer &amp;lt;= hello[39:32];
                        4: send_buffer &amp;lt;= hello[31:24];
                        3: send_buffer &amp;lt;= hello[23:16];
                        2: send_buffer &amp;lt;= hello[15:8];
                        1: send_buffer &amp;lt;= hello[7:0];
                    endcase
                end
            end
            S_SEND_CG: begin
                if (busy) begin
                    send &amp;lt;= 0;
                    if (cnt_cg == 11) begin cnt_cg &amp;lt;= 0; next_state &amp;lt;= S_IDLE; end
                end else if (!send) begin
                    send &amp;lt;= 1;
                    case (cnt_cg)
                        0: begin rs &amp;lt;= 0; send_buffer &amp;lt;= 8'h40; end
                        1,2,3,4,5,6,7,8: begin
                            rs &amp;lt;= 1;
                            if      (en_graph[0]) send_buffer &amp;lt;= graph_line_0[cnt_cg-1];
                            else if (en_graph[1]) send_buffer &amp;lt;= graph_line_1[cnt_cg-1];
                            else if (en_graph[2]) send_buffer &amp;lt;= graph_line_2[cnt_cg-1];
                            else if (en_graph[3]) send_buffer &amp;lt;= graph_line_3[cnt_cg-1];
                            else if (en_graph[4]) send_buffer &amp;lt;= graph_line_4[cnt_cg-1];
                            else if (en_graph[5]) send_buffer &amp;lt;= graph_line_5[cnt_cg-1];
                            else if (en_graph[6]) send_buffer &amp;lt;= graph_line_6[cnt_cg-1];
                            else                  send_buffer &amp;lt;= graph_line_7[cnt_cg-1];
                        end
                        9:  begin rs &amp;lt;= 0; send_buffer &amp;lt;= 8'h80; end
                        10: begin rs &amp;lt;= 1; send_buffer &amp;lt;= 8'h00; end
                    endcase
                    cnt_cg &amp;lt;= cnt_cg + 1;
                end
            end
            default: next_state &amp;lt;= S_IDLE;
            endcase
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드_ i2c_lcd_send_byte&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753605220490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module i2c_lcd_send_byte (
    input        clk, reset_p,
    input  [6:0] addr,
    input  [7:0] send_buffer,
    input        send, rs,
    output       scl, sda,
    output reg   busy,
    output [15:0] led_debug
);

    localparam IDLE                    = 6'b00_0001;
    localparam SEND_HIGH_NIBBLE_DIS    = 6'b00_0010;
    localparam SEND_HIGH_NIBBLE_EN     = 6'b00_0100;
    localparam SEND_LOW_NIBBLE_DIS     = 6'b00_1000;
    localparam SEND_LOW_NIBBLE_EN      = 6'b01_0000;
    localparam SEND_DISABLE            = 6'b10_0000;

    reg [5:0] state, next_state;
    reg [7:0] data;
    reg       comm_start;
    reg [21:0] cnt_us;
    reg       en_cnt_us;

    wire send_pedge;
    wire clk_us;

    //assign led_debug = {8'b0, en_cnt_us, comm_start, state};

    clock_div_1us u_clkdiv (
        .clk(clk),
        .reset_p(reset_p),
        .clk_us(clk_us)
    );

    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            cnt_us &amp;lt;= 0;
        else if (clk_us &amp;amp;&amp;amp; en_cnt_us)
            cnt_us &amp;lt;= cnt_us + 1;
        else if (!en_cnt_us)
            cnt_us &amp;lt;= 0;
    end

    edge_detector UED_send (
        .clk(clk),
        .reset_p(reset_p),
        .sig(send),	
        .p_edge(send_pedge),
        .n_edge()
    );

    I2C_master master (
        .clk(clk),
        .reset_p(reset_p),
        .addr(addr),
        .data(data),
        .rd_wr(1'b0),
        .comm_start(comm_start),
        .scl(scl),
        .sda(sda),
        .led_debug(led_debug)
    );

    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            state &amp;lt;= IDLE;
        else
            state &amp;lt;= next_state;
    end

    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            next_state &amp;lt;= IDLE;
            data &amp;lt;= 0;
            busy &amp;lt;= 0;
            en_cnt_us &amp;lt;= 0;
            comm_start &amp;lt;= 0;
        end else begin
            case (state)
                IDLE: begin
                    if (send_pedge) begin
                        next_state &amp;lt;= SEND_HIGH_NIBBLE_DIS;
                        busy &amp;lt;= 1;
                    end
                end
                SEND_HIGH_NIBBLE_DIS: begin
                    if (cnt_us &amp;lt;= 200) begin
                        data &amp;lt;= {send_buffer[7:4], 3'b100, rs};
                        comm_start &amp;lt;= 1;
                        en_cnt_us &amp;lt;= 1;
                    end else begin
                        next_state &amp;lt;= SEND_HIGH_NIBBLE_EN;
                        en_cnt_us &amp;lt;= 0;
                        comm_start &amp;lt;= 0;
                    end
                end
                SEND_HIGH_NIBBLE_EN: begin
                    if (cnt_us &amp;lt;= 200) begin
                        data &amp;lt;= {send_buffer[7:4], 3'b110, rs};
                        comm_start &amp;lt;= 1;
                        en_cnt_us &amp;lt;= 1;
                    end else begin
                        next_state &amp;lt;= SEND_LOW_NIBBLE_DIS;
                        en_cnt_us &amp;lt;= 0;
                        comm_start &amp;lt;= 0;
                    end
                end
                SEND_LOW_NIBBLE_DIS: begin
                    if (cnt_us &amp;lt;= 200) begin
                        data &amp;lt;= {send_buffer[3:0], 3'b100, rs};
                        comm_start &amp;lt;= 1;
                        en_cnt_us &amp;lt;= 1;
                    end else begin
                        next_state &amp;lt;= SEND_LOW_NIBBLE_EN;
                        en_cnt_us &amp;lt;= 0;
                        comm_start &amp;lt;= 0;
                    end
                end
                SEND_LOW_NIBBLE_EN: begin
                    if (cnt_us &amp;lt;= 200) begin
                        data &amp;lt;= {send_buffer[3:0], 3'b110, rs};
                        comm_start &amp;lt;= 1;
                        en_cnt_us &amp;lt;= 1;
                    end else begin
                        next_state &amp;lt;= SEND_DISABLE;
                        en_cnt_us &amp;lt;= 0;
                        comm_start &amp;lt;= 0;
                    end
                end
                SEND_DISABLE: begin
                    if (cnt_us &amp;lt;= 200) begin
                        data &amp;lt;= {send_buffer[3:0], 3'b100, rs};
                        comm_start &amp;lt;= 1;
                        en_cnt_us &amp;lt;= 1;
                    end else begin
                        next_state &amp;lt;= IDLE;
                        en_cnt_us &amp;lt;= 0;
                        comm_start &amp;lt;= 0;
                        busy &amp;lt;= 0;
                    end
                end
            endcase
        end
    end

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _uart_transmitter&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753609003565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module uart_transmitter(
    input wire clk,
    input wire reset_p,
    input wire [7:0] data_in,
    input wire send,
    output reg tx,
    output reg busy
);

    // 115200 baud rate, 100MHz 클록
    // Baud rate divisor = 100MHz / 115200 &amp;asymp; 868
    parameter BAUD_DIVISOR = 868;
    parameter IDLE = 2'b00;
    parameter START = 2'b01;
    parameter DATA = 2'b10;
    parameter STOP = 2'b11;
    
    reg [1:0] state;
    reg [31:0] baud_counter;
    reg [2:0] bit_counter;
    reg [7:0] shift_reg;
    
    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            state &amp;lt;= IDLE;
            tx &amp;lt;= 1'b1;
            busy &amp;lt;= 1'b0;
            baud_counter &amp;lt;= 32'b0;
            bit_counter &amp;lt;= 3'b0;
            shift_reg &amp;lt;= 8'b0;
        end else begin
            case (state)
                IDLE: begin
                    tx &amp;lt;= 1'b1;
                    busy &amp;lt;= 1'b0;
                    baud_counter &amp;lt;= 32'b0;
                    bit_counter &amp;lt;= 3'b0;
                    
                    if (send) begin
                        shift_reg &amp;lt;= data_in;
                        busy &amp;lt;= 1'b1;
                        state &amp;lt;= START;
                    end
                end
                
                START: begin
                    tx &amp;lt;= 1'b0;  // Start bit
                    baud_counter &amp;lt;= baud_counter + 1;
                    
                    if (baud_counter &amp;gt;= BAUD_DIVISOR) begin
                        baud_counter &amp;lt;= 32'b0;
                        state &amp;lt;= DATA;
                    end
                end
                
                DATA: begin
                    tx &amp;lt;= shift_reg[0];
                    baud_counter &amp;lt;= baud_counter + 1;
                    
                    if (baud_counter &amp;gt;= BAUD_DIVISOR) begin
                        baud_counter &amp;lt;= 32'b0;
                        shift_reg &amp;lt;= {1'b0, shift_reg[7:1]};
                        bit_counter &amp;lt;= bit_counter + 1;
                        
                        if (bit_counter &amp;gt;= 7) begin
                            bit_counter &amp;lt;= 3'b0;
                            state &amp;lt;= STOP;
                        end
                    end
                end
                
                STOP: begin
                    tx &amp;lt;= 1'b1;  // Stop bit
                    baud_counter &amp;lt;= baud_counter + 1;
                    
                    if (baud_counter &amp;gt;= BAUD_DIVISOR) begin
                        baud_counter &amp;lt;= 32'b0;
                        state &amp;lt;= IDLE;
                    end
                end
                
                default: state &amp;lt;= IDLE;
            endcase
        end
    end
    
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _ bin_to_dec&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753609052952&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module bin_to_dec (
    input      [11:0] bin,     // 이진 입력 (최대 4095)
    output reg [15:0] bcd      // 변환된 4자리 BCD 출력
);
    reg [3:0] i;

    always @(bin) begin
        bcd = 0;
        for (i = 0; i &amp;lt; 12; i = i + 1) begin
            bcd = {bcd[14:0], bin[11 - i]};
            if(i &amp;lt; 11 &amp;amp;&amp;amp; bcd[3:0] &amp;gt; 4)      bcd[3:0]   = bcd[3:0]   + 3;
            if(i &amp;lt; 11 &amp;amp;&amp;amp; bcd[7:4] &amp;gt; 4)      bcd[7:4]   = bcd[7:4]   + 3;
            if(i &amp;lt; 11 &amp;amp;&amp;amp; bcd[11:8] &amp;gt; 4)     bcd[11:8]  = bcd[11:8]  + 3;
            if(i &amp;lt; 11 &amp;amp;&amp;amp; bcd[15:12] &amp;gt; 4)    bcd[15:12] = bcd[15:12] + 3;
        end
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드_clock_div_1us&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753609224270&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module clock_div_1us (
    input        clk, reset_p,
    output       cp_div_100,      // clock pulse (1us 기준 펄스)
    output       edge_n_div_100   // 1us 네거티브 엣지 펄스
);

    localparam CNT_VALUE_100 = 100;                // 10ns * 100 = 1us (100MHz 기준)
    localparam WIDTH = $clog2(CNT_VALUE_100);

    reg [WIDTH-1:0] cnt_sysclk;

    always @(posedge clk or posedge reset_p) begin
        if (reset_p) cnt_sysclk &amp;lt;= 0;
        else if (cnt_sysclk == CNT_VALUE_100 - 1) cnt_sysclk &amp;lt;= 0;
        else cnt_sysclk &amp;lt;= cnt_sysclk + 1;
    end

    assign cp_div_100 = (cnt_sysclk &amp;lt; CNT_VALUE_100/2) ? 1'b0 : 1'b1;

    edge_detector ed (
        .clk(clk),
        .reset_p(reset_p),
        .sig(cp_div_100),
        .p_edge(),              // (포지티브 엣지는 미사용)
        .n_edge(edge_n_div_100)
    );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드_fnd_4digit_cntr&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753609327702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module fnd_4digit_cntr (
    input        clk, reset_p,
    input  [15:0] value,
    output [7:0]  seg_7,
    output [3:0]  com
);

    reg [3:0] hex_value;

    // 4자리 순환 제어 (One-hot)
    ring_counter ring_com(
        .clk   (clk),
        .reset_p (reset_p),
        .q     (com)
    );
    
    always @(posedge clk or posedge reset_p) begin
        if (reset_p)
            hex_value &amp;lt;= 0;
        else begin
            case (com)
                4'b1110: hex_value &amp;lt;= value[3:0];
                4'b1101: hex_value &amp;lt;= value[7:4];
                4'b1011: hex_value &amp;lt;= value[11:8];
                4'b0111: hex_value &amp;lt;= value[15:12];
                default: hex_value &amp;lt;= 0;
            endcase
        end
    end
    
    decoder_7seg dec(
        .hex_value(hex_value),
        .seg_7(seg_7)
    );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 코드 _button_cntr&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1753609356063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module button_cntr (
    input        clk, reset_p,
    input        btn,
    output       btn_pedge, btn_nedge
);

    localparam CNT_VALUE = 100_000;           // clk period = 10ns, 1ms count
    localparam WIDTH     = $clog2(CNT_VALUE);

    reg [WIDTH-1:0] clk_div;
    reg debounced_btn;
    wire clk_div_msb;

    // 1ms 분주 카운터
    always @(posedge clk or posedge reset_p) begin
        if (reset_p) clk_div &amp;lt;= 0;
        else         clk_div &amp;lt;= clk_div + 1;
    end

    // 1ms마다 펄스 생성 (엣지 디텍터)
    edge_detector ed_div (
        .clk(clk),
        .reset_p(reset_p),
        .sig(clk_div[WIDTH-1]),
        .p_edge(clk_div_msb),
        .n_edge() // 사용안함
    );

    // 디바운스: 1ms마다 샘플링
    always @(posedge clk or posedge reset_p) begin
        if (reset_p)            debounced_btn &amp;lt;= 0;
        else if (clk_div_msb)   debounced_btn &amp;lt;= btn;
    end

    // 버튼 엣지 검출기
    edge_detector ed_btn (
        .clk(clk),
        .reset_p(reset_p),
        .sig(debounced_btn),
        .p_edge(btn_pedge),
        .n_edge(btn_nedge)
    );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드 _XDC 파일&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753609866727&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Basys3 rev B Board XDC (Radar Project 전용)

## Clock signal
set_property -dict { PACKAGE_PIN W5   IOSTANDARD LVCMOS33 } [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

## Reset (SW0)
set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports reset_p]

## LEDs (16bit)
set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {led_debug[0]}]
set_property -dict { PACKAGE_PIN E19   IOSTANDARD LVCMOS33 } [get_ports {led_debug[1]}]
set_property -dict { PACKAGE_PIN U19   IOSTANDARD LVCMOS33 } [get_ports {led_debug[2]}]
set_property -dict { PACKAGE_PIN V19   IOSTANDARD LVCMOS33 } [get_ports {led_debug[3]}]
set_property -dict { PACKAGE_PIN W18   IOSTANDARD LVCMOS33 } [get_ports {led_debug[4]}]
set_property -dict { PACKAGE_PIN U15   IOSTANDARD LVCMOS33 } [get_ports {led_debug[5]}]
set_property -dict { PACKAGE_PIN U14   IOSTANDARD LVCMOS33 } [get_ports {led_debug[6]}]
set_property -dict { PACKAGE_PIN V14   IOSTANDARD LVCMOS33 } [get_ports {led_debug[7]}]
set_property -dict { PACKAGE_PIN V13   IOSTANDARD LVCMOS33 } [get_ports {led_debug[8]}]
set_property -dict { PACKAGE_PIN V3    IOSTANDARD LVCMOS33 } [get_ports {led_debug[9]}]
set_property -dict { PACKAGE_PIN W3    IOSTANDARD LVCMOS33 } [get_ports {led_debug[10]}]
set_property -dict { PACKAGE_PIN U3    IOSTANDARD LVCMOS33 } [get_ports {led_debug[11]}]
set_property -dict { PACKAGE_PIN P3    IOSTANDARD LVCMOS33 } [get_ports {led_debug[12]}]
set_property -dict { PACKAGE_PIN N3    IOSTANDARD LVCMOS33 } [get_ports {led_debug[13]}]
set_property -dict { PACKAGE_PIN P1    IOSTANDARD LVCMOS33 } [get_ports {led_debug[14]}]
set_property -dict { PACKAGE_PIN L1    IOSTANDARD LVCMOS33 } [get_ports {led_debug[15]}]

## 7-Segment Display (FND)
set_property -dict { PACKAGE_PIN W7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[7]}]
set_property -dict { PACKAGE_PIN W6   IOSTANDARD LVCMOS33 } [get_ports {seg_7[6]}]
set_property -dict { PACKAGE_PIN U8   IOSTANDARD LVCMOS33 } [get_ports {seg_7[5]}]
set_property -dict { PACKAGE_PIN V8   IOSTANDARD LVCMOS33 } [get_ports {seg_7[4]}]
set_property -dict { PACKAGE_PIN U5   IOSTANDARD LVCMOS33 } [get_ports {seg_7[3]}]
set_property -dict { PACKAGE_PIN V5   IOSTANDARD LVCMOS33 } [get_ports {seg_7[2]}]
set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[1]}]
set_property -dict { PACKAGE_PIN V7   IOSTANDARD LVCMOS33 } [get_ports {seg_7[0]}]

set_property -dict { PACKAGE_PIN U2   IOSTANDARD LVCMOS33 } [get_ports {com[0]}]
set_property -dict { PACKAGE_PIN U4   IOSTANDARD LVCMOS33 } [get_ports {com[1]}]
set_property -dict { PACKAGE_PIN V4   IOSTANDARD LVCMOS33 } [get_ports {com[2]}]
set_property -dict { PACKAGE_PIN W4   IOSTANDARD LVCMOS33 } [get_ports {com[3]}]

## Buttons
set_property -dict { PACKAGE_PIN U18   IOSTANDARD LVCMOS33 } [get_ports btn[0]]  # Center
set_property -dict { PACKAGE_PIN T18   IOSTANDARD LVCMOS33 } [get_ports btn[1]]  # Up
set_property -dict { PACKAGE_PIN W19   IOSTANDARD LVCMOS33 } [get_ports btn[3]]  # Left
set_property -dict { PACKAGE_PIN T17   IOSTANDARD LVCMOS33 } [get_ports btn[2]]  # Right
set_property -dict { PACKAGE_PIN U17   IOSTANDARD LVCMOS33 } [get_ports btn[4]]  # Down

## Pmod Header JA - 초음파, 서보, I2C
set_property -dict { PACKAGE_PIN J1   IOSTANDARD LVCMOS33 } [get_ports {trig_1}]
set_property -dict { PACKAGE_PIN L2   IOSTANDARD LVCMOS33 } [get_ports {echo_1}]
set_property -dict { PACKAGE_PIN J2   IOSTANDARD LVCMOS33 } [get_ports {trig_2}]
set_property -dict { PACKAGE_PIN G2   IOSTANDARD LVCMOS33 } [get_ports {echo_2}]
set_property -dict { PACKAGE_PIN H1   IOSTANDARD LVCMOS33 } [get_ports {servo}]
set_property -dict { PACKAGE_PIN K2   IOSTANDARD LVCMOS33 } [get_ports {scl}]
set_property -dict { PACKAGE_PIN H2   IOSTANDARD LVCMOS33 } [get_ports {sda}]

## USB-RS232 Interface (UART TX)
set_property -dict { PACKAGE_PIN A18   IOSTANDARD LVCMOS33 } [get_ports tx_uart]

## Basys3 Power &amp;amp; Configuration
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동작 영상&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 초음파 레이더 시스템 실시간 동작 시연 &lt;/b&gt;&lt;/h4&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 360&amp;deg; 초음파 센서 데이터 실시간 시각화 &lt;/b&gt;&lt;/h4&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/BVLbd0rTw9E&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;초음파 레이더 모형 시스템&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BVLbd0rTw9E&quot; width=&quot;0&quot; height=&quot;0&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/129</guid>
      <comments>https://juniha.tistory.com/129#entry129comment</comments>
      <pubDate>Sun, 27 Jul 2025 18:44:40 +0900</pubDate>
    </item>
    <item>
      <title>[MicroBlaze] Switch_Led</title>
      <link>https://juniha.tistory.com/128</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DIP 스위치 입력을 읽고, 해당 값을&amp;nbsp; LED에 출력하며 UART로 상태를 출력하는 기본 임베디드 제어 시스템&amp;nbsp; 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Diagram&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNpF2R/btsPAAxqYJ5/nRGEr05fLev6RAJed68qm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNpF2R/btsPAAxqYJ5/nRGEr05fLev6RAJed68qm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNpF2R/btsPAAxqYJ5/nRGEr05fLev6RAJed68qm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNpF2R%2FbtsPAAxqYJ5%2FnRGEr05fLev6RAJed68qm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1570&quot; height=&quot;378&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구성 블록&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;239&quot; data-start=&quot;195&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;microblaze_riscv_0 (RISC-V 프로세서)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;353&quot; data-start=&quot;240&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;279&quot; data-start=&quot;240&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;MicroBlaze V (RISC-V 기반)&lt;/b&gt; 임베디드 CPU&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;315&quot; data-start=&quot;280&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;AXI 인터페이스(M_AXI_DP)를 통해 주변 장치와 연결&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;353&quot; data-start=&quot;316&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DLMB, ILMB: 데이터/명령 로컬 메모리 인터페이스&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;403&quot; data-start=&quot;360&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;microblaze_riscv_0_local_memory&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;491&quot; data-start=&quot;404&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;404&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;로컬 메모리 (LMB 기반)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;454&quot; data-start=&quot;422&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;명령(ILMB), 데이터(DLMB) 메모리 제공&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;491&quot; data-start=&quot;455&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SYS_Rst, LMB_Clk으로 클럭 및 리셋 동기화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;520&quot; data-start=&quot;498&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;axi_gpio_0&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;637&quot; data-start=&quot;521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;540&quot; data-start=&quot;521&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;AXI GPIO 컨트롤러&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;571&quot; data-start=&quot;541&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;GPIO 채널 1: led_16bits (출력)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;611&quot; data-start=&quot;572&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;GPIO 채널 2: dip_switches_16bits (입력)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;637&quot; data-start=&quot;612&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;AXI 인터페이스를 통해 프로세서와 연결됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;670&quot; data-start=&quot;644&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;axi_uartlite_0&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;769&quot; data-start=&quot;671&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;690&quot; data-start=&quot;671&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;AXI UART Lite&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;705&quot; data-start=&quot;691&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;USB UART 연결용&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;746&quot; data-start=&quot;706&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;RX (usb_uart 입력), TX (usb_uart 출력)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;769&quot; data-start=&quot;747&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;UART 디버깅용 메시지 송수신 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;814&quot; data-start=&quot;776&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;axi_smc (AXI SmartConnect)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;908&quot; data-start=&quot;815&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;815&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프로세서(M_AXI_DP)와 주변 장치(GPIO, UART) 사이의 AXI 버스 연결기&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;908&quot; data-start=&quot;866&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;AXI Master(M00_AXI) &amp;rarr; Slave(S_AXI) 연결 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;968&quot; data-start=&quot;915&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;proc_sys_reset_0 (Processor System Reset)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1058&quot; data-start=&quot;969&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;979&quot; data-start=&quot;969&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리셋 논리 제어&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1058&quot; data-start=&quot;980&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;외부 리셋 + 디버그 리셋 + 클럭 안정성 &amp;rarr; 다양한 reset 신호 생성 (mb_reset, peripheral_reset 등)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1102&quot; data-start=&quot;1065&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;clk_wiz (Clocking Wizard)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1183&quot; data-start=&quot;1103&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1153&quot; data-start=&quot;1103&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;외부 클럭(sys_clock)을 내부에서 사용할 주파수(clk_out1)로 변환&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1183&quot; data-start=&quot;1154&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;locked 신호를 통해 클럭 안정 여부 표시&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1233&quot; data-start=&quot;1190&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;mdm_1 (MicroBlaze Debug Module)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1308&quot; data-start=&quot;1234&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1271&quot; data-start=&quot;1234&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;JTAG 디버깅 지원 (Xilinx SDK/Vitis 사용 시)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1308&quot; data-start=&quot;1272&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MBDEBUG_0, Debug_SYS_Rst 신호 출력&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Diagram에 맞춰 작성된 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753444740168&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;`timescale 1 ps / 1 ps  // 시뮬레이션 타임스케일 설정: 시간 단위 1ps, 정밀도 1ps

//-----------------------------------------------------------------------------
// Top-level wrapper module for the MicroBlazeV Hello World design
// This module wraps the block design system generated by Vivado IP Integrator
//-----------------------------------------------------------------------------

module microblazeV_hello_wrapper
   (
    dip_switches_16bits_tri_i, // 16비트 DIP 스위치 입력 (GPIO 입력으로 사용)
    led_16bits_tri_o,          // 16비트 LED 출력 (GPIO 출력으로 사용)
    reset,                     // 외부 비동기 리셋 입력 (active-high)
    sys_clock,                 // 시스템 클럭 입력
    usb_uart_rxd,             // UART 수신 데이터 (USB-UART 연결)
    usb_uart_txd              // UART 송신 데이터 (USB-UART 연결)
    );

  // 포트 선언 (외부 입출력 신호)
  input  [15:0] dip_switches_16bits_tri_i; // DIP 스위치 입력
  output [15:0] led_16bits_tri_o;          // LED 출력
  input         reset;                     // 리셋 입력
  input         sys_clock;                 // 시스템 클럭 입력
  input         usb_uart_rxd;              // UART 수신 (RX)
  output        usb_uart_txd;              // UART 송신 (TX)

  // 내부 와이어 연결 (포트 신호를 내부 모듈에 직접 연결)
  wire [15:0] dip_switches_16bits_tri_i;
  wire [15:0] led_16bits_tri_o;
  wire        reset;
  wire        sys_clock;
  wire        usb_uart_rxd;
  wire        usb_uart_txd;

  // microblazeV_hello 인스턴스화 (Vivado Block Design에서 생성된 시스템)
  microblazeV_hello microblazeV_hello_i (
        .dip_switches_16bits_tri_i(dip_switches_16bits_tri_i), // DIP 스위치 입력 연결
        .led_16bits_tri_o(led_16bits_tri_o),                   // LED 출력 연결
        .reset(reset),                                        // 리셋 신호 연결
        .sys_clock(sys_clock),                                // 시스템 클럭 연결
        .usb_uart_rxd(usb_uart_rxd),                          // UART RX 연결
        .usb_uart_txd(usb_uart_txd)                           // UART TX 연결
    );

endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 코드 _ Vitis&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1753445023985&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;             // 표준 입출력 함수 사용
#include &quot;platform.h&quot;          // 플랫폼 초기화 및 정리 함수 포함 (init_platform, cleanup_platform 등)
#include &quot;xil_printf.h&quot;        // UART를 통한 출력용 printf 함수 제공 (xil_printf)
#include &quot;sleep.h&quot;             // sleep 함수 포함 (지연용)
#include &quot;xparameters.h&quot;       // 하드웨어 주소 정의 포함 (IP의 BaseAddress 등)
#include &quot;xgpio.h&quot;             // AXI GPIO 관련 함수 정의

// GPIO 채널 번호 정의
#define LED_CHANNEL 1          // 채널 1은 LED 출력용
#define SW_CHANNEL  2          // 채널 2는 DIP 스위치 입력용

int main()
{
    init_platform(); // 플랫폼 초기화 (UART, 인터럽트, 메모리 등 사용 가능하게 설정)

    print(&quot;Hello World\n\r&quot;);                        // UART를 통해 인사 메시지 출력
    print(&quot;Successfully ran Hello World application&quot;); // 실행 성공 메시지

    XGpio_Config *cfg_ptr;   // GPIO 설정 구조체 포인터
    XGpio gpio_device;       // GPIO 장치 인스턴스 선언

    u32 data = 0;            // 스위치 입력 값을 저장할 변수

    // GPIO 장치 설정 정보 가져오기 (axi_gpio_0의 주소 기준)
    cfg_ptr = XGpio_LookupConfig(XPAR_AXI_GPIO_0_BASEADDR);

    // GPIO 장치 초기화 (구조체 포인터, 인스턴스, 베이스 주소)
    XGpio_CfgInitialize(&amp;amp;gpio_device, cfg_ptr, cfg_ptr-&amp;gt;BaseAddress);

    // GPIO 방향 설정
    // LED 채널을 출력으로 설정 (0은 출력)
    XGpio_SetDataDirection(&amp;amp;gpio_device, LED_CHANNEL, 0);
    
    // DIP 스위치 채널을 입력으로 설정 (0xFFFF는 16비트 모두 입력)
    XGpio_SetDataDirection(&amp;amp;gpio_device, SW_CHANNEL, 0xffff);

    // 무한 루프: DIP 스위치 상태를 LED로 출력하고 UART로 보여줌
    while(1){
        // DIP 스위치 상태 읽기 (채널 2)
        data = XGpio_DiscreteRead(&amp;amp;gpio_device, SW_CHANNEL);

        // UART를 통해 스위치 상태 16진수로 출력
        xil_printf(&quot;switch inputs : %X\n\r&quot;, data);

        // 읽은 값을 LED에 출력 (채널 1)
        XGpio_DiscreteWrite(&amp;amp;gpio_device, LED_CHANNEL, data);

        // 1초 대기 (지연)
        sleep(1);
    }

    cleanup_platform(); // 플랫폼 종료 (사용 리소스 정리)
    return 0; // 프로그램 종료
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동작 영상 _Switch&lt;/b&gt;&lt;/h3&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;동작 영상 _LED&lt;/b&gt;&lt;/h3&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;901&quot; data-start=&quot;819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;835&quot; data-start=&quot;819&quot;&gt;DIP 스위치를 조작하면,&lt;/li&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;836&quot;&gt;그 상태가 16개의 LED에 실시간으로 반영되고,&lt;/li&gt;
&lt;li data-end=&quot;901&quot; data-start=&quot;866&quot;&gt;UART 터미널에는 현재 스위치 상태가 1초마다 출력되는 것을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1077&quot; data-start=&quot;903&quot; data-ke-size=&quot;size16&quot;&gt;즉, 이 프로그램은 &lt;b&gt;입력(DIP 스위치)을 읽고&lt;/b&gt;, 그 값을 &lt;b&gt;출력(LED)에 반영하며&lt;/b&gt;, 동시에 &lt;b&gt;UART를 통해 상태를 확인할 수 있다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Verilog_RTL 설계/SoC</category>
      <author>juniha</author>
      <guid isPermaLink="true">https://juniha.tistory.com/128</guid>
      <comments>https://juniha.tistory.com/128#entry128comment</comments>
      <pubDate>Fri, 25 Jul 2025 21:09:56 +0900</pubDate>
    </item>
  </channel>
</rss>