Comportamento de hardware não pode ser implementado sem instruções condicionais e outras formas de controlar o fluxo de lógica. Verilog possui um conjunto de blocos e mecanismos de controle de fluxo para isso. if-else-if Esta instrução condicional decide se certas instruções devem ser executadas ou
Atribuição Bloqueante (Blocking) Atribuições blocking usam o operador = e são executadas sequencialmente dentro de um bloco procedural. No entanto, isso não impede a execução de instruções que rodam em blocos paralelos. module tb; reg [7:0] a, b, c, d, e; initial begin a = 8hDA; $dis
Atribuir valores a redes (nets) e variáveis é chamado de atribuição. Existem três formas básicas: Procedural Contínua Procedural contínua Valores LHS Permitidos Uma atribuição tem duas partes: lado direito (RHS) e lado esquerdo (LHS), com um símbolo de igual (=) ou menor-igual (<=) entre el
Existem maneiras de agrupar um conjunto de instruções que são sintaticamente equivalentes a uma única instrução e são conhecidas como blocos de instruções. Existem dois tipos de blocos de instruções: sequencial e paralelo. Sequencial Instruções são envolvidas usando palavras-chave begin e end e ser
Um exemplo anterior explorou um detector de sequência simples. Aqui está outro exemplo para um detector de padrão que detecta um padrão ligeiramente mais longo. Design module det_110101 ( input clk, input rstn, input in, output out ); parameter IDLE = 0, S1 = 1, S11 = 2, S110 =
Um exemplo muito comum de uma FSM é o de um detector de sequência onde o design de hardware é esperado para detectar quando um padrão fixo é visto em um fluxo de bits binários que são entrados nele. Exemplo module det_1011 ( input clk, input rstn, input in, output out ); parame
Um bloco generate permite multiplicar instâncias de módulos ou realizar instanciação condicional de qualquer módulo. Ele fornece a capacidade de o design ser construído baseado em parâmetros Verilog. Essas instruções são particularmente convenientes quando a mesma operação ou instância de módulo pre
Todo código comportamental é escrito dentro de module e endmodule. Portanto, qualquer design digital que você pretenda criar, entrará dentro de um bloco module. Ele pode ou não ter portas definidas - permitindo que sinais entrem no bloco como input ou saiam do bloco como output. Módulo O módulo vaz
Um conjunto de instruções Verilog são geralmente executadas sequencialmente em uma simulação. Essas instruções são colocadas dentro de um bloco procedural. Existem principalmente dois tipos de blocos procedurais em Verilog - initial e always. Sintaxe initial [instrução única] initial begin [múltip
Um artigo anterior mostrou diferentes exemplos de uso de um bloco always para implementar lógica combinacional. Um bloco always também é principalmente usado para implementar lógica sequencial, que possui elementos de memória como flip-flops que podem reter valores. Flip-Flop JK Um flip-flop JK é u
O bloco always do Verilog pode ser usado tanto para lógica sequencial quanto combinacional. Alguns exemplos de projeto foram mostrados usando um statement assign em um artigo anterior. O mesmo conjunto de projetos será explorado a seguir usando um bloco always. Exemplo #1: Lógica Combinacional Simpl
Um bloco always é um dos blocos procedurais em Verilog. Statements dentro de um bloco always são executados sequencialmente. Sintaxe always @ (event) [statement] always @ (event) begin [multiple statements] end O bloco always é executado em algum evento particular. O evento é definido por uma lista
Wires e variáveis Verilog multi-bit podem ser agrupados para formar um wire ou variável multi-net maior usando operadores de concatenação { e } separados por vírgulas. Concatenação também permite ter expressões e constantes com tamanho como operandos além de wires e variáveis. Tamanho de cada operan
Dados que não podem ser processados são bastante inúteis, sempre haverá alguma forma de cálculo requerida em circuitos digitais e sistemas computacionais. Vamos olhar alguns dos operadores em Verilog que permitiriam ferramentas de síntese realizar elementos de hardware apropriados. Operadores Aritmé
O statement assign Verilog é tipicamente usado para conduzir continuamente um sinal de tipo de dado wire e é sintetizado como lógica combinacional. Aqui estão mais alguns exemplos de projeto usando o statement assign. Exemplo #1: Lógica Combinacional Simples O código mostrado abaixo implementa uma l
Sinais do tipo wire ou tipo de dado similar a wire requerem atribuição contínua de um valor. Por exemplo, considere um fio elétrico usado para conectar peças em uma protoboard. Enquanto a bateria de +5V é aplicada a uma extremidade do fio, o componente conectado à outra extremidade do fio obterá a t
Como vimos em um artigo anterior, projetos maiores e complexos são construídos integrando múltiplos módulos de forma hierárquica. Módulos podem ser instanciados dentro de outros módulos e portas destas instâncias podem ser conectadas com outros sinais dentro do módulo pai. Estas conexões de porta po
Portas são um conjunto de sinais que atuam como entradas e saídas para um módulo particular e são a maneira primária de se comunicar com ele. Pense em um módulo como um chip fabricado colocado em uma PCB e fica óbvio que a única maneira de se comunicar com o chip é através de seus pinos. Portas são
Um module é um bloco de código Verilog que implementa uma certa funcionalidade. Módulos podem ser embutidos dentro de outros módulos e um módulo de nível superior pode se comunicar com seus módulos de nível inferior usando suas portas de entrada e saída. Sintaxe Um module deve ser delimitado por pal
Uma declaração de array de uma net ou variável pode ser escalar ou vetor. Qualquer número de dimensões pode ser criado especificando um range de endereço após o nome do identificador e é chamado de array multidimensional. Arrays são permitidos em Verilog para tipos de dados reg, wire, integer e real
Verilog