Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Tipos de dados Verilog


A principal intenção dos tipos de dados na linguagem Verilog é representar elementos de armazenamento de dados como bits em um flip-flop e elementos de transmissão como fios que conectam portas lógicas e estruturas sequenciais.

Quais valores as variáveis ​​mantêm?


Quase todos os tipos de dados podem ter apenas um dos quatro valores diferentes fornecidos abaixo, exceto real e event tipos de dados.
0 representa um zero lógico ou uma condição falsa
1 representa um lógico ou uma condição verdadeira
x representa um valor lógico desconhecido (pode ser zero ou um)
z representa um estado de alta impedância

A imagem a seguir mostra como esses valores são representados em diagramas de tempo e formas de onda de simulação. A maioria dos simuladores usa essa convenção onde vermelho significa X e laranja no meio significa alta impedância ou Z .

O que o conjunto de valores verilog implica?


Como o Verilog é essencialmente usado para descrever elementos de hardware como flip-flops e lógica combinacional como NAND e NOR, ele deve modelar o sistema de valores encontrado no hardware. Uma lógica representaria a alimentação de tensão Vdd que pode variar entre 0,8 V a mais de 3 V com base no nó de tecnologia de fabricação. Um zero lógico representaria terra e, portanto, um valor de 0V.

X ou x significa que o valor é simplesmente desconhecido no momento e pode ser 0 ou 1. Isso é bem diferente da forma como X é tratado em lógica booleana, onde significa "não me importo".

Como acontece com qualquer circuito elétrico incompleto, o fio que não está conectado a nada terá uma alta impedância nesse nó e é representado por Z ou z . Mesmo em verilog, qualquer fio desconectado resultará em alta impedância.

Redes e Variáveis


Redes e variáveis são os dois principais grupos de tipos de dados que representam diferentes estruturas de hardware e diferem na maneira como são atribuídos e retêm valores.

Redes


Redes são usados ​​para conectar entre entidades de hardware como portas lógicas e, portanto, não armazenam nenhum valor por conta própria. Na imagem mostrada abaixo, uma rede chamada net_11 é usada para conectar a saída da porta AND à primeira entrada do flip-flop chamada data_0. De forma semelhante, as duas entradas da porta AND são conectadas às redes net_45 e net_67.

Existem diferentes tipos de redes, cada uma com características diferentes, mas a mais popular e amplamente utilizada é a net em projetos digitais é do tipo wire . Um wire é um tipo de dados Verilog usado para conectar elementos e conectar redes que são acionadas por uma única porta ou atribuição contínua. O wire é semelhante ao fio elétrico que é usado para conectar dois componentes em uma placa de ensaio.

Quando há necessidade de várias redes, elas podem ser agrupadas para formar um único wire . Na imagem mostrada abaixo, temos um fio de 4 bits que pode enviar 4 valores separados em cada um dos fios. Tais entidades com largura maior que 1 são chamadas de vetores como veremos no próximo artigo.
  
  
wire [3:0] 	n0; 		// 4-bit wire -> this is a vector

  

É ilegal redeclarar um nome já declarado por uma rede, parâmetro ou variável conforme mostrado no código abaixo.
  
  
module design;
	wire    abc;
	wire 	a;
	wire 	b;
	wire 	c;
	
	wire    abc;   // Error: Identifier "abc" previously declared
	
	assign abc = a & b | c;
endmodule

  

Variáveis


Uma variável, por outro lado, é uma abstração de um elemento de armazenamento de dados e pode conter valores. Um flip-flop é um bom exemplo de elemento de armazenamento.

Tipo de dados Verilog reg pode ser usado para modelar registradores de hardware, pois pode conter valores entre atribuições. Observe que um reg nem sempre precisa representar um flip-flop porque também pode ser usado para representar lógica combinacional.

Na imagem mostrada à esquerda, temos um flip-flop que pode armazenar 1 bit e o flip-flop da direita pode armazenar 4 bits.

Outros tipos de dados

inteiro


Um integer é uma variável de uso geral de 32 bits de largura que pode ser usada para outros propósitos durante a modelagem de hardware e armazena valores inteiros.
  
  
    integer     count;              // Count is an integer value > 0

  

hora


Um time A variável não tem sinal, tem 64 bits de largura e pode ser usada para armazenar quantidades de tempo de simulação para fins de depuração. Um realtime A variável simplesmente armazena o tempo como uma quantidade de ponto flutuante.
  
  
    time        end_time;           // end_time can be stored a time value like 50ns
    realtime    rtime;              // rtime = 40.25ps 

  

real


Um real variável pode armazenar valores de ponto flutuante e pode ser atribuída da mesma forma que integer e reg .
  
  
    real        float;              // float = 12.344  - can store floating numbers

  

Exemplo

  
  
module testbench;
  integer  	int_a; 				// Integer variable
  real 		real_b; 			// Real variable
  time 		time_c; 			// Time variable
  
  initial begin
    int_a 	= 32'hcafe_1234; 	// Assign an integer value
    real_b 	= 0.1234567; 		// Assign a floating point value

    #20; 						// Advance simulation time by 20 units
    time_c 	= $time; 			// Assign current simulation time
    
    // Now print all variables using $display system task
    $display ("int_a 	= 0x%0h", int_a);
    $display ("real_b 	= %0.5f", real_b);
    $display ("time_c 	= %0t", time_c);
  end
endmodule

  
Registro de simulação
ncsim> run
int_a 	= 0xcafe1234
real_b 	= 0.12346
time_c 	= 20
ncsim: *W,RNQUIE: Simulation is complete.

Strings Verilog


As strings são armazenadas em reg , e a largura do reg variável tem que ser grande o suficiente para conter a string. Cada caractere em uma string representa um valor ASCII e requer 1 byte. Se o tamanho da variável for menor que a string, o Verilog truncará os bits mais à esquerda da string. Se o tamanho da variável for maior que a string, o Verilog adiciona zeros à esquerda da string.
  
  
// "Hello World" requires 11 bytes

reg [8*11:1] str = "Hello World";         // Variable can store 11 bytes, str = "Hello World"
reg [8*5:1]  str = "Hello World";         // Variable stores only 5 bytes (rest is truncated), str = "World"
reg [8*20:1] str = "Hello World";         // Variable can store 20 bytes (rest is padded with zeros), str = "         Hello World"

  

Aqui está um exemplo completo mostrando como as três variáveis ​​fornecidas acima podem ser simuladas.
  
  
module testbench;
  reg [8*11:1] str1;
  reg [8*5:1]  str2;
  reg [8*20:1] str3;
  
  initial begin
    str1 = "Hello World";
    str2 = "Hello World";
    str3 = "Hello World";
    
    $display ("str1 = %s", str1);
    $display ("str2 = %s", str2);
    $display ("str3 = %s", str3);
  end
endmodule

  

Observe que str1 tem o tamanho certo para armazenar todos os 11 bytes da string "Hello World" e, portanto, toda a string é impressa. No entanto, str2 pode armazenar apenas 5 bytes e, portanto, os 6 bytes superiores são truncados e acabam armazenando apenas "World". A terceira variável str3 é maior que 11 bytes e preenche espaços vazios à esquerda e, portanto, o valor armazenado nela se torna "Hello World".
Registro de simulação
ncsim> run
str1 = Hello World
str2 = World
str3 =          Hello World
ncsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Variáveis ​​C# e tipos de dados (primitivos)
  2. Tipos de dados C++
  3. Tipos de dados C
  4. Tipos de dados Python
  5. Tipos de dados Java (Primitivo)
  6. 5 tipos diferentes de data center [com exemplos]
  7. 8 tipos diferentes de computação em nuvem em 2021
  8. 8 tipos diferentes de violação de dados com exemplos
  9. Tutorial Verilog
  10. Concatenação Verilog