1

次のコードがあります

module POLY(CLK,RESET_n,IN_VALID,IN,OUT_VALID,OUT);

input         CLK,RESET_n,IN_VALID;
input  [ 3:0] IN;
output        OUT_VALID;
output [12:0] OUT;

reg        OUT_VALID;
reg [12:0] OUT;

reg        OUT_VALID_w;
reg [12:0] OUT_w;

reg [ 1:0] COUNT_IN, COUNT_IN_w;
reg [ 2:0] COUNT_DO, COUNT_DO_w;

always @(posedge CLK or negedge RESET_n)
begin
    if(!RESET_n)
    begin
        COUNT_IN <= 2'd0;
        COUNT_DO <= 3'd0;
    end
    else
    begin
        COUNT_IN <= COUNT_IN_w;
        COUNT_DO <= COUNT_DO_w;
    end
end


always @(*)
begin
    if(IN_VALID == 1'b0)
    begin
        if(COUNT_DO == 3'd7)
        begin
            COUNT_DO_w = COUNT_DO;
        end
        else
        begin
            COUNT_DO_w = COUNT_DO + 1'b1;
        end
    end
    else
    begin
        COUNT_DO_w = 3'd0;
    end
end

私が聞きたいのは、なぜCOUNT_DO1 in にジャンプしないの14nsですか?

COUNT_DO2番目の常にブロックの機密リストがとIN_VALIDであるため、開始時に、リセット信号トリガーは最初に常にブロックし、値を高インピーダンスから0COUNT_DO = 0に変更するを設定すると思います。したがって、2番目の常にブロックをトリガーします。そして、次のポジティブ エッジ クロックで、最初の常にブロックを実行するようにトリガーします。しかし、it( ) を割り当てるのに 1 クロック遅れているようです。私はそれを理解しようとしましたが、まだできません.なぜ1クロック遅れるのですか?COUNT_DOCOUNT_DO_w = 0 + 1 = 1COUNT_DO <= COUNT_DO_w22ns

事前にt​​hx。

ここに画像の説明を入力

4

1 に答える 1

4

time=14ns で、リセットがアサートされます ( RESET_N=0)。これはCOUNT_DO、最初の always ブロックで =0 であることを意味します。時間 t=20ns でリセットを解除COUNT_DOし、0 のままです。時間 =22ns で、最初のポーズエッジCLKが に割り当てCOUNT_DOられCOUNT_DO_wます。変更のタイミング COUNT_DOは、2 番目の always ブロックではなく、1 番目の always ブロックによってのみ制御されます。

于 2013-03-16T19:03:39.810 に答える