2017-04-26 4 views
0

私はVerilogで自動販売機を作成しています。 FPGAボードには、コインインサータとして機能するボタンが1つあります。ボタンを押すたびに、ユーザが使用できる合計金額に「四分の一」が追加され、左右の7セグメントディスプレイに合計が表示されます。Verilogでボタンのクリック数を維持する

Ex。 第1ボタン押し:25セント 第2ボタン押し:50セント 第3ボタン押し:75セント 第4ボタン押し:$ 1.00(7セグメント表示では10)。 4回目のボタンを押すとインクリメントされません。

input quarterIn, 
output reg [4:0] state, 
output reg [4:0] next_state, 
output reg totalChange, 
output reg [7:0] RSSD, 
output reg [7:0] LSSD 
); 

/***coin implementation***/ 
parameter 
    c0 = 0, 
    c1 = 1, 
    c2 = 2, 
    c3 = 3, 
    c4 = 4; 

always @(posedge clock) begin state = next_state; end

always @ (quarterIn or totalChange) 
begin 
    case(totalChange) 
    0: begin if(quarterIn == 1) totalChange = 1; state = c1; end 
    1: begin if(quarterIn == 1) totalChange = 2; state = c2; end 
    2: begin if(quarterIn == 1) totalChange = 3; state = c3; end 
    3: begin if(quarterIn == 1) totalChange = 4; state = c4; end 
    4: begin if(quarterIn == 1) totalChange = 4; state = c4; end 
    endcase 
end 

私は、ボタンのクリック数を維持するためにどのように立ち往生しています。私は7セグメント表示の最初の値を見ることができますが、合計コインを増やす方法は不明です。私は自分自身で研究しようとすることからこれに関する情報を見つけることができませんでした。

+1

州を登録する必要があります。これには、フリップフロップ、すなわち「posedge clk」で通常更新されるコードが必要です。 – JohanL

+0

@JohanLなんてこんな感じですか? '常に@(ポーズクロック) \t begin \t state = next_state; \t end ' – grimes88

+0

まあ、保存された状態は本質的に 'totalChange'なので、保存する必要があります。 – JohanL

答えて

0

私が理解したところでは、ボタン押下を追跡するために飽和カウンタが必要です。

input clock; 

そして、あなたは、この場合には、既知の値にゼロをカウンタを初期化するためのリセット信号を必要があります:

はカウントするためには、システム内のクロックを必要とする

input reset; 

とカウンター(state変数に相当し、私はちょうどnum_pushそれを呼びましょう):

reg [2:0] num_push; 

が飽和カウンタがこのように指定することができます。これは、とカウンターに合成されます

always @(posedge clock) begin 
    if (reset) begin      // Active high, synchronous reset 
     num_push <= 3'b0; 
    end else begin 
     if (quarterIn == 1'b1 && num_push != 3'b100) begin 
      num_push <= num_push + 3'b1; 
     end 
    end 
end 

あなたのFPGA上でカウントイネーブルおよびquarterIn == 1'b1 && num_push != 3'b100と同じになります有効にしてください。 resetを押すと最初からやり直すことができます。


ここでは、これをFPGAに実装する前に対処すべきいくつかの問題があります。まず、quarterIn準安定性のために同期する必要があります:私たちは直接のみquarterIn_syncデザインで、決してquarterInを使用する必要があります

reg quarterIn_f; 
reg quarterIn_sync; 

always @(posedge clock) begin 
    quarterIn_f <= quarterIn; 
    quarterIn_sync <= quarterIn_f; 
end 

reset信号についても同様に行う必要があります。

第2に、キーから来る信号はデバッガする必要があります。デバウンス自体は全体的な話題なので、私はしばらくそれをスキップします:(

もう1つのことは、オンボードのクロックジェネレータ回路から引き出す必要があり、このクロックは数MHzで動作することです典型的なボタンプレスは約500ms持続します。これは、1回のプレスで数十万回のキー入力をサンプリングすることを意味します。これを避けるために、我々はレベルquarterIn_syncのエッジをカウントし、そしてべきではありません。

always @(posedge clock) begin 
    if (reset) begin 
     num_push <= 3'b0; 
    end else begin 
     if (quarterIn_edge == 1'b1 && num_push != 3'b100) begin 
      num_push <= num_push + 3'b1; 
     end 
    end 
end 

そして、我々が行っている:今

wire quarterIn_edge; 
req quarterIn_sync_f; 

always @(posedge clock) begin 
    if (reset) begin 
     quarterIn_sync_f <= 1'b0; 
    end else begin 
     quarterIn_sync_f <= quarterIn_sync; 
    end 
end 

assign quarterIn_edge = quarterIn_sync & ~quarterIn_sync_f; // Detects rising edge 

を、quarterIn_edgeと飽和カウンタコードでquarterInを交換してください!

関連する問題