Você está na página 1de 29

Verilog

AULA - 3

Introduo
Verilog uma linguagem, como VHDL, largamente usada para descrever sistemas digitais, utilizada universalmente. Histrico: Inicialmente, Verilog era uma linguagem proprietria desenvolvida pela empresa Gateway. Verilog foi desenvolvida nos anos 1980 e foi inicialmente usada para modelar dispositivos ASIC. Em 1990, Verilog caiu no dominio pblico e agora est sendo padronizado como IEEE 1364.

Caractersticas
Exemplo de programa: module add (a, b, out); // cabealho input [7:0] a, b; // entradas output [7:0] out; // saidas assign out = a + b; // operao endmodule
a 8 b 8

8 out

Modulo
(conveniente que um arquivo contenha um mdulo)
module nome_do_modulo ( , , ...., ); lista de terminais declarao { terminais, Terminais so pinos de
registradores, wires entrada e sada do FPGA registradores e wires so drivers que guardam valores e ligam pontos do circuito, respectiva/.

construo da lgica { assign, function allways endmodule

Declarao dos terminais


Usar uma linha de declarao para terminais com mesmo nmero de bits: input a,b; output [7:0] c,e; output [3:0] d;
d[3], d[2], d[1], d[0]
[7:0] bits na configurao little endian (menos sign. a direita) [0:7] big endian

Exercicio: fazer a declarao dos terminais da caixa preta

Declarao de registradores e wires (fiaes ou ns)


Reg Wire

reg a; //registrador a reg [3:0] b,c ; // registradores de 4 bits b,c wire d; // sinal da fiacao, d wire [7:0] e; // sinal de 8 bits da fiacao, e Registradores so drivers que guardam valores Wires so drivers que apenas conectam dois pontos (equivale ao signal do VHDL)

Parte Lgica
Comandos: assign, assign + function, always
elementos combinatrios podem ser modelados usando comandos assign e always elementos sequenciais so podem ser modelados com comandos always

assign
assign add_out = a + b; // soma assign or_out = a|b|c; // or de 3 entradas

operacoes logicas: and & or | xor ^ not ~ nand ~& nor ~| right shift >> left shift << concatenacao {} condicional ? operacoes aritmeticas: adicao + subtracao multiplicacao * divisao / modulo %

assign usada para modelar somente lgica combinatria.

Exemplo: alta impedncia


assign out = (enable) ? data:1bz;
Exemplo de um buffer tri-state. Quando enable e 1, data conduzida para a saida, seno ocorre alta impedncia.

Operacoes de comparao
Igual Desigual Menor Menor/igual Maior Maior/igual Exemplos: reg [3:0] a,b; wire comp; // quando a igual a b comp = 1 assign comp = (a == b); == a == b != a != b < a<b <= a <= b > a > b >= a >= b

reduo
Resumir uma quantidade de bits em uma nica operao
a0

Exemplo: assign and4 = &a;

a1 a2 a3

and4

Equivale a: assign and4 = a[3]&a[2]&a[1]&a[0]; Possvel tambm para: & (and), |(or), ^ (xor)

concatenao
Transforma duas variveis em uma nica varivel:

assign c = {a, b}; c assign { a, b} = c assign {cout, out} = a + b;

function
Usado quando um mesmo cdigo e repetido vrias vezes. Exemplo:
function parity; input [31:0] data; integer i; begin parity = 0; for (i = 0; i < 32; i = i + 1) begin parity = parity^data[i]; end end

Assign + function
assign out = sel2to1(a,b,sel); function [3:0] sel2to1; input [3:0] a,b; input sel; if (sel) sel2to1 = a; else sel2to1 = b; endfunction

case (sel) 1: sel2to1 = a; 0: sel2to1 = b; endcase

Comando if
Possvel usar internamente a function e always: if ( , ; ; end else if ( , ; else ; ) ) begin
Quando tiver mais de um comando, cercar com begin end. // exemplo de comando if if (enable ==1b1) begin data = 10; // atribuio decimal address = 16Hdead; // hexadecimal wr_enable = 1b1; // binrio end else begin data = 32b0; wr_enable = 1b0; address = address + 1; end

Comando case
Possvel usar internamente a function e always:

case (
A: --- ; B: --- ;

. . . default: --- ; endcase

Representao de valores
8hff // representa ff em 8 bits 8b1111_1111 Pode usar para facilitar a leitura 8d15 Nmero de bits sistema: d decimal h hexadecimal b binrio

Comando always
O comando always do Verilog equivalente ao process do VHDL Todos os comandos always so executados em paralelo, enquanto, internamente a um comando always, os comandos so executados em sequncia.
always @ (a or b or sel) begin y = 0; if (sel ==0) begin y = a; end else begin y = b; end end

lista de sensibilidade diz quando o bloco de cdigo executado.

always
always @ (posedge clk) begin dff_c <= dff_n; L i end
s t a

Lista de sensibilidade posedge borda de subida negedge borda de descida

usamos a atribuio = no caso da lgica combinatria, e para lgica sequencial usamos <=. = representa blocking assignment executa o cdigo sequencialmente dentro de um begin/end. <= representa nonblocking assignment executa o cdigo em paralelo dentro de um begin/end.

always
always @ (posedge clk or negedge rst) begin if (rst ==1b0) q <= 1b0; else q <= d; end always @(posedge clk) begin if (rst ==1b0) q <= 1b0; else q <= d; end

d rst clk D > Q

Exemplo de contador
module count4(clk, rst, q); input clk, rst; output [3:0] q; reg [3:0] count; always @(posedge clk or negedge rst) begin if (rst == 1b0) count <= 4b0000; else if (count == 4b1110) count <= 4b0000; else count <= count + 1; end assign q = count; endmodule

Exerccio
Desenvolver um programa em Verilog para o circuito meio-somador.
A SOMA B

VAI-UM

Exerccio
Implementar um circuito decodificador definido pela Tabela: A 00 01 10 11 Decode 0001 0010 0100 1000

Exerccio
Escrever um programa Verilog para o circuito multiplexador

A(0) A(1) A(2) A(3) SEL 2 C

Exerccio
Escrever um programa para o circuito da Figura ao lado, cujo funcionamento dos flip-flops descrito pela Tabela abaixo.

SET

D(0)

Q(0)

D(1)

Q(1)

SET CLK L H H X ! !

D X L H

Q H L H
D(2) D Q Q(2)

D(3)

Q(3)

CLK

Exemplo 1 de programa Verilog completo

(Circuito lgico combinatrio: EOUT = (AIN xor BIN xor CIN). DIN )
module combinatorio (ain, bin, cin, din, eout); input ain, bin, cin, din ; output eout; assign eout = (ain ^ bin ^ cin)&~din; endmodule

Exemplo 2 de programa completo (cIRCUITO SEQUENCIAL: contador binrio crescente de 4 bits.)


Module contador ( indata,load, clk, cnt); input [3:0] indata; input load, clk; output [3:0] cnt; reg [3:0] conta; always@(posedge clk) begin if (load ==1b1) conta <= indata; else conta <= conta + 1; end assign cnt = conta; endmodule

Exemplo 3 de programa completo (cIRCUITO SEQUENCIAL: registrador de deslocamento simples)


module registrador (rst, clk, shifin, shifout); input clk, rst, shifin; output shifout; reg [0:3] registra; always@(posedge clk or negedge rst) begin if (rst == 1b0) registra <= 4b0000; else begin registra[0] <= shifin; registra[1] <= registra [0]; registra[2] <= registra [1]; registra[3] <= registra [2]; end assign shifout = registra[3]; endmodule

Você também pode gostar