Uploaded by Abner Barros

Tutorial Verilog

advertisement
Circuitos Digitais
Tutorial Linguagem Verilog
Baseado em:
http://doulos.com/knowhow/verilog_designers_guide/design_flow_using_verilog/
Universidade Federal Rural de Pernambuco
Professor: Abner Corrêa Barros
abnerbarros@gmail.com
Projetos sem HDL
●
Especificações
●
Modelagem
●
●
Máquina de Estados
●
Tabela Verdade/Tabela de transição
Simplificação
●
●
Mapa de karnaugh
Circuito Elétrico
2
Projeto com HDL
●
Especificação (specs)
●
Modelagem
●
Projeto de Alto Nível
●
Codificação RTL
●
Verificação
●
Sintese.
3
Projeto com HDL - Verilog
4
Níveis de abstração em projetos com Verilog
5
Níveis de abstração em projetos com Verilog
No seu mais alto nível de abstração a linguagem Verilog
permite o uso de funções estocásticas, por meio
das quais é possível efetuar diversos estudos
importantes para amodelagem e validação do
sistema.
Em um nível mais baixo de abstração, é possível o uso
da modelagem comportamental, por meio de
comandos de linguagens de alto nível. Desta forma
pode-se modelar a funcionamento de dos módulos de
um sistema sem se preocupar com os detalhes da
implementação em hw.
6
Níveis de abstração em projetos com Verilog
• A linguagem verilog suporta duas abordagens na descrição
dos circuitos.
• Descrição a nível comportamental, na qual o projeto será descrito
com base no funcionamento esperado, abstraindo o modo como
esse será mapeado FPGA/ASIC
• Descrição a nível de mapeamento de módulos e portas lógicas ,
conhecida como descrição RTL ( Regiter Transfer Level). Esse nível
de descrição dá mais liberdade ao desenvolvedor para definir como
o projeto será mapeado no FPGA/ASIC.
7
Níveis de abstração em projetos com Verilog
Verilog pode ser utilizado também para descrever
ambientes de simulação, com vetores de teste,
resultados esperados e circuitos de comparação e
análise com os resultados obtidos.
Algumas ferramentas de simulação permitem
também que sejam introduzidos breakpoints e
checkpoints a fim de facilitar o processo de
verificação e debug dos módulos em
desenvolvimento.
8
Modelagem e Particionamento
9
Elementos da Linguagem Verilog
Construtores




Módulos

Portas
Tipos de dados básicos(wire, reg)
Operadores (lógicos, aritméticos,
relacionais, atribuição, etc)

Biblioteca de componentes básicos

Hierarquia
10
Módulos
●
Módulos são a parte principal de um projeto verilog
–
Representam o módulo eletrônico implementado
–
–
●
●
Módulo = bloco Funcional
Módulos possuem entradas e saidas (Elementos de conexão
entre os módulos)
Utiliza-se a palavra reservada module para definir
um módulo
Pode-se fazer um paralelo entre os módulos verilog
e as funções e procedimentos das demais
linguagens de programação
11
Exemplo: módulo arbrito
module arbiter (
clock
, // clock
reset
, // Active high, syn reset
req_0
, // Request 0
req_1
, // Request 1
gnt_0
, // Grant 0
gnt_1
// Grant 1
);
Portas do módulo
12
Portas
• Portas são os elementos que fazem a
interface elétrica do módulo. As portas
devem ser declaradas como entrada,
saída ou entrada e saída
13
Exemplo1: módulo arbrito
module arbiter (
clock
, // clock
reset
, // Active high, syn reset
req_0
, // Request 0
req_1
, // Request 1
gnt_0
, // Grant 0
gnt_1
// Grant 1
);
//-------------Input Ports----------------------------input
clock;
input
reset;
input
req_0;
input
req_1;
//-------------Output Ports---------------------------output
gnt_0 ;
output
gnt_1 ;
14
Exemplo2: módulo arbrito
module arbiter (
input clock
, // clock
input reset
, // Active high, syn reset
input req_0
, // Request 0
input req_1
, // Request 1
output gnt_0
, // Grant 0
output gnt_1
// Grant 1
);
15
Tipos de Dados
Verilog suporta dois principais tipos de
dados e dois modificadores:
•Wire: Tipo de dado utilizado para conectar dois pontos de
um módulo ou duas portas de módulos diferentes (um fio
condutor). A princípio, salvo indicação em contrário, todos os
elementos de uma porta são do tipo Wire.
•Reg: Tipo de dado utilizado para armazenar um dado
lógico . Equivalente a um Flip/Flop ou a um Latch.
•Input / Output: Modificadores que indicam que a porta é
de entrada ou saida.
Obs: Apenas sinais do tipo Wire podem ser associados como
input.
16
Declaração de valores
• A fim de otimizar o uso dos recursos do hardware, em
Verilog um valor constante pode ser declarado
acompanhado da quantidade de bits que deve ser
utilizado na sua representação
• Formato:
• NN’BYYY…YY
• NN = Número de Bits
• B = Base numérica (b=binária, h=hexadecimal, d=decimal)
• YYY…YY = Valor a ser atribuido
• Exemplo: 8’h01 = valor 1 em hexadecimal representado em 8 bits
7’b0101100 = valor 46 em binário com 8 bits
17
Tipos de Dados
Vectors
A linguagem Verilog permite agrupar sinais na
forma de vetores dos tipos básicos de dados.
Declaração:
Data Type [Range] name;
• Range = Higher Bound: Lower Bound
• Exemplo: Reg [7:0] reg_name;
19
Exemplos Vectors
wire[7:0] dado;
Reg [3:0] cnt;
dado=8’d234;
cnt = 4’b0111;
dado=8’hAB;
dado[5]=1’b0;
20
Tipos de Dados
Array
A linguagem Verilog permite definir array de
elementos dos tipos básicos de dados.
Declaração:
Data Type [Range] name [Size];
•
•
•
•
Range = Higher Bound: Lower Bound
Size = Tamanho do array
Exemplo: Reg [7:0] dados [0:7];
Dados[5] = 8’hAA;
21
Exemplos Arrays
Reg [7:0] dado [0:7];
Wire [7:0] word;
Wire bit;
dado[5]=8’hAA;
word= dado[3]; // acessa uma palavra
bit = word[5]; // acessa um bit
22
Operadores Lógicos e
Aritméticos
23
Control Statements
•
if, else, case, repeat, while, for - são os comandos de
controle de fluxo do Verilog e funcionam de forma muito
parecida aos seus equivalentes das outras linguagens
• Entretanto, por ser um linguagem de descrição de Hw, nem
todos os comandos de controle são de fato implementáveis
em hardware. Comandos de repetição normalmente não são
suportados
• Na verdade, apesar da sintaxe ser bem parecida, temos que
lembrar que estes comandos serão implementados em HW
utilizando portas lógicas e não instruções de um processador e
isto pode fazer muita diferença no seu funcionamento
24
Exemplo de uso do If-else
25
Exemplo do comando Case
Wire a,b,c;
…
case ({a, b, c})
3'b000: f = 1'b0;
3'b00l: f = 1'b1;
3'b0l0: f = 1'b1;
3'b011: f = 1'b1;
3'b100: f = 1'b1;
default: f = 1'b0;
endcase
Wire [2:0] dado;
…
case (dado)
3'b000: f = 1'b0;
3'b00l: f = 1'b1;
3'b0l0: f = 1'b1;
3'b011: f = 1'b1;
3'b100: f = 1'b1;
default: f = 1'b0;
endcase
26
Estilos de Codificação em Verilog
• RTL (Regiter Transfer Lógic)
• Representa o mais baixo nível de abstração da
liguagem, normalmente associado aos elementos
lógicos (portas, operadores) que tem
representação direta no hardware
• Behavioral (Comportamental)
• Permite projetar com mais alto nível de abstração,
sem se preocupar como o circuito será de fato
implementado em hardware
27
Simple Design
A
B
C
D
AOI
F
// Verilog code for AND-OR-INVERT gate
module AOI (input A, B, C, D, output F);
....
endmodule
// end of Verilog code
28
Simple Design
Module xxx (O1 , O2 , … I1, I2…);
Input I1, I2, …., In;
output O1, O2, …., On;
assign O1=….
….
assign On=….
endmodule
// Verilog code for AND-OR-INVERT gate
module AOI (input A, B, C, D, output F);
assign F = ~((A & B) | (C & D));
endmodule
// end of Verilog code
29
Utilizando Wires
Wire
// Verilog code for AND-OR-INVERT gate
module AOI (input A, B, C, D, output F);
wire F; // the default
wire AB, CD, O; // necessary
assign AB = A & B;
assign CD = C & D;
assign O = AB | CD;
assign F = ~O;
endmodule
// end of Verilog code
30
Utilizando Wires
// Verilog code for AND-OR-INVERT gate
module AOI (input A, B, C, D, output F);
/* start of a block comment
wire F;
wire AB, CD, O;
assign AB = A & B;
assign CD = C & D;
Comentário
assign O = AB | CD;
em Bloco
assign F = ~O;
end of a block comment */
// Equivalent...
wire AB = A & B;
wire CD = C & D;
wire O = AB | CD;
wire F = ~O;
endmodule
// end of Verilog code
31
Projeto Hierarquico
// Verilog code for 2-input multiplexer
module INV (input A, output F); // An inverter
assign F = ~A;
endmodule
module AOI (input A, B, C, D, output F);
assign F = ~((A & B) | (C & D));
endmodule
module MUX2 (input SEL, A, B, output F); // 2:1
multiplexer
// wires SELB and FB are implicit
// Module instances...
INV G1 (SEL, SELB);
AOI G2 (SELB, A, SEL, B, FB); // Position mapping
INV G3 (.A(FB), .F(F));
// Named mapping
endmodule
// end of Verilog code
32
Testbench
module MUX2TEST;
// No ports!
...
initial // Stimulus
...
MUX2 M (SEL, A, B, F);
initial // Analysis
...
endmodule
33
Testbench - Stimulus
initial // Stimulus
begin
SEL = 0; A = 0; B = 0;
#10 A = 1;
#10 SEL = 1;
#10 B = 1;
end
34
Testbench - Analysis
initial // Response
$monitor($time, , SEL, A, B, F);
0 0000
10 0101
20 1100
30 1111
35
Verilog RTL
36
Bloco Always – Verilog Comportamental
37
Módulo AOI utilizando Always
38
Declaração de variáveis
39
Lógica combinacional com always
Golden Rule 1: Para sintetizar lógica
combinacional utilizando o always todos os sinais
de entrada devem aparacer na lista de
sensibilidade
Mux 2x1
a
f
b
sel
40
Comando If
• O comando if é por natureza sequencial,
ou seja, ele primeiro avalia a expressão de
controle e em seguida executa o comando
associado e, assim como na liguagem C,
aceita apenas um comando aninhado em
cada fluxo de execução.
• Sendo necessário aninhar mais de um
comando deve se utilizar o comando de
bloco begin…end
• Normalmente o comando if é sintetizado
na forma de um multiplexador
41
Comando if aninhado
42
Problemas com o comando if
43
Problemas com o comando if
Golden Rule 2: Para sintetizar lógica
combinacional utilizando o always
todas as variáveis devem ser
carregadadas em todas as condições
44
Resolvendo o problema com
always combinacional
Se não for possível garantir
que todas as variáveis
sejam carregadas em
todas as condições,
carrege-as com valores
default antes de executar
o código condicional
45
Comando Case
Reg a,b,c;
…
case ({a, b, c})
3'b000: f = 1'b0;
3'b00l: f = 1'b1;
3'b0l0: f = 1'b1;
3'b011: f = 1'b1;
3'b100: f = 1'b1;
default: f = 1'b0;
endcase
Reg [2:0] dado;
…
case (dado)
3'b000: f = 1'b0;
3'b00l: f = 1'b1;
3'b0l0: f = 1'b1;
3'b011: f = 1'b1;
3'b100: f = 1'b1;
default: f = 1'b0;
endcase
46
47
Projeto de módulos sequenciais
Módulos sequenciais diferem dos módulos combinacionais por
disporem de elementos de memória que registram o estado
do sistema de forma a alterar a sua resposta aos estímulos
da entrada a partir do estado em que se encontra
Log. Combinacional
Elementos
de
Memória
48
Projeto de módulos sequenciais
Como elementos de memória normalmente utilizamse Flip-Flops, os quias são implementados
utilizando o comando always
•
O comando always executa o que estiver em seu interior
de maneira síncrona com os eventos monitorados em
sua lista de sensibilidade
•
Da mesma forma que os flip-flops ativam o
armazenamento de informação sincronamente com o
sinal de clock
•
Enquanto o evento não ocorre a lógica interna do flipflop não é ativada
49
Always - Lista de sensibilidade
always @(sensitivity-list)
begin
// statements
end
always @(a, b, c, d)
sensitivity-list
always @(a or b or c or d)
always @(*)
always @*
always @(posedge a or posedge b)
always @(negedge a or posedge b)
always @(negedge a)
50
Always - observações
• Tipos de transições
• posedge (transição de subida)
• negedge (transição de descida)
• sem polaridade (qualquer transição)
• Não é permitido misturar transições com e sem
polaridade na lista de sensibilidade
 always @(a or b or c or d)
 always @(posedge a or negedge b)
Х always @(a or posedge b)
51
Exemplos de projetos
Lógica Combinacional - RTL
52
Exemplos de projetos
Lógica Combinacional – RTL Hierárquico
53
Exemplos de projetos
Lógica Combinacional – Comportamental
54
Exemplos de projetos
Lógica Sequencial– Comportamental
55
Exemplos de projetos
Lógica Sequencial– Comportamental
56
Exemplos de projetos
Lógica Sequencial– Comportamental
57
Lógicas sequencial x
combinacional
• Na lógica sequencial as atualizações nas
saidas ocorrem sincronamente com as
transições indicadas para os elementos
da lista de sensibilidade.
• Na lógica combinacional as saidas estão
em constante atualização. Qualquer
alteração no estado de qualquer das
entradas força a atualização das saidas.
58
Review
Combinacional RTL
// continuous assignments
assign selb = ~sel;
assign fb = ~((a & sel) | (b & selb));
assign f = ~fb
Hierárquico
// a hierarchy of designs
INV G1 (SEL, SELB);
AOI G2 (SELB, A, SEL, B, FB);
INV G3 (.A(FB), .F(F));
Combinacional Comportamental
// always block
always @(sel or a or b)
begin
if (sel == 1)
f = a;
else
f = b;
end
Sequancial
// always block
always @(posedge clk)
Begin
q=d;
end
59
Exercícios
Implemente e verifique a funcionalidade
dos seguintes módulos:
a)
b)
c)
d)
Porta and com 5 entradas
Multiplexador 4 x 4
Contador módulo 4
Somador/subtrator completo de 4 bits no
padrão de magnitude e sinal
e) Conversor BCD – 7 seguimentos
f) Flip-Flops JK, D e T
60
Comando Case
logic a,b,c;
…
case ({a, b, c})
3'b000: f = 1'b0;
3'b00l: f = 1'b1;
3'b0l0: f = 1'b1;
3'b011: f = 1'b1;
3'b100: f = 1'b1;
default: f = 1'b0;
endcase
logic [2:0] dado;
…
case (dado)
3'b000: f = 1'b0;
3'b00l: f = 1'b1;
3'b0l0: f = 1'b1;
3'b011: f = 1'b1;
3'b100: f = 1'b1;
default: f = 1'b0;
endcase
61
Projeto 1
Implemente uma calculadora de 4 bits
com as seguintes operações:
•
•
•
•
SOMA
SUBTRAÇÃO
MULTIPLICAÇÃO
DIVISÃO
62
Projeto 2
Implemente uma máquina de vender refrigerantes
com as seguintes funcionalidades:
• Aceita moedas de R$ 0,50 e R$ 1,0
• Vende refrigerantes de R$ 1.50 , R$ 2.50 e R$ 3.00
• Pode acumular até 6,0 em créditos
• Fornece quantos refrigerantes os créditos acumulados
permitirem
• Fornece troco (tem uma tecla para pedir o troco)
• Possui um display para mostrar o valor acumulado e o
troco
• Tem um estoque para até 3 latas de cada refrigerante
• Sinaliza quando tem refrigerante no estoque (LED)
63
Projeto 2
SALDO
Refri 1
1,50
0,50
1,00
TROCO
Refri 2
2,50
Refri 3
3,00
SERVE
64
Download