From 4ebd06b6d59a55a8a6a0d6be2fd42eadfbd42e33 Mon Sep 17 00:00:00 2001
From: PhillipRambo <93056982+PhillipRambo@users.noreply.github.com>
Date: Thu, 10 Apr 2025 14:38:34 +0200
Subject: [PATCH] Update digital_comps.md
---
.../part_2_digital_comps/digital_comps.md | 504 ++++++++++++++++++
1 file changed, 504 insertions(+)
diff --git a/modules/module_3_8_bit_SAR_ADC/part_2_digital_comps/digital_comps.md b/modules/module_3_8_bit_SAR_ADC/part_2_digital_comps/digital_comps.md
index e69de29b..79184b3f 100644
--- a/modules/module_3_8_bit_SAR_ADC/part_2_digital_comps/digital_comps.md
+++ b/modules/module_3_8_bit_SAR_ADC/part_2_digital_comps/digital_comps.md
@@ -0,0 +1,504 @@
+# Digital Components
+
+In this section, we will implement several essential digital components required for the SAR ADC. These include:
+
+- **SAR Algorithm**: The control logic responsible for managing the successive approximation process during analog-to-digital conversion.
+
+- **Bootstrap Switch**: Used for sampling the input voltage onto the C-DAC with minimal distortion and high linearity.
+
+- **Transmission Gate**: Employed to switch the bottom plates of the capacitors in the C-DAC.
+
+- **NAND Gate**: Utilized to generate control signals such as the SAR clock.
+
+
+We will begin by focusing on the **SAR algorithm** and integrating it into Xschem for performing mixed-signal simulations. This integration can be complex, but the provided module offers a working setup to help you get started. In the following, we will break down this setup and its file structure.
+## Understanding the File Structure
+
+Navigate to the following folder:
+
+```
+module_3_8_bit_SAR_ADC/part_2_digital_comps
+```
+Inside the `algorithm` directory, you will find all necessary files for simulating and compiling the SAR algorithm. Let’s start by reviewing the Verilog code for the SAR logic:
+```
+module sar_logic (
+ input wire clk,
+ input wire Op,
+ input wire En,
+ input wire Om,
+ input wire rst,
+ output reg [6:0] B, // 7-bit
+ output reg [6:0] BN, // 7-bit
+ output reg [7:0] D // 8-bit
+);
+
+reg [3:0] counter = 4'b0000; // 4-bit counter
+
+always @(posedge clk) begin
+ if (rst) begin
+ B <= 7'b0000000;
+ BN <= 7'b0000000;
+ D <= 8'b00000000;
+ counter <= 4'b0000;
+ end else if (En && (Op ^ Om)) begin
+ if (counter < 7) begin
+ D <= D | ({7'b0, Op} << counter);
+
+ B[counter % 7] <= (Op) ? 1'b1 : 1'b0;
+ BN[counter % 7] <= (Om) ? 1'b1 : 1'b0;
+
+ counter <= counter + 1'b1;
+ end
+ end
+end
+
+endmodule
+
+```
+### Code Explanation
+
+This Verilog module describes a simple synchronous SAR algorithm that operates on the **positive edge of the clock**. The two comparator outputs, `Op` and `Om`, represent complementary decision signals at each iteration.
+
+- `Op` is high if the input is greater than the DAC value.
+
+- `Om` is high if the input is less than the DAC value.
+
+- The output `D` stores the 8-bit final result of the SAR conversion.
+
+- `B` and `BN` store intermediate bits of the decision logic in direct and inverted form, respectively.
+
+- A 4-bit `counter` tracks the current bit being decided.
+
+- The logic ensures only one bit decision is taken per clock cycle.
+
+The next Verilog related file you will see is a simple testbench for the Verilog code which will not be shown here since this can easily be modified.
+
+## Supporting Files
+
+### `conf.gtkw` – GTKWave Configuration
+
+This file configures the GTKWave waveform viewer to automatically load the relevant signals and layout. It includes the following lines:
+
+```
+
+[*]
+[*] GTKWave Analyzer v3.3.116 (w)1999-2023 BSI
+[*] Mon Sep 30 13:11:15 2024
+[*]
+[dumpfile] "sar_logic_tb.vcd"
+[dumpfile_mtime] "Mon Sep 30 13:10:47 2024"
+[dumpfile_size] 777
+[savefile] "conf.gtkw"
+[timestart] 0
+[size] 1906 985
+[pos] -1 -1
+*-14.000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+[sst_width] 269
+[signals_width] 102
+[sst_expanded] 1
+[sst_vpaned_height] 291
+@28
+sar_logic_tb.Op
+sar_logic_tb.Om
+sar_logic_tb.B[6:0]
+sar_logic_tb.BN[6:0]
+sar_logic_tb.D[7:0]
+sar_logic_tb.clk
+sar_logic_tb.rst
+sar_logic_tb.En
+@29
+[pattern_trace] 1
+[pattern_trace] 0
+
+```
+This ensures that all key signals are pre-loaded when you open GTKWave, allowing you to quickly inspect the SAR algorithm’s behavior.
+
+### `Makefile` – Automation and Simulation
+
+The `Makefile` provides automation for compiling, simulating, viewing waveforms, and generating mixed-signal compatible modules. Here's a breakdown of its targets:
+
+```
+
+# Define variables
+IVERILOG = iverilog
+VVP = vvp
+GTKWAVE = gtkwave
+NGSPICE = ngspice
+OUTPUT = sar_logic.out
+MIXED = sar_logic.so
+MIXED_OBJ = sar_logic_obj_dir
+VCD_FILE = sar_logic_tb.vcd
+SRC_FILES = sar_logic.v sar_logic_tb.v
+NGSPICE_FILE = sar_logic.v
+DEST_DIR = ../xschem/simulations
+# Default target
+all: run_wave
+
+# Compile using iverilog
+$(OUTPUT): $(SRC_FILES)
+ $(IVERILOG) -o $(OUTPUT) $(SRC_FILES)
+
+# Run the simulation with vvp
+run: $(OUTPUT)
+ $(VVP) $(OUTPUT)
+
+copy:
+ cp $(MIXED) $(DEST_DIR)
+
+# Open the wave file in GTKWave
+wave: $(VCD_FILE)
+ $(GTKWAVE) $(VCD_FILE) conf.gtkw
+
+# Run ngspice vlnggen command
+ngspice:
+ $(NGSPICE) vlnggen $(NGSPICE_FILE)
+
+# Execute both the simulation and wave viewer
+run_wave: run wave
+
+# Run ngspice and then the rest of the steps
+full: ngspice run_wave copy
+
+# Clean up generated files
+clean:
+ rm -f $(OUTPUT) $(VCD_FILE) $(MIXED)
+ rm -rf $(MIXED_OBJ)
+```
+in the defined variables you can follow the same structure for any given code, the most essential is the dump files, shared object file used for simulation (**.so**) and ofcourse the src_files.
+#### Targets:
+
+- `all` → Runs the full simulation and waveform view (`run_wave`).
+
+- `$(OUTPUT)` → Compiles the Verilog files using Icarus Verilog.
+
+- `run` → Executes the compiled simulation, generating a `.vcd` file.
+
+- `wave` → Opens the `.vcd` waveform in GTKWave with the saved config.
+
+- `run_wave` → Combines both `run` and `wave`.
+
+- `ngspice` → Generates the `.so` file for use in mixed-signal simulations with Xschem/Ngspice using `vlnggen`.
+
+- `copy` → Copies the `.so` file to the appropriate Xschem simulation folder.
+
+- `full` → Executes all steps: create `.so`, simulate, view, and copy.
+
+- `clean` → Cleans all generated files including `.out`, `.vcd`, `.so`, and intermediate directories.
+
+```
+make run_wave # Compile and open wave viewer
+make full # Full build including mixed-signal export and copy
+make clean # Clean up simulation artifacts
+```
+
+Now at this point you can write *make full*. And this should compile the Verilog code and give you the following view:
+
+
+
+
+
+
+From here, you can modify the testbench to observe different behaviors or expand the `sar_logic_tb` hierarchy in GTKWave to explore the available signal waveforms.
+
+
+## Creating the Symbol for Mixed-Signal Simulation
+
+The next step is to create a symbol for use in mixed-signal simulations with Xschem. This process can be particularly tricky, as it requires correct syntax and precise ordering of pins. To simplify this, a Python script has been provided specifically for generating a symbol for `sar_logic.v`.
+
+> ⚠️ Note: This script is tailored to the `sar_logic.v` module and may not work for other designs without modification.
+
+### Running the Symbol Generation Script
+
+Navigate to the Python folder located at:
+```
+part_2_digital_comps/algorithm/python
+```
+The script is invoked as follows:
+
+```
+Usage: python generate_sym.py
+Example: python generate_sym.py control.v test.sym
+
+```
+For our case, run:
+
+```
+python3 generate_sym.py ../verilog/sar_logic.v ../xschem/sar_logic.sym
+
+```
+
+You should see output similar to:
+
+```
+Parsed module: sar_logic
+Inputs: ['clk', 'Op', 'En', 'Om', 'rst']
+Outputs: ['D7', 'D6', 'D5', 'D4', 'D3', 'D2', 'D1', 'D0', 'BN6', 'BN5', 'BN4', 'BN3', 'BN2', 'BN1', 'BN0', 'B6', 'B5', 'B4', 'B3', 'B2', 'B1', 'B0']
+Xschem symbol written to ../xschem/sar_logic.sym
+
+```
+You can now navigate to the `xschem` folder and view the newly generated symbol:
+
+
+
+
+> ⚠️ Note: In the make file the location for the shared object file `(.so)` was specified as in the simulations folder generated by xschem, this is needed for the mixed signal simulation.
+
+## Preparing the Mixed-Signal Testbench
+
+Inside the same `xschem` directory, you will also find two additional symbols:
+
+- `adc_bridge1.sym`: Converts analog input into digital signals compatible with the SAR logic.
+
+- `dac_bridge1.sym`: Converts digital output from the SAR logic into analog signals for NGSpice.
+
+
+These bridges are essential for enabling mixed-signal simulation in NGSpice.
+
+With everything set up, you can now build a testbench using the generated `sar_logic.sym` and the two bridge components:
+
+
+
+
+
+## Stimuli and Simulation Setup
+
+The following PULSE sources are used to simulate signal transitions:
+
+- **Op**:
+```
+name=V6 value="dc 0 ac 0 PULSE(1.2 0 100u 1n 1n 500u 1m)"
+```
+- **Om**:
+```
+"dc 0 ac 0 PULSE(0 1.2 100u 1n 1n 500u 1m)"
+```
+- **En**:
+```
+"dc 0 ac 0 PULSE(1.2 0 0 1n 1n 30u 1m)"
+```
+- **clk**:```
+"dc 0 ac 0 PULSE(0 1.2 0 10p 10p 5u 10u)"
+
+- **rst**:
+```
+"dc 0 ac 0 PULSE(0 1.2 100u 1n 1n 10u 1m)"
+```
+For simulation, a transient analysis is defined:
+
+```
+name=NGSPICE only_toplevel=true
+value="
+.param temp=27
+.control
+save all
+tran 1u 200u
+write sar_logic.raw
+.endc
+"
+```
+Once everything is in place, you can run the simulation. The waveform output should resemble the one below:
+
+
+
+
+## What's Next?
+
+You are encouraged to experiment with the input signals, change timings, and verify the results against the standalone Verilog testbench. This is a great way to gain intuition about how the SAR logic behaves in a mixed-signal context.
+
+
+## Bootstrap - Switch
+
+Explain the function of bootstrap switch
+
+In this design the bootstrap switch that was used is a modification of the one seen below:
+
+
+
+
+the schematic for the boostrap can be seen in the following image
+
+
+
+
+The dimensions of the transistors and caps are in reference to the schematic in xschem.
+
+**NMOS Transistors (`sg13_lv_nmos`):**
+- M1: W = 1.3 µm, L = 0.13 µm, ng = 1, m = 1
+- M2: W = 1.3 µm, L = 0.13 µm, ng = 1, m = 1
+- M3: W = 1.3 µm, L = 0.13 µm, ng = 1, m = 1
+- M5: W = 3.0 µm, L = 0.13 µm, ng = 1, m = 1
+- M7: W = 3.0 µm, L = 0.13 µm, ng = 1, m = 1
+- M8: W = 5.0 µm, L = 0.13 µm, ng = 1, m = 1
+- M9: W = 5.0 µm, L = 0.13 µm, ng = 1, m = 1
+- M10: W = 0.5 µm, L = 0.13 µm, ng = 1, m = 1
+- M11: W = 0.5 µm, L = 0.13 µm, ng = 1, m = 1
+- M12: W = 1.3 µm, L = 0.13 µm, ng = 1, m = 1
+
+**PMOS Transistors (`sg13_lv_pmos`):**
+- M4: W = 0.5 µm, L = 0.13 µm, ng = 1, m = 1
+- M6: W = 0.5 µm, L = 0.13 µm, ng = 1, m = 1
+
+**Capacitors (`cap_cmim`):**
+- C1: W = 4.665 µm L = 6.99 µm m = 1
+- C5: W = 4.665 µm L = 6.99 µm m = 1
+- C6: W = 11.485 µm L = 11.485 µm m = 1
+
+
+ For the inverter the reader is needed to design this use the following parameters
+**NMOS Transistors (`sg13_lv_nmos`):**
+- M1: W = 1.3 µm, L = 0.4 µm, ng = 1, m = 1
+
+**PMOS Transistors (`sg13_lv_pmos`):**
+- M2: W = 1.3 µm, L = 0.8 µm, ng = 1, m = 1
+
+From here the symbol can be made. It was done in the following way:
+
+
+
+
+## Testing the Bootstrap Switch
+
+The next step is to evaluate the **transient behavior** of the bootstrap switch. For this purpose, the following testbench was created:
+
+
+
+
+A simple transient analysis was performed with the following input stimuli:
+
+- **Clock (clk):**
+```
+name=V1 value="PULSE(0 5 0 1n 1n 0.5u 1u)"
+```
+- **Input Voltage (vin):**
+```
+name=V2 value="SIN(0.6 0.6 16e3 0 0 0)"
+
+```
+According to the documentation, the syntax for a sinusoidal source is:
+
+```
+SIN(VO VA FREQ TD THETA PHASE)
+```
+In this case, the input is a very low-frequency signal, which is acceptable for now. The rest of the testbench is fairly self-explanatory, so we proceed directly to the simulation. The resulting output is shown below:
+
+
+
+
+An interesting next step would be to evaluate **SNR, SINAD, and ENOB** based on the simulation output. To extract the necessary waveform data, you can use the following script within the code block:
+
+```
+name=NGSPICE
+only_toplevel=true
+value="
+.control
+save all
+tran 1u 200u
+set wr_singlescale
+set wr_vecnames
+write test_bootstrap.raw
+wrdata vout_data.txt v(vo)
+.endc
+"
+```
+
+## Logic Gates
+
+For generating the clock required by the SAR algorithm and applying logic to the C-DAC, we need basic **logic gates** such as NAND and transmission gates.
+
+### NAND Gate
+
+The schematic of a CMOS NAND gate is straightforward and is shown below:
+
+
+
+
+[Image Source](https://www.allaboutelectronics.org/cmos-logic-gates-explained/)
+
+The corresponding Xschem implementation:
+
+
+
+
+Transistor sizing used:
+
+**NMOS Transistors (`sg13_lv_nmos`):**
+
+- M: W = 0.25 µm L = 0.13 µm ng = 1 m = 1
+
+
+**PMOS Transistors (`sg13_lv_pmos`):**
+
+- M2: W = 0.5 µm L = 0.13 µm ng = 1 m = 1
+
+
+The corresponding symbol:
+
+
+
+![[nand_sym.png]]
+
+You can find the testbench under:
+
+```
+part_2_digital_comps/nand_gate/testbench
+
+```
+At this point in the module, the testbench setup should be fairly straightforward to follow.
+
+## Transmission Gate
+
+The **transmission gate** is a critical component in this design, as it delivers digital logic signals to the C-DAC. Its schematic is shown here:
+
+
+
+
+The Xschem implementation:
+
+
+
+
+Transistor sizing:
+
+**NMOS Transistors (`sg13_lv_nmos`):**
+
+- M: W = 1.0 µm L = 0.13 µm ng = 1 m = 1
+
+
+**PMOS Transistors (`sg13_lv_pmos`):**
+
+- M2: W = 2.0 µm L = 0.13 µm ng = 1 m = 1
+
+
+Corresponding symbol:
+
+
+
+
+### Testbench for Transmission Gate as Switch
+
+To test the transmission gate in a switching configuration, the following testbench was created:
+
+
+
+
+
+Here, the transmission gate passes either **Vref/Vdd** or **GND**, depending on the control signal. The testbench schematic:
+
+
+
+
+- **Vdd** is set to 1.2 V
+
+- **Vref** is 0.6 V (arbitrarily chosen)
+
+
+The control pulse is defined as:
+```
+name=V2 value="PULSE(0 1.2 0 1u 1u 10u 20u)"
+```
+After simulation, the results should resemble the following:
+
+
+
+
+As observed, when the control signal is high, the output is grounded; when low, it passes Vref.