Aula 5.8 - Contador de 4 bits para display de 7-segmentos
Na primeira aula dessa série de aulas você aprendeu toda a base para compreender códigos em Verilog HDL e rodar os códigos, se ainda não leu clique aqui e confira.
Para começarmos a aula de hoje, é recomendado que tenha lido a aula 5.7, caso não tenha lido.. clique aqui e confira!
Nesta aula vamos criar um contador que possa ser exibido em display de 7 segmentos. Para isso precisaremos dos códigos de um decodificador que você viu nas aulas anteriores.
Código decodificador:
module decodificador (E,S);
input [3:0]E;
output reg [0:6]S;
always @(*)
begin
case(E)
4'b0000 : S=7'b0000001;
4'b0001 : S=7'b1001111;
4'b0010 : S=7'b0010010;
4'b0011 : S=7'b0000110;
4'b0100 : S=7'b1001100;
4'b0101 : S=7'b0100100;
4'b0110 : S=7'b0100000;
4'b0111 : S=7'b0001101;
4'b1000 : S=7'b0000000;
4'b1001 : S=7'b0000100;
default : S=7'b1111111;
endcase;
end
endmodule
Vamos precisar de um código chamado divisor, ele permitirá nós utilizar o dispositivo de clock presente na FPGA em uma frequência que nós humanos conseguimos enxergar.
Código divisor:
module divisor(clocknovo,reset,clock);
input reset,clock;
output clocknovo;
reg [23:0]Q;
initial
begin
Q = 24'b000;
end
always @ (posedge clock or posedge reset)
begin
if (reset == 1'b1) begin
Q = 24'b000;
end
else begin
Q = Q + 1;
end
end
assign clocknovo = Q[23];
endmodule
Agora precisamos do código de um contador de 4 bits para chamar o módulo divisor acima.
Contador 4 bits:
module contador4bits(CLOCK_50, preset, reset,HEX0,HEX1); //clock pinado, saidas pinadas hex
input reset, preset, CLOCK_50;
reg [3:0]Q;
output[0:6]HEX0,HEX1;
wire[3:0] dez,unid;
initial
begin
Q=4'b0000;
end
wire clocknovo;
divisor(clocknovo,reset,CLOCK_50); //chama modulo divisor
always@(posedge clocknovo or posedge reset or posedge preset) //tem que ser a mesma borda do divisor
begin
if (reset ==1'b1)
begin
Q=4'b0000;
end
else if(preset==1'b1)
begin
Q=4'b1111;
end
else
begin
Q=Q+1;
end
end
assign dez= Q/10;
assign unid = Q%10;
decodificador(unid,HEX0);
decodificador(dez,HEX1);
endmodule
Com os código acima você consegue criar um contador crescente de 4 bits (módulo 16) síncrono. O contador é controlado pelo clock de no máximo 10Hz, sendo assim necessário usar o cristal de 50MHz. A contagem deve aparecer nos displays de 7-segmentos (dezena e unidade) conforme configurado o decodificador.
Finalizamos então aqui a primeira parte de uma série de aulas sobre códigos em Verilog. Quem sabe teremos mais? Salve em seus favoritos nosso site.
Voltar ao menu inicial, clique aqui.
input reset,clock;
output clocknovo;
reg [23:0]Q;
initial
begin
Q = 24'b000;
end
always @ (posedge clock or posedge reset)
begin
if (reset == 1'b1) begin
Q = 24'b000;
end
else begin
Q = Q + 1;
end
end
assign clocknovo = Q[23];
endmodule
Agora precisamos do código de um contador de 4 bits para chamar o módulo divisor acima.
Contador 4 bits:
module contador4bits(CLOCK_50, preset, reset,HEX0,HEX1); //clock pinado, saidas pinadas hex
input reset, preset, CLOCK_50;
reg [3:0]Q;
output[0:6]HEX0,HEX1;
wire[3:0] dez,unid;
initial
begin
Q=4'b0000;
end
wire clocknovo;
divisor(clocknovo,reset,CLOCK_50); //chama modulo divisor
always@(posedge clocknovo or posedge reset or posedge preset) //tem que ser a mesma borda do divisor
begin
if (reset ==1'b1)
begin
Q=4'b0000;
end
else if(preset==1'b1)
begin
Q=4'b1111;
end
else
begin
Q=Q+1;
end
end
assign dez= Q/10;
assign unid = Q%10;
decodificador(unid,HEX0);
decodificador(dez,HEX1);
endmodule
Com os código acima você consegue criar um contador crescente de 4 bits (módulo 16) síncrono. O contador é controlado pelo clock de no máximo 10Hz, sendo assim necessário usar o cristal de 50MHz. A contagem deve aparecer nos displays de 7-segmentos (dezena e unidade) conforme configurado o decodificador.
Finalizamos então aqui a primeira parte de uma série de aulas sobre códigos em Verilog. Quem sabe teremos mais? Salve em seus favoritos nosso site.
Voltar ao menu inicial, clique aqui.
COMENTÁRIOS