conversor digital-analógico calibrado para comunicações · comunicações são analógicos, é...
TRANSCRIPT
Conversor Digital-Analógico Calibrado para
Comunicações, em Tecnologia CMOS Avançada de
40nm
José Décio Gomes Gonçalves
Dissertação para obter o grau de Mestre em
Engenharia Eletrotécnica e de Computadores
Orientadores: Prof. Jorge Manuel dos Santos Ribeiro FernandesEng. António Ilídio Rocha Leal
Júri
Presidente: Prof. João Manuel Torres Caldinhas Simões VazOrientador: Prof. Jorge Manuel dos Santos Ribeiro Fernandes
Vogal: Prof. Gonçalo Nuno Gomes Tavares
Outubro 2014
Agradecimentos
Primeiramente, gostava de agradecer ao meu Coorientador, Eng. António Leal, por toda a ajuda,
pelas instruções que me deu durante este trabalho, pelo empenho e pelas horas investidas na minha
formação. O meu profundo e sincero obrigado.
Um grande agradecimento vai para o Doutor Pedro Figueiredo, por toda a ajuda, por todo o tempo
investido em mim, bem como por rever este trabalho de forma tão aprofundada.
Gostava de agradecer também a toda a equipa da Synopsys que de uma forma ou de outra contri-
buíram para melhorar esta dissertação.
Não podia deixar de agradecer ao Professor Jorge Fernandes por toda a disponibilidade e por ter
acreditado em mim dando-me esta oportunidade.
Quero agradecer a todos os meus colegas que me acompanharam durante percurso académico e
a todos os meus amigos na TUIST, que me ajudaram a ser o que sou hoje.
De uma forma mais pessoal, quero agradecer do fundo do meu coração à Andrea Cânovas, por todo
o apoio e motivação sempre, pelo carinho e compreensão. Do fundo do coração, o meu muito obrigado.
Por fim, quero agradecer aos meus pais, José e Guida, e aos meus irmãos, Regina e Pedro, por,
neste longo caminho, com altos e baixos, acreditarem incondicionalmente em mim. O meu mais pro-
fundo obrigado. Dedico-vos este trabalho.
i
ii
Abstract
Communications are a very vast area and nowadays most of our communications are done wire-
lessly. Thus, since the input and output of a communication system are analog, it is indispensable to
use Digital-to-Analog Converters (DACs) and Analog-to-Digital Converters (ADCs).
This dissertation describes the development and implementation of an algorithm that operates the
calibration required for a communications DAC, allowing it to achieve higher performances while, keeping
silicon areas and power consumption competitive.
The calibration is composed of a comparator and a digital system capable of implementing the cali-
bration algorithm. The comparator detects which of the current sources in a pair has the highest current.
The digital system takes as input the results from a number of comparisons, and provides, as output,
the switching sequence of current sources that yields the best linearity.
A new switching scheme is reported in this work, particulary suited for communications systems
using Orthogonal frequency-division multiplexing (OFDM), where the average level of the output signal
of the DAC is significantly below the full scale.
The digital block was implemented in Verilog-A and the DAC was designed and simulated in a 40
nm Complementary Metal-Oxide-Semiconductor (CMOS) technology. The DAC uses a voltage supply
of 1.8V/1.1V ±10%, a sample frequency of fs = 320MHz and specifications of INL and DNL of 1 LSB.
Keywords
Digital to Analog Converter, CMOS, Calibration, Switching Schemes, Comparator.
iii
iv
Resumo
As comunicações são uma área muito vasta e hoje em dia a maioria das nossas comunicações
são efetuadas via redes sem fios. Assim, e visto que os sinais de entrada e saída de um sistema de
comunicações são analógicos, é imprescindível o uso de um Conversor Digital Analógico – Digital-to-
Analog Converter (DAC) e de um Conversor Analógico Digital – Analog-to-Digital Converter (ADC).
O objetivo desta dissertação é desenvolver e implementar um algoritmo que opere a calibração
necessária num conversor digital analógico de comunicações, permitindo atingir um desempenho de
referência industrial, mantendo área e consumo competitivos.
Para implementar a calibração é necessário a utilização de um comparador apropriado, e um sis-
tema digital capaz de implementar o algoritmo de calibração. O comparador deteta, entre duas fontes
de corrente, qual a maior. O sistema digital recebe como entrada o resultado das comparações, e tem
como saída, a sequência de comutação ótima que melhora a linearidade de saída do conversor.
A sequência de comutação ótima desenvolvida neste trabalho é uma sequência inovadora direcio-
nada para sistemas de comunicações que usem Ortogonal Frequency-Division Multiplexing (OFDM),
que têm um nível médio do sinal significativamente abaixo do full scale.
O bloco digital foi implementado em Verilog-A e o conversor realizado numa tecnologia Semicondutor
Metal Óxido Complementar – Complementary Metal-Oxide-Semiconductor (CMOS) avançada (40 nm).
O DAC usa tensões de alimentação de 1.8V/1.1V ±10%, tem uma frequência de fs = 320MHz e as
especificações de INL e DNL são 1LSB.
Palavras Chave
Conversor Analógico Digital, CMOS, Calibração, Sequência de Comutação, Comparador.
v
vi
Conteúdo
1 Introdução 1
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Estrutura da Dissertação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Topologia do DAC 5
2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Conceitos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1 Especificações Estáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.2 Especificações Dinâmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.3 DAC Genérico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Estado da Arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 DAC descrito neste trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5 Especificações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5.1 Sequência de Comutação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5.2 Fontes de Corrente Extra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.3 Comparador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.4 Área das Fontes de Corrente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3 Blocos Analógicos 33
3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 Fonte de Corrente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 Amostragem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4 Comparador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.1 Calibração da tensão de desvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Blocos Digitais e Simulações 49
4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2 Máquina de Estados que Controla o Circuito de Amostragem . . . . . . . . . . . . . . . . 51
4.3 Máquina de Estados de Controlo da Calibração da Tensão de Desvio . . . . . . . . . . . 53
4.4 Controlo das Fontes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.5 Algoritmo de Calibração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
vii
5 Conclusões 65
5.1 Sumário e conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.2 Trabalho Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Bibliografia 69
Apêndice A Verilog-A A-1
viii
Lista de Figuras
1.1 Esquema simplificado que mostra a introdução de DACs e ADCs num sistema de comu-
nicações [1]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Resolução de DACs vs frequência de amostragem e em que áreas são aplicados [2]. . . 3
2.1 Bloco simplificado de um DAC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Saída do DAC e respetiva Não-linearidade Diferencial – Differential Nonlinearity (DNL),
considerando VREF = 2N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Saída do DAC e respetiva Não-linearidade Integral – Integral Nonlinearity (INL), conside-
rando VREF = 2N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Caso particular de um glitch na transição de códigos, considerando VREF = 2N . . . . . . 9
2.5 Alguns exemplos de arquiteturas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 DAC de 4 bits com arquitetura Current-Steering. . . . . . . . . . . . . . . . . . . . . . . . 11
2.7 DAC de 3 bits com arquitetura Current-Steering implementada com código termómetro. . 13
2.8 Vantagens e desvantagens das arquiteturas descodificadas em binário, termómetro e
segmentada [1]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.9 Resultado de 100 simulações Matlab para um DAC em termómetro vs um DAC em binary
weighted [3]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.10 Área normalizada vs segmentação [3]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.11 Diagrama de blocos (8 Bit Mais Significativo – Most Significant Bit (MSB) e 2 Bit Menos
Significativo – Least Significant Bit (LSB)) e célula de corrente escolhido pelos autores [3]. 16
2.12 Algoritmo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.13 Processo de calibração [4] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.14 Estudo que relaciona o número de fontes de corrente extra com a área relativa [4]. . . . . 18
2.15 Desempenho estático do DAC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.16 Fase inicial do algoritmo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.17 Arquitetura do DAC utilizado neste trabalho. . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.18 Comparação entre o Novo Modelo e o modelo da Synopsys. . . . . . . . . . . . . . . . . 20
2.19 Sequência hierarchical symmetrical. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.20 Sequência hierarchical symmetrical mirrored. . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.21 Nova sequência de comutação direcionada para DACs de comunicações. . . . . . . . . . 24
2.22 Nova técnica de cancelamento do erro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ix
2.23 Evolução do desvio padrão das fontes com o aumento do número de fontes de corrente
extra para INL=1 LSB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.24 Evolução da área com o aumento do número de fontes de corrente extra. . . . . . . . . . 28
2.25 Comparação entre um comparador ideal e não ideal. . . . . . . . . . . . . . . . . . . . . . 29
2.26 Estudo para obter a tensão de desvio do comparador. . . . . . . . . . . . . . . . . . . . . 29
2.27 Estudo para obter o ruído do comparador. . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.28 Efeito da decisão por maioria no ruído do comparador. . . . . . . . . . . . . . . . . . . . . 30
2.29 Comparação entre o modelo com as diferentes especificações. . . . . . . . . . . . . . . . 31
2.30 Comparação entre o modelo com e sem calibração, para σI/I = 0, 17%. . . . . . . . . . . 31
2.31 Estudo da variação do sigma das fontes. . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.1 Circuito elétrico da célula de corrente sem calibração. . . . . . . . . . . . . . . . . . . . . 35
3.2 Circuito elétrico da célula de corrente com calibração. . . . . . . . . . . . . . . . . . . . . 37
3.3 Circuito simplificado da amostragem no comparador. . . . . . . . . . . . . . . . . . . . . . 37
3.4 Tensão amostrada no condensador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.5 Simulação da tensão amostrada no condensador. . . . . . . . . . . . . . . . . . . . . . . 40
3.6 Amostragem no comparador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.7 Parte do circuito elétrico do comparador dinâmico desenvolvido neste trabalho. . . . . . . 42
3.8 Tensões de saída do comparador para vIP>vIN [5]. . . . . . . . . . . . . . . . . . . . . . 42
3.9 Simulação das tensões de saída do comparador. . . . . . . . . . . . . . . . . . . . . . . . 43
3.10 simulação do ruído do comparador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.11 Simulação do ruído do comparador com circuito de amostragem. . . . . . . . . . . . . . . 45
3.12 Esquema de calibração da tensão de desvio [5]. . . . . . . . . . . . . . . . . . . . . . . . 45
3.13 Circuito do comparador juntamente com o circuito de calibração da tensão de desvio. . . 47
3.14 Evolução da tensão diferencial de calibração da tensão de desvio. . . . . . . . . . . . . . 48
3.15 Zoom na simulação anterior para verificar a tensão de desvio do comparador depois da
calibração da tensão de desvio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1 Fluxograma da amostragem no comparador. . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2 Circuito da máquina de estados da amostragem do comparador. . . . . . . . . . . . . . . 54
4.3 Simulação da máquina de estados da amostragem do comparador. . . . . . . . . . . . . 55
4.4 Fluxograma da calibração de offset do comparador. . . . . . . . . . . . . . . . . . . . . . 55
4.5 Circuito da máquina de estados da calibração da tensão de desvio do comparador. . . . 58
4.6 Simulação da máquina de estados da calibração da tensão de desvio do comparador. . . 59
4.7 Simulação das duas máquinas de estado simultaneamente a funcionar. . . . . . . . . . . 59
4.8 circuito que controla as fontes de corrente em calibração e funcionamento normal. . . . . 61
4.9 Ordenação das fontes de corrente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.10 Parte da Simulação do algoritmo de calibração. . . . . . . . . . . . . . . . . . . . . . . . . 63
4.11 INL e DNL do DAC sem calibração. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.12 INL e DNL do DAC com calibração. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
x
Lista de Tabelas
2.1 Representação do código termómetro para 3 bits em código binário [2]. . . . . . . . . . . 12
3.1 Tabela de parâmetros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2 Relação entre o ruído e a constante de tempo. . . . . . . . . . . . . . . . . . . . . . . . . 38
4.1 Tabela de verdade para a máquina de estados da amostragem do comparador. . . . . . . 53
4.2 Tabela de verdade para a máquina de estados da Calibração da tensão de desvio do
comparador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.3 Tabela de verdade para gerar o Bvos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.4 Tabela de verdade para o controlo das fontes de corrente em calibração e funcionamento
normal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.5 Excerto das fontes de corrente ordenadas pelo algoritmo de calibração. . . . . . . . . . . 62
xi
xii
Lista de Acrónimos
ADC Conversor Analógico Digital – Analog-to-Digital Converter
CMOS Semicondutor Metal Óxido Complementar – Complementary Metal-Oxide-Semiconductor
DAC Conversor Digital Analógico – Digital-to-Analog Converter
DNL Não-linearidade Diferencial – Differential Nonlinearity
FSO Amplitude Máxima de Saída – Full-Scale Output
INL Não-linearidade Integral – Integral Nonlinearity
LSB Bit Menos Significativo – Least Significant Bit
MOS Semicondutor Metal Óxido – Metal-Oxide-Semiconductor
MSB Bit Mais Significativo – Most Significant Bit
OFDM Ortogonal Frequency-Division Multiplexing
SFDR Spurious Free Dynamic Range
SNR Relação Sinal-Ruído – Signal to Noise Ratio
SNDR Relação Sinal-Ruído mais Distorção – Signal to Noise and Distortion Ratio
THD Distorção Harmónica Total – Total Harmonic Distortion
xiii
xiv
1Introdução
Contents1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Estrutura da Dissertação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1
1. Introdução
2
1.1 Motivação
1.1 Motivação
As comunicações são uma área muito vasta e hoje em dia a maioria das nossas comunicações
são efetuadas via redes sem fios. Assim, e visto que os sinais de entrada e saída de um sistema de
comunicações são analógicos, é imprescindível o uso de Conversor Digital Analógico – Digital-to-Analog
Converter (DAC) e Conversor Analógico Digital – Analog-to-Digital Converter (ADC), Fig. 1.1.
Figura 1.1: Esquema simplificado que mostra a introdução de DACs e ADCs num sistema de comunicações [1].
A necessidade de redução de área e consumo bem como do aumento da velocidade de operação e
largura de banda dos conversores, requerem o desenvolvimento de técnicas cada vez mais elaboradas
para a miniaturização dos mesmos. Para se conseguir resoluções moderadas para comunicações (12
bit), Fig. 1.2, mantendo a área reduzida, é necessário empregar técnicas de calibração para compensar
os desvios de fabrico dos transístores Semicondutor Metal Óxido – Metal-Oxide-Semiconductor (MOS).
Figura 1.2: Resolução de DACs vs frequência de amostragem e em que áreas são aplicados [2].
3
1. Introdução
1.2 Objetivos
O objetivo desta dissertação é desenvolver e implementar um algoritmo que opere a calibração
necessária num conversor digital analógico de comunicações, permitindo atingir um desempenho de
referência industrial, mantendo área e consumo competitivos.
Para implementar a calibração é necessário a utilização de um comparador apropriado, e um sis-
tema digital capaz de implementar o algoritmo de calibração. O comparador deteta, entre duas fontes
de corrente, qual a maior. O sistema digital recebe como entrada o resultado das comparações, e tem
como saída, a sequência de comutação ótima que melhora a linearidade de saída do conversor.
A sequência de comutação ótima desenvolvida neste trabalho é uma sequência inovadora direcio-
nada para sistemas de comunicações que usem Ortogonal Frequency-Division Multiplexing (OFDM),
que têm um nível médio do sinal significativamente abaixo do full scale.
No final pretende obter-se um DAC com as especificações de INL e DNL inferior a 1LSB.
1.3 Estrutura da Dissertação
A dissertação está dividida em 5 capítulos:
• Capítulo 1
Neste capítulo é feita uma pequena apresentação e os objetivos do trabalho.
• Capítulo 2
Este capítulo começa por apresentar noções básicas de DACs genéricos, de seguida analisa-se
alguma da literatura já publicada em relação a este tema.
É apresentado o DAC descrito neste trabalho bem como os estudos feitos de modo a obter as
especificações dos diferentes blocos do conversor.
• Capítulo 3
Neste capítulo são apresentados e dimensionados os principais blocos analógicos do DAC, tendo
em conta as especificações obtidas no capítulo anterior. São também apresentadas as simula-
ções destes blocos
• Capítulo 4
Este capítulo apresenta os blocos digitais: As máquinas de estado necessárias para o controlo
das diferentes fases, o bloco de controlo das fontes bem como o bloco digital que contém o
algoritmo de calibração.
São também apresentadas as simulações dos blocos bem como as simulações finais.
• Capítulo 5
Este capítulo apresenta as conclusões e indicam-se algumas possibilidades de trabalho futuro.
No final do documento existe uma secção reservada para os apêndices.
4
2Topologia do DAC
Contents2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Conceitos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1 Especificações Estáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.2 Especificações Dinâmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.3 DAC Genérico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Estado da Arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 DAC descrito neste trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5 Especificações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5.1 Sequência de Comutação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5.2 Fontes de Corrente Extra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.3 Comparador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.4 Área das Fontes de Corrente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5
2. Topologia do DAC
6
2.1 Introdução
2.1 Introdução
Para comunicações em redes de alto débito são necessários Conversores Digital Analógico – Digital-
to-Analog Converters (DACs) com resoluções entre 10 e 14 bit e com taxas de conversão das centenas
de MAmostras/s. Um DAC é um componente eletrónico que produz uma saída analógica – tensão,
corrente ou carga – que é proporcional ao código digital de entrada.
Neste capítulo são apresentados alguns conceitos básicos sobre DACs, algumas arquiteturas de
DACs desenvolvidos em trabalhos anteriores e, por fim, uma descrição do conversor desenvolvido
neste trabalho bem como as suas especificações.
2.2 Conceitos Básicos
Um DAC tem como função produzir um sinal analógico a partir de palavras digitais. Na Fig. 2.1
pode observar-se o princípio de funcionamento de um DAC genérico e ideal, onde a cada instante são
colocadas palavras digitais (d0, d1, ...dn) à entrada e na saída é obtido o sinal analógico correspondente,
que neste exemplo em particular é representado pela tensão vOUT .
B1
B2
B3
B4
BN
...
DAC
VREF
0000
0
...
1000
0
...
0100
0
...
1100
0
...
d0d1d2d3
...
...
d0 d1 d2 d3 dN
0
1
2
3
2N-1
Din
...
...
...
1111
1
...
dN
VOUT
VOUT
[X VREF/2N]
Figura 2.1: Bloco simplificado de um DAC.
A tensão na saída é dada por
vOUT =Din
2NVREF , (2.1)
onde VREF representa a tensão de referência, Din a palavra digital na entrada e N o número de bits do
conversor.
A palavra digital de entrada tem necessariamente comprimento finito, N , pelo que a saída do DAC
é discreta em amplitude. Além disso, a palavra digital de entrada mantém-se inalterada em intervalos
de tempo discreto, pelo que a saída do DAC é discreta no tempo.
O Passo de Quantificação (∆) é dado pela razão entre a tensão máxima de saída do DAC (VFS) e a
resolução de mesmo
∆ =VFS2N
. (2.2)
De acordo com Fig. 2.1, VFS = VREF .
7
2. Topologia do DAC
Num DAC real existem não-linearidades que fazem com que a sua função de transferência se afaste
da ideal, representada na Fig. 2.1.
De seguida apresenta-se algumas medidas de desempenho que quantificam as diferenças entre as
funções de transferência real e ideal.
2.2.1 Especificações Estáticas
Não-linearidade Diferencial – Differential Nonlinearity (DNL) — Como se pode observar grafica-
mente na Fig. 2.2, corresponde ao desvio na diferença das saídas obtidas com códigos adjacentes, em
relação ao valor ideal do ∆.
000 001 010 011 100 101 110 111
vOUT
0
1
2
3
4
5
6
7
Din
0
000 001 010 011 100 101 110 111 Din
-0,4
-0,6
-0,2
0,4
0,2
0,6
DNL [LSB]
DNL+
Figura 2.2: Saída do DAC e respetiva DNL, considerando VREF = 2N .
Matematicamente pode ser descrita da seguinte forma
DNL(Din) =vOUT (Din)− vOUT (Din − 1)−∆
∆. (2.3)
Não-linearidade Integral – Integral Nonlinearity (INL) — Corresponde ao desvio entre a caracte-
rística de transferência medida e a ideal, como se pode observar graficamente na Fig. 2.3.
000 001 010 011 100 101 110 111
vOUT
0
1
2
3
4
5
6
7
Din
0
000 001 010 011 100 101 110 111 Din
-0,4
-0,2
0,4
0,2
0,6
INL [LSB]
INL0,8
Figura 2.3: Saída do DAC e respetiva INL, considerando VREF = 2N .
Matematicamente pode ser descrita da seguinte forma
8
2.2 Conceitos Básicos
INL(Din) =vOUT (Din)− vOUT,ideal(Din)
∆, (2.4)
onde vOUT,ideal(Din) representa a tensão de saída ideal correspondente ao código Din.
Tanto o INL como o DNL são medidos em termos de Bit Menos Significativo – Least Significant Bits
(LSBs) e podem ser positivos como negativos. Estas duas medidas são indicadores do comportamento
estático de um DAC e usualmente indica-se o valor de pior caso
INL = max
(∣∣∣∣vOUT (Din)− vOUT,ideal(Din)
∆
∣∣∣∣) , (2.5)
DNL = max
(∣∣∣∣vOUT (Din)− vOUT (Din − 1)−∆
∆
∣∣∣∣) . (2.6)
Monotonicidade — Um DAC é monotónico quando a saída é sempre crescente quando se aplicam
códigos digitais em ordem crescente.
2.2.2 Especificações Dinâmicas
Tempo de Estabelecimento (Settling Time) — Em geral é definido como o tempo necessário para
a saída, partindo do valor mínimo, se aproximar do valor máximo, a menos de um determinado erro.
Sobre-elevações (Glitches) — São perturbações na saída do DAC que tipicamente se devem ao
facto dos elementos internos do conversor não comutarem todos simultaneamente. Por exemplo, pode
observar-se na Fig. 2.4 que se os LSBs se desligarem depois do Bit Mais Significativo – Most Significant
Bit (MSB) ligar, a corrente vai atingir o seu valor máximo (ou mínimo) por um determinado intervalo de
tempo.
t0 t1 t2 t3 t4 t5 t6 t7
Vout
0
1
2
3
4
5
6
7
t
Figura 2.4: Caso particular de um glitch na transição de códigos, considerando VREF = 2N .
Relação Sinal-Ruído – Signal to Noise Ratio (SNR) — É o rácio entre a potência do sinal e a
potência de ruído. Para um conversor ideal é dado por
SNR = 6, 02N + 1, 76[dB]. (2.7)
Esta expressão indica o valor máximo de SNR para um DAC de N bit, sendo esta limitação causada
pelo facto da saída deste ser discreta em amplitude.
9
2. Topologia do DAC
Relação Sinal-Ruído mais Distorção – Signal to Noise and Distortion Ratio (SNDR) — É o rácio
entre a potência do sinal e a soma de todas as componentes espectrais que não são desejadas.
Spurious Free Dynamic Range (SFDR) — É a relação entre a fundamental e a maior componente
espectral indesejada dentro da banda.
Distorção Harmónica Total – Total Harmonic Distortion (THD) — É o rácio entre a soma da
potência das harmónicas e a potência do sinal.
2.2.3 DAC Genérico
Existem várias arquiteturas de DACs, algumas das quais podem ser observadas na Fig. 2.5.
(a) Arquitetura com série de resistências [2]. (b) Arquitetura com resistências pesadas binariamente [1].
(c) Arquitetura R-2R [1]. (d) Arquitetura com condensadores.
Figura 2.5: Alguns exemplos de arquiteturas.
Na Fig. 2.5 (a) pode observar-se uma arquitetura com resistências em série, que divide a tensão de
referencia. Esta implementação apesar de ser muito simples, toma áreas consideravelmente grandes
para conversores com resolução superior a 8 bits.
Na Fig. 2.5 (b) pode observar-se uma arquitetura com resistências pesadas binariamente. Nesta
arquitetura as resistências tomam valores diferentes, sendo que a cada uma delas é atribuído um
valor proporcional ao valor binário que cada bit representa. De notar que neste caso o número de
resistências e interruptores são reduzidos a 1 por bit, mas quando se trata de conversores de alta
resolução as resistências tornam-se demasiado grandes (2(N−1)R). Além disso, o facto das resistências
10
2.2 Conceitos Básicos
e interruptores não serem iguais implica que esta arquitetura seja suscetível de glitches e erros de não-
linearidade.
Uma das soluções para diminuir o tamanho das resistências é apresentada na Fig. 2.5 (c), a ar-
quitetura R-2R. O funcionamento é semelhante ao da arquitetura anterior mas tem a vantagem de ter
resistências menores e todas com o mesmo valor o que se traduz em maior precisão e menos erros
de não-linearidade. Contudo, continua a ter o problema relacionado com os glitches já mencionado
anteriormente.
As 2 arquiteturas mencionadas nas Fig. 2.5 (b) e (c) necessitam também de um amplificador na
saída de modo a gerar uma massa virtual para assim a corrente que passa em cada ramo ser indepen-
dente dos restantes.
Na Fig. 2.5 (d) é apresentada uma arquitetura com condensadores. Os condensadores são ligados
à tensão de referência, dependendo da palavra digital da entrada. Esta arquitetura é muito semelhante
à arquitetura com resistências pesadas binariamente, Fig. 2.5 (b), mas neste caso utilizando carga e
apresenta problemas semelhantes. Este conversor é usualmente encontrado em ADCs.
Em sistemas de comunicações a arquitetura mais utilizada é a Current-Steering [1], que se discute
de seguida.
DAC em arquitetura Current-Steering
A arquitetura Current-Steering é muito parecida às arquiteturas com base em resistências, como
mostra a Fig. 2.6, mas é direcionada para aplicações de altos débitos, pois a arquitetura em Current-
Steering é mais precisa e mais rápida devido ao uso de transístores em vez de resistências. Isto porque,
ao ser utilizada corrente em vez de tensão, não é necessário o uso do amplificador, pois deixa de existir
o erro derivado da variação da resistência de saída. O erro introduzido pelos interruptores, devido à
sua própria resistência, também deixa de ser um problema nesta arquitetura.
8I 4I 2I I
vOUT
B0B1B2B3
R
Figura 2.6: DAC de 4 bits com arquitetura Current-Steering.
A ideia consiste em ligar os interruptores das fontes de corrente que correspondem aos bits ati-
vos em cada instante e direcionar essas correntes para a saída onde a corrente total é transformada
em tensão através da resistência R. As restantes correntes, correspondentes aos bits desativos, são
direcionadas para a massa.
Os glitches são uma das maiores limitações em aplicações de altos débitos e muito frequentes em
conversores pesados binariamente quer seja com resistências ou fontes de corrente. Estas perturba-
11
2. Topologia do DAC
ções podem ser diminuídas limitando a largura de banda, o que torna o circuito mais lento, usando
um circuito de retenção e amostragem na saída ou usando internamente o código termómetro para
controlar a seleção das fontes de corrente. Na Tab. 2.1 pode observar-se a representação do código
termómetro.
Decimal Binário Código TermómetroB2 B1 B0 t7 t6 t5 t4 t3 t2 t1
0 0 0 0 0 0 0 0 0 0 01 0 0 1 0 0 0 0 0 0 12 0 1 0 0 0 0 0 0 1 13 0 1 1 0 0 0 0 1 1 14 1 0 0 0 0 0 1 1 1 15 1 0 1 0 0 1 1 1 1 16 1 1 0 0 1 1 1 1 1 17 1 1 1 1 1 1 1 1 1 1
Tabela 2.1: Representação do código termómetro para 3 bits em código binário [2].
Apesar do código termómetro não ser eficiente (necessita de 2N − 1 entradas para representar
2N valores enquanto que o código binário só necessita de N entradas para os mesmo valores) a sua
utilização apresenta algumas vantagens sobre o binário, tais como baixar a DNL, reduzir os glitches, e
garantir que o DAC é monotónico.
A DNL baixa, quando se usa o código termómetro, dado que as fontes de corrente são todas iguais,
o erro entre elas é da mesma ordem de grandeza, o que não acontece numa arquitetura pesada bi-
nariamente. Numa arquitetura pesada binariamente as fontes são proporcionais ao peso do bit que a
controla (I, 2I, 4I, 8I, etc.). Assim é possível perceber que o erro das fontes, numa arquitetura pesada
binariamente, é proporcionalmente maior o que traduz uma DNL pior. Por exemplo, numa arquitetura
pesada binariamente a transição do meio de escala, onde liga-se o bit mais significativo e se desliga
todos os restantes, o desemparelhamento (mismatches) de todos os transístores que desligam não
é igual ao desemparelhamento do único transístor que liga, existindo assim um erro. Este erro pode
implicar que o DAC não seja monotónico. Numa arquitetura em termómetro isso não acontece uma vez
que na transição do meio de escala é apenas mais um transístor que liga, e este tem dimensões iguais
aos restantes, assim os desemparelhamentos serão da mesma ordem de grandeza tornando assim o
erro menor. Assim com o código termómetro consegue-se garantir a monotunicidade do DAC.
Utilizando o código termómetro consegue-se também uma redução nos glitches porque, mais uma
vez, as fontes de corrente têm todas a mesma dimensão cada uma com o seu interruptor. Os glitches
devido a transições de bits (Fig. 2.4), ao contrário da arquitetura pesada binariamente, passam a ser
proporcionais ao número de interruptores que comutam nesse instante e iguais em todas as transições
o que se traduz numa menor distorção.
Na Fig. 2.7 pode observar-se a implementação de um DAC em arquitetura Current-Steering com
código termómetro. As fontes têm todas o mesmo tamanho e existe um interruptor para cada fonte de
corrente.
12
2.2 Conceitos Básicos
I
vOUT
t1t2t3t4
R
t5t6t7
IIIIII
Descodificador
Binário
para
Termómetro
t1
t2
t3
t4
t5
t6
t7
B0
B1
B2
Figura 2.7: DAC de 3 bits com arquitetura Current-Steering implementada com código termómetro.
De notar que os sinais (t1 ... t7) controlam os interruptores, e são obtidos do código de entrada do
DAC usando um descodificador de binário para termómetro. Para DACs de resoluções elevadas esta
descodificação torna-se complexa sendo que uma possibilidade para melhorar este problema passa por
segmentar o DAC. A segmentação passa por controlar as fontes de corrente correspondentes aos bits
menos significativos usando código binário, e as correspondentes aos bits mais significativos usando
código termómetro.
Na Fig. 2.8 pode observar-se a comparação entre arquiteturas pesadas binariamente, descodifica-
das em termómetro e segmentadas, para conversores em Current-Steering de alta resolução.
Figura 2.8: Vantagens e desvantagens das arquiteturas descodificadas em binário, termómetro e segmentada [1].
13
2. Topologia do DAC
A arquitetura pesada binariamente tem menor complexidade, menor área e consequentemente me-
nores consumos enquanto que a arquitetura descodificada em termómetro tem melhor DNL, menos
glitches e é garantidamente monotónica. Quanto à INL, as duas arquiteturas atingem valores seme-
lhantes. Segmentar o conversor tem como objetivo retirar o melhor das duas arquiteturas e utilizar
código termómetro nos bits mais significativos consegue-se resultados semelhantes a uma arquitetura
totalmente em termómetro.
De seguida serão apresentados mais detalhes sobre esta arquitetura.
2.3 Estado da Arte
Lin e Bult [3] fizeram um estudo, onde gerando aleatoriamente 1024 fontes de corrente seguindo
uma distribuição normal, testaram um DAC com descodificação em termómetro e outro DAC pesado
binariamente, com essas mesmas fontes de corrente. Os resultados em termos de INL e DNL são
apresentados na Fig. 2.9.
Figura 2.9: Resultado de 100 simulações Matlab para um DAC em termómetro vs um DAC em binary weighted [3].
Pode observar-se que a INL é muito semelhante nos dois casos mas a DNL apresenta muito melho-
res resultados usando descodificação em termómetro. Em contrapartida, o DAC em termómetro ocupa
uma área maior.
Para tirar partido das vantagens apresentas pela descodificação em termómetro e simultaneamente
áreas menores, usualmente utiliza-se segmentação. Trata-se de dividir o DAC em dois sub-DACs, um
controlado pelos MSBs e outro pelos LSBs, ficando as fontes de corrente correspondentes aos MSBs
descodificadas em termómetro e as dos LSBs descodificadas em binário.
Para perceber quantos bits serão atribuídos a cada sub-DAC os autores efetuaram um estudo que
relaciona a percentagem de segmentação com a área necessária. A percentagem de segmentação
14
2.3 Estado da Arte
indica quantos bits serão descodificados em binário e quantos serão descodificados em termómetro,
sendo que um DAC 0% segmentado indica que todos os códigos são descodificados em binário e um
DAC 100% segmentado indica que todos os códigos são descodificados em termómetro. Este estudo
pode ser visualizado na Fig. 2.10.
Figura 2.10: Área normalizada vs segmentação [3].
Como já foi mencionado anteriormente a INL é idêntica em ambos os casos, pelo que na Fig. 2.10
são representadas linhas constante com o aumento da segmentação. Com o aumento da área dos
transístores consegue-se maior precisão nas fontes de corrente e consequentemente menor INL, daí
serem apresentadas várias linhas horizontais para diferentes áreas e correspondentes níveis de INL:
AINL = 0, 5LSB, AINL = 1LSB e AINL = 2LSB.
De acordo com a Fig. 2.9 a DNL diminui com a segmentação, podendo demonstrar-se [3] que em
escala logarítmica, a área necessária em função da segmentação é uma linha reta que decresce com
o aumento da segmentação, ADNL = 0, 5LSB.
O código termómetro necessita de um descodificador binário – termómetro que ocupará mais área
caso o número de bits da secção dos MSBs (termómetro) seja maior. Então em escala logarítmica trata-
se, como no caso anterior, de uma reta mas neste caso que aumenta com o aumento da segmentação,
Adigital.
Segundo estas restrições qualquer ponto da parte plana da curva seria o ponto ótimo, mas tendo
em conta que o THD melhora com o aumento da segmentação [3] então os autores escolheram o ponto
ótimo apresentado na Fig. 2.10. Assim chegaram à conclusão que a melhor relação entre a área e a
segmentação é oito bits em código termómetro e dois bits em binário como se pode visualizar na Fig.
2.11.
Chen e Gielen [4] implementaram um algoritmo de calibração num DAC segmentado (7 MSB e 7
LSB), que consiste em ordenar as fontes de corrente, calcular a melhor sequência de comutação e
reprogramar uma RAM para aplicar essa sequência. Para tal é necessário um comparador de corrente
e um bloco digital que controla o reordenamento das fontes de corrente.
15
2. Topologia do DAC
Figura 2.11: Diagrama de blocos (8 MSB e 2 LSB) e célula de corrente escolhido pelos autores [3].
Este método reduz a INL sendo assim possível obter fontes de corrente menores, mantendo a sua
relação (W/L), e consequentemente uma redução na área. Inicialmente o DAC tem INL = 1, 5951[LSB]
e DNL = 0, 4919[LSB], como se pode observar na Fig. 2.13 (a).
O processo de calibração é apresentado na Fig. 2.12 e consiste em 5 passos: (a) Sorting, (b)
Resequencing, (c) Summing, (d) Sum Resequencing e (e) Final Sequencing.
Figura 2.12: Algoritmo.
(a) Sorting — Ordena o valor das fontes de corrente de forma crescente. O resultado pode ser
observado na Fig. 2.13 (b).
(b) Resequencing — As corrente são reordenadas de modo a que entre duas correntes grandes
esteja uma corrente pequena. O resultado pode ser observado na Fig. 2.13 (c).
(c) Summing — Somam uma corrente grande com uma pequena.
(d) Sum Resequencing — São novamente reordenadas segundo o passo (b).
16
2.4 DAC descrito neste trabalho
(e) Final Sequencing — As corrente são novamente separadas e obtêm assim a sequência final,
apresentada na Fig. 2.13 (d).
(a) Inicialmente (b) Sorting
(c) Resequencing (d) Final Sequencing
Figura 2.13: Processo de calibração [4]
Um aspeto interessante neste DAC é que não utiliza as fontes que estão mais afastadas da média,
como se pode observar na Fig. 2.13 (b) (identificado com linha mais grossa). Neste estudo 147 fontes
de corrente são ordenadas numa fase inicial, mas no final só 127 foram consideradas. Existem duas
razões para o uso de fontes de corrente extra, sendo a primeira o facto das piores afetarem o resultado
final, mesmo com a calibração. A segunda razão é porque quantas mais fontes extra forem considera-
das mais pequenas serão as fontes de corrente de toda a matriz fazendo assim com que a área total
diminua.
Na Fig. 2.14 pode visualizar-se o estudo que relaciona o número de fontes de corrente extra com
a área relativa e nota-se que neste trabalho o número de fontes extra a utilizar situa-se entre 20 e 70
fontes. É de salientar que mais fontes de corrente extra implica maior complexidade.
2.4 DAC descrito neste trabalho
O ponto de partida para este trabalho é um DAC de 12 bits segmentado, 6 bits em termómetro e 6 em
binário, desenvolvido pela Synopsys. Trata-se de um conversor para comunicações onde será aplicado
17
2. Topologia do DAC
Figura 2.14: Estudo que relaciona o número de fontes de corrente extra com a área relativa [4].
um método de calibração de modo a reduzir os erros aleatórios introduzidos pelos desemparelhamentos
dos elementos do DAC. Este conversor tem o seguinte desempenho estático: INL99% = 1, 013[LSB] e
DNL99% = 0, 544[LSB] o que significa que em 99% dos casos tem-se um DAC com INL ≤ 1, 013[LSB]
e DNL ≤ 0, 544[LSB], como apresentado na Fig. 2.15.
0
20
40
60
80
100
120
0 0,2 0,4 0,6 0,8 1 1,2 1,4
Yie
ld [
%]
INL [LSB]
Modelo Synopsys INL(99%) = 1,013 LSB
(a) Função Distribuição acumulada da INL.
0
20
40
60
80
100
120
0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8
Yie
ld [
%]
DNL [LSB]
Modelo Synopsys DNL(99%) = 0,544 LSB
(b) Função Distribuição acumulada da DNL.
Figura 2.15: Desempenho estático do DAC.
Quando não se usa calibração, a área da fonte de corrente, WL, é inversamente proporcional à
variância da corrente na fonte [1],
WL ∝ 1(σII
)2 . (2.8)
Para diminuir a INL e a DNL, tem que se diminuir σI/I, o que implica aumentar o WL.
Os valores de INL e DNL apresentados na Fig. 2.15 foram obtidos para σI/I = 0, 17%, valor este
que será usado neste capítulo, de modo a ser possível a comparação dos diferentes estudos.
Um dos objetivos da calibração é melhorar o desempenho estático do conversor, baixando a INL
e a DNL. Uma vez que para comunicações não existe grande vantagem em obter INL e DNL muito
inferior a 1 LSB, outro dos objetivos da calibração é reduzir a área ocupada pelo DAC. Esta redução de
18
2.5 Especificações
área é conseguida através da diminuição da área dos transístores da fonte de corrente, uma vez que a
calibração permite usar áreas mais pequenas do que as que são indicadas por 2.8.
Nesta calibração começa por se ordenar as fontes de corrente descodificadas em termómetro, que
idealmente teriam todas o mesmo valor de corrente, o que na realidade não acontece devido aos erros
aleatórios introduzidos no processo de fabrico. De seguida escolhem-se as 63 fontes centrais, excluindo
assim os outliers como mostra a Fig. 2.16. Por fim, aplica-se uma sequência de comutação às fontes
ordenadas de modo a cancelar os erros aleatórios.
38,85
38,90
38,95
39,00
39,05
39,10
39,15
39,20
39,25
39,30
0 10 20 30 40 50 60 70 80
Co
rren
te [
µA
]
Fonte de Corrente
(a) Fontes MSB aleatórias segundo uma distribuição normal.
38,85
38,90
38,95
39,00
39,05
39,10
39,15
39,20
39,25
39,30
0 10 20 30 40 50 60 70 80
Co
rren
te [
µA
]
Fonte de Corrente
Ordenadas
63 Melhores
(b) Fontes MSB ordenadas e selecionadas.
Figura 2.16: Fase inicial do algoritmo.
Para ordenar as fontes utiliza-se um algoritmo de ordenação sequencial conhecido [6] que utiliza um
comparador para comparar as fontes de corrente duas a duas. A sequência de comutação será descrita
mais à frente neste documento, mas é derivada da sequência hierarchical symmetrical scheme[1], que
é regularmente aplicada para cancelar erros de gradiente.
A Fig. 2.17 apresenta o diagrama de blocos simplificado do DAC utilizado neste trabalho. Quando
o conversor é inicializado começa a fase de calibração, onde o algoritmo de calibração, implementado
na parte digital do DAC, seleciona duas fontes MSB e direciona-as para a entrada do comparador. O
comparador indica qual das fontes é maior e, com essa decisão, o algoritmo ordena as duas fontes e
começa novamente o ciclo (duas fontes, comparação, decisão) até que a totalidade das fontes esteja
ordenada. Uma vez ordenadas as fontes, é aplicada a sequência de comutação e essa informação é
armazenada em memória. Quando termina a calibração o conversor entra em funcionamento normal
onde os bits menos significativos são encaminhados diretamente para as fontes de corrente LBS, e os
bits mais significativos são descodificados para termómetro e posteriormente indexados ao esquema
de comutação o que permite selecionar as fontes MSB pela ordem que maximiza a linearidade do DAC.
2.5 Especificações
De modo a obter as especificações dos diversos blocos fez-se um modelo em Matlab que imple-
menta a calibração descrita anteriormente. O modelo inicialmente gera um vetor de 2MSBs − 1 +
NFontesExtra fontes de corrente, com valor aleatório segundo uma distribuição normal com uma deter-
19
2. Topologia do DAC
LSBs
MSBs
Calib.Memória
Digital
Analógico
.
.
.
.
.
.
B0
B5
B6
B11
Vout
Figura 2.17: Arquitetura do DAC utilizado neste trabalho.
minada média e desvio padrão. De seguida as fontes são ordenadas recorrendo ao algoritmo Selec-
tionSort [6]. Um comparador, modelado com tensão de desvio (offset) e ruído aleatório, compara as
fontes de corrente duas a duas e indica quais as que têm que mudar de posição no vetor. Assim que
o vetor está ordenado são retiradas NFontesExtra/2 dos extremos desse vector, ficando assim com as
2MSBs − 1, neste caso 63, melhores fontes de corrente. Uma vez feita a calibração das fontes de cor-
rente correspondentes aos MSBs, de modo a efetuar diversos testes é gerada uma rampa digital, isto
é, um vetor com todas as amostras possíveis desde 0 a 212 − 1 de modo a estimular todos os códigos
do DAC, sendo depois calculada a INL e DNL. Adicionalmente é também possível fazer-se uma análise
estatística da INL e DNL, sendo que a cada repetição são geradas novas fontes aleatoriamente.
Uma vez implementado o modelo é necessário validar o mesmo. O método usado para a sua vali-
dação foi comparar este novo modelo sem a calibração com um modelo da Synopsys cujos resultados
já foram testados e comprovados no silício. Na Fig. 2.18 pode visualizar-se o resultado dessa compa-
ração onde se conclui que, o novo modelo indica aproximadamente os mesmos resultados que o da
Synopsys, sendo portanto válido.
0
20
40
60
80
100
120
0 0,2 0,4 0,6 0,8 1 1,2 1,4
Yie
ld [
%]
INL [LSB]
Novo Modelo INL(99%) = 0,994 LSB
Modelo Synopsys INL(99%) = 1,013 LSB
(a) Função Distribuição acumulada da INL.
0
20
40
60
80
100
120
0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8
Yie
ld [
%]
DNL [LSB]
Novo Modelo DNL(99%) = 0,566 LSB
Modelo Synopsys DNL(99%) = 0,544 LSB
(b) Função Distribuição acumulada da DNL.
Figura 2.18: Comparação entre o Novo Modelo e o modelo da Synopsys.
20
2.5 Especificações
Depois de validado o modelo segue-se uma série de testes e estudos de modo a obter as especifi-
cações necessárias ao bom funcionamento do circuito e responder a questões tais como:
• Qual a sequência de comutação a usar?
• Quais as especificações que têm de ser cumpridas pelo comparador, e qual o efeito das suas não
linearidades na calibração?
• Quantas fontes extra a colocar no DAC?
• Comparando com a situação sem calibração, quão mais pequenas serão essas fontes de cor-
rente?
2.5.1 Sequência de Comutação
Uma vez que as fontes são previamente ordenadas, o resultado do erro aleatório é aproximada-
mente igual a um gradiente linear. Assim, à semelhança da prática corrente para minimizar o efeito
de gradiente, aplica-se uma sequência de comutação com o objetivo de cancelar esses mesmos erros
aleatórios [1]. A sequência de comutação destina-se cancelar os erros das fontes comutando sequen-
cialmente fontes cujo erro seja simétrico. Como se pode observar na Fig. 2.19(a) a fonte designada por
1 tem o mesmo erro, em módulo, que a fonte designada por 2, e assim o erro após ser ligada a fonte 2
é aproximadamente zero.
De seguida são estudadas várias sequências de comutação desde a hierarchical symmetrical [1]
até uma sequência inovadora aplicada neste trabalho. Estes estudo foram efetuados nas seguintes
condições:
• Com calibração;
• Com 12 fontes extra (explicado mais à frente neste documento);
• σI/I = 0, 17%;
• Com comparador ideal.
No caso da sequência de comutação hierarchical symmetrical as fontes de corrente são ligadas
sucessivamente, em torno do primeiro e do terceiro quarto do vetor de fontes de corrente. Assim o erro
da primeira fonte a ser ligada cancela com o erro da segunda fonte ligada, o da terceira cancela com o
da quarta, e assim sucessivamente como mostra a Fig. 2.19(a).
Na Fig. 2.19(b) é apresentada a INL e a DNL do DAC Quando se usa esta sequência de comutação.
Pode observar-se que a INL tende progressivamente a aumentar com o aumento dos códigos. Isto
deve-se ao facto do erro, quando comutação as fontes ímpares, aumentar à medida que a sequência
tende para os extremos. É de salientar também que, com esta sequência de comutação, a INL não é
simétrica o que origina distorção harmónica par.
Uma alternativa é a sequência hierarchical symmetrical mirrored, apresentada na Fig. 2.20(a).
21
2. Topologia do DAC
Err
o
15 711 1 5 9 13 14 10 6 2 4 8 16123
Sequência de Comutação
(a) Exemplo da sequência de comutação para 4 bits.
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
INL
[LSB
]
Código
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
DN
L [L
SB]
Código
(b) INL e DNL correspondente a uma rampa na entrada do DAC.
Figura 2.19: Sequência hierarchical symmetrical.
22
2.5 Especificações
Err
o
11 155 13 3 9 7 8 10 4 14 2 16 1261
Sequência de Comutação
(a) Sequência de comutação.
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
INL
[LSB
]
Código
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
DN
L [L
SB]
Código
(b) INL e DNL correspondente a uma rampa na entrada do DAC.
Figura 2.20: Sequência hierarchical symmetrical mirrored.
23
2. Topologia do DAC
O modo de construção da sequência é idêntico ao anterior com a particularidade de ser intercalar.
A sequência começa nos quartos de onde parte para o centro e para os extremos intercaladamente
quando lá chega regressa aos quartos preenchendo os espaços vagos. O objetivo desta sequência
é tornar a INL do DAC simétrica, isto é, de modo a que o erro introduzido pela segunda metade dos
códigos do DAC sejam simétricos aos da primeira metade dos códigos e assim minimizar a distorção
harmónica par.
Como se pode observar na Fig. 2.20(b) nos códigos centrais é onde se encontra os maiores desvios
na INL, pelos mesmos motivos que na sequência hierarchical symmetrical.
A próxima sequência tem como objetivo colocar esses erros nos extremos da caraterística, isto
é, nos códigos mais altos e nos códigos mais baixos. Isto porque em sistemas de comunicações,
modulações como OFDM têm um nível médio do sinal significativamente abaixo do full scale. A nova
sequência é observada na Fig. 2.21(a).
Err
o
1 515 9 7 13 3 4 14 8 10 12 6 21611
Sequência de Comutação
(a) Sequência de comutação.
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
INL
[LSB
]
Código
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
DN
L [L
SB]
Código
(b) INL e DNL correspondente a uma rampa na entrada do DAC.
Figura 2.21: Nova sequência de comutação direcionada para DACs de comunicações.
O modo de construção da sequência de comutação tem o mesmo princípio da anterior mas neste
caso começa-se nos extremos e no centro avançando para os quartos intercaladamente e regressando.
Pode observar-se na Fig. 2.21(b) que em termos de INLmax e INLmin os valores são semelhantes
24
2.5 Especificações
às dos dois casos anteriores uma vez que se trata da comutação das mesmas fontes, com os mesmos
erros. No entanto com esta sequência os erros maiores ocorrem nas extremidades da função de trans-
ferência do DAC e a INL mantém-se simétrica, o que trás vantagens tal como foi acima mencionado.
Ao utilizar as sequências de comutação consegue-se o cancelamento do erro só a cada par de
fontes correntes, pois não se cancelar o erro gerado quando são ligadas as fontes ímpares, como
referido anteriormente, é isto que gera os maiores desvios na INL e picos na DNL.
Neste trabalho é sugerida uma técnica inovadora para melhorar esse efeito. O método consiste
em alternar aleatoriamente entre fontes com erros simétricos cada vez que o DAC recebe uma palavra
digital ímpar na sua entrada. Tomemos como exemplo o caso em que a palavra digital à entrada do
DAC ativa a primeira fonte em termómetro. Como se pode observar na Fig. 2.21(a) o erro, em módulo,
da primeira fonte é aproximadamente igual ao erro, em módulo, da segunda fonte a ser comutada.
Embora estejamos num código ímpar podemos aproveitar este fato, selecionando aleatoriamente uma
dessas duas fontes, a fonte 1 ou a fonte 2, sempre que à entrada do DAC o código corresponder à
primeira fonte de termómetro ativa. Assim, faz-se uma média do erro longo do tempo. Claro está que
este processo é feito apenas para os códigos MSB ímpares uma vez que nos códigos MSB pares as
duas fontes estão ativas cancelando aproximadamente os erros uma da outra. Na Fig. 2.22 pode-se
observar o efeito desta nova técnica de cancelamento do erro utilizando as mesmas fontes de corrente
que nos casos anteriores.
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
INL
[LSB
]
Código
-0,4
-0,2
0
0,2
0,4
0 1000 2000 3000 4000
DN
L [L
SB]
Código
Figura 2.22: Nova técnica de cancelamento do erro.
Nota-se que os erros devido às fontes de corrente controladas pelos MSBs foram significativamente
atenuados.
Nas próximas secções deste capítulo será utilizada esta sequência de comutação, ilustrada na Fig.
2.21(a), em conjunto com a técnica de alternância de fontes de corrente para os códigos impares agora
apresentado, de modo a obter as diversas especificações.
25
2. Topologia do DAC
2.5.2 Fontes de Corrente Extra
Nesta secção tenta perceber-se quantas fontes de corrente extra é necessário usar de modo a
minimizar a área. Interessa perceber que depois de todas as fontes ordenadas, as NFontesExtra não
serão utilizadas quando o DAC estiver a funcionar. Desta forma, serão retirados os outliers e as fontes
mais afastadas da média, que consequentemente se traduz em melhores resultados em termos de
desempenho estático (INL e DNL menores) e dinâmico do DAC. Contudo, como já foi referido, este
trabalho está direcionado para uma redução na área, assim fixando a INL em 1 LSB consegue-se
áreas menores, isto é, se σI/I aumentar até obter estatisticamente INLs de 1 LSB em 99% dos casos
a área das fontes de corrente desce, como se pode verificar de (2.8).
Com este conceito em mente, para saber quantas fontes extra usar fez-se um varrimento do nú-
mero de fontes de corrente e, para cada valor, se encontrou um σI/I que garante a especificação de
INL99% = 1[LSB]. A Fig. 2.23 indica que com o aumento do número de fontes extra o σI/I aumenta
possibilitando assim a diminuição da área de todas as fontes de corrente. No entanto as fontes de
corrente extra ocupam área, pelo que não se pode usar um valor indiscriminadamente alto de fontes de
corrente extra, o que iria aumentar a área total do DAC.
0,5
0,6
0,7
0,8
0,9
1,0
1,1
1,2
1,3
1,4
0 10 20 30 40 50 60 70
Fontes Extra
Figura 2.23: Evolução do desvio padrão das fontes com o aumento do número de fontes de corrente extra para INL=1 LSB.
É portanto importante perceber qual a redução na área da matriz de fontes de corrente. A nova área
A1, com fontes extra e com σI1/I obtido no estudo anterior, pode ser comparada com a área de uma
matriz, A0, sem fontes extra, com σI0/I correspondente a 0 fontes extra. Esta relação é dada por,
A1
A0=
(σI0σI1
)22MSB − 1 +NFontesExtra
2MSB − 1. (2.9)
Usando os σI/I obtidos da Fig. 2.23 pode construir-se o gráfico representado na Fig. 2.24 que
relaciona a área relativa, A1/A0, com o número de fontes extra. Observa-se que a linha ’fontes’ tende
a estagnar quando se atinge o valor de 20 fontes extra.
Relacionando apenas a área da fonte de corrente, como acabámos de fazer, não se contabiliza a
área ocupada pelos interruptores, latches e cascodes que são necessários em cada fonte de corrente.
26
2.5 Especificações
A área destes elementos não diminui com o aumento do desvio padrão das fontes e para os tomar em
consideração, é necessário alterar (2.9).
A área da matriz sem fontes extra é dada por,
A0 =K(σI0I
)2 (2MSB − 1)
+ASW0, (2.10)
onde ASW0representa a área de todos os interruptores, cascodes, etc. K é dado por
K =1
2
[A2β +
4A2V T
(VGS − Vt)2
]. (2.11)
A área da nova matriz com as fontes extra é dada por
A1 =K(σI1I
)2 (2MSB − 1 +NFontesExtra)
+ASW0 +ASWindNFontesExtra, (2.12)
onde ASWindé a área de 1 conjunto interruptores+cascode+latch e dado por
ASWind=
ASW0
2MSB − 1 +NFontesExtra. (2.13)
Dividindo (2.12) por (2.10) obtém-se
A1
A0=
K(σI1I
)2
(2MSB − 1 +NFontesExtra
)+ASW0
(1 + NFontesExtra
2MSB−1+NFontesExtra
)K(σI0I
)2 (2MSB − 1) +ASW0
, (2.14)
e assumindo que a área total dos interruptores, cascodes e latches, é igual à área total das fontes de
corrente
ASW0=
K(σI0I
)2 (2MSB − 1)
(2.15)
tem-se que
A1
A0=
1
2
(σI0σI1
)22MSBs − 1 +NFontesExtra
2MSBs − 1+
1 + NFontesExtra2MSBs−1+NFontesExtra
2. (2.16)
Na Fig. 2.24 também relaciona a área relativa (contabilizando com cascode, interruptor e latch) com
o número de fontes extra, na linha Fontes+Cas.+SW+Latch. pode observar-se que a partir de 12 fontes
extra a diminuição da área das fontes de corrente não compensa a área do hardware extra (cascode,
interruptor e latch), pode concluir-se que existe um valor óptimo, 12, e este será o número de fontes
extra que minimiza a área.
2.5.3 Comparador
Como se pode visualizar na Fig. 2.25, ao introduzir um comparador não ideal pode levar a que o
algoritmo de ordenação não ordene as fontes corretamente. A tensão de desvio e o ruído do com-
parador podem causar decisões erradas. Caso isto aconteça a ordenação não ficará correta, o que
27
2. Topologia do DAC
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1,0
1,1
0 10 20 30 40 50
Áre
a R
ela
tiva
Fontes Extra
Fontes
Fontes + Cas. + SW + Latch
Figura 2.24: Evolução da área com o aumento do número de fontes de corrente extra.
comprometerá a calibração. Assim é necessário dimensionar apropriadamente o comparador de modo
a que os erros introduzidos pela tensão de desvio e pelo ruído não tenham impacto significativo.
De seguida determinam-se os valores da tensão de desvio e valor rms de ruído que garante essa
situação.
Introduziram-se diferentes erros de tensão de desvio no comparador e para cada um destes calcula-
se o yield da INL. É de esperar que, estatisticamente, com o aumento do erro de tensão de desvio a
INL seja cada vez maior, uma vez que a ordenação das fontes de corrente é feita de uma forma mais
deficiente. O resultado é apresentado na Fig. 2.26(a) onde se pode observar este comportamento.
A Fig. 2.26(a) mostra que para uma tensão de desvio de 0V a INL em 99% dos casos é menor que
0,2LSB.
Na Fig. 2.26(b) pode observar-se que a partir de aproximadamente 100µV , para uma INL de 0,2LSB,
o nível de confiança baixa para 95%. Assim fixa-se este valor como especificação máxima para o
comparador.
Para quantificar o efeito do ruído do comparador seguiu-se um processo semelhanate ao que acabou
de se descrever para a tensão de desvio: Consideraram-se diferentes valores rms para o ruído, e para
cada um destes calcula-se a INL. Novamente, é de esperar que, estatisticamente, com o aumento do
ruído a INL seja cada vez maior. O resultado é apresentado na Fig. 2.27(a) onde se pode observar que
corresponde ao esperado.
Na Fig. 2.27(b) pode observar-se que a partir de aproximadamente 100µV o nível de confiança
baixa de 95%. Assim fixa-se este valor como especificação para o comparador.
Com o objetivo de tentar relaxar o comparador considerou-se a hipotese de tomar a decisão sobre
cada par de fontes de corrente, baseado não em uma única comparação, mas na maioria de várias
comparações. O objetivo passa por tentar eliminar o erro introduzido pelo ruído. O esperado será com
mais comparações mais preciso será o comparador. Na Fig. 2.28 é apresentado o resultado deste
estudo.
28
2.5 Especificações
38
38
39
39
40
40
41
0 10 20 30 40 50 60 70 80
Co
rre
nte
[µ
A]
Fonte de Corrente
Ideal
63 Selecionadas
(a) Comparador ideal.
38
38
39
39
40
40
41
0 10 20 30 40 50 60 70 80
Co
rre
nte
[µ
A]
Fonte de Corrente
Ideal
Não Ideal
63 Selecionadas
(b) Comparador não ideal (ruído = 100 µV, tensão de desvio =100 µV).
38
38
39
39
40
40
41
0 10 20 30 40 50 60 70 80
Co
rren
te [
µA
]
Fonte de Corrente
Ideal
Não Ideal
63 Selecionadas
(c) Comparador não ideal (ruído = 200 µV, tensão de desvio =200 µV).
38
38
39
39
40
40
41
0 10 20 30 40 50 60 70 80
Co
rren
te [
µA
]
Fonte de Corrente
Ideal
Não Ideal
63 Selecionadas
(d) Comparador não ideal (ruído = 500 µV, tensão de desvio =500 µV).
Figura 2.25: Comparação entre um comparador ideal e não ideal.
0
10
20
30
40
50
60
70
80
90
100
0 0,2 0,4 0,6 0,8 1
Yie
ld [
%]
INL [LSB]
0 uV 26 uV 53 uV 79 uV 105 uV 132 uV 158 uV 184 uV 211 uV 237 uV 263 uV 290 uV 316 uV 342 uV 368 uV 395 uV 421 uV 447 uV 474 uV 500 uV
(a) Função distribuição acumulada da INL para diferentes va-lores da tensão de desvio do comparador.
0
10
20
30
40
50
60
70
80
90
100
0 100 200 300 400 500
Yie
ld (
INL=
0,2
LSB
) [%
]
Offset [µV]
(b) Variação da tensão de desvio fixando a INL=0,2LSB.
Figura 2.26: Estudo para obter a tensão de desvio do comparador.
29
2. Topologia do DAC
0
10
20
30
40
50
60
70
80
90
100
0 0,2 0,4 0,6 0,8 1
Yie
ld [
%]
INL [LSB]
0 uV 35 uV 69 uV 104 uV 138 uV 172 uV 207 uV 241 uV 276 uV 310 uV 345 uV 379 uV 414 uV 448 uV 483 uV
(a) Função distribuição acumulada da INL para diferentes va-lores de ruído.
0
10
20
30
40
50
60
70
80
90
100
0 100 200 300 400 500 Y
ield
(IN
L=0
,2 L
SB)
[%]
Ruído [µV]
(b) Variação do ruído fixando a INL=0,2LSB.
Figura 2.27: Estudo para obter o ruído do comparador.
0
10
20
30
40
50
60
70
80
90
100
0 200 400 600 800 1000
Yie
ld (
INL=
0,2
LSB
) [%
]
Ruído [µV]
1 Comp. 3 Comp. 5 Comp. 7 Comp.
9 Comp. 11 Comp. 13 Comp. 15 Comp.
Figura 2.28: Efeito da decisão por maioria no ruído do comparador.
30
2.5 Especificações
O comportamento observado na Fig. 2.28 corresponde ao esperado, podendo concluir-se que se o
comparador tiver um ruído for demasiado alto para as especificações uma das soluções pode passar
por fazer várias comparações e tomar uma decisão por maioria.
Como será explicado mais à frente neste documento, este último procedimento não será aplicado
neste trabalho devido a ser um processo moroso sendo que foi implementada outra solução. E assim as
especificações para o comparador são: ruído total = 100 µV, tensão de desvio = 100 µV e 1 comparação
por amostra.
De seguida compara-se os resultados dos estudos anteriores. Na Fig. 2.29 pode observar-se a
comparação entre: comparador ideal com 0 fontes extra; comparador ideal com 12 fontes extra; e 12
fontes extra com um comparador com 100µV de ruído e 100µV de tensão de desvio.
0
10
20
30
40
50
60
70
80
90
100
0 0,1 0,2 0,3 0,4 0,5
Yie
ld [
%]
INL [LSB]
0 Fontes Extra e Comp. Ideal
12 Fontes Extra e Comp. Ideal
12 Fontes Extra e Comp. Real
(a) Função Distribuição acumulada da INL.
0
10
20
30
40
50
60
70
80
90
100
0 0,05 0,1 0,15 0,2 0,25 0,3
Yie
ld [
%]
DNL [LSB]
0 Fontes Extra e Comp. Ideal
12 Fontes Extra e Comp. Ideal
12 Fontes Extra e Comp. Real
(b) Função Distribuição acumulada da DNL.
Figura 2.29: Comparação entre o modelo com as diferentes especificações.
Da comparação advém que, como era de esperar, com 12 fontes extra os resultados melhoram,
ficando com uma INL99% = 0, 2LSB mas quando se trata de um comparador não ideal perde-se no
desempenho sendo que a INL99% = 0, 35LSB.
A Fig. 2.30 compara os resultados com e sem calibração.
0
10
20
30
40
50
60
70
80
90
100
0 0,5 1 1,5
Yie
ld [
%]
INL [LSB]
Sem Calibração
Com Calibração
(a) Função Distribuição acumulada da INL.
0
10
20
30
40
50
60
70
80
90
100
0 0,2 0,4 0,6 0,8
Yie
ld [
%]
DNL [LSB]
Sem Calibração
Com Calibração
(b) Função Distribuição acumulada da DNL.
Figura 2.30: Comparação entre o modelo com e sem calibração, para σI/I = 0, 17%.
31
2. Topologia do DAC
Pode concluir-se que o desempenho melhora significativamente passando de INL99% = 1LSB para
INL99% = 0, 35LSB para σI/I = 0, 17%.
2.5.4 Área das Fontes de Corrente
Uma vez que os resultados em termos de linearidade estática são melhorescomo mostra a Fig.
2.30 opta-se por fazer o dimensionamento para σI/I maior de modo a obter INL99% = 1LSB indo de
encontro às especificações para este DAC. A Fig. 2.31 mostra a variação do σI/I de modo a obter o
yield da INL..
0
20
40
60
80
100
0,5 1 1,5 2 2,5 3
Yie
ld [
%]
Figura 2.31: Estudo da variação do sigma das fontes.
Neste estudo varia-se o desvio padrão da corrente das fontes de modo a perceber quando é que
a INL é superior a 1LSB. Analisando a Fig. 2.31 observa-se que pode aumentar-se o σI/I até 1%
garantindo que estatisticamente a INL = 1LSB com um grau de confiança de 95%. Como inicialmente
e sem calibração tem-se que σI/I = 0, 17% o fato de com este método de calibração se poder usar
σI/I = 1% é possível diminuir a área da matriz de fontes de corrente em aproximadamente 34,6 vezes,
o que reduz a área do DAC. Isto reduz também a capacidade parasita o que se traduz numa melhor
linearidade dinâmica.
32
3Blocos Analógicos
Contents3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 Fonte de Corrente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 Amostragem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4 Comparador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.1 Calibração da tensão de desvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
33
3. Blocos Analógicos
34
3.1 Introdução
3.1 Introdução
Neste capítulo são apresentados alguns dos blocos analógicos do DAC, nomeadamente a fonte de
corrente, o comparador e o bloco de amostragem.
Será apresentada e dimensionada a fonte de corrente a utilizar, para o caso sem calibração. Uma
vez que o objetivo deste trabalho passa por utilizar a calibração de forma a reduzir a área da matriz de
fontes de corrente, posteriormente são apresentadas as alterações na fonte de corrente de modo a ser
possível a calibração, assim como o novo dimensionamento.
É também dimensionado o bloco de amostragem que amostra as tensões das fontes de corrente
para de seguida ser feita a comparação.
Neste capítulo também será apresentado o comparador bem como um método para minimizar a
tensão de desvio deste.
3.2 Fonte de Corrente
A célula da fonte de corrente representada na Fig. 3.1 é constituída pelo transístor da fonte de
corrente M1, o cascode M2, os interruptores M3 e os cascodes de óxido grosso M4, bem como duas
fontes de corrente auxiliares.
Figura 3.1: Circuito elétrico da célula de corrente sem calibração.
As dimensões do transístor da fonte de corrente dependem, da Amplitude Máxima de Saída – Full-
Scale Output (FSO) da corrente do DAC e da tecnologia onde o conversor será implementado.
Pode demonstrar-se que o desvio padrão, σI , da corrente, I, que passa num transistor com dimen-
sões W e L é dado por [7]
(σII
)2=
1
2WL
[A2β +
4A2V T
(VGS − Vt)2
], (3.1)
onde os valores deAβ eAV T são propriedades de matching determinados por flutuações na mobilidade
e dependem da tecnologia usada. VGS é a tensão entre a gate e a source do transístor, Vt a tensão
35
3. Blocos Analógicos
necessária para ligar o transístor e, W e L o comprimento e a largura do canal do transístor, respetiva-
mente. Esta equação indica que caso se pretenda diminuir o σI duas vezes é necessário aumentar a
área do transístor quatro vezes.
Do modelo quadrático, vem a dependência da corrente e é dado por
W
L=
2Ics
µCox (VGS − Vt)2, (3.2)
onde
Ics =IFS
2NMSB − 1. (3.3)
Os parâmetros Aβ , AV T e µCox foram obtidos por simulação e são apresentados na Tab. 3.1.
Aβ AV T µCox_fino µCox_grosso
0,436% 3,078 mV.µm 111,11 µA/V 2 45,69 µA/V 2
Tabela 3.1: Tabela de parâmetros.
Sabendo que a resistência de saída é de 200Ω e que a corrente máxima de saída IFS = 2, 5mA
tem-se que VFS = 0, 5V . Uma vez que a alimentação é Vdd = 1, 8V escolhe-se VDS = 325mV e uma
margem de 175mV tem-se que VGS − Vt = 150mV .
De (3.1) e (3.3), sabendo que IFS = 2, 5mA, NMSB = 6, σI/I = 0, 17%, tem-se que(WL
)1
= 32 e
(WL)1 = 294, 7µm2, consequentemente W1 = 97µm e L1 = 3µm.
Enquanto que as dimensões do transístor da fonte de corrente são determinadas pela corrente e
pelas considerações de desemparelhamento, as dimensões dos interruptores e cascodes são determi-
nados pela corrente e velocidade de operação. Deste modo, o L do interruptor M3 é escolhido para
ser o mínimo da tecnologia, L3 = 40nm. O objetivo é colocar o interruptor o mais pequeno possível de
modo a diminuir a capacidade parasita no nó e assim beneficiar o tempo de estabelecimento do con-
versor. Como a corrente que passa no interruptor é a mesma que a do transístor da fonte de corrente,
de (3.3) é obtido W3 = 1, 3µm.
Quanto ao cascode, M2, a corrente que lá passa é a mesma que no transístor da fonte de corrente
e no interruptor. Deve-se implementar um cascode cuja relação gm/gds seja suficientemente grande
para este ficar bem saturado. Assim, escolhe-se um L2 = 90nm e de (3.3) vem que W2 = 3µm. Para
o dimensionamento do cascode de óxido grosso, M4, é necessário contabilizar com a corrente auxiliar,
cuja função é, não descarregar a capacidade parasita presente no nó sempre que os interruptores
comutam a corrente para a saída N ou P, ficando o circuito com melhor desempenho dinâmico [8].
Esta corrente auxiliar é aproximadamente 2µA e, escolhendo L mínimo para este transístor tem-se que
L4 = 0, 27µm e W4 = 22, 1µm.
Com a introdução da calibração neste DAC é necessário adicionar dois novos ramos à célula da
fonte de corrente de modo que a corrente seja direcionada para o comparador. Assim, como se pode
observar na Fig. 3.2, os dois novos ramos são réplicas dos já existente de modo a ter as mesmas
condições de funcionamento quando se está em modo de calibração.
36
3.3 Amostragem
Figura 3.2: Circuito elétrico da célula de corrente com calibração.
Quando o DAC está em funcionamento normal são selecionados os interruptores SWp e SWn e a
corrente é encaminhada para a saída P e N respetivamente. Quando o conversor está em calibração
são selecionados os interruptores SWcal e SWcal_dmy. O SWcal encaminha a corrente para uma resis-
tência onde é feita a amostragem antes do comparador, e SWcal_dmy que encaminha a corrente para
uma resistência dummy de igual valor.
As dimensões dos transístores mantêm-se com a exceção do transístor da fonte de corrente. Uma
vez que, com a calibração, o σI/I = 1%, possibilitando assim a diminuição da área do transístor da fonte
de corrente. De (3.3) vem que(WL
)1
= 32 e de (3.1) vem que (WL)1 = 8, 52µm2, consequentemente
W1 = 16µm e L1 = 0, 52µm.
Com a calibração consegue-se uma redução na área de 34,6 vezes em relação à área inicial do
transístor da fonte de corrente.
3.3 Amostragem
Para comparar as fontes de corrente, implementou-se um circuito que amostra a tensão gerada por
cada uma delas na resistência R, em condensadores como mostra a Fig. 3.3.
... I2 I1
R
C2
C1
ph1dphsw1
ph2
dphsw2
q
C1=C2=C
In
phnlatch
offset_cal
qz
OffsetOK
Figura 3.3: Circuito simplificado da amostragem no comparador.
37
3. Blocos Analógicos
Uma alternativa, seria colocar duas resistências de igual valor, sendo que assim, podiam ser amos-
tradas as duas fontes em simultâneo. Com esse método introduz-se um erro na tensão amostrada
devido ao desemparelhamento das resistências. Escolheu-se uma única resistência para amostrar a
tensão gerada pelas fontes de corrente, porque deste modo, as duas fontes de corrente são amostradas
nas mesmas condições.
O modo de funcionamento deste circuito é simples, inicialmente liga-se ph1 e dphsw1, e a tensão
da resistência, gerada por I1, é amostrada no C1. De seguida mantém-se ligado ph1, liga-se dphsw2 e
acontece a mesma coisa para I2. Por fim é feita a calibração da tensão de desvio, ativando offset_cal,
ficando o circuito à espera que a tensão de desvio seja calibrada.
Depois de calibrada a tensão de desvio entra-se num loop onde são comparadas fontes de corrente
duas a duas, até obter a ordenação completa das fontes. Inicialmente liga-se ph1 e dphsw1, e a tensão
da resistência, gerada por I1, é amostrada no C1. De seguida liga-se ph2 e dphsw2, e acontece a
mesma coisa para a I2. O comparador é então ativado, indicando qual das fontes de corrente é maior.
De seguida é ligado ph2 e dphsw1, os condensadores são novamente colocados à mesma tensão, é
feita a calibração da tensão de desvio e volta a repetir-se o loop para duas novas fontes de corrente.
Tendo em conta a especificação para o ruído total do comparador, 100µV , indicadas no capítulo
anterior, e tendo em conta que a potência de ruído dos sinais amostrados no condensador é [9]
v2n =kT
C, (3.4)
onde k é a constante de Boltzmann, T é a temperatura em Kelvin e C a capacidade. Uma vez que se
trata de um circuito diferencial é necessário reformular (3.4)
v2dif =2kT
C. (3.5)
Optou-se por dividir o ruído em partes iguais, tanto para o circuito de amostragem como para o
comparador, ficando assim 70µV para cada um deles, cumprindo desta forma as especificações
v2TOTAL =
√(v2comp
)2+(v2dif
)2=√
70µ2 + 70µ2 = 98, 99µV. (3.6)
Para que o valor de modo comum da tensão de entrada do comparador seja 0,4V (o que garante
o bom funcionamento do mesmo) e uma vez que a corrente das fontes MSBs é I = 40µA, escolhe-
se uma resistência de 10kΩ. Assim, tendo em conta o ruído e a constante de tempo (τ ), é possível
escolher o condensador a usar.
Na Tab. 3.2 pode visualizar-se a relação entre o ruído e a constante de tempo.
C [pF] vdif [µV] τ [ns]0,1 298,6 11 94,4 102 66,8 2010 29,9 100
100 9,4 1000
Tabela 3.2: Relação entre o ruído e a constante de tempo.
38
3.3 Amostragem
Tendo em conta (3.6) e a Tab. 3.2, o condensador que deve ser escolhido é o de C = 2pF . Este
condensador, juntamente com a resistência de 10kΩ, tem uma constante de tempo elevada, 20ns, o que
torna o circuito demasiado lento. Uma solução passa por, permitir mais ruído na parte de amostragem
e tentar diminuir o ruído no comparador. Deste modo, opta-se por colocar um condensador menor, 1pF,
o que torna o circuito duas vezes mais rápido, mesmo optando por várias comparações de modo a
reduzir o ruído do comparador.
Assim, a nova divisão do ruído é
v2TOTAL =
√(v2comp
)2+(v2dif
)2=√
34µ2 + 94, 4µ2 = 100, 33µV. (3.7)
Com este condensador e resistência de amostragem será necessário esperar alguns ciclos de reló-
gio para que a tensão estabilize. Assim, de modo a concluir quanto tempo é necessário esperar, como
ilustra a Fig. 3.4, considera-se o caso extremo em que a primeira fonte carregada no condensador tem
um erro de 5σ e que a fonte que será carregada de seguida tem um erro de −5σ.
Vmax
Vmin
erro
Ts t
V
fonte2fonte1
Figura 3.4: Tensão amostrada no condensador.
A tensão ilustrada na Fig. 3.4, vo(t) é dada por
vo(t) = Vf − (Vf − Vi) e−tτ , (3.8)
onde Vi é a tensão inicial e Vf a tensão final.
Deste modo e tendo em conta que o σII = 1%,
Imax = 40µ(1 + 5%) = 42µA, (3.9)
Imin = 40µ(1− 5%) = 38µA, (3.10)
Vmax = 420mV, (3.11)
Vmin = 380mV, (3.12)
∆V = Vmax − Vmin = 40mV. (3.13)
39
3. Blocos Analógicos
O erro na entrada do comparador tem de ser inferior a 100µV, assim,
vo(t) = Vmin −∆V e−Tsτ (3.14)
Vmin − vo(t) = ∆V e−Tsτ (3.15)
erro = ∆V e−Tsτ . (3.16)
De (3.16) o tempo de estabelecimento é dado por Ts = 59, 9ns.
Com este tempo de estabelecimento conclui-se que, a frequência máxima possível para amostrar a
tensão nos condensadores de amostragem é fmax = 16, 7MHz.
Na Fig. 3.5 pode-se visualizar a simulação que mostra a tensão amostrada nos dois condensadores.
Figura 3.5: Simulação da tensão amostrada no condensador.
Observa-se que os condensadores partem da mesma tensão, o que significa que vem da situação
em que foi calibrada a tensão de desvio do comparador. É carregada uma fonte no C1, outra no C2 e
são feitas várias comparações. De seguida os condensadores são colocados ao mesmo potencial, é
feita a calibração de da tensão de desvio e são carregadas novas fontes.
A máquina de estados que controla a calibração, explicada no próximo capítulo, divide o relógio de
entrada (320 MHz) de forma a respeitar a frequência máxima fmax, enquanto o DAC está na calibração.
Por simulação, obteve-se que a capacidade parasita na entrada do comparador é Cp = 78, 78fF ,
assim implementou-se um condensador de amostragem cuja capacidade é C = 920fF . Este conden-
sador foi implementado usando um dispositivo MOS, sendo a capacidade dada por,
C = WLCox, (3.17)
onde a capacidade por unidade de área do óxido é Cox = 5, 84[fF/µm2
], ficando assim o condensador
com W = 15, 75µm e L = 10µm.
Na Fig. 4.2 mostra-se o circuito implementado.
De modo a tentar compensar a injeção de carga e com o objetivo de garantir que a tensão de
modo comum fique sempre ≈ 400mV , foi necessário colocar transístores junto dos interruptores. A
injeção de carga não é um problema para as medidas, uma vez que, esta tem o mesmo efeito em
ambos os condensadores. Admitindo que o efeito nos condensadores deixa de ser igual, devido aos
desemparelhamentos nos interruptores, é necessário contabilizar essas diferenças. Deste modo, ao
40
3.4 Comparador
Figura 3.6: Amostragem no comparador.
colocar os condensadores ao mesmo potencial e posteriormente efetuar-se a calibração da tensão de
desvio do comparador, consegue-se anular a tensão de desvio gerada por essa injeção de carga.
3.4 Comparador
O comparador utilizado neste trabalho, tem como base o comparador dinâmico apresentado em [10],
modificado para ter um par diferencial do tipo PMOS. Na Fig. 3.7, pode observar-se parte do circuito
elétrico do comparador.
Quando o sinal latch está desligado (latch = 0 e latch = 1), o comparador está no modo reset, onde
os nós vOP e vON são puxados a Vdd através dos transístores M4a e M4b respetivamente. Os nós vDN
e vDP estão ambos a 0V através de M7a e M7b, como M8 está ao corte, não existe corrente a passar
no par diferencial M1a e M1b.
Quando o sinal latch fica ativo (latch = 1 e latch = 0), os transístores M7 passam a estar ao
corte, a corrente começa a passar por M8 e pelos transístores do par diferencial, carregando assim os
nós vDN e vDP . Quando o vGS do M5a ou M5b passa a ser maior que a tensão de limiar, Vt, estes
começam a conduzir descarregando assim os nós de saída. Com os transístores M5 em condução, os
transístores M6 e M3 formam um par de inversores, ligados costas com costas, implementando assim
uma realimentação positiva.
Assumindo que a tensão de entrada é positiva (vIP>vIN ), o nó de saída vON irá começar a descar-
regar antes de vOP , uma vez que vDP atinge o Vt do M5b antes do vDN , atingir o Vt de M5a. Dado que
vOP está ligado à porta de M6b e M3b, o aumento da tensão fará com que o transístor PMOS conduza
menos e o NMOS mais. A realimentação positiva, utilizando inversores costas com costas, faz com que
a saída do comparador transite rapidamente para o estado final: vOP a Vdd e vON a zero. Esta fase é
chamada de regeneração e está ilustrada na Fig. 3.8.
41
3. Blocos Analógicos
Figura 3.7: Parte do circuito elétrico do comparador dinâmico desenvolvido neste trabalho.
Figura 3.8: Tensões de saída do comparador para vIP >vIN [5].
42
3.4 Comparador
Na Fig. 3.9 pode observar-se a simulação das tensões de saída do comparador.
Figura 3.9: Simulação das tensões de saída do comparador.
Como foi referido na secção anterior, o ruído referido à entrada do comparador tem que ser inferior
a 34µV . Para obter este valor iremos recorrer a uma decisão por maioria, assim sendo o comparador é
dimensionado de modo a que o ruído referido à entrada seja inferior a 100µV .
O ruído do comparador é dominado pela contribuição do primeiro andar. Isto acontece porque, M1 e
CD formam um integrador com ganho maior do que 1, que reduz o ruído, referido à entrada, gerado pelo
andar de regeneração (M3 – M6). Assim, o ruído produzido pelo segundo andar do comparador será
ignorado e só o ruído gerado pelo primeiro andar será contabilizado. Considerando que o ruído produ-
zido por M1a e M1b é apenas ruído térmico, a densidade espectral de potência do ruído na corrente de
dreno nos transístores MOS na saturação é dado por [9]
i2n = 4kTγgm, (3.18)
onde k é a constante de Boltzmann, T a temperatura em Kelvin, γ ≈ 1 para transístores de canal curto
e gm é a transcondutância do transístor. De acordo com [10] o ruído referido à entrada do primeiro
andar do comparador é dado por
(v2COMP
)2≈ 4kT
1
Vt1CD
IM1
gm1, (3.19)
onde IM1 é a corrente que passa em cada transístor (M1a e M1b), gm1 é a transcondutância dos mes-
mos transístores, CD é a capacidade nos nós VDP e VDN e Vt1 é a tensão necessária para ligar os
transístores M1.
Considerando que os transístores estão na inversão forte a transcondutância de M1 é dada por
gm1 =2IM1
VOVD. (3.20)
Substituindo (3.20) em (3.19), a capacidade é dada por
(v2COMP
)2≈ 4kT
1
Vt1CD
IM1
2IM1
VOVD
(3.21)
⇔(v2COMP
)2≈ 2kT
VOVDVt1CD
(3.22)
43
3. Blocos Analógicos
pelo que
CD =2kT(
v2COMP
)2 VOVDVt1, (3.23)
tendo em conta a expressão anterior e dado que VOVD = 0, 2V e v2COMP = 100µV o condensador
CD = 636, 9fF .
Este condensador foi implementado usando um dispositivo MOS, onde a capacidade é dada por
(3.17) sendo o Cox = Cox_fino = 14, 2[fF/µm2
]e assim o condensador fica com W = 44, 9µm e
L = 10µm.
De modo a obter o ruído referido à entrada do comparador foi feita uma simulação transient noise no
HSPICE com 1000 decisões do comparador com um sinal de entrada constante e igual a 1 mV. Assim,
o ruído referido à entrada é dado por
σ =√E[X2]− E[X]2 ⇔ v2COMP sim =
√(∆VDP,DN_RMS)
2 −(∆VDP,DN
)2A
, (3.24)
onde A representa o ganho.
Uma vez que o comparador é um sistema linear variante no tempo, assim foi necessário escolher
um instante para obter esse ganho. Assim instante escolhido foi o início da fase de regeneração e foi
amostrado 1000 vezes.
Na Fig. 3.10 observa-se o ruído do comparador.
Figura 3.10: simulação do ruído do comparador.
Por simulação, observou-se que v2COMP sim = 102, 2µV e assim opta-se por fazer uma decisão por
maioria. Deste modo são efetuadas 7 decisões no comparador e de seguida uma decisão por maioria
de modo a baixar o ruído do comparador. Assim, tem-se que o ruído referido à entrada do comparador
com várias decisões é dado por
v2COMPTOTAL=
√√√√√Ncomp
(v2COMP
)2N2comp
, (3.25)
onde Ncomp é o número de decisões feitas pelo comparador.
De (3.25), sabendo que foram feitas 7 comparações, tem-se que v2COMPTOTALsim= 38, 7µV .
44
3.4 Comparador
Por simulação, Fig. 3.11 pode observar-se do ruído do comparador, contabilizando com o circuito
de amostragem, e com o comparador apenas a fazer uma decisão.
Figura 3.11: Simulação do ruído do comparador com circuito de amostragem.
Observa-se que v2dif sim = 102, 4µV e que no final, com o circuito de amostragem e o comparador,
fica-se então com
v2TOTAL =
√(v2compsim
)2+(v2dif sim
)2=√
38, 7µ2 + 102, 39µ2 = 109, 4µV. (3.26)
3.4.1 Calibração da tensão de desvio
Como já foi referido, o comparador tem uma tensão de desvio inerente, devido ao fato de haver erros
aleatórios no processo de fabrico dos transístores. Um método para minimizar essa tensão de desvio
do comparador é apresentado na Fig. 3.12.
Figura 3.12: Esquema de calibração da tensão de desvio [5].
Adicionalmente ao par diferencial principal, com a transcondutância, gm1 (que corresponde ao par
diferencial M1 da Fig. 3.7), existe um par diferencial auxiliar, gm2, cuja tensão de entrada é guardada
pelo condensador CS . A malha de retroação composta pelo comparador, o par diferencial auxiliar e
os condensadores comutados, ajustam a tensão de calibração, vCAL, de modo a cancelar a tensão
45
3. Blocos Analógicos
de desvio. VOS1, VOS2 e VOSl são as tensões de desvio do par diferencial principal, auxiliar e do
comparador, respetivamente.
Em funcionamento normal S1 está ligado, e a tensão de entrada é aplicada ao par diferencial prin-
cipal. Durante a calibração, S2 curto circuita a entrada de gm1 para a massa, o que amplifica a sua
própria tensão de desvio e assim
vOA = −gm1R0VOS1, (3.27)
assumindo que i2 = 0.
Se o comparador for ligado neste instante, irá decidir 1 se −gm1R0VOS1 > VOSl e 0 caso con-
trário. Assim, esta decisão é determinada pela tensão de desvio do comparador, juntamente com o
pré-amplificador.
De seguida, o bloco Selection_Logic (que será explicado no Capítulo 5 deste documento), seleciona
a tensão de calibração a aplicar na entrada do par diferencial auxiliar, tendo em conta a decisão do
comparador. Este ajuste é feito carregando CP , que corresponde à capacidade parasita desse nó, com
VMAX ou VMIN , dependendo da decisão do comparador. De seguida CP é ligado a CS por S3. Uma
vez que CS é muito maior que CP , vCAL é ajustado em passos pequenos. O ciclo repete-se até que a
decisão do comparador seja contrária às decisões tomadas anteriormente, ficando assim a calibração
da tensão de desvio concluída.
Quando vOA está acima do limiar de decisão do comparador, este decide 1, carregando CP com
VMAX e aumentando a tensão de calibração, reduzindo assim, a tensão vOA em relação a VOSl. Com
isto, a tensão de calibração é ajustada de modo a que o comparador esteja no limiar de decisão quando
a tensão de entrada do pré-amplificador, gm1, é zero (situação forçada no inicio da calibração). A tensão
de calibração quando esta situação ocorre é VCALopt.
Analisando o circuito, as expressões da variação da tensão no nó vCAL são dadas por
vCAL+[n] = vCAL[n− 1] + (VMAX − vCAL[n− 1])CP
CP + CS, (3.28)
vCAL−[n] = vCAL[n− 1] + (VMIN − vCAL[n− 1])CP
CP + CS. (3.29)
Considerando a condição inicial vCAL[0] = 0, o primeiro passo da calibração pode ser escrito
∆vCALinicial =
(VMAX −
VMAX − VMIN
2
)CP
CP + CS, (3.30)
que é valido até vCAL atingir o seu limite, vCALopt.
A calibração da tensão de desvio, neste trabalho, é implementada de modo a que, quando vOA está
no limiar de decisão do comparador, e o comparador toma uma decisão oposta às anteriores, o bloco
Selection_Logic bloqueia o circuito nesse estado, ficando assim, uma tensão de desvio residual, que
no máximo é dado por
VOSmax = ±gm2
gm1
(VMAX −
VMAX − VMIN
2
)CP
CP + CS. (3.31)
46
3.4 Comparador
Uma vez que, a tensão de desvio depois da calibração é armazenada no condensador e este, ao
longo do tempo perde a sua carga devido às correntes de fuga, é necessário recalibrar a tensão de
desvio. Deste modo, optou-se por fazer esta calibração a cada duas fontes comparadas.
Colocando a transcondutância do par diferencial auxiliar gm2 = gm1
5 , com VMAX = 100mV e VMIN =
−100mV e para obter uma tensão de desvio máxima do comparador inferior a 100uV , a capacidade CS
tem que ser dimensionada de modo a verificar-se
CP ≈CS800
. (3.32)
Este condensador foi implementado usando um dispositivo MOS, onde a capacidade é dada por
(3.17) e na Fig. 3.13 é identificado como CSP e CSN .
Na Fig. 3.13 é apresentado a implementação do circuito de calibração da tensão de desvio, inte-
grado com o circuito do comparador dinâmico.
Figura 3.13: Circuito do comparador juntamente com o circuito de calibração da tensão de desvio.
Os transístores M2 formam o par diferencial auxiliar, representado na Fig. 3.12 como gm2, e os
transístores M1,o primeiro andar do comparador, formam o par diferencial principal, que na Fig. 3.12
corresponde a gm1. Comparando a Fig. 3.13 com a Fig. 3.12 pode observar-se que não existe S1 nem
S2. Isto é feito para calibrar também os desemparelhamentos na injeção de carga dos interruptores
dphsw1 e dphsw2 representados na Fig. 3.3.
De modo a verificar a calibração, efetuou-se uma primeira simulação de montecarlo e mediu-se a
tensão de desvio em cada run com a calibração desligada. De seguida, calculou-se o desvio padrão
das tensões de desvio (σ) e numa outra simulação foi forçado no comparador uma tensão de desvio
com um desvio padrão de 6σ. Deste modo, pretende-se colocar uma tensão de desvio de pior caso
47
3. Blocos Analógicos
(6 vezes maior) e garantir que a calibração a consegue minimizar. Das simulações de montecarlo
obteve-se desvio padrão das tensões de desvio σ = 2, 8mV , assim foi forçado uma tensão de desvio de
16, 8mV no comparador e, ajustando VMAX e VMIN , bem como a relação entre gm1 e gm2 garante-se a
calibração. Depois de ajustado VMAX = 450mV , VMIN = 350mV e gm2 = gm1
5 , obteve-se a simulação
pode ser visualizada na Fig. 3.14.
Figura 3.14: Evolução da tensão diferencial de calibração da tensão de desvio.
Na Fig. 3.15 pode verificar-se que a tensão de desvio depois da calibração é no máximo 27, 7uV ,
isto porque, no último incremento o comparador tem uma decisão contrária às anteriores e logo o limiar
de decisão está entre os 27, 7uV do último incremento.
Figura 3.15: Zoom na simulação anterior para verificar a tensão de desvio do comparador depois da calibração da tensão dedesvio.
48
4Blocos Digitais e Simulações
Contents4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2 Máquina de Estados que Controla o Circuito de Amostragem . . . . . . . . . . . . . 51
4.3 Máquina de Estados de Controlo da Calibração da Tensão de Desvio . . . . . . . . . 53
4.4 Controlo das Fontes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.5 Algoritmo de Calibração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
49
4. Blocos Digitais e Simulações
50
4.1 Introdução
4.1 Introdução
Neste capítulo são apresentados os blocos digitais necessários ao funcionamento do DAC, nomea-
damente máquinas de estado, circuitos de controlo e o bloco digital onde será implementado o algoritmo
de calibração.
As máquinas de estados implementadas são máquinas de Moore e são utilizadas para gerar as
diferentes fases que controlam dos interruptores de amostragem das fontes no comparador, bem como
para a controlar a calibração da tensão de desvio do comparador.
Foi também necessário implementar um circuito de controlo de modo a discernir a seleção de fontes
em modo de calibração e em funcionamento normal.
Por fim será apresentado o bloco digital onde está implementado o algoritmo de calibração e o
restante código necessário para que o conversor funcione normalmente depois da calibração. Neste
capítulo também é possível visualizar as simulações efetuadas ao DAC.
4.2 Máquina de Estados que Controla o Circuito de Amostragem
Como já foi referido no capítulo anterior, e pode ser visualizado na Fig. 3.3, as fontes de corrente
são direcionadas para o comparador através de um único condutor. Por esse motivo, antes do com-
parador existe um circuito de amostragem onde, a tensão correspondente à fonte I1 é armazenada no
condensador C1 e a tensão correspondente à fonte I2 é armazenada no condensador C2. Por fim o
comparador toma uma decisão com base nas duas tensões armazenas nos respetivos condensadores.
É necessário uma máquina de estados que gere as fases que controlam os interruptores das fontes
de corrente, ph1 e ph2, bem como, as fases que controlam os interruptores antes dos condensadores,
dphsw1 e dphsw2, ilustrado na Fig. 3.3. Na Fig. 4.1 pode visualizar-se o fluxograma da máquina de
estados.
Inicialização
(000)
Carrega C1
com I1
(001)
Carrega C2
com I1
(010)
Calibração
Offset
(011)
Carrega C1
com I1
(100)
Carrega C2
com I2
(101)
Comparação
(110)
Carrega C1
com I2
(111)
OffsetOK=1
Sim
Não
Figura 4.1: Fluxograma da amostragem no comparador.
51
4. Blocos Digitais e Simulações
Esta máquina de estados tem uma entrada de relógio (clk), uma entrada de enable (enable) e outra
que fica ativa quando a calibração da tensão de desvio do comparador estiver concluída (offsetOK).
Quanto a saídas, existe um sinal para controlar os interruptores cada fonte de corrente (dphsw1 e
dphsw2), um sinal para controlar os interruptores antes dos condensadores (ph1 e ph2), um sinal para
ativar a comparação (latch) e outro para ativar a calibração da tensão de desvio (offset_cal), como se
pode observar na Fig. 3.3.
Antes do comparador começar a comparar as diversas fontes de corrente, é necessário efetuar
a calibração da tensão de desvio do comparador de modo a minimizar os erros de comparação. Para
isso liga-se uma das fontes, neste caso a fonte I1, e carrega-se ambos os condensadores com a tensão
correspondente à fonte I1, estados (001) e (010). De seguida tem-se o estado (011), onde se efetua a
calibração da tensão de desvio do comparador ativando a saída (offset_cal). A máquina de estados não
avança enquanto a calibração não estiver concluída, ou seja, enquanto a entrada (offsetOK) não estiver
ativa. Uma vez ativa, a calibração da tensão de desvio está concluída e pode iniciar-se a comparação
das diversas fontes.
No estado (100), para que seja guardado o valor correto da fonte de corrente no condensador, em
primeiro lugar é ligada a fonte de corrente, espera-se o tempo de estabelecimento da fonte. Trata-se
de um intervalo de tempo reduzido, só para que não haja oscilações quando se liga o condensador,
pois este, juntamente com a resistência, tem uma constante de tempo grande, 10ns. No final acontece
o mesmo, o condensador é desligado e só depois se desliga a fonte, para que não seja guardado no
condensador um valor errado, devido à fonte estar a comutar. No estado (101), passa-se exatamente a
mesma coisa mas para a fonte I2.
Uma vez carregadas as tensões das fontes nos respetivos condensadores é feita a comparação,
estado (110), ativando o sinal ’latch’.
No próximo ciclo de relógio (111), a tensão na resistência, gerada por I2, é colocada no C1, de
modo a ficarem os dois condensadores com o mesmo potencial, visto que no condensador C2 já tinha a
tensão correspondente à fonte I2, e faz-se novamente a calibração da tensão de desvio do comparador.
É necessário fazer novamente a calibração da tensão de desvio pois o condensador que armazena o
valor residual da tensão de desvio perde o seu valor com o passar do tempo devido a correntes de fuga.
Entretanto, no bloco digital, são selecionadas duas novas fontes para serem comparadas e de seguida
começa um novo ciclo assim que o sinal (offsetOK) vem ativo.
A máquina de estados implementa este ciclo até que seja concluído o algoritmo de calibração.
Na Tab. 4.1 pode-se observar a tabela de verdade desta máquina de estados.
Recorrendo aos mapas de Karnaugh obtêm-se as seguintes equações lógicas
52
4.3 Máquina de Estados de Controlo da Calibração da Tensão de Desvio
Estado Actual Estado SeguinteEstado Saídas OffsetOK=0 OffsetOK=1
Qa Qb Qc latch ph1 ph2 dphsw1 dphsw2 offset_cal Qa Qb Qc Qa Qb Qc
0 0 0 0 0 0 0 0 0 0 0 1 0 0 10 0 1 0 1 0 0 1 0 0 1 0 0 1 00 1 0 0 0 1 0 1 0 0 1 1 0 1 10 1 1 0 0 0 1 0 1 0 1 1 1 0 01 0 0 0 1 0 0 1 0 1 0 1 1 0 11 0 1 0 0 1 1 0 0 1 1 0 1 1 01 1 0 1 0 0 1 0 0 1 1 1 1 1 11 1 1 0 1 0 1 0 0 0 1 1 0 1 1
Tabela 4.1: Tabela de verdade para a máquina de estados da amostragem do comparador.
Da = QaQb +QaQbQc + OffsetOKQaQbQc, (4.1)
Db = QbQc +QaQc +QbQc + OffsetOKQbQc, (4.2)
Dc = QbQc +QbQc +QaQb + OffsetOKQbQc, (4.3)
latch = QaQbQc, (4.4)
ph1 = QaQbQc +QaQbQc +QaQbQc, (4.5)
ph2 = QaQbQc +QaQbQc, (4.6)
dphsw1 = QaQc +QaQb +QbQc, (4.7)
dphsw2 = QaQbQc +QaQbQc +QaQbQc, (4.8)
offset_cal = QaQbQc, (4.9)
onde Da, Db e Dc representa a entrada dos flip-flops.
Simplificando as equações lógicas obtém-se o circuito apresentado na Fig. 4.2.
Na Fig. 4.3 pode visualizar-se a simulação do circuito anterior.
4.3 Máquina de Estados de Controlo da Calibração da Tensão deDesvio
O comparador tem uma tensão de desvio inerente que pode resultar em decisões erradas, e que é
necessário minimizar. Com este intuito utilizou-se o circuito apresentado na Fig. 3.12 que necessita de
uma máquina de estados para controlar os diversos sinais. Esta máquina de estados está representada
na Fig. 3.12 com o bloco Selection_Logic, onde S4 e S5 corresponde a posvos e negvos respetivamente,
e S3 corresponde a phchrg na Tab. 4.2. Na Fig. 4.4 pode visualizar-se o fluxograma da máquina de
estados de calibração da tensão de desvio do comparador.
A máquina de estados tem uma entrada de relógio (clk) e uma entrada para iniciar a calibração
(offsetcal), que vem da máquina de estados descrita na secção anterior, e duas entradas com a decisão
do comparador (q e qz). Quanto a saídas, o sistema tem um sinal que liga uma tensão positiva em Cp
(posvos), Fig. 3.13, um sinal que liga uma tensão negativa Cp (negvos), um sinal que liga Cp ao Cs
53
4. Blocos Digitais e Simulações
Figura 4.2: Circuito da máquina de estados da amostragem do comparador.
54
4.3 Máquina de Estados de Controlo da Calibração da Tensão de Desvio
Figura 4.3: Simulação da máquina de estados da amostragem do comparador.
Comparação
(000)
Decisão?Carrega Cp
(001)
Carrega Cp
(010)
Liga Cp a Cs
(011)
Liga Cp a Cs
(100)
Comparação
(101)
Comparação
(110)
Alterou? Alterou?Cal. OK
(111)
NãoNão
0 1
Sim Sim
Figura 4.4: Fluxograma da calibração de offset do comparador.
55
4. Blocos Digitais e Simulações
(phchrg) de modo a que seja adicionada em Cs a tensão de Cp, um sinal para o comparador decidir
(latch) e por fim um sinal que indica que a calibração está concluída (cal_ok).
Apresentados os sinais, na Tab. 4.2 pode observar-se a tabela de verdade desta máquina de esta-
dos. A tabela apresentada quando a (offsetcal) está ativa.
Estado Actual Estado SeguinteEstado Saídas Bvos=0 Bvos=1
Qa Qb Qc posvos negvos phchrg cal_ok latch Qa Qb Qc Qa Qb Qc
0 0 0 0 0 0 0 1 0 0 1 0 1 00 0 1 0 1 0 0 0 0 1 1 0 1 10 1 0 1 0 0 0 0 1 0 0 1 0 00 1 1 0 0 1 0 0 1 0 1 1 0 11 0 0 0 0 1 0 0 1 1 0 1 1 01 0 1 0 0 0 0 1 0 0 1 1 1 11 1 0 0 0 0 0 1 1 1 1 0 1 01 1 1 0 0 0 1 0 1 1 1 1 1 1
Tabela 4.2: Tabela de verdade para a máquina de estados da Calibração da tensão de desvio do comparador.
Inicialmente é colocada a mesma tensão aos terminais do comparador, o sinal (offsetcal) é ativo
e entramos no estado (000). Neste estado ativa-se o sinal (latch) e o comparador faz uma decisão.
Dependendo da decisão tomada pelo comparador é colocada uma tensão positiva ou negativa no con-
densador Cp.
Observando a Fig. 3.12, e tomando como exemplo o comparador decidir 1, a máquina de estados
passa ao estado (010) onde coloca uma tensão VMAX em Cp. No próximo ciclo de relógio o sinal
(phchrg) é ativado (100), ligando o Cp ao Cs através do interruptor S3, incrementando assim a tensão
carregada em Cs.
De seguida, no estado (110), é feita uma nova comparação e, se a decisão do comparador for igual à
decisão anterior, processo repete-se e volta-se a colocar VMAX em Cp. Isto acontece até que a decisão
seja diferente da anterior, neste caso a máquina de estados passa ao estado (111) onde ativa o sinal
(cal_ok) e termina o processo.
Recorrendo aos mapas de Karnaugh obtêm-se as seguintes equações lógicas:
Da = QbQc +BvosQaQb +BvosQaQc +QaQbQc, (4.10)
Db = BvosQb +QaQb +QaQc +QaQbQc, (4.11)
Dc = Qc +BvosQaQb +BvosQaQb, (4.12)
posvos = offsetcal(QaQbQc
), (4.13)
negvos = offsetcal(QaQbQc
), (4.14)
phchrg = offsetcal(QaQbQc +QaQbQc
), (4.15)
cal_ok = offsetcal (QaQbQc) , (4.16)
latch = offsetcal(QaQbQc +QaQbQc +QaQbQc
), (4.17)
(4.18)
56
4.4 Controlo das Fontes
onde o Bvos é um sinal gerado a partir da decisão do comparador e a decisão anterior e Da, Db e Dc
são as entradas dos flip-flops da máquina de estados. Na Tab. 4.3 é apresentada a tabela de verdade
para este sinal.
Estado Actual Estado SeguinteQd q qz Bvos0 0 0 X0 0 1 00 1 0 10 1 1 01 0 0 X1 0 1 01 1 0 11 1 1 1
Tabela 4.3: Tabela de verdade para gerar o Bvos.
E obtém-se
Bvos = q (qz +Qd) . (4.19)
Simplificando as equações lógicas obtém-se o circuito apresentado na Fig. 4.5.
Na Fig. 4.6 pode observar-se a simulação desta máquina de estados.
Na Fig. 4.7 pode observar-se a simulação das duas máquinas de estado simultaneamente a funci-
onar.
4.4 Controlo das Fontes
Quando o DAC está em funcionamento normal o controlo das fontes é feito através do bloco digital
onde está implementado o algoritmo de calibração. Quando o DAC está em calibração o algoritmo
de ordenação indica quais a fontes para o comparador fazer a comparação e a máquina de estados
apresentada na secção 4.2 gere as fases do circuito apresentado na Fig. 3.3. Deste modo é necessário
uma interface que controle dada uma das fontes para os dois modos de funcionamento: Normal e
Calibração. Esta interface é apresentada nesta secção.
O bloco controlo das fontes recebe do bloco digital os sinais: alg, dig, dig1, dig2. Em que ’ alg’ fica
ativo quando o algoritmo de calibração começa, ’dig1’ e ’dig2’ são as fontes selecionadas pelo algoritmo
para serem comparados e ’dig’ seleciona as fontes em funcionamento normal.
Da máquina de estados recebe os sinais: cs1 e cs2. Este sinais controlam as fontes indicadas por
’dig1’ e ’dig2’.
As saídas são: calibração e normal. Estes sinais controlam as fontes em calibração e funcionamento
normal, respetivamente, e ao ramo de interruptores respetivo.
Na Tab. 4.4 é apresentada a tabela de verdade para estes sinais.
De salientar que existe um bloco para cada uma das fontes de corrente. Assim analisando a Tab.
4.4 pode observar-se que quando está na fase de calibração (alg=1) a saída fica ativa (calibracao=1)
quando o digital seleciona a primeira fonte para comparação (dig1=1) e a máquina de estados também
57
4. Blocos Digitais e Simulações
Figura 4.5: Circuito da máquina de estados da calibração da tensão de desvio do comparador.
58
4.4 Controlo das Fontes
Figura 4.6: Simulação da máquina de estados da calibração da tensão de desvio do comparador.
Figura 4.7: Simulação das duas máquinas de estado simultaneamente a funcionar.
59
4. Blocos Digitais e Simulações
alg dig1 dig2 cs1 cs2 calibracao normal0 X X X X 0 01 0 0 0 0 0 11 0 0 0 1 0 11 0 0 1 0 0 11 0 0 1 1 0 11 0 1 0 0 0 01 0 1 0 1 1 01 0 1 1 0 0 01 0 1 1 1 1 01 1 0 0 0 0 01 1 0 0 1 0 01 1 0 1 0 1 01 1 0 1 1 1 01 1 1 0 0 0 01 1 1 0 1 0 01 1 1 1 0 0 01 1 1 1 1 0 0
Tabela 4.4: Tabela de verdade para o controlo das fontes de corrente em calibração e funcionamento normal.
seleciona a primeira fonte para comparação (cs1=1) ou quando o digital seleciona a segunda fonte para
comparação (dig2=1) e a máquina de estados também seleciona a segunda fonte para comparação
(cs2=1). Estes dois pares de sinais (dig1/cs1 e dig2/cs2) nunca estão ativos em simultâneo para a
mesma fonte. Quando estamos em funcionamento normal a saída fica ativa (normal=1) quando o
digital seleciona uma fonte em modo normal (dig=1), não representado na tabela, ou quando (dig1=0 e
dig2=0) de modo a que a fonte nunca se desligue.
Recorrendo aos mapas de Karnaugh obtêm-se as seguintes equações,
calibracao = alg.dig1.dig2.cs1 + alg.dig1.dig2.cs2, (4.20)
normal = alg.dig + alg.dig1.dig2. (4.21)
(4.22)
Após simplificação das equações o circuito é apresentado na Fig. 4.8.
4.5 Algoritmo de Calibração
O algoritmo de calibração pode ser dividido em duas partes, a ordenação das fontes e o esquema
de comutação das fontes.
Para a ordenação das fontes foram considerados vários algoritmos, tendo-se excluído à partida
algoritmos do tipo recursivos e do tipo "divisão e conquista"por não ser possível implementar recursi-
vidade em Verilog-A. Assim, foram só considerados algoritmos de ordenação sequenciais: Selection
Sort ; Insertion Sort ; e Bubble Sort [6].
60
4.5 Algoritmo de Calibração
Figura 4.8: circuito que controla as fontes de corrente em calibração e funcionamento normal.
O Bubble Sort foi descartado por ser o que necessita de fazer mais comparações[6]. O Selection
Sort e o Insertion Sort são semelhantes quanto ao número de comparações[6]. Neste trabalho foi
utilizado o selection sort por ser mais simples de implementar em Verilog-A.
O selection sort funciona da seguinte forma, inicialmente considera que a primeira posição do vetor
é o mínimo, sendo este guardado num registo auxiliar. Fixando a primeira posição do vetor, o algoritmo
percorre o restante vetor comparando cada posição com o registo auxiliar, sendo esse registo atualizado
sempre que for detetado um valor inferior ao anteriormente guardado. Quando chegar ao fim do vetor,
no registo auxiliar está guardado a posição do mínimo no vetor. Caso o mínimo seja diferente do valor
na primeira posição do vetor, troca de posição com o primeiro elemento do vetor. Passa para a segunda
posição e percorre o vetor a partir daí até encontrar o mínimo e troca-o com a segunda posição e assim
sucessivamente até chegar à penúltima posição do vetor.
Uma vez ordenadas as fontes é aplicado um esquema de comutação a este vetor ordenado. Este
esquema de comutação é o abordado e explicado na secção 2.5.1.
O algoritmo de calibração foi implementado em Verilog-A e pode ser consultado na integra no Apên-
dice A.
Uma vez concluída a implementação dos blocos, fez-se uma simulação de montecarlo de modo a
posteriormente se poder observar os resultados com calibração. A simulação consiste em colocar à
entrada do DAC uma rampa digital e, sem calibração, observar o resultado na saída do conversor. De
seguida liga-se a calibração e observa-se novamente o resultado na saída.
Na Fig. 4.9 e na Tab. 4.5 pode observar-se o resultado da ordenação as fontes de corrente.
61
4. Blocos Digitais e Simulações
39,0E-06
39,2E-06
39,4E-06
39,6E-06
39,8E-06
40,0E-06
40,2E-06
40,4E-06
40,6E-06
40,8E-06
41,0E-06
0 20 40 60 80
Co
rre
nte
[A
]
Fonte de Corrente
Fontes Fontes Ordenadas
Figura 4.9: Ordenação das fontes de corrente.
Índice Corrente (A)68 39,1108E-0634 39,4314E-0644 39,4956E-065 39,5020E-06
74 39,5121E-0667 39,5140E-0659 39,5495E-0637 39,5688E-06... ...
Tabela 4.5: Excerto das fontes de corrente ordenadas pelo algoritmo de calibração.
Na Fig. 4.10 pode observar-se parte da simulação onde são ordenadas as fontes e onde pode-se
visualizar o correto funcionamento do algoritmo.
A calibração compara o idig1<mínimo> com todas as posições de idig2. Assim, depois de percorrer
o vetor de fontes de corrente, a calibração selecionou a fonte de corrente 68 como mínimo (idig1<68>),
percorrendo o vetor uma segunda vez selecionou a fonte 34 (idig1<34>) e de seguida, percorrendo o
vector pela terceira vez, selecionou a 44 (idig1<44>).
Calculando uma INL com os resultados obtidos da rampa de saída observa-se, na Fig. 4.11, que
sem calibração tem-se uma INL = 2, 4LSB e DNL = 1, 5LSB.
Ligando então a calibração, para as mesmas fontes de corrente e nas mesmas condições obtém-se
os resultados apresentados na Fig. 4.12.
Observa-se que com a calibração a INL = 1, 1LSB e DNL = 0, 77LSB ficando assim muito
próximo das especificações.
62
4.5 Algoritmo de Calibração
Figura 4.10: Parte da Simulação do algoritmo de calibração.
Figura 4.11: INL e DNL do DAC sem calibração.
63
4. Blocos Digitais e Simulações
Figura 4.12: INL e DNL do DAC com calibração.
64
5Conclusões
Contents5.1 Sumário e conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.2 Trabalho Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
65
5. Conclusões
5.1 Sumário e conclusões
Nesta dissertação foi projetado um conversor digital-analógico de 12 bits calibrado para comuni-
cações numa tecnologia de 40nm, alimentado a 1,8V/1,1V ±10%, com frequência de funcionamento
fs=320MHz, tensão máxima de saída VFS=0,5V e com INL=1LSB e DNL=1LSB no máximo.
No capítulo 2 foram apresentados alguns conceitos básicos no que diz respeito a DACs, bem como
algumas medidas de desempenho quer estáticas quer dinâmicas. Foram também apresentadas al-
gumas arquiteturas de DACs e foi introduzido o conceito de segmentação. A arquitetura apresentada
neste trabalho foi uma arquitetura em current steering segmentada, com 6 bits em termómetro e 6 bits
em binário, tendo um bloco digital onde foi implementado o algoritmo de calibração. O algoritmo de ca-
libração ordenas as 75 fontes de corrente (63 + 12 fontes extra), e de seguida foi aplicada a sequência
de comutação. Foi feita uma análise das sequências de comutação onde se introduziu uma sequência
inovadora e melhor para sistemas de comunicação baseados em sinais OFDM. Neste capítulo também
foram feitos vários estudos, através de um modelo Matlab, de modo a obter as especificações para
os diferentes circuitos que foram implementados neste trabalho, nomeadamente o comparador e fonte
de corrente. Fez-se também uma comparação entre o DAC sem calibração e um DAC com calibração
usando o modelo matlab e observa-se que com a calibração os resultados em termos de INL e DNL são
muito melhores permitindo assim uma redução significativa na área do transístor da fonte de corrente.
Ainda neste capítulo foi feito um levantamento de alguns dos trabalho já implementados.
O capítulo 3 começou com o dimensionamento da célula da fonte de um DAC sem calibração, isto
para saber, no final, qual melhoria obtida. De seguida fizeram-se as alterações à célula da fonte de
corrente que são necessárias à calibração. Posto isto foi dimensionado o transístor da fonte de corrente
visto que o resto se mantém ou é uma réplica. Com esta implementação é possível diminuir o tamanho
do transístor da fonte de corrente em 34,6 vezes a área inicial. Depois disso foi descrito o dimensiona-
mento o bloco de amostragem tendo em conta a especificação do ruído. De seguida foi dimensionado o
comparador dinâmico tendo em conta a especificação de ruído obtida do modelo e foi apresentada uma
forma para cancelar a tensão de desvio, originária do desemparelhamento dos transístores, de modo a
cumprir as especificações. No final foram feitas algumas simulações em HSPICE onde se mostra que
os blocos ficaram a cumprir as especificações.
No capítulo 4 foram apresentados alguns blocos digitais que foi necessário implementar de modo
a controlar as diversas fases que controlam os diversos interruptores quer do bloco de amostragem
quer do bloco de calibração da tensão de desvio do comparador. Em primeiro lugar foi implementada a
máquina de estados que controla a medição das fontes de corrente. De seguida a máquina de estados
que controla a calibração da tensão de desvio. Foi apresentado um circuito que controla as fontes de
corrente quando estas estão em calibração ou quando estão em funcionamento normal. Foi também
explicado como funciona o algoritmo de calibração implementado em verilog-A, cuja listagem pode
ser consultado no anexo A. Por fim, foram apresentadas algumas simulações que mostram o correto
funcionamento das máquinas de estado bem como do algoritmo de calibração. Mostra-se também
66
5.2 Trabalho Futuro
neste capítulo que com a calibração a INL passa de 2,4LSB para 1,1LSB e a DNL passa de 1,5LSB
para 0,77 LSB, para as mesmas condições de simulação.
O conversor digital-analógico proposto foi desenvolvido nas instalações da Synopsys, Inc. Lisboa,
Portugal.
5.2 Trabalho Futuro
Este trabalho abordou um novo método de calibração introduzido num DAC já existente com o obje-
tivo de reduzir a área do mesmo. Contudo, ainda muito pode ser feito para complementar o que foi aqui
apresentado e melhorar o seu desempenho. Alguns aspetos neste trabalho não foram completamente
explorados principalmente devido ao tempo disponível:
• Efetuar a calibração as fontes de corrente menos significativas uma vez que, com a calibração, o
erro das fontes de corrente termómetro é anulado.
• Implementar o algoritmo em Verilog de modo a obter o bloco digital real para assim ser possível
contabilizar com a sua área e perceber qual será na realidade a a redução na área total.
• Este trabalho incidiu principalmente no comportamento estático do DAC. É necessário perceber
qual o efeito das alterações efetuadas, no comportamento dinâmico do conversor.
• O layout do DAC deveria ser implementado e a vista extraída deveria ser simulada de modo a
verificar se continua a garantir as especificações.
• Por fim, o objetivo máximo seria implementar o DAC no silício e testar o mesmo.
67
5. Conclusões
68
Bibliografia
[1] Bosch, Anne Van den and Steyaert, Michiel and Sansen, Willy, Static and Dynamic Performance
Limitations for High Speed D/A Converters. Springer Science+Business Media, LLC, 2004.
[2] Carusone, Tony Chan and Johns, David A. and Martin, Kenneth W., Analog Integrated Circuit
Design. John Wiley & Sons, Inc., 2011.
[3] Lin, Chi-Hung and Bult, Klaas, “A 10-bit, 500-MSamples/s CMOS DAC in 0.6 mm2,” IEEE J. Solid-
State Circuits, vol. 33, pp. 1948–1958, December 1998.
[4] Chen, Tao and Gielen, Georges G. E., “A 14-bit 200-MHz current-steering DAC with switching-
sequence post-adjustment calibration,” IEEE J. Solid-State Circuits, vol. 42, pp. 2386–2394, No-
vember 2007.
[5] Figueiredo, Pedro M. and Vital, João C., Offset Reduction Techniques in Highspeed Analog-to-
Digital Converters. Springer Science+Business Media, LLC, 2009.
[6] Sedgewich, Robert, Algorithms in C. Addison-Wesley Publishing Company, Inc., 2006.
[7] Pelgrom, Marcel J. M. and Duinmaijer, AAD C. J. and Welbers, Anton P. G., “Matching properties of
MOS transistors,” IEEE J. Solid-State Circuits, vol. 24, pp. 1433–1440, October 1989.
[8] Manganaro, Gabriele, Advanced Data Converters. Cambridge University Press, 2011.
[9] Razavi, Behzad, Design of Analog CMOS Integrated Circuits. McGraw-Hill, 2001.
[10] Van Elzakker, Michiel and all, “A 10-bit charge-redistribution ADC consuming 1.9 µW at 1MS/s,”
IEEE J. Solid-State Circuits, vol. 45, pp. 1007–1015, May 2010.
[11] Bugeja, Alex R. and Song,Bang-Sup, “A self-trimming 14b 100MSamples/s CMOS DAC,” IEEE J.
Solid-State Circuits, vol. 35, pp. 1841–1852, December 2000.
[12] Van der Plas, Geert A. M. and Vandenbusshe, Jan and Sansen, Willy and Steyaert, Michael S.
J. and Gielen, Georges G. E., “A 14-bit intrinsic accuracy Q2 random walk CMOS DAC,” IEEE J.
Solid-State Circuits, vol. 34, pp. 1708–1718, December 1999.
[13] Schofield, W. and Mercer, D. and Onge, L. St., “A 16b 400MS/s DAC with <-80dBc IMD to 300MHz
and <-160dBm/Hz noise power spectral density,” IEEE International Solid-State Circuits Confe-
rence, vol. Session 7, no. 7.1, 2003.
69
Bibliografia
70
AVerilog-A
A-1
A. Verilog-A
A-2
////////////////////////////////////////////////////////////////
// Netlist generated by : Custom Designer (TM) db::generateVerilogA
// Date : Wed Sep 17 03:08:59 PM WEST 2014
////////////////////////////////////////////////////////////////
// Library Name : z8562cqlp
// Cell Name : digital_block
// View Name : veriloga
////////////////////////////////////////////////////////////////
// Author : Décio Gonçalves
////////////////////////////////////////////////////////////////
`include "constants.vams"
`include "disciplines.vams"
module top_sim1 (boost, cal_ok, clk, comp_done, dgnd, di0, di1, di10, di11, di2,
di3, di4, di5, di6, di7, di8, di9, dnilsb, dnqlsb, dpilsb, dpqlsb, dq0, dq1, dq10,
dq11, dq2, dq3, dq4, dq5, dq6, dq7, dq8, dq9, dvdd, en_algorithm, enbiasz, enctr0,
enctr1, enctr2, endaci, endacq, eni_cal, eni_cal_z, enilsb, enilsbz, enimsb,
enimsbz, enq_cal, enq_cal_z, enqlsb, enqlsbz, enqmsb, enqmsbz, envon, gain0, gain1,
gain2, gain3, idig1, idig2, idig, latch_i_ini, latch_q_ini, nocalib, q0, q0z, qdig1,
qdig2, qdig, start, stdby, tieh_cdm, tielow_cdm, vbiasmode, vonmode, voutp, voutn);
output boost;
input cal_ok;
input clk;
input comp_done;
input dgnd;
input di0;
input di1;
input di10;
input di11;
input di2;
input di3;
input di4;
input di5;
input di6;
input di7;
input di8;
input di9;
output [0:5] dnilsb;
output [0:5] dnqlsb;
output [0:5] dpilsb;
output [0:5] dpqlsb;
input dq0;
input dq1;
input dq10;
input dq11;
input dq2;
input dq3;
input dq4;
input dq5;
input dq6;
input dq7;
input dq8;
input dq9;
input dvdd;
output en_algorithm;
output enbiasz;
output enctr0;
output enctr1;
output enctr2;
output endaci;
output endacq;
output [0:74] eni_cal;
output [0:74] eni_cal_z;
output enilsb;
output enilsbz;
output [0:74] enimsb;
output [0:74] enimsbz;
output [0:74] enq_cal;
output [0:74] enq_cal_z;
output enqlsb;
A-3
output enqlsbz;
output [0:74] enqmsb;
output [0:74] enqmsbz;
output [0:1] envon;
output gain0;
output gain1;
output gain2;
output gain3;
output [0:74] idig1;
output [0:74] idig2;
output [0:74] idig;
output latch_i_ini;
output latch_q_ini;
output nocalib;
input q0;
input q0z;
output [0:74] qdig1;
output [0:74] qdig2;
output [0:74] qdig;
output start;
output stdby;
input tieh_cdm;
input tielow_cdm;
output [0:2] vbiasmode;
output [0:2] vonmode;
input voutp;
input voutn;
electrical boost, cal_ok, clk, comp_done, dgnd, di0, di1, di10, di11, di2, di3, di4, di5, di6, di7,
di8, di9, dq0, dq1, dq10, dq11, dq2, dq3, dq4, dq5, dq6, dq7, dq8, dq9, dvdd, en_algorithm, enbiasz,
enctr0, enctr1, enctr2, endaci, endacq, enilsb, enilsbz, enqlsb, enqlsbz, gain0, gain1, gain2, gain3,
latch_i_ini, latch_q_ini, nocalib, q0, q0z, start, stdby, tieh_cdm, tielow_cdm, voutp, voutn;
electrical [0:5] dnilsb;
electrical [0:5] dnqlsb;
electrical [0:5] dpilsb;
electrical [0:5] dpqlsb;
electrical [0:74] eni_cal;
electrical [0:74] eni_cal_z;
electrical [0:74] enimsb;
electrical [0:74] enimsbz;
electrical [0:74] enq_cal;
electrical [0:74] enq_cal_z;
electrical [0:74] enqmsb;
electrical [0:74] enqmsbz;
electrical [0:1] envon;
electrical [0:74] idig1;
electrical [0:74] idig2;
electrical [0:74] idig;
electrical [0:74] qdig1;
electrical [0:74] qdig2;
electrical [0:74] qdig;
electrical [0:2] vbiasmode;
electrical [0:2] vonmode;
/***************** ******VARIABLE DEFINITIONS**********************************/
real td=180p, tr=10p, tf=10p;//transitions properties
integer boost_i=0, start_i=1, nocalib_i=0, nocalib_cont=0, en_algorithm_i=0;
integer latch_i_ini_i=0, latch_q_ini_i=0, enq_cal_i[74:0];
integer dnilsb_i[5:0], dnqlsb_i[5:0], endaci_i=1, endacq_i=0, q0_i=0;
integer enbiasz_i=0, enctr0_i=0, enctr1_i=0, enctr2_i=0, envon_i[1:0];
integer vbiasmode_i[2:0], vonmode_i[2:0], gain_i[3:0];
integer enilsb_i=1, enqlsb_i=1, stdby_i=0, eni_cal_i[74:0], enimsb_i[74:0];
integer enqmsb_i[74:0], idig1_i[74:0], idig2_i[74:0], idig_i[74:0];
integer qdig1_i[74:0], qdig2_i[74:0], qdig_i[74:0];
integer corrent_souces[74:0], cs1=0, cs2=1, i=0, comp_count=0;
integer aux_index=0, aux=0, res_comp[7:0];
integer corrent_souces_final1[62:0], corrent_souces_final2[62:0], corrent_souces_sorted[62:0], rnd=0;
integer msb_0=0, msb_1=0, msb_2=0, msb_3=0, msb_4=0, msb_5=0;
integer minimo=0, minimo_aux=0, first=0, inicial_count=0;
real mean_comp;
A. Verilog-A
A-4
parameter string inputfilename="rampa.csv";
parameter string outputfilename="tensao_saida.csv";
integer fin, fout;
integer enilsbz_i, enqlsbz_i, dpilsb_i[5:0], dpqlsb_i[5:0], eni_cal_z_i[74:0], enimsbz_i[74:0],
enq_cal_z_i[74:0], enqmsbz_i[74:0];
integer stt=1111;
//integer stt=1;
parameter string inputfilename2="rampa1.csv";
integer fin2;
parameter string inputfilename3="rampa2.csv";
integer fin3;
parameter string outputfilename1="tensao_saida1.csv";
integer fout1;
parameter string outputfilename2="tensao_saida2.csv";
integer fout2;
/******************************************************************************/
analog begin
//INICIALIZATIONS
@(initial_step) begin
for(i=0;i<=5;i=i+1) begin
dnilsb_i[i]=0; // 1-ON 0-OFF
dnqlsb_i[i]=0; // 1-ON 0-OFF
end
for(i=0;i<=1;i=i+1) envon_i[i]=1;
for(i=0;i<=2;i=i+1) begin
vbiasmode_i[i]=0;
vonmode_i[i]=0;
end
gain_i[3]=0;
gain_i[2]=1;
gain_i[1]=0;
gain_i[0]=1;
for(i=0;i<=74;i=i+1) begin
eni_cal_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enimsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
enq_cal_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enqmsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
idig1_i[i]=0; // 1-ON 0-OFF
idig2_i[i]=0; // 1-ON 0-OFF
idig_i[i]=0; // 1-ON 0-OFF
qdig1_i[i]=0; // 1-ON 0-OFF
qdig2_i[i]=0; // 1-ON 0-OFF
qdig_i[i]=0; // 1-ON 0-OFF
corrent_souces[i]=i;
end
for(i=0;i<=7;i=i+1) res_comp[i]=0;
for(i=0;i<=62;i=i+1) begin
corrent_souces_final1[i]=0;
corrent_souces_final2[i]=0;
corrent_souces_sorted[i]=0;
end
if (enilsb_i==1) enilsbz_i=0;
else enilsbz_i=1;
if (enqlsb_i==1) enqlsbz_i=0;
else enqlsbz_i=1;
for(i=0;i<=5;i=i+1) begin
if (dnilsb_i[i]==1) dpilsb_i[i]=0;
A-5
else dpilsb_i[i]=1;
if (dnqlsb_i[i]==1) dpqlsb_i[i]=0;
else dpqlsb_i[i]=1;
end
for(i=0;i<=74;i=i+1) begin
if (eni_cal_i[i]==1) eni_cal_z_i[i]=0;
else eni_cal_z_i[i]=1;
if (enimsb_i[i]==1) enimsbz_i[i]=0;
else enimsbz_i[i]=1;
if (enq_cal_i[i]==1) enq_cal_z_i[i]=0;
else enq_cal_z_i[i]=1;
if (enqmsb_i[i]==1) enqmsbz_i[i]=0;
else enqmsbz_i[i]=1;
end
fin=$fopen(inputfilename,"r");
fout=$fopen(outputfilename,"w");
fout1=$fopen(outputfilename1,"w");
fout2=$fopen(outputfilename2,"w");
end
//SAVE THE OUTOUT IN A FILE
@(cross(V(clk)-V(dvdd)/2,+1)) begin
if (stt==0) begin
$strobe("**************** ecreve no ficheiro ", "stt=", stt, "**************");
$fdisplay(fout,"without_calibration voutp %.20f voutn
%.20f",V(voutp,dgnd),V(voutn,dgnd));
end
if (stt==6) begin
$strobe("**************** ecreve no ficheiro ", "stt=", stt, "**************");
$fdisplay(fout1,"calibration_sequence1 voutp %.20f voutn
%.20f",V(voutp,dgnd),V(voutn,dgnd));
end
if (stt==7) begin
$strobe("**************** ecreve no ficheiro ", "stt=", stt, "**************");
$fdisplay(fout2,"calibration_sequence2 voutp %.20f voutn
%.20f",V(voutp,dgnd),V(voutn,dgnd));
end
end
//CALIBRATION
//AT EVERY CLOCK RISING EDGE
@(cross(V(clk)-V(dvdd)/2,-1)) begin
if (stt==1111) begin
if (inicial_count==10) stt=0;
else begin
inicial_count=inicial_count+1;
$strobe(inicial_count);
end
end
if (stt==0) begin
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
stt=1;
else begin
$fscanf(fin,"%d %d %d %d %d %d %d %d %d %d %d
%d",dnilsb_i[0],dnilsb_i[1],dnilsb_i[2],dnilsb_i[3],dnilsb_i[4],dnilsb_i[5],msb_0,msb_1,msb_2,msb_3,msb_4,msb
A. Verilog-A
A-6
_5);
$strobe(dnilsb_i[0],dnilsb_i[1],dnilsb_i[2],dnilsb_i[3],dnilsb_i[4],dnilsb_i[5],msb_0,msb_1,msb_2,msb
_3,msb_4,msb_5);
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==0) idig_i[0]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==0) for(i=0;i<=1;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==0) for(i=0;i<=2;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==0) for(i=0;i<=3;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==0) for(i=0;i<=4;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==0) for(i=0;i<=5;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==0) for(i=0;i<=6;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=7;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=8;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=9;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=10;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=11;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=12;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=13;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==0) for(i=0;i<=14;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=15;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=16;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=17;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=18;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=19;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=20;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=21;i=i+1) idig_i[i]=1;
A-7
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==0) for(i=0;i<=22;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=23;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=24;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=25;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=26;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=27;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=28;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=29;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==0) for(i=0;i<=30;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=31;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=32;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=33;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=34;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=35;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=36;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=37;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 &&
msb_5==1) for(i=0;i<=38;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=39;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=40;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=41;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=42;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=43;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=44;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 &&
A. Verilog-A
A-8
msb_5==1) for(i=0;i<=45;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 &&
msb_5==1) for(i=0;i<=46;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=47;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=48;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=49;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=50;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=51;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=52;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=53;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 &&
msb_5==1) for(i=0;i<=54;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=55;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=56;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=57;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=58;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=59;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=60;i=i+1) idig_i[i]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=61;i=i+1) idig_i[i]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 &&
msb_5==1) for(i=0;i<=62;i=i+1) idig_i[i]=1;
end
end
if(stt==1) begin //VCM DIFERENTIAL PAIR COMPARATOR
$fclose(fin);
$fclose(fout);
for(i=0;i<=5;i=i+1) begin
dnilsb_i[i]=0; // 1-ON 0-OFF
dnqlsb_i[i]=0; // 1-ON 0-OFF
end
for(i=0;i<=1;i=i+1) envon_i[i]=1;
for(i=0;i<=2;i=i+1) begin
vbiasmode_i[i]=0;
vonmode_i[i]=0;
end
A-9
gain_i[3]=0;
gain_i[2]=1;
gain_i[1]=0;
gain_i[0]=1;
for(i=0;i<=74;i=i+1) begin
eni_cal_i[i]=1; // 1->Latch=ON 0->Latch=OFF
enimsb_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enq_cal_i[i]=1; // 1->Latch=ON 0->Latch=OFF
enqmsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
idig1_i[i]=0; // 1-ON 0-OFF
idig2_i[i]=0; // 1-ON 0-OFF
idig_i[i]=0; // 1-ON 0-OFF
qdig1_i[i]=0; // 1-ON 0-OFF
qdig2_i[i]=0; // 1-ON 0-OFF
qdig_i[i]=0; // 1-ON 0-OFF
end
enilsb_i=0;
enqlsb_i=0;
nocalib_i=1;
nocalib_cont=nocalib_cont+1;
if (nocalib_cont==5) begin
nocalib_i=0;
stt=2;
end
end
if (stt==2) begin //OFFSET CALIBRATION
en_algorithm_i=1;
idig1_i[corrent_souces[cs1]]=1;
idig2_i[corrent_souces[cs2]]=1;
minimo=corrent_souces[cs1];
end
if (stt==3) begin //SORTING
if(first==0 && cs1!=minimo)begin
idig1_i[corrent_souces[cs1]]=0;
first=1;
end
else begin
for(i=0;i<=minimo-1;i=i+1) begin
idig1_i[i]=0;
end
end
idig2_i[corrent_souces[cs2-1]]=0;
idig1_i[minimo]=1;
idig2_i[corrent_souces[cs2]]=1;
end
if (stt==4) begin //DISCARD WORST CORRENT SOURCES
for(i=0;i<=74;i=i+1) begin
if(i>=6 && i<=68) begin
corrent_souces_sorted[aux]=corrent_souces[i];
$strobe(corrent_souces_sorted[aux]);
aux=aux+1;
end
end
stt=5;
en_algorithm_i=0;
end
if (stt==5) begin //SWITCHING SEQUENCE
corrent_souces_final1[0] =corrent_souces_sorted[0] ;
corrent_souces_final1[62]=corrent_souces_sorted[1] ;
corrent_souces_final1[4] =corrent_souces_sorted[2] ;
A. Verilog-A
A-10
corrent_souces_final1[58]=corrent_souces_sorted[3] ;
corrent_souces_final1[8] =corrent_souces_sorted[4] ;
corrent_souces_final1[54]=corrent_souces_sorted[5] ;
corrent_souces_final1[12]=corrent_souces_sorted[6] ;
corrent_souces_final1[50]=corrent_souces_sorted[7] ;
corrent_souces_final1[16]=corrent_souces_sorted[8] ;
corrent_souces_final1[46]=corrent_souces_sorted[9] ;
corrent_souces_final1[20]=corrent_souces_sorted[10];
corrent_souces_final1[42]=corrent_souces_sorted[11];
corrent_souces_final1[24]=corrent_souces_sorted[12];
corrent_souces_final1[38]=corrent_souces_sorted[13];
corrent_souces_final1[28]=corrent_souces_sorted[14];
corrent_souces_final1[34]=corrent_souces_sorted[15];
corrent_souces_final1[30]=corrent_souces_sorted[16];
corrent_souces_final1[32]=corrent_souces_sorted[17];
corrent_souces_final1[26]=corrent_souces_sorted[18];
corrent_souces_final1[36]=corrent_souces_sorted[19];
corrent_souces_final1[22]=corrent_souces_sorted[20];
corrent_souces_final1[40]=corrent_souces_sorted[21];
corrent_souces_final1[18]=corrent_souces_sorted[22];
corrent_souces_final1[44]=corrent_souces_sorted[23];
corrent_souces_final1[14]=corrent_souces_sorted[24];
corrent_souces_final1[48]=corrent_souces_sorted[25];
corrent_souces_final1[10]=corrent_souces_sorted[26];
corrent_souces_final1[52]=corrent_souces_sorted[27];
corrent_souces_final1[6] =corrent_souces_sorted[28];
corrent_souces_final1[56]=corrent_souces_sorted[29];
corrent_souces_final1[2] =corrent_souces_sorted[30];
corrent_souces_final1[60]=corrent_souces_sorted[31];
corrent_souces_final1[3] =corrent_souces_sorted[32];
corrent_souces_final1[59]=corrent_souces_sorted[33];
corrent_souces_final1[7] =corrent_souces_sorted[34];
corrent_souces_final1[55]=corrent_souces_sorted[35];
corrent_souces_final1[11]=corrent_souces_sorted[36];
corrent_souces_final1[51]=corrent_souces_sorted[37];
corrent_souces_final1[15]=corrent_souces_sorted[38];
corrent_souces_final1[47]=corrent_souces_sorted[39];
corrent_souces_final1[19]=corrent_souces_sorted[40];
corrent_souces_final1[43]=corrent_souces_sorted[41];
corrent_souces_final1[23]=corrent_souces_sorted[42];
corrent_souces_final1[39]=corrent_souces_sorted[43];
corrent_souces_final1[27]=corrent_souces_sorted[44];
corrent_souces_final1[35]=corrent_souces_sorted[45];
corrent_souces_final1[31]=corrent_souces_sorted[46];
corrent_souces_final1[33]=corrent_souces_sorted[47];
corrent_souces_final1[29]=corrent_souces_sorted[48];
corrent_souces_final1[37]=corrent_souces_sorted[49];
corrent_souces_final1[25]=corrent_souces_sorted[50];
corrent_souces_final1[41]=corrent_souces_sorted[51];
corrent_souces_final1[21]=corrent_souces_sorted[52];
corrent_souces_final1[45]=corrent_souces_sorted[53];
corrent_souces_final1[17]=corrent_souces_sorted[54];
corrent_souces_final1[49]=corrent_souces_sorted[55];
corrent_souces_final1[13]=corrent_souces_sorted[56];
corrent_souces_final1[53]=corrent_souces_sorted[57];
corrent_souces_final1[9] =corrent_souces_sorted[58];
corrent_souces_final1[57]=corrent_souces_sorted[59];
corrent_souces_final1[5] =corrent_souces_sorted[60];
corrent_souces_final1[61]=corrent_souces_sorted[61];
corrent_souces_final1[1] =corrent_souces_sorted[62];
corrent_souces_final2[1] =corrent_souces_sorted[0] ;
corrent_souces_final2[61]=corrent_souces_sorted[1] ;
corrent_souces_final2[5] =corrent_souces_sorted[2] ;
corrent_souces_final2[57]=corrent_souces_sorted[3] ;
corrent_souces_final2[9] =corrent_souces_sorted[4] ;
corrent_souces_final2[53]=corrent_souces_sorted[5] ;
corrent_souces_final2[13]=corrent_souces_sorted[6] ;
corrent_souces_final2[49]=corrent_souces_sorted[7] ;
corrent_souces_final2[17]=corrent_souces_sorted[8] ;
corrent_souces_final2[45]=corrent_souces_sorted[9] ;
A-11
corrent_souces_final2[21]=corrent_souces_sorted[10];
corrent_souces_final2[41]=corrent_souces_sorted[11];
corrent_souces_final2[25]=corrent_souces_sorted[12];
corrent_souces_final2[37]=corrent_souces_sorted[13];
corrent_souces_final2[29]=corrent_souces_sorted[14];
corrent_souces_final2[33]=corrent_souces_sorted[15];
corrent_souces_final2[31]=corrent_souces_sorted[16];
corrent_souces_final2[35]=corrent_souces_sorted[17];
corrent_souces_final2[27]=corrent_souces_sorted[18];
corrent_souces_final2[39]=corrent_souces_sorted[19];
corrent_souces_final2[23]=corrent_souces_sorted[20];
corrent_souces_final2[43]=corrent_souces_sorted[21];
corrent_souces_final2[19]=corrent_souces_sorted[22];
corrent_souces_final2[47]=corrent_souces_sorted[23];
corrent_souces_final2[15]=corrent_souces_sorted[24];
corrent_souces_final2[51]=corrent_souces_sorted[25];
corrent_souces_final2[11]=corrent_souces_sorted[26];
corrent_souces_final2[55]=corrent_souces_sorted[27];
corrent_souces_final2[7] =corrent_souces_sorted[28];
corrent_souces_final2[59]=corrent_souces_sorted[29];
corrent_souces_final2[3] =corrent_souces_sorted[30];
corrent_souces_final2[60]=corrent_souces_sorted[31];
corrent_souces_final2[2] =corrent_souces_sorted[32];
corrent_souces_final2[56]=corrent_souces_sorted[33];
corrent_souces_final2[6] =corrent_souces_sorted[34];
corrent_souces_final2[52]=corrent_souces_sorted[35];
corrent_souces_final2[10]=corrent_souces_sorted[36];
corrent_souces_final2[48]=corrent_souces_sorted[37];
corrent_souces_final2[14]=corrent_souces_sorted[38];
corrent_souces_final2[44]=corrent_souces_sorted[39];
corrent_souces_final2[18]=corrent_souces_sorted[40];
corrent_souces_final2[40]=corrent_souces_sorted[41];
corrent_souces_final2[22]=corrent_souces_sorted[42];
corrent_souces_final2[36]=corrent_souces_sorted[43];
corrent_souces_final2[26]=corrent_souces_sorted[44];
corrent_souces_final2[32]=corrent_souces_sorted[45];
corrent_souces_final2[30]=corrent_souces_sorted[46];
corrent_souces_final2[34]=corrent_souces_sorted[47];
corrent_souces_final2[28]=corrent_souces_sorted[48];
corrent_souces_final2[38]=corrent_souces_sorted[49];
corrent_souces_final2[24]=corrent_souces_sorted[50];
corrent_souces_final2[42]=corrent_souces_sorted[51];
corrent_souces_final2[20]=corrent_souces_sorted[52];
corrent_souces_final2[46]=corrent_souces_sorted[53];
corrent_souces_final2[16]=corrent_souces_sorted[54];
corrent_souces_final2[50]=corrent_souces_sorted[55];
corrent_souces_final2[12]=corrent_souces_sorted[56];
corrent_souces_final2[54]=corrent_souces_sorted[57];
corrent_souces_final2[8] =corrent_souces_sorted[58];
corrent_souces_final2[58]=corrent_souces_sorted[59];
corrent_souces_final2[4] =corrent_souces_sorted[60];
corrent_souces_final2[62]=corrent_souces_sorted[61];
corrent_souces_final2[0] =corrent_souces_sorted[62];
for(i=0;i<=62;i=i+1) $strobe("corrent_souces_final1=", corrent_souces_final1[i]);
for(i=0;i<=62;i=i+1) $strobe("corrent_souces_final2=", corrent_souces_final2[i]);
stt=61;
end
if (stt==61) begin
$strobe("**************", "stt=", stt, "**************");
$fclose(fin);
fin2=$fopen(inputfilename2,"r");
stt=6;
end
if (stt==71) begin
$strobe("**************", "stt=", stt, "**************");
$fclose(fin2);
A. Verilog-A
A-12
$fclose(fout1);
fin3=$fopen(inputfilename3,"r");
stt=7;
end
if (stt==72) begin
$strobe("**************", "stt=", stt, "**************");
$fclose(fin3);
$fclose(fout2);
end
if (stt==6) begin
$strobe("**************", "stt=", stt, "**************");
nocalib_i=0;
nocalib_cont=0;
en_algorithm_i=0;
latch_i_ini_i=0;
latch_q_ini_i=0;
endaci_i=1;
endacq_i=0;
q0_i=0;
enbiasz_i=0;
enqlsb_i=1;
stdby_i=0;
cs1=0;
cs2=1;
i=0;
comp_count=0;
aux_index=0;
aux=0;
rnd=0;
msb_0=0;
msb_1=0;
msb_2=0;
msb_3=0;
msb_4=0;
msb_5=0;
minimo=0;
minimo_aux=0;
first=0;
inicial_count=0;
for(i=0;i<=5;i=i+1) begin
dnilsb_i[i]=0; // 1-ON 0-OFF
dnqlsb_i[i]=0; // 1-ON 0-OFF
end
for(i=0;i<=74;i=i+1) begin
eni_cal_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enimsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
enq_cal_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enqmsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
idig1_i[i]=0; // 1-ON 0-OFF
idig2_i[i]=0; // 1-ON 0-OFF
idig_i[i]=0; // 1-ON 0-OFF
qdig1_i[i]=0; // 1-ON 0-OFF
qdig2_i[i]=0; // 1-ON 0-OFF
qdig_i[i]=0; // 1-ON 0-OFF
corrent_souces[i]=i;
end
if (enilsb_i==1) enilsbz_i=0;
else enilsbz_i=1;
if (enqlsb_i==1) enqlsbz_i=0;
else enqlsbz_i=1;
A-13
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1) begin
stt=71;
$strobe("stt=", stt);
end
else begin
$fscanf(fin2,"%d %d %d %d %d %d %d %d %d %d %d
%d",dnilsb_i[0],dnilsb_i[1],dnilsb_i[2],dnilsb_i[3],dnilsb_i[4],dnilsb_i[5],msb_0,msb_1,msb_2,msb_3,msb_4,msb
_5);
$strobe(dnilsb_i[0],dnilsb_i[1],dnilsb_i[2],dnilsb_i[3],dnilsb_i[4],dnilsb_i[5],msb_0,msb_1,msb_2,msb
_3,msb_4,msb_5);
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==0) begin
idig_i[corrent_souces_final1[0]]=1;
$strobe(corrent_souces_final1[0]);
end
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==0)
begin
for(i=0;i<=1;i=i+1) begin
idig_i[corrent_souces_final1[i]]=1;
$strobe(corrent_souces_final1[i]);
end
end
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=2;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=3;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=4;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=5;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=6;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=7;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=8;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=9;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=10;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=11;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=12;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=13;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=14;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=15;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=16;i=i+1) idig_i[corrent_souces_final1[i]]=1;
A. Verilog-A
A-14
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=17;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=18;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=19;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=20;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=21;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=22;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=23;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=24;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=25;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=26;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=27;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=28;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=29;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=30;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=31;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=32;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=33;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=34;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=35;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=36;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=37;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=38;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=39;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=40;i=i+1) idig_i[corrent_souces_final1[i]]=1;
A-15
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=41;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=42;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=43;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=44;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=45;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=46;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=47;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=48;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=49;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=50;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=51;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=52;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=53;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=54;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=55;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=56;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=57;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=58;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=59;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=60;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=61;i=i+1) idig_i[corrent_souces_final1[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1) begin
for(i=0;i<=62;i=i+1) idig_i[corrent_souces_final1[i]]=1;
stt=71;
end
end
A. Verilog-A
A-16
end
if (stt==7) begin
$strobe("**************", "stt=", stt, "**************");
nocalib_i=0;
nocalib_cont=0;
en_algorithm_i=0;
latch_i_ini_i=0;
latch_q_ini_i=0;
endaci_i=1;
endacq_i=0;
q0_i=0;
enbiasz_i=0;
enqlsb_i=1;
stdby_i=0;
cs1=0;
cs2=1;
i=0;
comp_count=0;
aux_index=0;
aux=0;
rnd=0;
msb_0=0;
msb_1=0;
msb_2=0;
msb_3=0;
msb_4=0;
msb_5=0;
minimo=0;
minimo_aux=0;
first=0;
inicial_count=0;
for(i=0;i<=5;i=i+1) begin
dnilsb_i[i]=0; // 1-ON 0-OFF
dnqlsb_i[i]=0; // 1-ON 0-OFF
end
for(i=0;i<=74;i=i+1) begin
eni_cal_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enimsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
enq_cal_i[i]=0; // 1->Latch=ON 0->Latch=OFF
enqmsb_i[i]=1; // 1->Latch=ON 0->Latch=OFF
idig1_i[i]=0; // 1-ON 0-OFF
idig2_i[i]=0; // 1-ON 0-OFF
idig_i[i]=0; // 1-ON 0-OFF
qdig1_i[i]=0; // 1-ON 0-OFF
qdig2_i[i]=0; // 1-ON 0-OFF
qdig_i[i]=0; // 1-ON 0-OFF
corrent_souces[i]=i;
end
if (enilsb_i==1) enilsbz_i=0;
else enilsbz_i=1;
if (enqlsb_i==1) enqlsbz_i=0;
else enqlsbz_i=1;
$fscanf(fin3,"%d %d %d %d %d %d %d %d %d %d %d
%d",dnilsb_i[0],dnilsb_i[1],dnilsb_i[2],dnilsb_i[3],dnilsb_i[4],dnilsb_i[5],msb_0,msb_1,msb_2,msb_3,msb_4,msb
_5);
A-17
$strobe(dnilsb_i[0],dnilsb_i[1],dnilsb_i[2],dnilsb_i[3],dnilsb_i[4],dnilsb_i[5],msb_0,msb_1,msb_2,msb
_3,msb_4,msb_5);
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==0)
begin
idig_i[corrent_souces_final2[0]]=1;
$strobe(corrent_souces_final2[0]);
end
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==0)
begin
for(i=0;i<=1;i=i+1) begin
idig_i[corrent_souces_final2[i]]=1;
$strobe(corrent_souces_final2[i]);
end
end
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=2;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=3;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=4;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=5;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==0)
for(i=0;i<=6;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=7;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=8;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=9;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=10;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=11;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=12;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=13;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==0)
for(i=0;i<=14;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=15;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=16;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=17;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=18;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=19;i=i+1) idig_i[corrent_souces_final2[i]]=1;
A. Verilog-A
A-18
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=20;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=21;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==0)
for(i=0;i<=22;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=23;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=24;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=25;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=26;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=27;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=28;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=29;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==0)
for(i=0;i<=30;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=31;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=32;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=33;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=34;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=35;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=36;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=37;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==0 && msb_5==1)
for(i=0;i<=38;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=39;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=40;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=41;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=42;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=43;i=i+1) idig_i[corrent_souces_final2[i]]=1;
A-19
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=44;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=45;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==0 && msb_5==1)
for(i=0;i<=46;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=47;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=48;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=49;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=50;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=51;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=52;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=53;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==0 && msb_4==1 && msb_5==1)
for(i=0;i<=54;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=55;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=56;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=57;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==0 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=58;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=59;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==0 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=60;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==0 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
for(i=0;i<=61;i=i+1) idig_i[corrent_souces_final2[i]]=1;
if (msb_0==1 && msb_1==1 && msb_2==1 && msb_3==1 && msb_4==1 && msb_5==1)
begin
for(i=0;i<=62;i=i+1) idig_i[corrent_souces_final2[i]]=1;
stt=72;
end
end
if (enilsb_i==1) enilsbz_i=0;
else enilsbz_i=1;
if (enqlsb_i==1) enqlsbz_i=0;
else enqlsbz_i=1;
for(i=0;i<=5;i=i+1) begin
if (dnilsb_i[i]==1) dpilsb_i[i]=0;
else dpilsb_i[i]=1;
A. Verilog-A
A-20
if (dnqlsb_i[i]==1) dpqlsb_i[i]=0;
else dpqlsb_i[i]=1;
end
for(i=0;i<=74;i=i+1) begin
if (eni_cal_i[i]==1) eni_cal_z_i[i]=0;
else eni_cal_z_i[i]=1;
if (enimsb_i[i]==1) enimsbz_i[i]=0;
else enimsbz_i[i]=1;
if (enq_cal_i[i]==1) enq_cal_z_i[i]=0;
else enq_cal_z_i[i]=1;
if (enqmsb_i[i]==1) enqmsbz_i[i]=0;
else enqmsbz_i[i]=1;
end
end
//VERIFY IF THE OFFSET CALIBRATION IS DONE TO TRIGER TWO NEW CORRENT SOURCES
@(cross(V(cal_ok)-V(dvdd)/2,+1))begin
if (stt==3) begin
if (cs1==73 && cs2==74) begin
stt=4;
end
else if (cs2==74) begin
idig1_i[minimo]=0;
idig2_i[corrent_souces[cs2]]=0;
cs2=cs1+2;
cs1=cs1+1;
minimo=corrent_souces[cs1];
minimo_aux=corrent_souces[cs1];
end
else begin
minimo=minimo_aux;
cs2=cs2+1;
end
end
if (stt==2) stt=3;
end
//VERIFY IF THE COMPARISONS ARE DONE AND SAVE THEM
@(cross(V(comp_done)-V(dvdd)/2,+1))begin
comp_count=comp_count+1;
if (comp_count==8) begin
comp_count=0;
//DO THE MEAN
mean_comp=(res_comp[1]+res_comp[2]+res_comp[3]+res_comp[4]+res_comp[5]+res_comp[6]+res_comp[7])/7;
if(mean_comp>=0.5) minimo_aux=corrent_souces[cs2];
if (cs2==74 && corrent_souces[cs1]!=minimo_aux) begin
aux_index=corrent_souces[cs1];
corrent_souces[cs1]=minimo_aux;
corrent_souces[minimo_aux]=aux_index;
$strobe("posicao: ",cs1,"fonte de corrente: ",corrent_souces[cs1]);
end
end
else begin
if (V(q0)>=V(dvdd)/2) q0_i=1;
else q0_i=0;
//SAVE THE Q0 IN DIFERENTS REGISTERS
res_comp[comp_count]=q0_i;
end
end
A-21
/***************************OUTPUTS****************************************/
V(start) <+ transition(start_i*V(dvdd,dgnd),td,tr,tf);
V(boost) <+ transition(boost_i*V(dvdd,dgnd),td,tr,tf);
V(nocalib) <+ transition(nocalib_i*V(dvdd,dgnd),td,tr,tf);
V(en_algorithm) <+ transition(en_algorithm_i*V(dvdd,dgnd),td,tr,tf);
V(enbiasz) <+ transition(enbiasz_i*V(dvdd,dgnd),td,tr,tf);
V(enctr0) <+ transition(enctr0_i*V(dvdd,dgnd),td,tr,tf);
V(enctr1) <+ transition(enctr1_i*V(dvdd,dgnd),td,tr,tf);
V(enctr2) <+ transition(enctr2_i*V(dvdd,dgnd),td,tr,tf);
V(stdby) <+ transition(stdby_i*V(dvdd,dgnd),td,tr,tf);
V(latch_i_ini) <+ transition(latch_i_ini_i*V(dvdd,dgnd),td,tr,tf);
V(latch_q_ini) <+ transition(latch_q_ini_i*V(dvdd,dgnd),td,tr,tf);
V(endaci) <+ transition(endaci_i*V(dvdd,dgnd),td,tr,tf);
V(endacq) <+ transition(endacq_i*V(dvdd,dgnd),td,tr,tf);
V(enilsb) <+ transition(enilsb_i*V(dvdd,dgnd),td,tr,tf);
V(enilsbz) <+ transition(enilsbz_i*V(dvdd,dgnd),td,tr,tf);
V(enqlsb) <+ transition(enqlsb_i*V(dvdd,dgnd),td,tr,tf);
V(enqlsbz) <+ transition(enqlsbz_i*V(dvdd,dgnd),td,tr,tf);
generate i (0,5,1) begin
V(dnilsb[i]) <+ transition(dnilsb_i[i]*V(dvdd,dgnd),td,tr,tf);
V(dnqlsb[i]) <+ transition(dnqlsb_i[i]*V(dvdd,dgnd),td,tr,tf);
V(dpilsb[i]) <+ transition(dpilsb_i[i]*V(dvdd,dgnd),td,tr,tf);
V(dpqlsb[i]) <+ transition(dpqlsb_i[i]*V(dvdd,dgnd),td,tr,tf);
end
generate i (0,1,1) begin
V(envon[i]) <+ transition(envon_i[i]*V(dvdd,dgnd),td,tr,tf);
end
generate i (0,2,1) begin
V(vbiasmode[i]) <+ transition(vbiasmode_i[i]*V(dvdd,dgnd),td,tr,tf);
V(vonmode[i]) <+ transition(vonmode_i[i]*V(dvdd,dgnd),td,tr,tf);
end
V(gain0) <+ transition(gain_i[0]*V(dvdd,dgnd),td,tr,tf);
V(gain1) <+ transition(gain_i[1]*V(dvdd,dgnd),td,tr,tf);
V(gain2) <+ transition(gain_i[2]*V(dvdd,dgnd),td,tr,tf);
V(gain3) <+ transition(gain_i[3]*V(dvdd,dgnd),td,tr,tf);
generate i (0,74,1) begin
V(eni_cal[i]) <+ transition(eni_cal_i[i]*V(dvdd,dgnd),td,tr,tf);
V(eni_cal_z[i]) <+ transition(eni_cal_z_i[i]*V(dvdd,dgnd),td,tr,tf);
V(enimsb[i]) <+ transition(enimsb_i[i]*V(dvdd,dgnd),td,tr,tf);
V(enimsbz[i]) <+ transition(enimsbz_i[i]*V(dvdd,dgnd),td,tr,tf);
V(enq_cal[i]) <+ transition(enq_cal_i[i]*V(dvdd,dgnd),td,tr,tf);
V(enq_cal_z[i]) <+ transition(enq_cal_z_i[i]*V(dvdd,dgnd),td,tr,tf);
V(enqmsb[i]) <+ transition(enqmsb_i[i]*V(dvdd,dgnd),td,tr,tf);
V(enqmsbz[i]) <+ transition(enqmsbz_i[i]*V(dvdd,dgnd),td,tr,tf);
V(idig1[i]) <+ transition(idig1_i[i]*V(dvdd,dgnd),td,tr,tf);
V(idig2[i]) <+ transition(idig2_i[i]*V(dvdd,dgnd),td,tr,tf);
V(idig[i]) <+ transition(idig_i[i]*V(dvdd,dgnd),td,tr,tf);
V(qdig1[i]) <+ transition(qdig1_i[i]*V(dvdd,dgnd),td,tr,tf);
V(qdig2[i]) <+ transition(qdig2_i[i]*V(dvdd,dgnd),td,tr,tf);
V(qdig[i]) <+ transition(qdig_i[i]*V(dvdd,dgnd),td,tr,tf);
end
end
endmodule
A. Verilog-A
A-22