Tutorial de Verilog: Conversor BCD para 7 Segmentos

Conversor BCD para 7 Segmentos
Este post faz parte da série Tutorial de Verilog

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.  

CD4511B - Conversor BCD para 7 Segmentos
Figura 1: Circuito Integrado CD4511B da Texas Instruments

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.
Conversor BCD para 7 Segmentos em Verilog
Figura 2: Display de 7 Segmentos

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.

Conversor BCD para 7 Segmentos - Testbench

Faça Download do Projeto para o Quartus da Altera:

download

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!

Tutorial de Verilog

Tutorial de Verilog: Somador com Propagação do Carry – Somador Ripple-Carry Tutorial de Verilog: Contador binário síncrono crescente Mod 10 com reset síncrono em nível lógico baixo
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
FERNANDO MARCOLINO DEZEMBRO
FERNANDO MARCOLINO DEZEMBRO
30/06/2019 14:16

O 9 esta errado
Correto seria abcdfg

Home » Hardware » Sistemas Digitais » Tutorial de Verilog: Conversor BCD para 7 Segmentos

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: