Hice un contador simple de 0 a 9 con Verilog. La salida es de 4 LED que se encienden cuando su bit correspondiente es 1. El código se sintetiza bien, pero en el FPGA, solo un LED se enciende y apaga repetidamente. Los otros tres LEDs no se iluminan en absoluto. Aquí está mi código:
module counter(
input wire clock,
input wire reset,
output wire [3:0] o_number
);
reg [3:0] cur_state;
reg [3:0] next_state;
always @(posedge clock or posedge reset) begin
if (reset) cur_state <= 4'b0;
else
cur_state <= next_state;
end
// Next state function
always @(*) begin
if (cur_state == 4'b1001) next_state = 4'b0000;
else next_state = cur_state + 4'b0001;
end
// Output function
assign o_number = cur_state;
endmodule
module display(
input wire [3:0] inumber,
output wire [3:0] LEDs
);
assign LEDs = inumber;
endmodule
Ninguno de los LED está roto, ya que todos se encienden cuando se prueban individualmente. El reloj se ha ajustado por lo que su período es de alrededor de 2 segundos.
Por favor, ayúdame. Gracias.
Revisé el módulo contador. Aquí están todos los archivos que utilicé:
top.v
module top ( input wire clock, input wire reset, output wire [3:0] LEDs);
counter c1 (.clock(clock), .reset(reset), .o_number(number));
display d1 (.inumber(number), .LEDs(LEDs));
endmodule
counter.v
module counter ( input wire clock, input wire reset, output wire [3:0] o_number);
reg [3:0] cur_state;
always @ (posedge clock or posedge reset) begin
if (reset) cur_state[3:0] <= 4'b0000;
else begin
if (cur_state[3:0]==4'b1001) cur_state[3:0] <= 4'b0000;
else cur_state[3:0] <= cur_state[3:0] + 4'b0001;
end
end
assign o_number[3:0]=cur_state[3:0];
endmodule
display.v
module display( input wire[3:0] inumber, output wire [3:0] LEDs);
assign LEDs[3:0] = inumber[3:0];
endmodule
top.ucf
NET "LEDs[0]" LOC = K12;
NET "LEDs[1]" LOC = P14;
NET "LEDs[2]" LOC = L12;
NET "LEDs[3]" LOC = N14;
NET "clock" LOC = T9;
NET "reset" LOC = L14;