Há algum tempo atrás foram publicados dois artigos no Embarcados que dizia respeito ao controle de displays de sete segmentos. Foram publicados os textos Displays de LED de 7 segmentos e Sistemas Operacionais de Tempo Real – Displays de 7 segmentos, ambos escritos por Henrique Puhlmann. Nesses textos, Puhlmann explica minuciosamente como o Display funciona, qual é a forma correta de montar o circuito e como controlá-lo utilizando microcontrolador. Nesse post, é implementado um conversor BCD para 7 segmentos em Verilog, seguindo as especificações de um CI bastante usado para esse fim.
Escolhi um CI CMOS Conversor BCD para 7 segmentos (BCD-to-7-Segment Latch Decoder Drivers) da Texas Instruments, o Circuito Integrado CD4511B para que pudesse servir de base para essa implemetação. A tabela verdade do CD4511 foi então copiada do datasheet e é mostrada abaixo.
Para esse CI, temos a relação entre entrada BCD e saída de sete segmentos. Veja no desenho técnico acima como as variáveis a, b, c, d, e, f, g se comportam.
- 0 (Zero) – a, b, c, d, e, f;
- 1 (Um) – b, c;
- 2 (dois) – a, b, d, e, g;
- 3 (três) – a, b, c, d, g;
- 4 (quatro) – b, c, f, g;
- 5 (cinco) – a, c, d, f, g;
- 6 (seis) – a, c, d, e, f, g;
- 7 (sete) – a, b, c;
- 8 (oito) – a, b, c, d, e, f, g (todos);
- 9 (nove) – a, b, c, f, g.
Representação do Circuito Conversor BCD para 7 segmentos em Verilog
A lógica acima foi implementada em Verilog conforme pode-se conferir a seguir. Primeiramente verifique que testo os sinais LI barra e BI Barra e apenas se LI barra e BI barra forem igual a um e LE é igual a zero, as condições de conversão BCD para 7 segmentos são aplicadas.
// Embarcados - Use como quiser e de os creditos
// Exemplo de Implementacao de um conversor BCD 7 segmentos seguindo o CD4511 da TI
// Thiago Lima - 15/11/2015
module BCDto7SEGMENT( a, b, c, d, e, f, g, D, C, B, A , LTbarr, BIbarr, LE );
output a, b, c, d, e, f, g;
input D, C, B, A;
input LTbarr, BIbarr, LE;
reg [6:0] SeteSegmentos;
always @(*)
if ( LTbarr == 0 )
begin
SeteSegmentos = 8'b11111111;
end
else
begin
if ( BIbarr == 0 )
begin
SeteSegmentos = 8'b00000000;
end
else if(( BIbarr == 1 ) && ( LTbarr == 1 ) && ( LE == 0))
begin
case({D, C, B, A})
4'b0000: SeteSegmentos = 7'b1111110;
4'b0001: SeteSegmentos = 7'b0110000;
4'b0010: SeteSegmentos = 7'b1101101;
4'b0011: SeteSegmentos = 7'b1111001;
4'b0100: SeteSegmentos = 7'b0110011;
4'b0101: SeteSegmentos = 7'b1011011;
4'b0110: SeteSegmentos = 7'b0011111;
4'b0111: SeteSegmentos = 7'b1110000;
4'b1000: SeteSegmentos = 7'b1111111;
4'b1001: SeteSegmentos = 7'b1110011;
default: SeteSegmentos = 7'b0000000;
endcase
end
end
assign {a, b, c, d, e, f, g} = SeteSegmentos;
endmodule
Testbench
Eu testei todas as condições da tabela verdade. Veja que os sinais são injetados conforme a tabela da figura 1.
//Verilog Code for //by Thiago Lima module BCDto7SEGMENT_tb; wire a_tb, b_tb, c_tb, d_tb, e_tb, f_tb, g_tb; reg D_tb, C_tb, B_tb, A_tb; reg LTbarr_tb, BIbarr_tb, LE_tb; BCDto7SEGMENT dut( a_tb, b_tb, c_tb, d_tb, e_tb, f_tb, g_tb, D_tb, C_tb, B_tb, A_tb, LTbarr_tb, BIbarr_tb, LE_tb ); initial begin LTbarr_tb = 0; #1 LTbarr_tb = 1; BIbarr_tb = 0; #1 LTbarr_tb = 1; BIbarr_tb = 1; LE_tb = 0; D_tb = 0; C_tb = 0; B_tb = 0; A_tb = 0; #1 D_tb = 0; C_tb = 0; B_tb = 0; A_tb = 1; #1 D_tb = 0; C_tb = 0; B_tb = 1; A_tb = 0; #1 D_tb = 0; C_tb = 0; B_tb = 1; A_tb = 1; #1 D_tb = 0; C_tb = 1; B_tb = 0; A_tb = 0; #1 D_tb = 0; C_tb = 1; B_tb = 0; A_tb = 1; #1 D_tb = 0; C_tb = 1; B_tb = 1; A_tb = 0; #1 D_tb = 0; C_tb = 1; B_tb = 1; A_tb = 1; #1 D_tb = 1; C_tb = 0; B_tb = 0; A_tb = 0; #1 D_tb = 1; C_tb = 0; B_tb = 0; A_tb = 1; #1 D_tb = 1; C_tb = 0; B_tb = 1; A_tb = 0; #1 D_tb = 1; C_tb = 0; B_tb = 1; A_tb = 1; #1 D_tb = 1; C_tb = 1; B_tb = 0; A_tb = 0; #1 D_tb = 1; C_tb = 1; B_tb = 0; A_tb = 1; #1 D_tb = 1; C_tb = 1; B_tb = 1; A_tb = 0; #1 D_tb = 1; C_tb = 1; B_tb = 1; A_tb = 1; #1; end endmodule
Forma de Onda resultante do teste
Os sinais de saída são de acordo com a tabela da Figura 1.
Faça Download do Projeto para o Quartus da Altera:
Note que a figura em destaque é apenas ilustrativa e foi retirado do texto de Henrique Puhlmann que pode ser acessado nesse link. Um muito obrigado a Henrique Puhlmann por essa imagem!










O 9 esta errado
Correto seria abcdfg