n --> son los 8 bits que usamos de entrada binaria desde interruptores
bcd --> son 12 bits de salida bcd, que tenemos que segmentar en 3 partes para mostrarlos en tres displays de 7 segmentos.
Código: Seleccionar todo
module binary2bcd (
input wire clk,
input wire [7:0] n,
input wire start,
output wire [11:0] bcd,
output reg finish
);
reg [3:0] loop = 4'h0;
reg [19:0] scratch = 20'h00000;
reg [19:0] scratch_modificado;
reg [11:0] output_reg = 12'h000;
assign bcd = output_reg;
initial finish = 1'b1;
always @(posedge clk) begin
if (start && finish) begin
loop <= 4'h0;
scratch <= {12'h000, n};
finish <= 1'b0;
end
else if (loop == 4'd8) begin
output_reg <= scratch[19:8];
loop <= loop + 1;
finish <= 1'b1;
end
else if (loop == 4'd9) begin
finish <= 1'b0;
end
else begin
loop <= loop + 1;
scratch <= {scratch_modificado[18:0],1'b0};
end
end
always @* begin
scratch_modificado[7:0] = scratch[7:0];
if (scratch[11:8]>4)
scratch_modificado[11:8] = scratch[11:8] + 4'd3;
else
scratch_modificado[11:8] = scratch[11:8];
if (scratch[15:12]>4)
scratch_modificado[15:12] = scratch[15:12] + 4'd3;
else
scratch_modificado[15:12] = scratch[15:12];
if (scratch[19:16]>4)
scratch_modificado[19:16] = scratch[19:16] + 4'd3;
else
scratch_modificado[19:16] = scratch[19:16];
end
endmodule
El código modificado para una altera de2_70 de una forma rápida y sin ser estructurada(mi culpa) es la siguiente.