Tengo un término medio en el diseño de sistemas digitales. Mi profesor desarrolló una tabla ASM para un problema y decidí que intentaría completar el código para la práctica. La simulación se ejecuta, sólo da un resultado extraño. Mi primer dígito d2 va de 0 a 15 y el resto sigue siendo 0. Sentí como si hubiera clavado todo, y no me equivoqué. Cualquier ayuda sería muy apreciada.
module b(clk,b,d1,d2,d0);
input clk;
input [7:0]b;
output [3:0]d0,d1,d2;
//reg[7:0]b;
reg [7:0]R=0;
reg [1:0]s=0;
reg [3:0]d2=0,d1=0,d0=0;
always @(posedge clk)
case(s)
0:begin s<=1;R<=b;end
1:if(b>90)begin s<=1;R<=R-100;d2<=d2+1;end else s<=2;
2: if(b>9) begin s<=2;R<=R-10;d1<=d1+1;end else s<=0;
default: s<=0;
endcase
endmodule
Testbench
module sim();
reg clk;
reg[7:0]b;
wire[3:0]d2,d1,d0;
b uut(.clk(clk),.b(b),.d2(d2),.d1(d1),.d0(d0));
localparam t=1;
initial begin clk=0; forever #(t/2.0)clk= ~clk;end
initial begin
#0.55 b=250;
end
endmodule
Código ligeramente diferente que tampoco funciona.
module b(clk,b,d1,d2,d0);
input clk;
input [7:0]b;
output [3:0]d0,d1,d2;
//reg[7:0]b;
reg [7:0]R=0;
reg [1:0]s=0;
reg [3:0] dt2=0,dt1=0,dt0=0,d2=0,d1=0,d0=0;
always @(posedge clk)
case(s)
0:begin s<=1;R<=b;end
1:if(b>90)begin s<=1;R<=R-100;dt2<=dt2+1;end else s<=2;
2: if(b>9) begin s<=2;R<=R-10;dt1<=dt1+1;end else begin s<=0; d2<=dt2;d1<=dt1;d0<=R;end
default: s<=0;
endcase
endmodule