37232


アルテラのFPGA MAX10でverilogで書いておりますが、ちょっとわからないことがあり質問いたします。  
早いクロック(Clock1)と遅いクロック(Clock2)があり、早いクロックでクロックをカウントし、  
遅いクロックの立ち上がりでカウントをクリアしたいと思っています。  
遅いクロックでのカウントクリアはあくまでも立ち上がりであるため、リセットのように  
入っている間クリアではありません。

下記の記述では論理合成が出来ません。

[code]

    reg [31:0] count;
    
    always @(posedge Clock1, negedge res_n)
    begin
        if (~res_n) begin
            count = 0;
        end
        else begin
            count <= count+1;
        end
    end
    always @(posedge Clock2)
    begin
        count <= 0;
    end
    
[/code]

また、下記の記述ではClocl2がHighの時に常にクリアされてしまいます。

[code]

    reg [31:0] count;
    
    always @(posedge Clock1, posedge Clock2)
    begin
        if (Clock2) begin
            count = 0;
        end
        else begin
            count <= count+1;
        end
    end
    
[/code]

どのように記述するのは正しいのでしょうか？


CC BY-SA 3.0
2017-08-15T02:11:20.587
37201
2017-08-16T16:25:43.657
2017-08-15T02:26:40.613
2383
24490
question
verilog
verilogでのカウントについて


新たに clear_done という変数を用意して、

  * Clock2 が立ち上がった時は count を0にして、clear_done フラグを立てる
  * Clock2 が立ち上がっても、clear_done ならばクリアしない
  * Clock2 が立ち下がった時に clear_done フラグを下ろす

という方法で Clock2 の立ち上がりのタイミングだけ count をクリアする方法ではどうでしょうか。

[code]

    reg [31:0] count = 0;
    reg clear_done = 0;
    
    always @(posedge Clock1, posedge Clock2, negedge Clock2, negedge res_n)
    begin
        if (~Clock2 && clear_done) begin
            clear_done <= 0;
        end
        if (Clock2 && ~clear_done) begin
            count <= 0;
            clear_done <= 1;
        end
        else if (~res_n) begin
            count <= 0;
        end
        else begin
            count <= count + 1;
        end
    end
    
[/code]

手元に論理合成できる環境がないので、動かなかったら済みません。


CC BY-SA 3.0
2017-08-16T00:02:52.237
37232
2017-08-16T04:50:56.813
2017-08-16T04:50:56.813
7414
7414
37201
answer


いろいろ試していたら、なんとか出来るようになりました。  
ありがとうございました。  
ソースコードをのせておきます。

[code]

    reg oldClock2;
    
    always @(posedge Clock, posedge Clock2, negedge res_n)
    begin
        if (~res_n) begin
            count <= 0;
            oldClock2 <= 0;
        end
        else begin
            if (Clock2) begin
                if (~oldClock2) begin
                    count <= 0;
                    Clock2 <= 1;
                end
                else begin
                    count <= count+1;
                end
            end
            else begin
                count <= count+1;
                if (~Clock2) begin
                    oldClock2 <= 0;
                end
            end
        end
    end
    
[/code]


CC BY-SA 3.0
2017-08-16T16:25:43.657
37257
2017-08-16T16:25:43.657
24490
37201
answer