Skip to content

Latest commit

 

History

History
72 lines (53 loc) · 3.83 KB

analog_model.rst

File metadata and controls

72 lines (53 loc) · 3.83 KB

Models of Analog Circuits

.. versionadded:: 1.6.0

This is the example :mod:`analog_model` showing how to use Python models for analog circuits together with a digital part. For an FPGA, these analog circuits would be implemented off-chip, while for an ASIC, they would usually co-exist with the digital part on the same die.

The Python model consists of an Analog Front-End (AFE) in file :file:`afe.py` containing a Programmable Gain Amplifier (PGA) with a selectable gain of 5.0 and 10.0, and a 13-bit Analog-to-Digital Converter (ADC) with a reference voltage of 2.0 V. These analog models hand over data via a blocking :class:`cocotb.queue.Queue`.

The digital part (in :file:`digital.sv`) monitors the measurement value converted by the ADC and selects the gain of the PGA based on the received value.

A test :file:`test_analog_model.py` exercises these submodules.

When running the example, you will get the following output:

     0.00ns INFO     ...test_analog_model.0x7ff913700490       decorators.py:313  in _advance                        Starting test: "test_analog_model"
                                                                                                                     Description: Exercise an Analog Front-end and its digital controller.
  1001.00ns INFO     cocotb.digital                     test_analog_model.py:55   in test_analog_model               AFE converted input value 0.1V to 2047
  3000.00ns (digital) HDL got meas_val=2047 (0x07ff)
  3000.00ns (digital) PGA gain select was 0 --> calculated AFE input value back to 0.099963
  3000.00ns (digital) Measurement value is less than 30% of max, switching PGA gain from 5.0 to 10.0
  7301.00ns INFO     cocotb.digital                     test_analog_model.py:55   in test_analog_model               AFE converted input value 0.1V to 4095
  9000.00ns (digital) HDL got meas_val=4095 (0x0fff)
  9000.00ns (digital) PGA gain select was 1 --> calculated AFE input value back to 0.099988
 13301.00ns INFO     cocotb.digital                     test_analog_model.py:55   in test_analog_model               AFE converted input value 0.0V to 0
 15000.00ns (digital) HDL got meas_val=0 (0x0000)
 15000.00ns (digital) PGA gain select was 1 --> calculated AFE input value back to 0.000000
Saturating measurement value 10238 to [0:8191]!
 19301.00ns INFO     cocotb.digital                     test_analog_model.py:55   in test_analog_model               AFE converted input value 0.25V to 8191
 21000.00ns (digital) HDL got meas_val=8191 (0x1fff)
 21000.00ns (digital) PGA gain select was 1 --> calculated AFE input value back to 0.200000
 21000.00ns (digital) Measurement value is more than 70% of max, switching PGA gain from 10.0 to 5.0
 25301.00ns INFO     cocotb.digital                     test_analog_model.py:55   in test_analog_model               AFE converted input value 0.25V to 5119
 27000.00ns (digital) HDL got meas_val=5119 (0x13ff)
 27000.00ns (digital) PGA gain select was 0 --> calculated AFE input value back to 0.249982
 30301.00ns INFO     cocotb.regression                         regression.py:364  in _score_test                     Test Passed: test_analog_model

You can view the source code of the example by clicking the file names below.

.. details:: :file:`afe.py`

   .. literalinclude:: ../../examples/analog_model/afe.py
      :language: python

.. details:: :file:`digital.sv`

   .. literalinclude:: ../../examples/analog_model/digital.sv
      :language: systemverilog

.. details:: :file:`test_analog_model.py`

   .. literalinclude:: ../../examples/analog_model/test_analog_model.py
      :language: python

.. details:: :file:`Makefile`

   .. literalinclude:: ../../examples/analog_model/Makefile
      :language: make