Verilog 输出仅为一个时钟周期,而不是三个时钟周期

Verilog 输出仅为一个时钟周期,而不是三个时钟周期,verilog,Verilog,我写了这段代码。当输入B为1时,输出必须为3个时钟周期,但当我尝试测试它时,输出仅为1个时钟周期。我不知道如何更改代码以获得所需的输出 module LaserTimerTopDown ( B,X,Clk,Rst); input B; output reg X; input Clk,Rst; parameter S_OFF =0, S_ON=1; // shared variable reg Cnt_Sel, Cnt_Eq_0, Cn

我写了这段代码。当输入B为1时,输出必须为3个时钟周期,但当我尝试测试它时,输出仅为1个时钟周期。我不知道如何更改代码以获得所需的输出

module LaserTimerTopDown (

B,X,Clk,Rst);

    input B;

    output reg X;

    input Clk,Rst;

    parameter S_OFF =0, S_ON=1;

    // shared variable

    reg Cnt_Sel, Cnt_Eq_0, Cnt_Ld;

    // datapath variable

    reg [1:0] Cnt, CntNext;

    // controller variable

    reg [0:0] State, StateNext;

    // Datapath Procedures

    always @(Cnt, Cnt_Sel) begin

        if (Cnt_Sel == 1)

            CntNext <= 2'b10;

        else

            CntNext <= Cnt -1;

        Cnt_Eq_0 <= (Cnt ==0)? 1:0;
    end

    always @ (posedge Clk) begin
        if (Rst ==1)
            Cnt <= 0;
        else if (Cnt_Ld ==1)
            CntNext <= Cnt;
    end
    // Controler Procedures 
    always @(Cnt_Eq_0, B, State)begin
        case(State)
            S_OFF :begin
                X<= 0; Cnt_Sel <= 1; Cnt_Ld <= 1;
                if (B==0)
                    StateNext <= S_OFF;
                else
                    StateNext <= S_ON;
             end
             S_ON : begin
                X<= 1; Cnt_Sel <= 0; Cnt_Ld <= 1;
                if(Cnt_Eq_0 ==0)
                    StateNext <= S_ON;
                else
                    StateNext <= S_OFF;
              end  
        endcase
    end
    always @(posedge Clk) begin
        if (Rst ==1)
            State <= S_OFF;
        else
            State<= StateNext;
    end
endmodule
模块激光自顶向下(
B、 X、Clk、Rst);
输入B;
输出寄存器X;
输入时钟,Rst;
参数S_OFF=0,S_ON=1;
//共享变量
注册Cnt_Sel,Cnt_Eq_0,Cnt_Ld;
//数据路径变量
reg[1:0]Cnt,CntNext;
//控制器变量
reg[0:0]状态,StateNext;
//数据路径过程
始终@(Cnt,Cnt_Sel)开始
如果(Cnt_Sel==1)
CntNext
模块激光自顶向下(
B、 X、Clk、Rst);
输入B;
输出寄存器X;
输入时钟,Rst;
参数S_OFF=0,S_ON=1;
//共享变量
注册Cnt_Sel,Cnt_Eq_0,Cnt_Ld;
//数据路径变量
reg[1:0]Cnt,CntNext;
//控制器变量
reg[0:0]状态,StateNext;
//数据路径过程
始终@(Cnt,Cnt_Sel)开始
如果(Cnt_Sel==1)

CntNext可能应该是这一行:
CntNext我看到Cnt_next是通过多个always块分配的。接下来Cnt_的确切逻辑是什么。另外,您还没有在“始终块”的敏感度列表中添加Rst。谢谢Mattew Taylor,我完成了您的所有要点。就像我期望的那样,谢谢你,卡兰·沙阿。当我注意到下一步的确切逻辑并修改它时。它就像我期望的那样工作。
module LaserTimerTopDown (

B,X,Clk,Rst);

input B;

output reg X;

input Clk,Rst;

parameter S_OFF =0, S_ON=1;

// shared variable

reg Cnt_Sel, Cnt_Eq_0, Cnt_Ld;

// datapath variable

reg [1:0] Cnt, CntNext;

// controller variable

reg [0:0] State, StateNext;

// Datapath Procedures

always @(Cnt, Cnt_Sel) begin

    if (Cnt_Sel == 1)

        CntNext <= 2'b10;

    else

        CntNext <= Cnt -1;

    Cnt_Eq_0 <= (Cnt ==0)? 1:0;
end

always @ (posedge Clk) begin
    if (Rst ==1)
        Cnt <= 0;
    else if (Cnt_Ld ==1)
        Cnt <= CntNext;
end
// Controler Procedures 
always @(Cnt_Eq_0, B, State)begin
    case(State)
        S_OFF :begin
            X<= 0; Cnt_Sel <= 1; Cnt_Ld <= 1;
            if (B==0)
                StateNext <= S_OFF;
            else
                StateNext <= S_ON;
         end
         S_ON : begin
            X<= 1; Cnt_Sel <= 0; Cnt_Ld <= 1;
            if(Cnt_Eq_0 ==0)
                StateNext <= S_ON;
            else
                StateNext <= S_OFF;
          end  
    endcase
end
always @(posedge Clk) begin
    if (Rst ==1)
        State <= S_OFF;
    else
        State<= StateNext;
end
endmodule