2017-08-14 108 views
2

私はVerilogにはとても新しいので、私はそれをより良くするために書いているプロジェクトに立ち往生しています。私はボード上にボタンとLEDを持っていて、ボタンを押し上げてLEDの点滅を速くしたい。これは理論的にはうまくいくようですが、実際には動作させることができません。スイッチは、LEDのフラッシュを速くすることはありません、それはいくつかの奇妙なことをするようです。点滅するLED Verilog

私の現在のコードは、私がここで問題を引き起こさない場合でも、私が何をしているのかを教えてください。

`timescale 1ns/1ps 

module LedFlash(CLK100MHZ, led0, sw0, btn0); 
input CLK100MHZ; 
output reg led0; 
input sw0; 
input btn0; 

reg [25:0] clockTick = 0; 
reg [1:0]currentlyLighting = 0; 
reg [3:0] speedFactor = 0; 
reg [1:0]oldButton = 0; 
reg [1:0]buttonValue = 0; 



    always @(posedge CLK100MHZ) 
    begin 
    led0 <= 0; 
    buttonValue <= 0; 

    if(oldButton != btn0 && btn0 == 1) 
     buttonValue <= 1; 

    oldButton <= btn0; 

    if(clockTick == 0) 
    currentlyLighting <= !currentlyLighting; 

    if(currentlyLighting) 
    led0 <= 1; 

    if(buttonValue) begin 
      speedFactor <= speedFactor + 1; 
    end 

    clockTick <= clockTick + speedFactor; 
    end 


endmodule 

ここには、ボタンを数回押すだけのGIFがあります。スピードファクタが増加するのは、実際にボタンを押したときだけです。

waveform

私はより多くのプレスを提供するだろうが、それはただ明確に私が何か間違ったことをやって、そこからより多くの奇妙な取得します。 ボタンを最初に押した後、それは私が期待しているものから離れてしまいます。例えば

clockTick <= clockTick + 10; 

clockTick <= clockTick + speedFactor; 

:私はこの行を交換する場合、また**時にはそれは、オフになり、時には固体のまま、遅く、スピードアップ.....

それは私が期待するように速く点滅します。私はプローブが私に別のことを教えているようだが、ビットの追加に何か間違っていると思っている。

**

固定コード:

`timescale 1ns/1ps 

module LedFlash(CLK100MHZ, led0, sw0, btn0); 
input CLK100MHZ; 
output reg led0; 
input sw0; 
input btn0; 

reg [25:0] clockTick = 0; 
reg currentlyLighting = 0; 
reg [3:0] speedFactor = 0; 
reg oldButton = 0; 
reg buttonValue = 0; 



    always @(posedge CLK100MHZ) 
    begin 
    led0 <= 0; 
    buttonValue <= 0; 

    if(oldButton != btn0 && btn0 == 1) 
     buttonValue <= 1; 

    oldButton <= btn0; 

    currentlyLighting <= clockTick[25]; 

    if(currentlyLighting && sw0) 
    led0 <= 1; 

    if(buttonValue) begin 
      speedFactor <= speedFactor + 1; 
    end 

    clockTick <= clockTick + speedFactor; 
    end 


endmodule 

答えて

1

デザインが新しいラウンドを開始しながら、clockTickヒット0が、そうspeedFactorが実際にcurrentlyLightingのトグル周波数を制御することができないことを保証しません。例えば

clockTickが26'h3FFFFFFとspeedFactorが4'd3である場合、clockTickの次の値は26'h0000002なり、currentlyLighting、そのラウンドのためにトグルしないであろう。

clockTickのMSBをcurrentlyLightingとすると簡単に解決できます。

currentlyLighting <= clockTick[25]; 

さらに、 buttonValue,oldButtonおよびcurrentlyLightingはシングルビット信号でなければなりませんが、コードでは2ビットです。正しい宣言は次のとおりです。

reg currentlyLighting = 0; 
reg oldButton = 0; 
reg buttonValue = 0; 
+0

有益な回答をいただきありがとうございます。私は午前中に試してみる必要があります。 –

+0

私は[1:0]を置くために馬鹿だと思う。これらのようなものについては、cやverilogのような言語の接続をやめなければならない。 1つのアイテムを意味するcで実際にreg [1]を見ると、verilogの[h:l]表記は、慣れなければならないものです。 –

+0

ちょうど確認され、それは素晴らしい動作しています。助けていただきありがとうございます。作業コードのOPの最下部が更新されました。 –

関連する問題