2016-11-22 5 views
0

自分のクロック分周器モジュールを使用してクロックを操作しようとしています。SystemVerilogでクロックを変更して操作する方法

module clockDivider(input logic input0, 
        input logic input1, 
        input logic clock, 
        output logic y); 

// 00 = stop, 01 = slow, 10 = medium, 11 = fast; 

if(~input1 & ~input0)  /*stop clock*/ ; 
else if(~input1 & input0) /*slow*/ ; 
else if(input1 & ~input0) /*medium*/ ; 
else if(input1 & input0) /*fast*/ ; 

endmodule 

私の入力によれば、私は自分のクロックを操作してから、私たちのFPGAボードにあるステップモータを動かします。しかし、私はそれを行う方法を理解できませんでした。

また、doulos以外のウェブサイトはありますか?私はそれが本当に明確ではなく、System Verilogに関する少量の情報しか含んでいないと思います。

おかげ

+1

システムバーLRM(IEEE Std 1800-2012)は、IEEEのWebサイトで自由に入手できます。 – toolic

+0

ありがとう、@toolic。他の人を助けるだけで、誰もが[ここ](http://standards.ieee.org/getieee/1800/download/1800-2012.pdf)からSystemVerilog LRMにアクセスできます –

答えて

1
slowことで

mediumfastは、私はあなたがクロック分周器を実装しているすなわちあなたはこのロジックで期待している最速はclock自体の速度であると仮定するつもりです。

私は次のことを想定しています

slow = 0.25 *クロック

medium = 0.5 *クロック

fast =クロック

module clockDivider(input logic reset, 
        input logic input0, 
        input logic input1, 
        input logic clock, 
        output logic y); 

// 00 = stop, 01 = slow, 10 = medium, 11 = fast; 
    logic delayed_y; 
    logic delayed_delayed_y; 
    logic [1:0] counter; 

    always @(posedge clock) begin 
    if (reset) begin 
     counter <= 'h0; 
    end 
    else begin 
     counter <= counter+1'b1; 
    end 
    end 

    always @(posedge clock) begin 
    if (reset) begin 
     delayed_y <= 1'b0; 
    end 
    else begin 
     delayed_y <= counter[0]; 
    end 
    end 

    always @(posedge clock) begin 
    if (reset) begin 
     delayed_delayed_y <= 1'b0; 
    end 
    else begin 
     delayed_delayed_y <= counter[1]; 
    end 
    end 

    always @(*) begin 
    if (reset) begin 
     y = 1'b0; 
    end 
    else begin 
     /*stop clock*/ 
     if(~input1 & ~input0) begin 
     y = 1'b0; 
     end 

     /*slow*/ 
     else if(~input1 & input0) begin 
     y = delayed_delayed_y; 
     end 

     /* medium*/ 
     else if(input1 & ~input0) begin 
     y = delayed_y; 
     end 

     /* fast */ 
     else if(input1 & input0) begin 
     y = clock; 
     end 
    end 
    end 

endmodule 

あなたはここで働い例を見つけることができます。 https://www.edaplayground.com/x/5J75

注:クロックを増やす場合は、ターゲットFPGAでDCMを使用する必要があります。 2入力のXORゲートとクロックバッファを備えた別の方法もありますが、私はDCMに固執します。

+0

まずは、あなたの興味に感謝します。私は実際にbeeingのためにこの質問をしています。 delayed_y = medium、delayed_delayed_y = slowですか? –

+0

@AhmetBatuOrhanはい。 'delayed_y'はクロックの周波数の1/2であり、' delayed_delayed_y'は 'delayed_y'の周波数の1/2 =>' clock'の1/4周波数です – noobuntu

+1

あなたが書いた 'delayed_y'と' delay_delayed_y'を割り当てるロジック非同期フィードバック付きの推測ラッチである。シミュレーションと合成は一致しません。彼らは 'posedge'で浮かべるべきです。出力されるクロックエッジの位相オフセットを小さくするには、両方とも '@(posedge clock) 'でフロップすることが望ましいです。 – Greg

2

あなたが直接ここにいるとN.により

を周波数を分割するモジュロNカウンタを持つことができ、クロックのあなたのすべての3種類です。

00 - No Clock 
01 - Clock/4 
02 - Clock/2 
03 - Clock 

ここにコードがあります。概念的なコードであり、検証されていないことに注意してください。

module clockDivider(input logic input0, 
        input logic input1, 
        input logic clock, 
        input logic reset, 
        output logic y); 

// 00 = stop, 01 = slow, 10 = medium, 11 = fast; 
parameter mod = 2; 
reg [mod-1:0] count, max; 

assign y = (~input1 & ~input0) ? 1'b0 : count[mod-1]; /*stop clock*/ 

always @ (posedge clock) 
begin 
if(~input1 & input0) /*slow*/ 
    max <= (1 << (mod-2)) - 1'b1; 
else if(input1 & ~input0) /*medium*/ 
    max <= (1 << (mod-1)) - 1'b1; 
else if(input1 & input0) /*fast*/ 
    max <= (1 << mod) - 1'b1; 
end 

always @ (posedge clock, negedge reset) 
begin 
    if (!reset) 
    count <= 0; 
    else if (count == max) 
    count <= 0; 
    else 
    count <= count + 1'b1; 
end 
endmodule 
+0

適切であれば、答えとして記入してください。 :) –

関連する問題