<?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: Umaima Khan</title>
    <description>The latest articles on DEV Community by Umaima Khan (@umaima_khan_a82d6a018037a).</description>
    <link>https://dev.to/umaima_khan_a82d6a018037a</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4224906%2F3511762e-de4c-47c6-9afb-59a45e1c6e9d.png</url>
      <title>DEV Community: Umaima Khan</title>
      <link>https://dev.to/umaima_khan_a82d6a018037a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/umaima_khan_a82d6a018037a"/>
    <language>en</language>
    <item>
      <title>Designing a Full Adder Using Structural Modeling in Verilog and Implementing It on the Nexys A7 (Artix-7) FPGA</title>
      <dc:creator>Umaima Khan</dc:creator>
      <pubDate>Tue, 03 Nov 2026 20:05:42 +0000</pubDate>
      <link>https://dev.to/umaima_khan_a82d6a018037a/designing-a-full-adder-using-structural-modeling-in-verilog-and-implementing-it-on-the-nexys-a7-3ppb</link>
      <guid>https://dev.to/umaima_khan_a82d6a018037a/designing-a-full-adder-using-structural-modeling-in-verilog-and-implementing-it-on-the-nexys-a7-3ppb</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frzmqjuz6zkxjr3zy51xk.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frzmqjuz6zkxjr3zy51xk.jpg" alt="Nexys A7 board running the full adder" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time a processor adds two numbers, a tiny circuit called the &lt;strong&gt;full adder&lt;/strong&gt; is doing the work. It is one of the first circuits you learn in digital design, and it is the building block of the adders and ALUs inside modern CPUs.&lt;/p&gt;

&lt;p&gt;In this post, I design a &lt;strong&gt;1-bit full adder using structural modeling in Verilog&lt;/strong&gt;, built from &lt;strong&gt;two half adders and one OR gate&lt;/strong&gt;. I verify it with a testbench and timing diagram, then implement it on the &lt;strong&gt;Digilent Nexys A7 (Artix-7) FPGA board&lt;/strong&gt;. If you are new to Verilog or FPGAs, you can follow along step by step and reproduce the result on your own board.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you will learn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How a full adder works (truth table and Boolean equations)&lt;/li&gt;
&lt;li&gt;How a full adder is built from two half adders and an OR gate&lt;/li&gt;
&lt;li&gt;What structural modeling is and why it is useful&lt;/li&gt;
&lt;li&gt;How to write the design, testbench and constraint file&lt;/li&gt;
&lt;li&gt;How to read a timing diagram&lt;/li&gt;
&lt;li&gt;How to program the Nexys A7 and verify the result on real hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Xilinx Vivado 2018.2&lt;/li&gt;
&lt;li&gt;Digilent Nexys A7 100T, Artix-7&lt;/li&gt;
&lt;li&gt;Verilog HDL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/UmaimaKhan-13/full-adder-nexys-a7" rel="noopener noreferrer"&gt;https://github.com/UmaimaKhan-13/full-adder-nexys-a7&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Is a Full Adder?
&lt;/h2&gt;

&lt;p&gt;A full adder adds &lt;strong&gt;three 1-bit inputs&lt;/strong&gt; and produces a &lt;strong&gt;sum&lt;/strong&gt; and a &lt;strong&gt;carry-out&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The full adder has three inputs and two outputs. &lt;strong&gt;A&lt;/strong&gt; and &lt;strong&gt;B&lt;/strong&gt; are the two bits to be added, and &lt;strong&gt;Cin&lt;/strong&gt; is the carry coming in from a previous stage. The circuit produces &lt;strong&gt;Sum&lt;/strong&gt;, which is the result bit, and &lt;strong&gt;Cout&lt;/strong&gt;, which is the carry going out to the next stage.&lt;/p&gt;

&lt;p&gt;A half adder has no carry input, so it can only add two bits. The full adder's &lt;code&gt;Cin&lt;/code&gt; lets it be chained to add multi-bit numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A useful way to read the output:&lt;/strong&gt; the result is a 2-bit number &lt;code&gt;{Cout, Sum}&lt;/code&gt;. Since the largest possible sum is 1 + 1 + 1 = 3, the result always fits in two bits (00 to 11). For example, when A = 1, B = 1, Cin = 1, the output is &lt;code&gt;11&lt;/code&gt; in binary, which is 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Truth Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;Cin&lt;/th&gt;
&lt;th&gt;Sum&lt;/th&gt;
&lt;th&gt;Cout&lt;/th&gt;
&lt;th&gt;Decimal result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Boolean Equations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sum  = A ⊕ B ⊕ Cin
Cout = (A · B) + (Cin · (A ⊕ B))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Building a Full Adder from Two Half Adders
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;half adder&lt;/strong&gt; adds two bits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sum   = A ⊕ B
Carry = A · B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A full adder is made by connecting two half adders and an OR gate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Half Adder 1&lt;/strong&gt; adds &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt;, giving &lt;code&gt;S1 = A ⊕ B&lt;/code&gt; and &lt;code&gt;C1 = A · B&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Half Adder 2&lt;/strong&gt; adds &lt;code&gt;S1&lt;/code&gt; and &lt;code&gt;Cin&lt;/code&gt;, giving &lt;code&gt;Sum = S1 ⊕ Cin&lt;/code&gt; and &lt;code&gt;C2 = S1 · Cin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;OR gate&lt;/strong&gt; combines the two carries: &lt;code&gt;Cout = C1 + C2&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can check this against the equation above: &lt;code&gt;C1 + C2 = A·B + (A⊕B)·Cin&lt;/code&gt;, which is exactly the full adder's &lt;code&gt;Cout&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv4dtg8p8mbikce3jm0s.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv4dtg8p8mbikce3jm0s.png" alt="Block diagram of the full adder: two half adders and one OR gate" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What Is Structural Modeling?
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;structural modeling&lt;/strong&gt;, the code mirrors the schematic. In this design, the full adder is built by instantiating two half adders and combining their carries with an OR operation, with internal wires connecting everything together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why use structural modeling?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code reads like the circuit diagram, so it is easy to understand.&lt;/li&gt;
&lt;li&gt;It encourages modular, reusable design: the half adder is written once and used twice.&lt;/li&gt;
&lt;li&gt;Each module can be tested separately, which makes debugging easier.&lt;/li&gt;
&lt;li&gt;It teaches how bigger systems (adders, ALUs, processors) are assembled from small blocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Verilog Design Code
&lt;/h2&gt;

&lt;p&gt;The design has two modules: &lt;code&gt;half_adder&lt;/code&gt;, and &lt;code&gt;full_adder&lt;/code&gt;, which instantiates the half adder twice and adds an OR gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;half_adder.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;half_adder&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt;  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt;  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;b&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;wire&lt;/span&gt; &lt;span class="n"&gt;sum&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;wire&lt;/span&gt; &lt;span class="n"&gt;carry&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;sum&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;b&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;carry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&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;&lt;strong&gt;full_adder.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;full_adder&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt;  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt;  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt;  &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;cin&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;wire&lt;/span&gt; &lt;span class="n"&gt;sum&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;wire&lt;/span&gt; &lt;span class="n"&gt;cout&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;s1&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;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;half_adder&lt;/span&gt; &lt;span class="n"&gt;HA1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;carry&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="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;half_adder&lt;/span&gt; &lt;span class="n"&gt;HA2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;carry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c2&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;cout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;c2&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;&lt;strong&gt;Code walkthrough:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;half_adder&lt;/code&gt;:&lt;/strong&gt; takes two 1-bit inputs, &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt;. The sum output is their XOR (&lt;code&gt;a ^ b&lt;/code&gt;) and the carry output is their AND (&lt;code&gt;a &amp;amp; b&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;full_adder&lt;/code&gt;:&lt;/strong&gt; instantiates &lt;code&gt;half_adder&lt;/code&gt; twice. &lt;code&gt;HA1&lt;/code&gt; adds &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt;, producing the partial sum &lt;code&gt;s1&lt;/code&gt; and the first carry &lt;code&gt;c1&lt;/code&gt;. &lt;code&gt;HA2&lt;/code&gt; adds &lt;code&gt;s1&lt;/code&gt; and &lt;code&gt;cin&lt;/code&gt;, producing the final &lt;code&gt;sum&lt;/code&gt; output and the second carry &lt;code&gt;c2&lt;/code&gt;. The internal wires &lt;code&gt;s1&lt;/code&gt;, &lt;code&gt;c1&lt;/code&gt; and &lt;code&gt;c2&lt;/code&gt; carry these intermediate values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carry-out:&lt;/strong&gt; a carry is generated if either half adder produced one, so &lt;code&gt;cout = c1 | c2&lt;/code&gt;. This is the OR gate from the block diagram.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Testbench
&lt;/h2&gt;

&lt;p&gt;A testbench is a Verilog module with no ports. It applies inputs to the design and lets us observe the outputs in simulation. Because the full adder has only 3 inputs, I test &lt;strong&gt;all 2³ = 8 combinations&lt;/strong&gt; (exhaustive testing), so every row of the truth table is verified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tb_full_adder.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;`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;tb_full_adder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;cin&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;sum&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;cout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;full_adder&lt;/span&gt; &lt;span class="n"&gt;uut&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;integer&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;initial&lt;/span&gt; &lt;span class="k"&gt;begin&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;8&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="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="o"&gt;}&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="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="p"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="p"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;finish&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;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;timescale&lt;/code&gt; directive at the top sets the time unit to 1 ns and the precision to 1 ps.&lt;/li&gt;
&lt;li&gt;The inputs &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt; and &lt;code&gt;cin&lt;/code&gt; are declared as &lt;code&gt;reg&lt;/code&gt;, because the testbench drives them. The outputs &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;cout&lt;/code&gt; are &lt;code&gt;wire&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The design under test is instantiated as &lt;code&gt;uut&lt;/code&gt; (unit under test).&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;for&lt;/code&gt; loop counts &lt;code&gt;i&lt;/code&gt; from 0 to 7. Each pass assigns the 3 lowest bits of &lt;code&gt;i&lt;/code&gt; to &lt;code&gt;{a, b, cin}&lt;/code&gt;, so the inputs step through 000, 001, 010 ... 111, the same order as the truth table.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#10&lt;/code&gt; holds each combination for 10 ns, so the whole test takes 80 ns.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$finish&lt;/code&gt; ends the simulation after the last combination.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Simulation Results and Timing Diagram
&lt;/h2&gt;

&lt;p&gt;I ran the behavioral simulation in Vivado and got the following waveform.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcy7d3kia2flkdh4duyid.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcy7d3kia2flkdh4duyid.png" alt="Behavioral simulation waveform of the full adder" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Behavioral simulation of the full adder: all 8 input combinations, each held for 10 ns.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The top three signals (&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;cin&lt;/code&gt;) are inputs. They change every 10 ns, and the simulation runs for 80 ns in total.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;cout&lt;/code&gt; respond to each input change.&lt;/li&gt;
&lt;li&gt;Each time step corresponds to one row of the truth table.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;a&lt;/th&gt;
&lt;th&gt;b&lt;/th&gt;
&lt;th&gt;cin&lt;/th&gt;
&lt;th&gt;sum&lt;/th&gt;
&lt;th&gt;cout&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0-10 ns&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-20 ns&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-30 ns&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30-40 ns&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40-50 ns&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50-60 ns&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60-70 ns&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70-80 ns&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt; I compared every time step with the truth table in Section 1, and all 8 combinations matched.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Behavioral simulation assumes zero gate delay. In real hardware, signals take a few nanoseconds to propagate through the logic. That delay shows up in post-implementation timing simulation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7. Mapping to the Nexys A7: Pin Assignment
&lt;/h2&gt;

&lt;p&gt;To test the design on the board, I connected the inputs to &lt;strong&gt;slide switches&lt;/strong&gt; and the outputs to &lt;strong&gt;LEDs&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Board Component&lt;/th&gt;
&lt;th&gt;FPGA Pin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;SW0&lt;/td&gt;
&lt;td&gt;J15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;SW1&lt;/td&gt;
&lt;td&gt;L16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cin&lt;/td&gt;
&lt;td&gt;SW2&lt;/td&gt;
&lt;td&gt;M13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sum&lt;/td&gt;
&lt;td&gt;LED0&lt;/td&gt;
&lt;td&gt;H17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cout&lt;/td&gt;
&lt;td&gt;LED1&lt;/td&gt;
&lt;td&gt;K15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These pins come from Digilent's master XDC for the Nexys A7.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Constraint File (XDC)
&lt;/h2&gt;

&lt;p&gt;The constraint file tells Vivado which physical FPGA pin each port of your design connects to. Without it, Vivado does not know how to connect your design to the board's switches and LEDs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;full_adder.xdc&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tcl"&gt;&lt;code&gt;&lt;span class="c"&gt;## Inputs (Switches: SW0, SW1, SW2)
&lt;/span&gt;set_property -dict &lt;span class="p"&gt;{&lt;/span&gt; PACKAGE_PIN J15   IOSTANDARD LVCMOS33 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;get_ports &lt;span class="p"&gt;{&lt;/span&gt;a&lt;span class="p"&gt;}]&lt;/span&gt;
set_property -dict &lt;span class="p"&gt;{&lt;/span&gt; PACKAGE_PIN L16   IOSTANDARD LVCMOS33 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;get_ports &lt;span class="p"&gt;{&lt;/span&gt;b&lt;span class="p"&gt;}]&lt;/span&gt;
set_property -dict &lt;span class="p"&gt;{&lt;/span&gt; PACKAGE_PIN M13   IOSTANDARD LVCMOS33 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;get_ports &lt;span class="p"&gt;{&lt;/span&gt;cin&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="c"&gt;## Outputs (LEDs: LED0, LED1)
&lt;/span&gt;set_property -dict &lt;span class="p"&gt;{&lt;/span&gt; PACKAGE_PIN H17   IOSTANDARD LVCMOS33 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;get_ports &lt;span class="p"&gt;{&lt;/span&gt;sum&lt;span class="p"&gt;}]&lt;/span&gt;
set_property -dict &lt;span class="p"&gt;{&lt;/span&gt; PACKAGE_PIN K15   IOSTANDARD LVCMOS33 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;get_ports &lt;span class="p"&gt;{&lt;/span&gt;cout&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PACKAGE_PIN&lt;/code&gt; maps a port to a physical FPGA pin.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IOSTANDARD LVCMOS33&lt;/code&gt; sets the 3.3 V I/O standard used on this board.&lt;/li&gt;
&lt;li&gt;Port names in the XDC (&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;cin&lt;/code&gt;, &lt;code&gt;sum&lt;/code&gt;, &lt;code&gt;cout&lt;/code&gt;) must &lt;strong&gt;exactly match&lt;/strong&gt; the port names of the top-level module &lt;code&gt;full_adder&lt;/code&gt;, including capitalization.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Implementation Flow in Vivado
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a project&lt;/strong&gt; and select the board part: &lt;code&gt;xc7a100tcsg324-1&lt;/code&gt; for the Nexys A7-100T, or &lt;code&gt;xc7a50tcsg324-1&lt;/code&gt; for the A7-50T.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the design sources&lt;/strong&gt; (Verilog files) and the &lt;strong&gt;constraint file&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set the top module&lt;/strong&gt; to &lt;code&gt;full_adder&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run simulation&lt;/strong&gt; with the testbench to verify the logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run Synthesis&lt;/strong&gt;, which converts the Verilog into logic elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run Implementation&lt;/strong&gt;, which places and routes the design on the FPGA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate the Bitstream&lt;/strong&gt;, the &lt;code&gt;.bit&lt;/code&gt; file that configures the FPGA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Hardware Manager&lt;/strong&gt;, connect the board, and click Program Device.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  10. Hardware Demonstration
&lt;/h2&gt;

&lt;p&gt;After programming the board, I set the switches and observed the LEDs.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F19at2lcrd3fkwt21k6od.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F19at2lcrd3fkwt21k6od.jpg" alt="Nexys A7 board with the full adder programmed" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SW2 (Cin)&lt;/th&gt;
&lt;th&gt;SW1 (B)&lt;/th&gt;
&lt;th&gt;SW0 (A)&lt;/th&gt;
&lt;th&gt;LED0 (Sum)&lt;/th&gt;
&lt;th&gt;LED1 (Cout)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;td&gt;ON&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The LED behavior matches both the truth table and the simulation, so the design works correctly on real hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Common Mistakes and Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LEDs not responding:&lt;/strong&gt; Check that the port names in the XDC match your top module exactly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Unconstrained ports" warning:&lt;/strong&gt; Some ports are missing from the XDC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong top module:&lt;/strong&gt; Make sure &lt;code&gt;full_adder&lt;/code&gt;, not &lt;code&gt;half_adder&lt;/code&gt;, is set as the top module.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Board not detected:&lt;/strong&gt; Check the USB cable and drivers, make sure the board is powered on, and check that the JP1 jumper is set for USB/JTAG programming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulation shows &lt;code&gt;X&lt;/code&gt; or &lt;code&gt;Z&lt;/code&gt;:&lt;/strong&gt; An input was not initialized in the testbench, or a wire is left unconnected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  12. Applications
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Building block of &lt;strong&gt;ripple-carry and carry-lookahead adders&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Arithmetic Logic Units (ALUs) in processors&lt;/li&gt;
&lt;li&gt;Digital signal processing circuits&lt;/li&gt;
&lt;li&gt;Counters, address calculation and multipliers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this project, I designed a full adder using structural modeling by connecting two half adders and an OR gate, verified it with an exhaustive testbench and timing diagram, and implemented it on the Nexys A7 FPGA. The hardware output matched the simulation for all 8 input combinations.&lt;/p&gt;

&lt;p&gt;Even a circuit this small covers the entire FPGA design flow: &lt;strong&gt;design → simulate → constrain → synthesize → implement → program → verify&lt;/strong&gt;. Once this flow is clear, scaling up to larger designs becomes much easier.&lt;/p&gt;

&lt;p&gt;If this post helped you, feel free to leave a comment or question below.&lt;/p&gt;

</description>
      <category>verilog</category>
      <category>fpga</category>
      <category>digitaldesign</category>
      <category>hardware</category>
    </item>
  </channel>
</rss>
