0

そのため、4 ビットの verilog にカウンターがあり、0000 から再びカウントを開始する信号を与えるまで、カウンターを最大値 1111 のままにしたいと考えています。

これが私がこれまでに思いついたことです:

module contadorAscMax
(
    input iClk,
    input iRst,
    output oQ,
    input iCE,
    input iSignal,
    output [3:0] orCnt
);

reg[3:0] rvCnt_d;
reg[3:0] rvCnt_q;

assign orCnt = rvCnt_q;

always @(posedge iClk or posedge iRst)
begin
    if(iRst)
    begin
        rvCnt_q<=4'b0;
    end
    else
    begin
        if(iCE)
        begin
            rvCnt_q<=rvCnt_d;
        end
        else
        begin
            rvCnt_q<=rvCnt_q;
        end
    end
end
always @*
begin
    rvCnt_d=rvCnt_q+4'b1;
    if(rvCnt_d == 4'b1111)
    begin
        rvCnt_d = rvCnt_d;
    end
    else if(rvCnt_d == 4'b1111 & iSignal)
    begin
        rvCnt_d = 4'b0;
    end
end


endmodule

しかし、信号を待つだけではありません。私は Verilog に非常に慣れていないので、おそらく私のコードはハードウェアの専門家にはあまり意味がありません。

テストベンチに関しては、ここに私が持っているものがあります:

`timescale 1ns / 1ps

module vtfContMax;

    // Inputs
    reg iClk;
    reg iRst;
    reg iCE;
    reg iSignal;

    // Outputs
    wire oQ;
    wire [3:0] orCnt;

    // Instantiate the Unit Under Test (UUT)
    contadorAscMax uut (
        .iClk(iClk), 
        .iRst(iRst), 
        .oQ(oQ), 
        .iCE(iCE), 
        .iSignal(iSignal), 
        .orCnt(orCnt)
    );

    initial begin
        // Initialize Inputs
        iClk = 1;
        iRst = 1;
        iCE = 1;
        iSignal = 0;

        // Wait 100 ns for global reset to finish
        #10;
        iRst = 0;


        repeat(10)
        begin
            repeat(10)
            begin
                wait(iClk);
                wait(!iClk);
            end
        end
        $stop();

        // Add stimulus here

    end

    always
    begin
        #5;
        iClk = ~iClk;
        #10
        iSignal = ~iSignal;
    end

endmodule

助けてくれてありがとう:)

4

1 に答える 1