<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 张智豪</title>
    <description>The latest articles on DEV Community by 张智豪 (@zzhihao).</description>
    <link>https://dev.to/zzhihao</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2725880%2Ffe0fe34e-8d94-40fd-a165-e0d8c6a3ea75.jpg</url>
      <title>DEV Community: 张智豪</title>
      <link>https://dev.to/zzhihao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zzhihao"/>
    <language>en</language>
    <item>
      <title>Displaying images on a TFT screen using a ROM IP core</title>
      <dc:creator>张智豪</dc:creator>
      <pubDate>Thu, 06 Feb 2025 08:33:21 +0000</pubDate>
      <link>https://dev.to/zzhihao/displaying-images-on-a-tft-screen-using-a-rom-ip-core-2pee</link>
      <guid>https://dev.to/zzhihao/displaying-images-on-a-tft-screen-using-a-rom-ip-core-2pee</guid>
      <description>&lt;p&gt;In a &lt;a href="https://blog.csdn.net/JInx299/article/details/145385973?spm=1001.2014.3001.5501" rel="noopener noreferrer"&gt;previous blog post&lt;/a&gt;, we learned how to display color bars on a TFT screen. In this post, we will take it a step further and learn how to display any image on the TFT screen. We will learn how to use a ROM IP core, write the corresponding module, and finally display the target image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ZZhiHao196/Verilog_For_Starter" rel="noopener noreferrer"&gt;Click here&lt;/a&gt; to get the complete files of the code provided in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling the ROM IP Core
&lt;/h2&gt;

&lt;p&gt;To display an image, we need to convert the two-dimensional image into one-dimensional data and store it in ROM in a specific format. During operation, the TFT display reads data from the ROM core.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Image Format Conversion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;​     Here we use an image conversion tool. &lt;a href="https://www.google.com/search?q=https://pan.baidu.com/s/1bStLZ12EhgnsREoUVv051w%3Fpwd%3D9jk4&amp;amp;authuser=3" rel="noopener noreferrer"&gt;Click here&lt;/a&gt; to get the software directly. The &lt;strong&gt;extraction code&lt;/strong&gt; is 9jk4. Once you have the software, we can begin.&lt;/p&gt;

&lt;p&gt;Find the image you want to display and convert it to a BMP bitmap. &lt;/p&gt;

&lt;p&gt;​ The image I will display here is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77u1rcbniycj5qvrg88i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77u1rcbniycj5qvrg88i.png" alt="Image description" width="225" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​     You may not know how to convert JPG, PNG, or other image formats to BMP format. Here I will share my method, hoping it will be helpful to you.&lt;/p&gt;

&lt;p&gt;Open the system's built-in Paint software and import the target image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1swmcs84ofeun29xyqiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1swmcs84ofeun29xyqiy.png" alt="Image description" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5xazwlgaks9taohsjwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5xazwlgaks9taohsjwm.png" alt="Image description" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Process the image to ensure the size is appropriate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0flr77bpadnjd4sdo6lk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0flr77bpadnjd4sdo6lk.png" alt="Image description" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Export the image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsrb36g8xi5datqadsan.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsrb36g8xi5datqadsan.png" alt="Image description" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that the image format issue is resolved, let's move on to the second step.&lt;/p&gt;

&lt;p&gt;Get the .coe file&lt;/p&gt;

&lt;p&gt;Open the software tool, load the image file, select the specific format (RGB565), and convert it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53a1negreq3nrfh2fq78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53a1negreq3nrfh2fq78.png" alt="Image description" width="591" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want to make a few points here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RGB565&lt;/strong&gt;: This is because our TFT display uses the RGB565 format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coe&lt;/strong&gt;: The ROM IP core reads data, which is generally loaded with a .coe file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Loading complete&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0iok7unm3y2xvr3i78b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0iok7unm3y2xvr3i78b.png" alt="Image description" width="601" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note down the size of the image: &lt;code&gt;169*267&lt;/code&gt;, as this will be needed later when configuring the ROM. Also, consider copying and pasting the generated file into the Vivado file path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the ROM IP Core
&lt;/h3&gt;

&lt;p&gt;Now let's configure the ROM IP.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Window&lt;/strong&gt; tab, find &lt;strong&gt;IP Catalog&lt;/strong&gt;, search for &lt;strong&gt;ROM&lt;/strong&gt;, find it, and double-click it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn21h0mal617yxqb4z6hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn21h0mal617yxqb4z6hy.png" alt="Image description" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjnrdgfphmft9atfwebk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjnrdgfphmft9atfwebk.png" alt="Image description" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Single Port ROM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftakie6nmh2cafjimcldp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftakie6nmh2cafjimcldp.png" alt="Image description" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure the Option page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dct5a0ldkrhqbawq43g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dct5a0ldkrhqbawq43g.png" alt="Image description" width="800" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Width&lt;/strong&gt;: Represents the number of bits of stored data. For RGB565, it is 16 bits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depth&lt;/strong&gt;: Represents the number of stored data, corresponding to the size of the image. In this case, 169 * 267 = 45123.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We choose &lt;strong&gt;Always Enable&lt;/strong&gt; so that we can always read data from the ROM. Note: In actual project engineering, it is best to use an enable signal for control. Here, for the sake of simplicity, we choose to always enable it.&lt;/p&gt;

&lt;p&gt;Do not check &lt;strong&gt;Primitives Output Register&lt;/strong&gt;: If checked, the data will be two clock cycles slower than the enable signal. If not checked, the data lags by one clock cycle.&lt;/p&gt;

&lt;p&gt;Load the data file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsxb3ab1aep7v6kjp900.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsxb3ab1aep7v6kjp900.png" alt="Image description" width="800" height="790"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the Depth configured earlier is less than the number of data in the file, an error will be reported, as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusqanomm8xsqgk8xmbkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusqanomm8xsqgk8xmbkn.png" alt="Image description" width="800" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After ensuring everything is correct, click the OK button, and then click the Generate button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsi7pym6cme3namv2i447.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsi7pym6cme3namv2i447.png" alt="Image description" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluehuufnj4zyst4vdtxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluehuufnj4zyst4vdtxu.png" alt="Image description" width="603" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Image_Extract Module
&lt;/h2&gt;

&lt;p&gt;▌Module Definition and Parameters Section&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;Image_Extract&lt;/span&gt;
&lt;span class="p"&gt;#&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;H_Visible_area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Screen visible area width (pixels)&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;V_Visible_area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Screen visible area height (pixels)&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Original image width&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;267&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Original image height&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Pixel data width (RGB565 format)&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;   &lt;span class="c1"&gt;// Image ROM address bus width&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The first two parameters describe the physical resolution of the screen.&lt;/li&gt;
&lt;li&gt;The middle three parameters describe the characteristics of the stored original image.&lt;/li&gt;
&lt;li&gt;The last two parameters define the bit width of the data bus and storage address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;▌Input and Output Port Definitions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;// TFT control clock (synchronized with the screen refresh rate)&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Low-level reset signal&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Image display starting X coordinate&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Image display starting Y coordinate&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_back_color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Background color (RGB value)&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;// Frame synchronization signal (pulse at the beginning of each frame)&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// Data request signal (valid display area flag)&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Current horizontal scan position&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Current vertical scan position&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;rom_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Pixel data read from ROM&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// ROM read address&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt;     &lt;span class="c1"&gt;// Final output pixel data&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Input signals are strictly synchronized with the TFT controller timing.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;visible_hcount&lt;/code&gt; / &lt;code&gt;visible_vcount&lt;/code&gt; for screen coordinate positioning.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disp_back_color&lt;/code&gt; is used for background filling in non-image areas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;▌ Boundary Detection Logic&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Detect if the image exceeds the screen boundary&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;h_exceed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;H_Visible_area&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;v_exceed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;V_Visible_area&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Calculate the theoretical right boundary of the image (X start + image width).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compare whether it exceeds the maximum screen coordinates (&lt;code&gt;H_Visible_area&lt;/code&gt; - 1).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handle the vertical boundary in the same way.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;▌ Display Area Determination Logic&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Generate a valid display area signal&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;img_h_disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h_exceed&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;H_Visible_area&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;img_v_disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v_exceed&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;V_Visible_area&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;img_disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;img_h_disp&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;img_v_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When the image exceeds the screen, automatically limit the valid area to within the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Normal mode(h_exceed= 0)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Effective condition: The picture is completely within the horizontal range of the screen.&lt;/li&gt;
&lt;li&gt;Valid area: &lt;code&gt;[img_disp_hbegin, img_disp_hbegin + IMG_WIDTH)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Example:

&lt;ul&gt;
&lt;li&gt;Screen width 800&lt;/li&gt;
&lt;li&gt;Set starting coordinate = 100, image width = 200&lt;/li&gt;
&lt;li&gt;Valid X range: 100 ≤ X &amp;lt; 300&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Truncation mode( h_exceed= 1)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Effective condition: The right side of the image exceeds the screen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Valid area: &lt;code&gt;[img_disp_hbegin, H_Visible_area)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screen width 800&lt;/li&gt;
&lt;li&gt;Set starting coordinate = 700, image width = 200&lt;/li&gt;
&lt;li&gt;Valid X range: 700 ≤ X &amp;lt; 800 (actually only displays the 100 pixels on the right)

&lt;ul&gt;
&lt;li&gt;The combined &lt;code&gt;img_disp&lt;/code&gt; signal indicates that the current scan position needs to display image content.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;▌ ROM Address Generation Logic&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_ctrl&lt;/span&gt; &lt;span class="kt"&gt;or&lt;/span&gt; &lt;span class="kt"&gt;negedge&lt;/span&gt; &lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;'d0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;'d0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_disp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;hcount_max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;hcount_max&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Reset the address to zero at reset or new frame start.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Increment the address pixel by pixel in the valid image area.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Special boundary handling: When scanning to the end of the line, calculate the address offset.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Normal situation: &lt;code&gt;hcount_max&lt;/code&gt; = &lt;code&gt;img_disp_hbegin&lt;/code&gt; + &lt;code&gt;IMG_WIDTH&lt;/code&gt; - 1&lt;/li&gt;
&lt;li&gt;Out-of-bounds situation: &lt;code&gt;hcount_max&lt;/code&gt; = &lt;code&gt;H_Visible_area&lt;/code&gt; - 1&lt;/li&gt;
&lt;li&gt;Offset = Original planned next line starting address - Actually reachable address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;▌ Data Output Logic&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;rom_data&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_back_color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output selection strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output the pixel data read from ROM in the image display area.&lt;/li&gt;
&lt;li&gt;Display the background color in non-image areas.&lt;/li&gt;
&lt;li&gt;Achieve real-time mixing of the image layer and the background layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;▌Complete Code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;Image_Extract&lt;/span&gt;
&lt;span class="p"&gt;#&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;H_Visible_area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Width of the entire screen display area&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;V_Visible_area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Height of the entire screen display area&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Image width&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;267&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Image height&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Image pixel width&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;     &lt;span class="c1"&gt;// Storage image ROM address width&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="c1"&gt;// Input clock, consistent with the TFT screen clock&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                           &lt;span class="c1"&gt;// Reset signal, active low&lt;/span&gt;

  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Row coordinate of the first pixel in the upper left corner of the image to be displayed on the TFT screen&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Field coordinate of the first pixel in the upper left corner of the image to be displayed on the TFT screen&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_back_color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Background color&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                       &lt;span class="c1"&gt;// Flag signal for the start of a frame image, clk_ctrl clock domain&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                     &lt;span class="c1"&gt;// Data valid area&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;// TFT visible area row scan counter&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;// TFT visible area field scan counter&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;rom_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Read image data&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// ROM address for reading image data&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt;      &lt;span class="c1"&gt;// Data displayed on the TFT screen&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;h_exceed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;v_exceed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;img_h_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;img_v_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;img_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;hcount_max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Determine if the image will exceed the screen range, resulting in incomplete display&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;h_exceed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;H_Visible_area&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;v_exceed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;V_Visible_area&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;img_h_disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h_exceed&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;H_Visible_area&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
                               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;img_v_disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v_exceed&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;V_Visible_area&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
                               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;img_disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;img_h_disp&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;img_v_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;hcount_max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h_exceed&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;H_Visible_area&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_ctrl&lt;/span&gt; &lt;span class="kt"&gt;or&lt;/span&gt; &lt;span class="kt"&gt;negedge&lt;/span&gt; &lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;'d0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;'d0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_disp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;hcount_max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;hcount_max&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;rom_addra&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img_disp&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;rom_data&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_back_color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Top Level Module
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Header File&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;disp_param.vh&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cp"&gt;`define&lt;/span&gt; &lt;span class="n"&gt;HW_TFT50&lt;/span&gt;

&lt;span class="c1"&gt;// Use VGA monitor, default is 640*480 resolution, 24-bit mode, other resolutions or 16-bit mode can be reconfigured in code lines 63 to 75&lt;/span&gt;
&lt;span class="c1"&gt;//`define HW_VGA&lt;/span&gt;

&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// The following macro definitions are used to set the bit mode and resolution based on the display device&lt;/span&gt;
&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;HW_TFT43&lt;/span&gt;  &lt;span class="c1"&gt;// Use 4.3 inch 480*272 resolution display&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; MODE_RGB565&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; Resolution_480x272 1 &lt;span class="err"&gt;//&lt;/span&gt; Clock is 9MHz&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;HW_TFT50&lt;/span&gt;  &lt;span class="c1"&gt;// Use 5 inch 800*480 resolution display&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; MODE_RGB565&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; Resolution_800x480 1 &lt;span class="err"&gt;//&lt;/span&gt; Clock is 33MHz&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;HW_VGA&lt;/span&gt;    &lt;span class="c1"&gt;// Use VGA monitor, default is 640*480 resolution, 24-bit mode&lt;/span&gt;
&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// You can choose other resolutions and 16-bit mode, users need to set according to actual needs&lt;/span&gt;
&lt;span class="c1"&gt;// The three lines and four lines below set the bit mode&lt;/span&gt;
&lt;span class="c1"&gt;// The continuous macro definition part after the five lines below sets the resolution&lt;/span&gt;
&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; MODE_RGB565&lt;span class="cp"&gt;
&lt;/span&gt; &lt;span class="c1"&gt;// `define MODE_RGB888&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; Resolution_640x480   1 &lt;span class="err"&gt;//&lt;/span&gt; Clock is 25&lt;span class="err"&gt;.&lt;/span&gt;175MHz&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="c1"&gt;//`define Resolution_800x600   1 // Clock is 40MHz&lt;/span&gt;
  &lt;span class="c1"&gt;//`define Resolution_1024x600  1 // Clock is 51MHz&lt;/span&gt;
  &lt;span class="c1"&gt;//`define Resolution_1024x768  1 // Clock is 65MHz&lt;/span&gt;
  &lt;span class="c1"&gt;//`define Resolution_1280x720  1 // Clock is 74.25MHz&lt;/span&gt;
  &lt;span class="c1"&gt;//`define Resolution_1920x1080 1 // Clock is 148.5MHz&lt;/span&gt;
&lt;span class="cp"&gt;`endif&lt;/span&gt;

&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// For non-special needs, users do not need to modify the following content&lt;/span&gt;
&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// Define different color depths&lt;/span&gt;
&lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;MODE_RGB888&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; Red_Bits   8&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; Green_Bits 8&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; Blue_Bits  8&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;MODE_RGB565&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; Red_Bits   5&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; Green_Bits 6&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; Blue_Bits  5&lt;span class="cp"&gt;
`endif&lt;/span&gt;

&lt;span class="c1"&gt;// Define timing parameters for different resolutions&lt;/span&gt;
&lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;Resolution_480x272&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d525&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d41&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d286&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d10&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_640x480&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d800&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d96&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d525&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d25&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_800x480&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d1056&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d128&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d88&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d525&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d25&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_800x600&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d1056&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d128&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d88&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d628&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d1&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d4&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d23&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1024x600&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d1344&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d24&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d136&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d160&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d628&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d1&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d4&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d23&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1024x768&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d1344&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d24&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d136&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d160&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d806&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d3&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d6&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d29&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1280x720&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d1650&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d110&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d220&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d750&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d5&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d5&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d20&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1920x1080&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d2200&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border  12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d88&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d44&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d148&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border   12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time    12&lt;span class="err"&gt;'&lt;/span&gt;d1125&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch   12&lt;span class="err"&gt;'&lt;/span&gt;d4&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time     12&lt;span class="err"&gt;'&lt;/span&gt;d5&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch    12&lt;span class="err"&gt;'&lt;/span&gt;d36&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border    12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Top-Level Instantiation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rom_Image_Tft.v&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;Rom_Image_Tft&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;

  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;clk50M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// System clock input 50M&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Reset signal input, active low&lt;/span&gt;

  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TFT_rgb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// TFT data output&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_hs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// TFT horizontal synchronization signal&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_vs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// TFT vertical synchronization signal&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_clk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// TFT pixel clock&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_de&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// TFT data enable&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_pwm&lt;/span&gt;         &lt;span class="c1"&gt;// TFT backlight control&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Set the size of the image to be displayed, the address width of the ROM storing the image, and the background color of the display&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;DISP_IMAGE_W&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;DISP_IMAGE_H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;267&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// Determined by the depth of the ROM bearing the image storage&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;DISP_BACK_COLOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;16'hFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// White&lt;/span&gt;

  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;TFT_WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;TFT_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// The image is displayed in the middle of the screen&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;DISP_HBEGIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;DISP_IMAGE_W&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;DISP_VBEGIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;DISP_IMAGE_H&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;tft_reset_n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;rom_data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;visible_hcount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;visible_vcount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;tft_reset_p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Disp_red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Disp_green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Disp_blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;clk33M&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;clk165M&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;tft_reset_n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;tft_reset_p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;clk_ctrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clk33M&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;pll&lt;/span&gt; &lt;span class="n"&gt;pll&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Clock out ports&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_out1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk33M&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;      &lt;span class="c1"&gt;// output clk_out1&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_out2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk165M&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// output clk_out2&lt;/span&gt;
    &lt;span class="c1"&gt;// Status and control signals&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resetn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// input reset, active low&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;locked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// output locked&lt;/span&gt;
    &lt;span class="c1"&gt;// Clock in ports&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_in1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk50M&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;// input clk_in1&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;rom_image&lt;/span&gt; &lt;span class="n"&gt;rom_image&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clka&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// input wire clka&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// input wire [16 : 0] addra&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;douta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rom_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// output wire [15 : 0] douta&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Image_Extract&lt;/span&gt;
  &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H_Visible_area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_WIDTH&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// Screen display area width&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;V_Visible_area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;      &lt;span class="c1"&gt;// Screen display area height&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IMG_WIDTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISP_IMAGE_W&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;// Image width&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IMG_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISP_IMAGE_H&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// Image height&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IMG_DATA_WIDTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;              &lt;span class="c1"&gt;// Image pixel width&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ROM_ADDR_WIDTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// Address width of the ROM storing the image&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;image_extract&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tft_reset_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img_disp_hbegin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISP_HBEGIN&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img_disp_vbegin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISP_VBEGIN&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_back_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISP_BACK_COLOR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rom_addra&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rom_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rom_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Disp_Driver&lt;/span&gt; &lt;span class="n"&gt;disp_driver&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_ctrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tft_reset_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data_In&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataReq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H_Addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_hcount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;V_Addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible_vcount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Hs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_hs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Vs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_vs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Red&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Disp_red&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Green&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Disp_green&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Blue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Disp_blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Frame_Begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_begin&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// Flag signal for the start of a frame image&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_De&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Pclk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TFT_clk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_rgb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Disp_red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Disp_green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Disp_blue&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_pwm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  TFT Display
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Disp_Driver.v&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cp"&gt;`include&lt;/span&gt; &lt;span class="s"&gt;"disp_param.vh"&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;Disp_Driver&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cp"&gt;`Red_Bits&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cp"&gt;`Green_Bits&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cp"&gt;`Blue_Bits&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Data_In&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;DataReq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;H_Addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;V_Addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;Disp_Hs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;Disp_Vs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cp"&gt;`Red_Bits&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Disp_Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cp"&gt;`Green_Bits&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Disp_Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cp"&gt;`Blue_Bits&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Disp_Blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;Frame_Begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Flag signal for the start of a frame image&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;Disp_De&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;Disp_Pclk&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Internal signals&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;hcount_ov&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Row counter overflow signal&lt;/span&gt;
  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;vcount_ov&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Column counter overflow signal&lt;/span&gt;

  &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;hcount_r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Row counter register&lt;/span&gt;
  &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;vcount_r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Column counter register&lt;/span&gt;

  &lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;HW_VGA&lt;/span&gt;
    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;Disp_Pclk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cp"&gt;`else&lt;/span&gt;
    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;Disp_Pclk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cp"&gt;`endif&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;DataReq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Disp_De&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Timing parameters&lt;/span&gt;
  &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;Hdata_Begin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`H_Sync_Time&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cp"&gt;`H_Back_Porch&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cp"&gt;`H_Left_Border&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Hdata_End&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`H_Total_Time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="cp"&gt;`H_Right_Border&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="cp"&gt;`H_Front_Porch&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Vdata_Begin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`V_Sync_Time&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cp"&gt;`V_Back_Porch&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cp"&gt;`V_Top_Border&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Vdata_End&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`V_Total_Time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="cp"&gt;`V_Bottom_Border&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="cp"&gt;`V_Front_Porch&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;VGA_HS_End&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`H_Sync_Time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;VGA_VS_End&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`V_Sync_Time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Hpixel_End&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`H_Total_Time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Vline_End&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cp"&gt;`V_Total_Time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Row counter overflow signal&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;hcount_ov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;Hpixel_End&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Row counter reaches maximum value, overflow signal is valid&lt;/span&gt;

  &lt;span class="c1"&gt;// Row counter&lt;/span&gt;
  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt; &lt;span class="kt"&gt;or&lt;/span&gt; &lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;// Reset, row counter cleared&lt;/span&gt;
      &lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hcount_ov&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// Reaches the end of the row scan, row counter cleared&lt;/span&gt;
      &lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;                  &lt;span class="c1"&gt;// Otherwise, row counter increments by 1&lt;/span&gt;
      &lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;// Column counter overflow signal&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vcount_ov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;Vline_End&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Column counter reaches maximum value and row counter overflows, overflow signal is valid&lt;/span&gt;

  &lt;span class="c1"&gt;// Column counter&lt;/span&gt;
  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt; &lt;span class="kt"&gt;or&lt;/span&gt; &lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;// Reset, column counter cleared&lt;/span&gt;
      &lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hcount_ov&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;  &lt;span class="c1"&gt;// Row counter overflows, column counter increments&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vcount_ov&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// Reaches the end of the column scan, column counter cleared&lt;/span&gt;
        &lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;              &lt;span class="c1"&gt;// Otherwise, column counter increments by 1&lt;/span&gt;
        &lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;vcount_r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;// Data valid area flag&lt;/span&gt;
  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;Disp_De&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;Hdata_Begin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Hdata_End&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
               &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;Vdata_Begin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Vdata_End&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// When both row and column counters are in the valid data area, the data valid area flag is valid&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;H_Addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Disp_De&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Hdata_Begin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12'd0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;V_Addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Disp_De&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Vdata_Begin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12'd0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;Disp_Hs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;VGA_HS_End&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Row counter greater than or equal to VGS_HS_End, horizontal sync signal is valid&lt;/span&gt;
    &lt;span class="n"&gt;Disp_Vs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vcount_r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;VGA_VS_End&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Column counter greater than or equal to VGS_VS_End, vertical sync signal is valid&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Disp_Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Disp_Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Disp_Blue&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Disp_De&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Data_In&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Output RGB data&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c1"&gt;// in the valid data area, otherwise output black&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;// Extract rising edge of Disp_Vs&lt;/span&gt;
  &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;Disp_Vs_Dly1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;Disp_Vs_Dly1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;Disp_Vs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_disp&lt;/span&gt; &lt;span class="kt"&gt;or&lt;/span&gt; &lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
      &lt;span class="n"&gt;Frame_Begin&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Disp_Vs_Dly1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Disp_Vs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
      &lt;span class="n"&gt;Frame_Begin&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
      &lt;span class="n"&gt;Frame_Begin&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Result Display
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4ou7pla9tfcadycxa2x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4ou7pla9tfcadycxa2x.png" alt="Image description" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>learning</category>
      <category>fpga</category>
    </item>
    <item>
      <title>HDMI Encoder</title>
      <dc:creator>张智豪</dc:creator>
      <pubDate>Thu, 06 Feb 2025 08:20:19 +0000</pubDate>
      <link>https://dev.to/zzhihao/hdmi-encoder-4l1l</link>
      <guid>https://dev.to/zzhihao/hdmi-encoder-4l1l</guid>
      <description>&lt;p&gt;In &lt;a href="https://blog.csdn.net/JInx299/article/details/145404155?spm=1001.2014.3001.5501" rel="noopener noreferrer"&gt;the previous blog post&lt;/a&gt;, we introduced the HDMI encoding section. In this blog post, we will complete the subsequent task of HDMI: serial transmission of HDMI.&lt;/p&gt;

&lt;h2&gt;
  
  
  ODDR
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Clock Selection
&lt;/h3&gt;

&lt;p&gt;In the transmission stage, we usually use a clock frequency that is 5 times the encoder's working frequency to send the encoded 10-bit data. The reason is simple: when using DDR (Double Data Rate, where both the rising and falling edges of the clock are effective), under the &lt;strong&gt;&lt;em&gt;clk_5x&lt;/em&gt;&lt;/strong&gt; frequency, the time to serially transmit 10 bits of data is roughly the same as the time for the encoding part to process 10 bits of data under &lt;strong&gt;&lt;em&gt;clk&lt;/em&gt;&lt;/strong&gt;, which is beneficial for achieving data synchronization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2771p5yv02j5wvt602u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2771p5yv02j5wvt602u.png" alt="Image description" width="715" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Template Usage
&lt;/h3&gt;

&lt;p&gt;In FPGAs, we can use &lt;strong&gt;ready-made DDR templates&lt;/strong&gt; to accomplish this.&lt;/p&gt;

&lt;p&gt;Click on the Tool bar, find Language Templates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3q24xr2smyq9i67vbp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3q24xr2smyq9i67vbp0.png" alt="Image description" width="573" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Verilog's Device Primitive Instantiation, find the Artixe-7 series; click on I/O Components, and find DDR Registers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faci642ttf9ihjk5fsqdl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faci642ttf9ihjk5fsqdl.png" alt="Image description" width="420" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to serially output the encoded data, so we use ODDR (Output DDR Register); select the ODDR column, and you can see the preview of the template code on the left. Copy it as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m4njxcbyh0ex31xp264.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m4njxcbyh0ex31xp264.png" alt="Image description" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You need to select the template library according to the series of FPGA chips you are using. Do not blindly follow the example.&lt;/p&gt;

&lt;h3&gt;
  
  
  Port Introduction
&lt;/h3&gt;

&lt;p&gt;The ODDR structure diagram is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7v4lzro5k7pmzyp5l0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7v4lzro5k7pmzyp5l0s.png" alt="Image description" width="291" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The port descriptions are as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port Signal Name&lt;/th&gt;
&lt;th&gt;I/O&lt;/th&gt;
&lt;th&gt;Bit Width&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Input Clock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CE&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Clock Enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;High Segment Input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D2&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Low Segment Input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S/R&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Set/Reset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here, we explain the two working modes of ODDR: &lt;strong&gt;Opposite Edge&lt;/strong&gt; and &lt;strong&gt;Same Edge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Opposite Edge mode, &lt;strong&gt;input data is latched on the rising edge of the clock signal and output on the falling edge; simultaneously, the next input data is latched on the falling edge of the clock signal and output on the next rising edge&lt;/strong&gt;. In this mode, the output transmission delay is low, and data recovery is easier, but the power consumption is higher, and the quality requirement for the clock is also very high.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuicf5bewjb9f9qxm36qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuicf5bewjb9f9qxm36qo.png" alt="Image description" width="664" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Same Edge mode, &lt;strong&gt;input data is latched simultaneously on either the rising or falling edge of the clock signal&lt;/strong&gt;, and output on both the rising and falling edges**. In this mode, the two edges of the output data correspond to the same input data. This method can simplify timing design and facilitate control. It has low requirements for the clock and lower power consumption, but the delay is higher.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9g8fp6x44qcyvs39iuz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9g8fp6x44qcyvs39iuz.png" alt="Image description" width="618" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Correspondence between DDR Interface and TMDS Data
&lt;/h3&gt;

&lt;p&gt;We use the ODDR core in FPGA to transmit TMDS data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5q6ft60x3kwgzjuoiyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5q6ft60x3kwgzjuoiyh.png" alt="Image description" width="418" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HDMI has a total of 4 channels, of which 3 channels are data channels and one channel is a clock channel. Each channel needs to complete 10-bit data output within 5 clock cycles. Since the output data starts from the low bit, it is necessary to switch between datain_h and datain_1 every clock cycle. The specific correspondence is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqprvtg7c90dsaxk0cokd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqprvtg7c90dsaxk0cokd.png" alt="Image description" width="682" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OBUFDS
&lt;/h2&gt;

&lt;p&gt;Since the TMDS encoding method uses differential transmission during transmission, that is, two signal lines are used for each channel, and their transmission levels are exactly opposite. To achieve this function, we can use the &lt;strong&gt;OBUFDS&lt;/strong&gt; template library. The usage method is the same as ODDR, so we will not repeat it here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Serial Transmission Section
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cp"&gt;`timescale&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ps&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;Ser_Def_10to1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 5x clock frequency&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 0 data input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 1 data input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 2 data input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 3 data input&lt;/span&gt;

    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_0_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 0 differential negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_0_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 0 differential positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_1_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 1 differential negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_1_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 1 differential positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_2_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 2 differential negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_2_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 2 differential positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_3_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Channel 3 differential negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_3_p&lt;/span&gt;  &lt;span class="c1"&gt;// Channel 3 differential positive output&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// modulo-5 counter, used to select data bits&lt;/span&gt;
&lt;span class="kt"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// shift registers&lt;/span&gt;
&lt;span class="kt"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_0h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_01&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_1h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_11&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_2h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_21&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_3h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_31&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_0_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_0_h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_1_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_1_h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_2_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_2_h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_3_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;TMDS_3_h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="c1"&gt;// 5x speed to send data&lt;/span&gt;
&lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="c1"&gt;// TMDS_CNT5[2] is 1 for the first time, just count to 100, which is 4, 0 to 4 --&amp;gt;&amp;gt; 5 numbers are counted&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;3'd0&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3'd1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_0h&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_0_h&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_0h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_01&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_0_1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_01&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_1h&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_1_h&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_1h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_1_1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_11&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_2h&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_2_h&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_2h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_21&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_2_1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_21&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_3h&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_3_h&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_3h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;TMDS_Shift_31&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_CNT5&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;TMDS_3_1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TMDS_Shift_31&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;dataout_0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_out1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_out2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataout_3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="c1"&gt;// Use ODDR and OBUFDS&lt;/span&gt;
&lt;span class="c1"&gt;// Channel 0&lt;/span&gt;
&lt;span class="n"&gt;ODDR&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DDR_CLK_EDGE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OPPOSITE_EDGE"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// "OPPOSITE_EDGE" or "SAME_EDGE"&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;                     &lt;span class="c1"&gt;// Initial value of Q: 1'b0 or 1'b1&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRTYPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SYNC"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;// Set/Reset type: "SYNC" or "ASYNC"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ODDR_0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;// 1-bit DDR output&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit clock input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// 1-bit clock enable input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_01&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (positive edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_0h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (negative edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit reset&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;// 1-bit set&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;OBUFDS&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IOSTANDARD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEFAULT"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Specify the output I/O standard&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SLEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SLOW"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// Specify the output slew rate&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OBUFDS_0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_0_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// Diff_p output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_0_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Diff_n output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// Buffer input&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Channel 1&lt;/span&gt;
&lt;span class="n"&gt;ODDR&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DDR_CLK_EDGE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OPPOSITE_EDGE"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// "OPPOSITE_EDGE" or "SAME_EDGE"&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;                     &lt;span class="c1"&gt;// Initial value of Q: 1'b0 or 1'b1&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRTYPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SYNC"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;// Set/Reset type: "SYNC" or "ASYNC"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ODDR_1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;// 1-bit DDR output&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit clock input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// 1-bit clock enable input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_11&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (positive edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_1h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (negative edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit reset&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;// 1-bit set&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;OBUFDS&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IOSTANDARD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEFAULT"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Specify the output I/O standard&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SLEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SLOW"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// Specify the output slew rate&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OBUFDS_1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_1_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// Diff_p output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_1_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Diff_n output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// Buffer input&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;


&lt;span class="c1"&gt;// Channel 2&lt;/span&gt;
&lt;span class="n"&gt;ODDR&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DDR_CLK_EDGE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OPPOSITE_EDGE"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// "OPPOSITE_EDGE" or "SAME_EDGE"&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;                     &lt;span class="c1"&gt;// Initial value of Q: 1'b0 or 1'b1&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRTYPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SYNC"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;// Set/Reset type: "SYNC" or "ASYNC"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ODDR_2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;// 1-bit DDR output&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit clock input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// 1-bit clock enable input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_21&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (positive edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_2h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (negative edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit reset&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;// 1-bit set&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;OBUFDS&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IOSTANDARD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEFAULT"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Specify the output I/O standard&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SLEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SLOW"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// Specify the output slew rate&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OBUFDS_2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_2_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// Diff_p output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_2_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Diff_n output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// Buffer input&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Channel 3&lt;/span&gt;
&lt;span class="n"&gt;ODDR&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DDR_CLK_EDGE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OPPOSITE_EDGE"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// "OPPOSITE_EDGE" or "SAME_EDGE"&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;                     &lt;span class="c1"&gt;// Initial value of Q: 1'b0 or 1'b1&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRTYPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SYNC"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;// Set/Reset type: "SYNC" or "ASYNC"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ODDR_3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;// 1-bit DDR output&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit clock input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// 1-bit clock enable input&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_31&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (positive edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TMDS_Shift_3h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// 1-bit data input (negative edge)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// 1-bit reset&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;// 1-bit set&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;OBUFDS&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IOSTANDARD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEFAULT"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Specify the output I/O standard&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SLEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SLOW"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// Specify the output slew rate&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OBUFDS_3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_3_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// Diff_p output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_3_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Diff_n output (connect directly to top-level port)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataout_3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// Buffer input&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  HDMI Transmitter
&lt;/h3&gt;

&lt;p&gt;As long as the encoder is instantiated and linked with image data stream data and control signals according to the HDMI protocol, the transmitter module can be implemented.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favk9q21b87sh56jqi8pu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favk9q21b87sh56jqi8pu.png" alt="Image description" width="678" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When TMDS sends data, it also sends the pixel clock (which we记为 tmds_clk) together. tmds_clk should be consistent with the pixel clock pixelclk frequency, not pixelclk_x5. tmds_clk is used to synchronize a complete encoded data, not a single data bit.&lt;/p&gt;

&lt;p&gt;There are two ways to generate tmds_clk: one is to invert pixelclk; the other is to use ODDR to generate it in the form of data. We use ODDR to generate it in the form of data. This method can maintain the phase relationship between the output clock and the output data to a certain extent, which is convenient for the receiving end to synchronize. The method of generating the waveform is very simple: we assign 10'b11111_00000 to the input segment of ODDR, so that in the first 2.5 clock cycles, the output level is high, and in the latter 2.5 cycles, the output level is low.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cp"&gt;`timescale&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ps&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;HDMI_Encoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Input global control signals&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Pixel clock&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;pixelclk_x5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 5x pixel clock&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Reset, positive polarity&lt;/span&gt;

    &lt;span class="c1"&gt;// Input display data&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;blue_din&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Blue data input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;green_din&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Green data input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;red_din&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Red data input&lt;/span&gt;

    &lt;span class="c1"&gt;// Input display control signals&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;hsync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Horizontal sync&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;vsync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Vertical sync&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// Data enable&lt;/span&gt;

    &lt;span class="c1"&gt;// Output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;tdms_clk_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// TMDS clock positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;tdms_clk_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// TMDS clock negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;tmds_data_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// TMDS data positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;tmds_data_n&lt;/span&gt;  &lt;span class="c1"&gt;// TMDS data negative output&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Instantiate modules&lt;/span&gt;
&lt;span class="n"&gt;Encode&lt;/span&gt; &lt;span class="n"&gt;encb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// Pixel clock&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// Reset, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;din&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blue_din&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// Data input, blue&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hsync&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// Control signal c0, horizontal sync&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vsync&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// Control signal c1, vertical sync&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// Data enable&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;// Data output, blue&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Encode&lt;/span&gt; &lt;span class="n"&gt;encg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// Pixel clock&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// Reset, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;din&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;green_din&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// Data input, green&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// Control signal c0, constant 0&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// Control signal c1, constant 0&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// Data enable&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// Data output, green&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Encode&lt;/span&gt; &lt;span class="n"&gt;encr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// Pixel clock&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// Reset, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;din&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;red_din&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// Data input, red&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// Control signal c0, constant 0&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// Control signal c1, constant 0&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;          &lt;span class="c1"&gt;// Data enable&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;// Data output, red&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Ser_Def_10to1&lt;/span&gt; &lt;span class="n"&gt;HDMI_Sender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_x5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c1"&gt;// 5x pixel clock&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datain_0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;// Data input channel 0, blue&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datain_1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// Data input channel 1, green&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datain_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;// Data input channel 2, red&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datain_3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;10'b11111_00000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Data input channel 3, for clock generation&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_0_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_data_p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// Data output channel 0 negative, positive polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_0_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_data_n&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// Data output channel 0 positive, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_1_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_data_p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// Data output channel 1 negative, positive polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_1_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_data_n&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// Data output channel 1 positive, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_2_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_data_p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// Data output channel 2 negative, positive polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_2_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_data_n&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="c1"&gt;// Data output channel 2 positive, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_3_n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_clk_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// Clock output negative, negative polarity&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataout_3_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmds_clk_p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// Clock output positive, positive polarity&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: The Encode module code can be found in my &lt;a href="https://blog.csdn.net/JInx299/article/details/145404155?spm=1001.2014.3001.5501" rel="noopener noreferrer"&gt;previous article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After completing this controller, when using it, you only need to connect the corresponding signals to the HDMI_Encoder corresponding ports based on the VGA or TFT display system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Top Level
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cp"&gt;`timescale&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ps&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;HDMI_Disp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;clk_50M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// 50MHz system clock&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;rst_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// Reset, negative polarity&lt;/span&gt;

    &lt;span class="c1"&gt;// HDMI1 interface&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;hdmi1_clk_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI1 clock positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;hdmi1_clk_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI1 clock negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi1_dat_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// HDMI1 data positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi1_data_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// HDMI1 data negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi1_oe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI1 output enable&lt;/span&gt;

    &lt;span class="c1"&gt;// HDMI2 interface&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;hdmi2_clk_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI2 clock positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;hdmi2_clk_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI2 clock negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi2_dat_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// HDMI2 data positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi2_data_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// HDMI2 data negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi2_oe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI2 output enable&lt;/span&gt;

    &lt;span class="c1"&gt;// HDMI3 interface&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;hdmi3_clk_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI3 clock positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;hdmi3_clk_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI3 clock negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi3_dat_p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// HDMI3 data positive output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi3_data_n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// HDMI3 data negative output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;hdmi3_oe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// HDMI3 output enable&lt;/span&gt;

    &lt;span class="c1"&gt;// TFT interface&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TFT_rgb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// TFT RGB data output&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_hs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// TFT horizontal sync&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_vs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// TFT vertical sync&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_clk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// TFT clock&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_de&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// TFT data enable&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;TFT_pwn&lt;/span&gt;       &lt;span class="c1"&gt;// TFT PWM&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Resolution_800x480 // Clock is 33MHz&lt;/span&gt;
&lt;span class="k"&gt;parameter&lt;/span&gt;
    &lt;span class="n"&gt;Disp_Width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Disp_Height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Pixel clock, 33MHz&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;pixelclk_x5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// 5x pixel clock, 165MHz&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// PLL locked signal&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;         &lt;span class="c1"&gt;// Reset, positive polarity&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_h_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Display horizontal address&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_v_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Display vertical address&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Display data request&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Display data, 24 bits RGB&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;disp_hs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// Display horizontal sync&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;disp_vs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// Display vertical sync&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;disp_red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// Display red data&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;disp_green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Display green data&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;disp_blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Display blue data&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;disp_de&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// Display data enable&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;disp_pclk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Display pixel clock&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;rst_p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="n"&gt;pll&lt;/span&gt; &lt;span class="n"&gt;pll&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_out1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// output 33M&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_out2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// output 165M&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resetn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;      &lt;span class="c1"&gt;// input resetn&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;locked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pll_locked&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// output locked&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_in1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk_50M&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// input clk_in1&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Color_Bar&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Disp_Width&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Disp_Height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;color_bar&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_h_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_h_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_v_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_v_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Disp_Driver&lt;/span&gt; &lt;span class="n"&gt;disp_driver&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clk_disp&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data_In&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataReq&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H_Addr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_h_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;V_Addr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_v_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Hs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_hs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Vs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_vs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Red&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_red&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Green&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_green&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Blue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Frame_Begin&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt;       &lt;span class="c1"&gt;// Flag for the beginning of a frame&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_De&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disp_Pclk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_pclk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// TFT&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_rgb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;disp_red&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;disp_green&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;disp_blue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_hs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disp_hs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_vs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disp_vs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_clk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disp_pclk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_de&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disp_de&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;TFT_pwm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;HDMI_Encoder&lt;/span&gt; &lt;span class="n"&gt;encoder1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Input global control signals&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pixelclk_x5&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue_din&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;green_din&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_green&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;red_din&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_red&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hsync&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_hs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vsync&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_vs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tdms_clk_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi1_clk_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tdms_clk_n&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi1_clk_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tmds_data_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi1_dat_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tmds_data_n&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi1_data_n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;hdmi1_oe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;HDMI_Encoder&lt;/span&gt; &lt;span class="n"&gt;encoder2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Input global control signals&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pixelclk_x5&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelclk_x5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rst_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue_din&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;green_din&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_green&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;red_din&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_red&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hsync&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_hs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vsync&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_vs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_de&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tdms_clk_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi2_clk_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tdms_clk_n&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi2_clk_n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tmds_data_p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi2_dat_p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tmds_data_n&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdmi2_data_n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;hdmi2_oe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Auxiliary Modules
&lt;/h3&gt;

&lt;p&gt;Color_Bar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cp"&gt;`timescale&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ps&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;Color_Bar&lt;/span&gt; &lt;span class="p"&gt;#(&lt;/span&gt;
    &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;Disp_Width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;Disp_Height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;
&lt;span class="p"&gt;)(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;disp_h_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Display horizontal address input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;disp_v_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Display vertical address input&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Display data request input&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="c1"&gt;// Display data output&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;localparam&lt;/span&gt;
    &lt;span class="n"&gt;BLACK&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'h000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Black color&lt;/span&gt;
    &lt;span class="n"&gt;BLUE&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'h0000FF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Blue color&lt;/span&gt;
    &lt;span class="n"&gt;RED&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'hFF0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Red color&lt;/span&gt;
    &lt;span class="n"&gt;PURPPLE&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'hFF00FF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Purple color&lt;/span&gt;
    &lt;span class="n"&gt;GREEN&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'h00FF00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Green color&lt;/span&gt;
    &lt;span class="n"&gt;CYAN&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'h00FFFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Cyan color&lt;/span&gt;
    &lt;span class="n"&gt;YELLOW&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'hFFFF00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Yellow color&lt;/span&gt;
    &lt;span class="n"&gt;WHITE&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;24'hFFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// White color&lt;/span&gt;

&lt;span class="c1"&gt;// Define the default display color value for each pixel block&lt;/span&gt;
&lt;span class="k"&gt;localparam&lt;/span&gt;
    &lt;span class="n"&gt;R0_C0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BLACK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Pixel block in row 0, column 0&lt;/span&gt;
    &lt;span class="n"&gt;R0_C1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Pixel block in row 0, column 1&lt;/span&gt;
    &lt;span class="n"&gt;R1_C0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Pixel block in row 1, column 0&lt;/span&gt;
    &lt;span class="n"&gt;R1_C1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PURPPLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Pixel block in row 1, column 1&lt;/span&gt;
    &lt;span class="n"&gt;R2_C0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Pixel block in row 2, column 0&lt;/span&gt;
    &lt;span class="n"&gt;R2_C1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CYAN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Pixel block in row 2, column 1&lt;/span&gt;
    &lt;span class="n"&gt;R3_C0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;YELLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Pixel block in row 3, column 0&lt;/span&gt;
    &lt;span class="n"&gt;R3_C1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WHITE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// Pixel block in row 3, column 1&lt;/span&gt;

&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;row_act&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Active row flags&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;col_act&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Active column flags&lt;/span&gt;

&lt;span class="k"&gt;genvar&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;localparam&lt;/span&gt; &lt;span class="n"&gt;row_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Disp_Height&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Height of each row block&lt;/span&gt;
           &lt;span class="n"&gt;col_width&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Disp_Width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Width of each column block&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;row_act&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_v_addr&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;row_height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_v_addr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;row_height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;col_act&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_h_addr&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;col_width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_h_addr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;col_width&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;row_act&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col_act&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;disp_data_req&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="mb"&gt;7'b0001_01_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R0_C0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b0001_10_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R0_C1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b0010_01_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R1_C0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b0010_10_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R1_C1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b0100_01_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R2_C0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b0100_10_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R2_C1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b1000_01_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R3_C0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="mb"&gt;7'b1000_10_1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R3_C1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;default:&lt;/span&gt;      &lt;span class="n"&gt;disp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R0_C0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;endcase&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Header File
&lt;/h3&gt;

&lt;p&gt;disp_para.vh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Usage instructions
When using, select 2 predefined parameters according to actual work needs.

Parameter 1: MODE_RGBxxx
Predefined to determine whether the driver works in 16-bit mode or 24-bit mode, choose one of the two
MODE_RGB888: 24-bit mode
MODE_RGB565: 16-bit mode
4.3-inch TFT display ------ use 16-bit color RGB565 mode
5-inch TFT display -------- use 16-bit color RGB565 mode
GM7123 module ---------- use 24-bit color RGB888 mode

Parameter 2: Resolution_xxxx
Predefined to determine the resolution of the display device, common device resolutions are as follows

4.3-inch TFT display:
Resolution_480x272

5-inch TFT display:
Resolution_800x480

VGA common resolution:
Resolution_640x480
Resolution_800x600
Resolution_1024x600
Resolution_1024x768
Resolution_1280x720
Resolution_1920x1080
*/&lt;/span&gt;

&lt;span class="c1"&gt;// You can also set the display device type through macro definition. Enable one and shield others with comments.&lt;/span&gt;
&lt;span class="c1"&gt;// Use 4.3-inch 480*272 resolution display&lt;/span&gt;
&lt;span class="c1"&gt;//`define HW_TFT43&lt;/span&gt;

&lt;span class="c1"&gt;// Use 5-inch 800*480 resolution display&lt;/span&gt;
&lt;span class="cp"&gt;`define&lt;/span&gt; HW_TFT50&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Use VGA monitor, default is 640*480 resolution, 24-bit mode. Other resolutions or 16-bit mode can be reconfigured from line 63 to line 75 in the code.&lt;/span&gt;
&lt;span class="c1"&gt;//`define HW_VGA&lt;/span&gt;

&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// The following macro definitions are used to set the bit mode and resolution parameters according to the display device&lt;/span&gt;
&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;HW_TFT43&lt;/span&gt; &lt;span class="c1"&gt;// Use 4.3-inch 480*272 resolution display&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; MODE_RGB565&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; Resolution_480x272 1 &lt;span class="err"&gt;//&lt;/span&gt; Clock is 9MHz&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;HW_TFT50&lt;/span&gt; &lt;span class="c1"&gt;// Use 5-inch 800*480 resolution display&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; MODE_RGB565&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; Resolution_800x480 1 &lt;span class="err"&gt;//&lt;/span&gt; Clock is 33MHz&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;HW_VGA&lt;/span&gt; &lt;span class="c1"&gt;// Use VGA monitor, default is 640*480 resolution, 24-bit mode&lt;/span&gt;
    &lt;span class="c1"&gt;//=====================================&lt;/span&gt;
    &lt;span class="c1"&gt;// Other resolutions and 16-bit modes can be selected. Users need to set them according to actual needs.&lt;/span&gt;
    &lt;span class="c1"&gt;// Code lines 75~76 set the bit mode&lt;/span&gt;
    &lt;span class="c1"&gt;// Code lines 77~83 set the resolution&lt;/span&gt;
    &lt;span class="c1"&gt;//=====================================&lt;/span&gt;
    &lt;span class="c1"&gt;//`define MODE_RGB565&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; MODE_RGB888&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="c1"&gt;//`define Resolution_640x480 1 // Clock is 25.175MHz&lt;/span&gt;
    &lt;span class="c1"&gt;//`define Resolution_800x480 1 // Clock is 33MHz, compatible with TFT5.0&lt;/span&gt;
    &lt;span class="c1"&gt;//`define Resolution_800x600 1 // Clock is 40MHz&lt;/span&gt;
    &lt;span class="c1"&gt;//`define Resolution_1024x600 1 // Clock is 51MHz&lt;/span&gt;
    &lt;span class="c1"&gt;//`define Resolution_1024x768 1 // Clock is 65MHz&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; Resolution_1280x720 1 &lt;span class="err"&gt;//&lt;/span&gt; Clock is 74&lt;span class="err"&gt;.&lt;/span&gt;25MHz&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="c1"&gt;//`define Resolution_1920x1080 1 // Clock is 148.5MHz&lt;/span&gt;
&lt;span class="cp"&gt;`endif&lt;/span&gt;

&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// For non-special needs, users do not need to modify the following content&lt;/span&gt;
&lt;span class="c1"&gt;//=====================================&lt;/span&gt;
&lt;span class="c1"&gt;// Define different color depths&lt;/span&gt;
&lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;MODE_RGB888&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; Red_Bits 8&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; Green_Bits 8&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; Blue_Bits 8&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;MODE_RGB565&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; Red_Bits 5&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; Green_Bits 6&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; Blue_Bits 5&lt;span class="cp"&gt;
`endif&lt;/span&gt;

&lt;span class="c1"&gt;// Define timing parameters for different resolutions&lt;/span&gt;
&lt;span class="cp"&gt;`ifdef&lt;/span&gt; &lt;span class="n"&gt;Resolution_480x272&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d525&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d41&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d286&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d10&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_640x480&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d800&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d96&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d525&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d25&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_800x480&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d1056&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d128&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d88&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d525&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d2&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d25&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d8&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_800x600&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d1056&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d128&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d88&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d628&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d1&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d4&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d23&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1024x600&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d1344&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d24&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d136&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d160&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d628&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d1&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d4&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d23&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1024x768&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d1344&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d24&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d136&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d160&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d806&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d3&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d6&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d29&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1280x720&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d1650&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d110&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d40&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d220&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d750&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d5&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d5&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d20&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;span class="cp"&gt;`elsif&lt;/span&gt; &lt;span class="n"&gt;Resolution_1920x1080&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d2200&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Right_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d88&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d44&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d148&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; H_Left_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Total_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d1125&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Bottom_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Front_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d4&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Sync_Time 12&lt;span class="err"&gt;'&lt;/span&gt;d5&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Back_Porch 12&lt;span class="err"&gt;'&lt;/span&gt;d36&lt;span class="cp"&gt;
&lt;/span&gt;    &lt;span class="cp"&gt;`define&lt;/span&gt; V_Top_Border 12&lt;span class="err"&gt;'&lt;/span&gt;d0&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;`endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>development</category>
      <category>fpga</category>
    </item>
    <item>
      <title>Beyond the Program: The Three Layers of Computer Abstraction and the Underlying Logic of Performance Optimization</title>
      <dc:creator>张智豪</dc:creator>
      <pubDate>Wed, 05 Feb 2025 02:52:35 +0000</pubDate>
      <link>https://dev.to/zzhihao/beyond-the-program-the-three-layers-of-computer-abstraction-and-the-underlying-logic-of-2ge4</link>
      <guid>https://dev.to/zzhihao/beyond-the-program-the-three-layers-of-computer-abstraction-and-the-underlying-logic-of-2ge4</guid>
      <description>&lt;p&gt;Have you ever wondered how a computer understands the code you write? How does it transform high-level languages into instructions that the hardware can execute? Most people are only involved in calling functions but don't truly understand the underlying principles. This article will reveal what lies "beyond the program" and how we define computer performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond the Program
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Three Layers of Abstraction
&lt;/h3&gt;

&lt;p&gt;Have you ever considered what your computer actually is? Essentially, it's a collection of hardware components, a system that processes 0s and 1s. We can abstract your laptop into three layers: &lt;strong&gt;application software, system software, and hardware&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcisrtvkqvn9w3oo3tgin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcisrtvkqvn9w3oo3tgin.png" alt="Image description" width="601" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application software&lt;/strong&gt; is like a complex instruction manual written by programmers, but it's in a language that the computer can't directly understand. &lt;br&gt;
&lt;strong&gt;System software&lt;/strong&gt; acts as a bridge between the application software and the hardware, translating the complex manual into simple, easy-to-understand &lt;strong&gt;strings of 0s and 1s&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Hardware&lt;/strong&gt; is responsible for executing tasks such as displaying content on the screen, playing music, and performing calculations. It's like a strong worker who doesn't make mistakes and is incredibly efficient, but you need to communicate in its language to tell it what to do and how to use its resources.&lt;/p&gt;

&lt;p&gt;Which of these three layers is the most important? The answer varies depending on your perspective, but from a technological development standpoint, the outermost layer is the most likely to be impacted by AI. Interestingly, one of the reasons is that it's the easiest for us to get started with.&lt;/p&gt;

&lt;p&gt;Application software is the most closely related to our daily lives, including games, social media applications, and search engines. System software is a bit less familiar, and many people are often confused when using it. For example, I still remember my first time using &lt;strong&gt;Git&lt;/strong&gt; to upload files to &lt;strong&gt;GitHub&lt;/strong&gt;. The language based on the operating system made it difficult for me to adapt at first.&lt;/p&gt;

&lt;p&gt;Hardware, on the other hand, is like a "familiar stranger." We all use it (like mice, keyboards, and screens) and have heard of components like CPUs and GPUs, but do we understand their working principles? The answer is likely no. This is why people working in hardware are in high demand. People tend to underestimate hardware (like mice and keyboards) or consider applications simple (like CPUs and GPUs), leading them to focus solely on software development.&lt;/p&gt;

&lt;p&gt;What about system software? The field of application software, with its established framework, has reached a point of saturation. Why? Let's delve deeper.&lt;/p&gt;

&lt;p&gt;System software encompasses many components, with the two most critical being the &lt;strong&gt;operating system&lt;/strong&gt; and the &lt;strong&gt;compiler&lt;/strong&gt;. Their primary tasks include handling basic input and output operations, allocating external and internal memory, and providing shared computing resources for multiple applications. In other words, it serves as the interface between pure software and pure hardware. The operating systems we currently use, such as &lt;strong&gt;Linux, iOS, and Windows&lt;/strong&gt;, are unlikely to be replaced by other operating systems, considering the immense amount of engineering required and the high level of difficulty. Apart from Huawei, no other company dares, wants, or has the capability to attempt such an endeavor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5399zjfr2q8cwap28n9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5399zjfr2q8cwap28n9l.png" alt="Image description" width="511" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other key component is the compiler, which translates programs written in high-level languages (such as C, C++, Java, and Python) into &lt;strong&gt;instructions&lt;/strong&gt; that the hardware can execute. This process is quite complex, and we'll provide a brief overview here, with a more detailed explanation in a future article.&lt;/p&gt;
&lt;h3&gt;
  
  
  From High-Level Language to Hardware Language
&lt;/h3&gt;

&lt;p&gt;Computers can only understand binary data and, based on the bit segments of the &lt;strong&gt;instructions&lt;/strong&gt;, extract the corresponding data and perform the corresponding operations (calculations, shifts, storage, and retrieval). For example, 1001010100101110 would instruct the computer to add two numbers. &lt;strong&gt;Using numbers to represent both instructions and data is the foundation of computing.&lt;/strong&gt; I'll be writing a detailed article about instructions later on, so if you're interested, please like and follow me to stay updated.&lt;/p&gt;

&lt;p&gt;Obviously, a string of numbers is tedious and lacks readability, which led to the development of &lt;strong&gt;assemblers&lt;/strong&gt;. These are software programs that translate mnemonic instructions into corresponding binary code, instructing the computer to add two numbers A and B.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add A, B --&amp;gt; 1001010100101110
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, this still wasn't intuitive enough, so people created &lt;strong&gt;high-level programming languages&lt;/strong&gt; like C++, C, and Java, which use portable languages composed of words and algebraic symbols. Compilers translate these into assembly language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A + B --&amp;gt; add A, B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, you might have a general idea of what happens. When we run code, our compiler checks the syntax and then translates the high-level language we've written into assembly language. With the help of the assembler, the assembly language is then translated into instructions that the computer can understand. These instructions are stored in memory, and during each clock cycle, the &lt;strong&gt;CPU&lt;/strong&gt; fetches these instructions and performs the corresponding operations. The process is illustrated below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2ylyep949cdctdssfya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2ylyep949cdctdssfya.png" alt="Image description" width="585" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;When it comes to computers, everyone loves to talk about performance. So, how do we define performance? One way is to compare the execution time of the same program, similar to a race. This is the &lt;strong&gt;speed&lt;/strong&gt; perspective, which is commonly used for CPUs. Another perspective is &lt;strong&gt;throughput&lt;/strong&gt;, such as how many instructions can be executed in a clock cycle, which is the core idea behind GPUs. Still having trouble understanding? Imagine transporting 450 tourists from Shanghai to Beijing. There are several ways to do it. Using a plane or high-speed train might be sufficient for a single trip, while using small cars would require multiple trips back and forth.&lt;/p&gt;

&lt;p&gt;Let's consider performance from the speed perspective:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Performance = 1 / Execution Time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's look at an example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If computer A takes 10 seconds to run a program and computer B takes 15 seconds, how much faster is computer A than computer B?&lt;/p&gt;

&lt;p&gt;Performance_A / Performance_B = Execution_Time_B / Execution_Time_A = 15 / 10 = 1.5&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To be more precise, the execution time we consider is the &lt;strong&gt;CPU execution time&lt;/strong&gt;, and we use &lt;strong&gt;clock cycles&lt;/strong&gt; as the unit of measurement. So we have:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CPU Execution Time of a Program = CPU Clock Cycles of a Program * Clock Cycle Length&lt;/p&gt;

&lt;p&gt;or CPU Execution Time of a Program = CPU Clock Cycles of a Program / Clock Frequency&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, let's consider &lt;strong&gt;instructions&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Number of CPU Clock Cycles = Number of Program Instructions * Average Clock Cycles per Instruction (CPI)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CPI stands for "clock cycle per instruction."&lt;/p&gt;

&lt;p&gt;Let's look at another example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suppose we have two different implementations of the same instruction set. Computer A has a clock cycle length of 250 ps and a CPI of 2.0 for a certain program. Computer B has a clock cycle length of 500 ps and a CPI of 1.2 for the same program. Which computer is faster for this program?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Number of clock cycles:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CPU Clock Cycles_A = I * 2.0&lt;/p&gt;

&lt;p&gt;CPU Clock Cycles_B = I * 1.2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CPU time:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CPU Time_A = CPU Clock Cycles_A * Clock Cycle Length = I * 2.0 * 250 ps = 500 * I ps&lt;/p&gt;

&lt;p&gt;CPU Time_B = CPU Clock Cycles_B * Clock Cycle Length = I * 1.2 * 500 ps = 600 * I ps&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Performance:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CPU Performance_A / CPU Performance_B = CPU_B / CPU_A = 600 / 500 = 1.2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's another way to express CPU time:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CPU Time = (Number of Instructions * CPI) / Clock Frequency&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This method allows us to analyze the performance impact of each type of instruction. However, we won't delve into that here.&lt;/p&gt;

&lt;p&gt;So, how do we improve computer performance? From the formula, we can see that the shorter the CPU time, the better the performance. Therefore, a faster clock frequency and fewer cycles required for program execution are what we desire. A faster clock frequency is related to hardware, while the number of clock cycles required is related to algorithms. In situations where we can't change the hardware, optimizing the code based on the computer architecture to improve performance is what sets apart &lt;strong&gt;computer experts&lt;/strong&gt; from &lt;strong&gt;ordinary programmers&lt;/strong&gt;. Here's an intuitive insight: &lt;strong&gt;accelerate frequently occurring events&lt;/strong&gt;. A real-world example is &lt;strong&gt;high-speed elevators in office buildings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Finally, I want to share an important law: &lt;strong&gt;Amdahl's Law&lt;/strong&gt;. It's quite simple: you can't expect a proportional improvement in overall performance from a local improvement in one aspect of the computer. Let's take a simple example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suppose a program takes 100 seconds to run on a computer, with 80 seconds spent on multiplication operations. If we improve the speed of program execution by 5 times, how much should the speed of multiplication operations be improved?&lt;/p&gt;

&lt;p&gt;Time after improvement = (Execution time affected by the improvement) / (Improvement factor) + (Execution time not affected)&lt;/p&gt;

&lt;p&gt;Time after improvement = 80 / n + (100 - 80)&lt;/p&gt;

&lt;p&gt;Since we want to improve the execution time by 5 times, the new execution time should be 20 seconds. Therefore:&lt;/p&gt;

&lt;p&gt;20 = 80 / n + 20&lt;/p&gt;

&lt;p&gt;0 = 80 / n&lt;/p&gt;

&lt;p&gt;This means that the multiplication operations need to be infinitely faster than before, which is obviously impossible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You must have heard of the concept of &lt;strong&gt;multi-core&lt;/strong&gt;. Similarly, simply stacking processors won't lead to a proportional improvement in performance, because the communication protocols between devices will limit their speed. In other words, using multi-core to improve computer performance follows a pattern of diminishing returns. Stacking cores eventually leads to a slowdown in performance improvement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8d6u753qrgza6xgyl0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8d6u753qrgza6xgyl0r.png" alt="Image description" width="364" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I believe you're also familiar with the famous &lt;strong&gt;scaling law&lt;/strong&gt;. In simple terms, it means that as long as you blindly add more hardware, performance will skyrocket. However, according to Amdahl's Law, the end of the scaling law is a "toothpaste-like" improvement in performance.&lt;/p&gt;

&lt;p&gt;The recent &lt;strong&gt;DeepSeek AI&lt;/strong&gt; is perhaps the most vivid example. They don't need a lot of Nvidia H100 GPUs to achieve performance comparable to OpenAI's O1 model in certain aspects. This is because they are not blindly stacking hardware; they are optimizing algorithms based on the computer architecture.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>General Overview Of Computer Architecture</title>
      <dc:creator>张智豪</dc:creator>
      <pubDate>Sun, 26 Jan 2025 11:05:20 +0000</pubDate>
      <link>https://dev.to/zzhihao/general-overview-of-computer-architecture-59ip</link>
      <guid>https://dev.to/zzhihao/general-overview-of-computer-architecture-59ip</guid>
      <description>&lt;h2&gt;
  
  
  Traditional Computer Architecture
&lt;/h2&gt;

&lt;p&gt;​     The earliest computers were designed to perform specialized tasks and lacked the ability to be reprogrammed. These are known as "Fixed Program Computers," and a simple calculator is a perfect example of this type of computer.&lt;/p&gt;

&lt;p&gt;​     Later, "Stored Program Computers" were developed to handle a wider range of tasks and applications. Many modern computers are based on the stored-program concept introduced by John Von Neumann, where both program instructions and data are stored in the same memory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnf4foo07aspiy1enollj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnf4foo07aspiy1enollj.png" alt="Image description" width="474" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​    The power of this concept lies in its &lt;strong&gt;&lt;em&gt;flexibility&lt;/em&gt;&lt;/strong&gt;. The source code for an editor program, its corresponding compiled machine code, the text the program is editing, and even the compiler that generated the machine code can all reside in the same memory. This has significant commercial implications, as computers can utilize ready-made software as long as they are compatible with an existing instruction set.&lt;/p&gt;

&lt;p&gt;​    We can conceptually divide a computer into three primary components: &lt;strong&gt;memory, processor, and datapath&lt;/strong&gt;. The processor, also known as the &lt;strong&gt;Central Processing Unit (CPU)&lt;/strong&gt;, is responsible for data flow and arithmetic operations. &lt;strong&gt;Memory&lt;/strong&gt; provides instructions that dictate the computer's actions and stores the data to be processed, facilitating data flow between memory and the CPU. This is the fundamental operational principle of the John Von Neumann architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6aqf30j56rsmowm7ghz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6aqf30j56rsmowm7ghz5.png" alt="Image description" width="708" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might also be familiar with the &lt;strong&gt;Harvard Architecture&lt;/strong&gt;, which employs separate memories and buses for instructions and data, aiming for improved performance and suitability for general-purpose computing. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw21xmu25oxfsjm35bdl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw21xmu25oxfsjm35bdl.png" alt="Image description" width="667" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the Harvard Architecture differs from the John Von Neumann Architecture in its handling of data flow, the &lt;strong&gt;underlying principles&lt;/strong&gt; remain the same: &lt;strong&gt;a separation between memory and the CPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These architectures have served us well as semiconductor technology has progressed. However, in the era of Artificial Intelligence (AI), significant challenges have emerged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges Faced by Current Computer Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.Memory Wall
&lt;/h3&gt;

&lt;p&gt;​     The "memory wall" refers to the growing disparity between processor speeds and memory bandwidth. &lt;/p&gt;

&lt;p&gt;​     This increasing gap results in processors spending more time &lt;strong&gt;waiting for data from memory rather than performing computations&lt;/strong&gt;, creating a significant performance bottleneck. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdto7z3gfvvszqpdtr5jx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdto7z3gfvvszqpdtr5jx.png" alt="Image description" width="800" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.Power Wall
&lt;/h3&gt;

&lt;p&gt;The "power wall" represents the escalating problem of &lt;strong&gt;heat dissipation&lt;/strong&gt; in chips. As transistor density and clock speeds increase, the power consumption and resulting heat generation become more challenging to manage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgj7ukgxyp8oi0p842c4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgj7ukgxyp8oi0p842c4.png" alt="Image description" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqzsyrgzvbdbz67dhq67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqzsyrgzvbdbz67dhq67.png" alt="Image description" width="508" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.Specialization  Vs Generalization Dilemma
&lt;/h3&gt;

&lt;p&gt;​      Traditional architectures were designed for &lt;strong&gt;general-purpose computing&lt;/strong&gt;. However, &lt;strong&gt;specialized workloads like AI&lt;/strong&gt; often benefit from specialized hardware accelerators (e.g., GPUs, TPUs). Striking a balance between general-purpose capabilities and specialized acceleration poses a major challenge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5gc7ijkrpu9pqxw4dx7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5gc7ijkrpu9pqxw4dx7q.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Possible Solutions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Processing-In-Memory&lt;/strong&gt;: Integrating processing elements directly within the memory array itself, allowing computations to occur where the data resides.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Neuromorphic Computing:&lt;/strong&gt; Inspired by the human brain, using asynchronous, event-driven computation for AI workloads.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optical Computing:&lt;/strong&gt; Using light instead of electricity for computation, offering potential advantages in speed and power efficiency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quantum Computing:&lt;/strong&gt; While still in its nascent stages, quantum computing holds the potential to revolutionize computation by leveraging quantum mechanics to solve problems currently intractable for classical computers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;[1]&lt;a href="https://medium.com/@kalebmlemke/the-importance-of-ai-accelerators-in-ai-development-c7012d5e175a" rel="noopener noreferrer"&gt;https://medium.com/@kalebmlemke/the-importance-of-ai-accelerators-in-ai-development-c7012d5e175a&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[2]&lt;a href="https://www.geeksforgeeks.org/harvard-architecture" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/harvard-architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[3]&lt;a href="https://www.geeksforgeeks.org/computer-organization-von-neumann-architecture" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/computer-organization-von-neumann-architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[4]&lt;a href="https://ayarlabs.com/glossary/memory-wall" rel="noopener noreferrer"&gt;https://ayarlabs.com/glossary/memory-wall&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[5] Computer Organization and Design MIPS Edition  Authors: David A. Patterson, John L. Hennessy&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>career</category>
    </item>
    <item>
      <title>Fundamentals of FPGA</title>
      <dc:creator>张智豪</dc:creator>
      <pubDate>Sat, 18 Jan 2025 09:45:28 +0000</pubDate>
      <link>https://dev.to/zzhihao/fundamentals-of-fpga-1l41</link>
      <guid>https://dev.to/zzhihao/fundamentals-of-fpga-1l41</guid>
      <description>&lt;p&gt;For some reason, there exists an implicit hierarchy of disdain in embedded development: those working on 8051 microcontrollers tend to look down on basic circuit developers, STM32 developers look down on those working with 8051, and FPGA developers look down on STM32 developers. Today, our main focus is on FPGA!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is FPGA?
&lt;/h2&gt;

&lt;p&gt;A Field Programmable Gate Array(FPGA) is a type of configurable integrated circuit which can be repeatedly programmed after manufacturing.&lt;/p&gt;

&lt;p&gt;Many customers favor FPGA over MCU for its programmability and flexibility for the fact that customers could customize their own circuits based on their needs. In addition, FPGA boast higher performance because of its parallel structure, meaning they can process data in a given clock than  MCU does. Consequently, FPGA chips are more expensive than MCUs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Boolean Algebra&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In logic, we often use &lt;strong&gt;&lt;em&gt;true (1)&lt;/em&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;em&gt;false (0)&lt;/em&gt;&lt;/strong&gt; to judge whether an event occurs. For example, we use a variable &lt;strong&gt;A&lt;/strong&gt; to denote whether it will rain tomorrow. If it rains, &lt;strong&gt;A&lt;/strong&gt; equals 1, which means the event occurs; otherwise, &lt;strong&gt;A&lt;/strong&gt; equals 0.&lt;/p&gt;

&lt;p&gt;This logic is analogous to the use of &lt;strong&gt;high (1)&lt;/strong&gt; and &lt;strong&gt;low (0)&lt;/strong&gt; voltage levels in circuits to detect specific events and enable the circuit to respond accordingly.&lt;/p&gt;

&lt;p&gt;To perform these logical operations, circuits rely on &lt;strong&gt;logic gates&lt;/strong&gt;. The equivalent Boolean operations of logic gates are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Or Gate&lt;/strong&gt;: Performs Boolean addition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;And Gate&lt;/strong&gt;: Performs Boolean multiplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or gate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc01012crvptvzufyhhqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc01012crvptvzufyhhqr.png" alt="OR gate's Boolean operation" width="427" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And Gate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxk0c2oncg0eimio0ioo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxk0c2oncg0eimio0ioo0.png" alt="AND gate's Boolean operation" width="451" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sum of Products&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essentially, &lt;strong&gt;Or Gates (Boolean addition)&lt;/strong&gt; and &lt;strong&gt;And Gates (Boolean multiplication)&lt;/strong&gt; can be combined to detect multiple events. This is represented in the &lt;strong&gt;Sum of Products&lt;/strong&gt; form, where a function is expressed as a series of &lt;strong&gt;AND operations (products)&lt;/strong&gt; combined through &lt;strong&gt;OR operations (summation)&lt;/strong&gt;. For example:&lt;br&gt;&lt;br&gt;
  &lt;code&gt;F = (A AND B) OR (B AND C AND D) OR(A AND C)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes6zgeat6i6be90wiaay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes6zgeat6i6be90wiaay.png" alt="Image description" width="643" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ideally, as long as there are sufficient resources, we can design circuits to represent the world in terms of 0s and 1s. This is the fundamental concept behind how computers work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a4h7z8mx33cjt4v49x9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a4h7z8mx33cjt4v49x9.png" alt="Image description" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Truth Table&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Truth Table is a tabular representation of all possible input combinations and their corresponding outputs for a logic circuit or function. It is used to understand and verify the behavior of the circuit.&lt;/p&gt;

&lt;p&gt;For example, consider a simple AND gate with two inputs, &lt;strong&gt;A&lt;/strong&gt; and &lt;strong&gt;B&lt;/strong&gt;, and one output, &lt;strong&gt;F&lt;/strong&gt;. The truth table would look like this:&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;A&lt;/strong&gt; | &lt;strong&gt;B&lt;/strong&gt; | &lt;strong&gt;F (A AND B)&lt;/strong&gt; |&lt;br&gt;
  | ----- | ----- | --------------- |&lt;br&gt;
  |      0|      0|                0|&lt;br&gt;
  |      0|      1|                0|&lt;br&gt;
  |      1|      0|                0|&lt;br&gt;
  |      1|      1|                1|&lt;/p&gt;

&lt;p&gt;The Truth Table not only helps in analyzing individual gates but also serves as a blueprint for designing and validating more complex functions implemented within an FPGA. When circuits become large and complex, tools like LUTs are used to handle these truth table mappings efficiently.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lookup Tables (LUTs)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lookup Tables (LUTs) are a direct hardware implementation of truth tables in an FPGA. They are small memory units that store the output values for all possible input combinations of a logic function. This means an LUT essentially maps the truth table into a programmable circuit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgum2ewzaam1zc50iq8wn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgum2ewzaam1zc50iq8wn.png" alt="Image description" width="589" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, consider the same AND gate as above. The LUT for this gate would store the output column of the truth table:&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;Address (Input Combination)&lt;/strong&gt; | &lt;strong&gt;Stored Value (Output)&lt;/strong&gt; |&lt;br&gt;
  | ------------------------------- | ------------------------- |&lt;br&gt;
  | 00                              | 0                         |&lt;br&gt;
  | 01                              | 0                         |&lt;br&gt;
  | 10                              | 0                         |&lt;br&gt;
  | 11                              | 1                         |&lt;/p&gt;

&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;address&lt;/strong&gt; corresponds to the input combination (e.g., A=0, B=1 corresponds to 01 in binary).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;stored value&lt;/strong&gt; represents the corresponding output for that combination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The relationship between the truth table and LUTs allows FPGAs to implement logic functions efficiently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Truth Table as the Blueprint&lt;/strong&gt;: The truth table defines the desired behavior of the logic circuit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LUT as the Hardware Realization&lt;/strong&gt;: The LUT translates this behavior into a physical implementation by storing the outputs for all possible inputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By leveraging LUTs, FPGAs can dynamically reprogram their hardware to implement a wide variety of functions, making them highly versatile. For larger designs, multiple LUTs are interconnected through the FPGA’s programmable interconnects, enabling the implementation of complex logic circuits without the need for custom hardware.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interconnects&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interconnects are the backbone of an FPGA's programmable wiring network. They connect Lookup Tables (LUTs), registers, and other logic elements, allowing the FPGA to form custom circuits based on the user’s design. Without interconnects, the individual LUTs would remain isolated and unable to contribute to a larger, functional design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtc0xligwslqcd3a8s7m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtc0xligwslqcd3a8s7m.png" alt="Image description" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;### Relationship Between Interconnects and LUTs&lt;/p&gt;

&lt;p&gt;While LUTs implement the logic of individual truth tables, interconnects are responsible for connecting the outputs of one LUT to the inputs of another. This connectivity enables the FPGA to scale simple logic operations into complex systems.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single LUT might implement a basic logic function like &lt;code&gt;A AND B&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Through interconnects, the output of this LUT could be routed as an input to another LUT that performs a function like &lt;code&gt;(A AND B) OR C&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interconnect system in an FPGA consists of several programmable elements that allow signals to traverse the chip:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Global Routing Resources&lt;/strong&gt;: These are long wires that span across large areas of the FPGA, enabling signals to travel between distant parts of the chip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch Matrices&lt;/strong&gt;: These are grids of programmable switches that control how signals move between different routing paths. Users configure these switches to create the connections needed for their design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Routing Resources&lt;/strong&gt;: Short wires are used to connect nearby logic elements, such as linking one LUT to a neighboring LUT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated Lines&lt;/strong&gt;: For high-speed or specialized connections, dedicated lines provide direct, efficient pathways that bypass general-purpose routing.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
