Graduação em Engenharia Eletrônica Universidade Federal de Itajubá IESTI Verilog HDL Operações aritméticas Prof. Rodrigo de Paula Rodrigues
Valores lógicos possíveis 0 1 x z nível baixo, nível alto, nível alta falso verdadeiro desconhecido impedância
Notação numérica base de representação Nº de bits Base D1 D2... DN tamanho, em bits, do valor b binária d decimal o octal h hexadecimal dígitos do valor numérico 0 a 9, A a F, x, z
Notação numérica - Exemplos 1 b1 1 b0 2 b10 4 ha nível alto, valor 1 nível baixo, valor 0 valor binário de 2 bits valor hexa de 4 bits 8 d255 12 h12x 6 o71 4 b1xzx valor decimal de 8 bits valor hexa de 12 bits valor octal de 6 bits valor binário de 4 bits
Operadores aritméticos Símbolo Operação aritmética Exemplo + Adição - Subtração * Multiplicação / Divisão c + d c d a * b f / g ** Potência a ** b % Módulo (resto da divisão) a % d!! É sintetizável apenas se um dos operandos for um valor fixo
Operadores aritméticos A = 4 b0011, B = 4 b0010, C = 4 b001x A + B A - B B - A A / 2 A * 3 Resultado: 4 b0101 Resultado: 4 b0001 Resultado: 4 b1111 Resultado: 4b 0001 Resultado: 4b 1001 A + C A % 2 B ** 2 Resultado: x Resultado: 4 b0001 Resultado: 4 b0100
Exemplo: meio somador // Somador module somador( A, B, S, Cs ); 4 4 4 A S somador B Cs input [3:0] A, B; // entradas output [3:0] S; // saídas output Cs; // saídas wire [4:0] Sc; // interno assign Sc = A + B ; assign S = Sc[3:0]; assign Cs = Sc[4]; endmodule Descrição no Quartus II
Exemplo: meio subtrator // Subtrator module subtrator( A, B, S, Bs ); 4 4 4 A S subtrator B Bs input [3:0] A, B; // entradas output [3:0] S; // saídas output Bs; // saídas wire [4:0] Sc; // interno assign Sc = A - B; assign S = Sc[3:0]; assign Bs = Sc[4]; endmodule Descrição no Quartus II Mapeamento na tecnologia Cyclone II e Startix III
Exemplo: multiplicador // Multiplicador 4 8 4 A M multiplicador B M3 8 module multiplicador( A, B, M, M3 ); input [3:0] A, B; // entradas output [7:0] M, M3; // saídas assign M = A * B; assign M3 = A * 3; endmodule Descrição no Quartus II Mapeamento na tecnologia Cyclone II e MAX7000S
Exemplo: divisor // Divisor 4 2 4 A divisor D B D3 2 module divisor( A, B, D, D3); input [3:0] A, B; // entradas output [3:0] D, D3; // saídas assign D = A / B; assign D3 = A / 3; endmodule Descrição no Quartus II Mapeamento na tecnologia Cyclone II e Startrix III
Exemplo: potenciação // Potência 2 4 A P Potência de 2 module potencia2( A, P ); input [1:0] A; // entradas output [3:0] P; // saídas assign P = A ** 2; endmodule Descrição no Quartus II Mapeamento na tecnologia Cyclone II e Startrix III
Exemplo: módulo // Módulo 4 4 4 A B M módulo module modulo( A, B, M ); input [3:0] A, B; // entradas output [3:0] M; // saídas assign M = A % B; endmodule Descrição no Quartus II
Operadores aritméticos Símbolo Operação de deslocamento Exemplo >> Deslocamento à direita a >>b << Deslocamento à esquerda a << c >>> Deslocamento aritmético à direita b >>> f <<< Deslocamento aritmético à esquerda c <<< g!!! Ambos os operandos precisam ser declarados como sinalizados
Operadores aritméticos << Deslocamento à esquerda 0 b n b 0 >> Deslocamento à direita 0 b n b 0 <<< Deslocamento aritmético à esquerda 0 0 b n b 0 0 >>> Deslocamento aritmético à direita b n b 0
Exemplo: deslocamento controlado // Deslocamento module deslocamento( A, d, S1, S2, S3, S4 ); input [1:0] d; // entradas input signed [7:0] A; // entradas output signed [7:0] S1, S2, S3, S4 ; // saídas assign S1 = A << d; assign S2 = A >> d; assign S3 = A <<< d; assign S4 = A >>> d; endmodule 4 A S1 S2 S3 d 2 S4 8 8 8 8 Descrição no Quartus II
Exercício Implemente uma unidade de divisão e multiplicação por 2 n para um operando de 8 bits.
Obrigado