質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

2回答

10298閲覧

verilogを用いた7セグメントデコーダ回路の設計について

退会済みユーザー

退会済みユーザー

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2016/12/07 07:15

###前提・実現したいこと
DE0を用いて、外部入力スイッチでクロックを与えるたびにカウントアップし、LEDで16進数の0からFまで表示してくれるというものを、ベリログで実装したいです。
###発生している問題・エラーメッセージ
チャタリングを解消するために@(negedge CLK);を使ってディレイをしようとしているのですがうまくいきません

Error (10856): Verilog HDL error at SEG7V.v(13): multiple event control statements not supported for synthesis Error (12153): Can't elaborate top-level user hierarchy Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 2 errors, 1 warning Error: Peak virtual memory: 450 megabytes Error: Processing ended: Wed Dec 07 15:41:15 2016 Error: Elapsed time: 00:00:02 Error: Total CPU time (on all processors): 00:00:01 Error (293001): Quartus II Full Compilation was unsuccessful. 4 errors, 1 warning

###該当のソースコード
上記のとおりverilogを使用しています

module SEG7V ( input CLK, RST, output reg [6:0] nHEX0 ); reg [3:0] cntr; always @( posedge CLK) begin if ( RST ) cntr <= 4'h0; else cntr <= cntr + 4'h1; @(negedge CLK); end always @* begin case ( cntr ) 4'h0: nHEX0 = 7'b1000000; 4'h1: nHEX0 = 7'b1111001; 4'h2: nHEX0 = 7'b0100100; 4'h3: nHEX0 = 7'b0110000; 4'h4: nHEX0 = 7'b0011001; 4'h5: nHEX0 = 7'b0010010; 4'h6: nHEX0 = 7'b1000010; 4'h7: nHEX0 = 7'b1011000; 4'h8: nHEX0 = 7'b0000000; 4'h9: nHEX0 = 7'b0010000; 4'ha: nHEX0 = 7'b0001000; 4'hb: nHEX0 = 7'b0000011; 4'hc: nHEX0 = 7'b1000110; 4'hd: nHEX0 = 7'b0100001; 4'he: nHEX0 = 7'b0000110; 4'hf: nHEX0 = 7'b0001110; default: nHEX0 = 7'bxxxxxxx; endcase end endmodule

###試したこと
wait (CLK);としてみたり、こちらのページのように『verilog ディレイ』のような検索をして出てきたページを参考にしてみたりしたのですがうまくいきませんでした

###補足情報(言語/FW/ツール等のバージョンなど)
FPGAはCycloneⅢシリーズのEP3C16F484C6です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/12/07 07:48

まず’always @( posedge CLK) begin’に対する'end'が無い。’always @* begin’の前に'end'を入れてみて下さい。そもそもコンパイルエラーですよ。
退会済みユーザー

退会済みユーザー

2016/12/14 04:04

修正依頼ありがとうございます。ですがその'end'はコード中に記入されていると思います。念のために追加で記入してみましたがコンパイルエラーになりました。
MasahikoHirata

2016/12/15 10:13

試しにiverilogでコンパイルしたらエラーは出ませんでした。verilogの種類とバージョンを教えてください。
ozwk

2017/01/26 02:40

多分コンパイルエラーじゃなくて論理合成エラーです。
guest

回答2

0

まず、Verilog HDLでは、シミュレーションでは posedge と negedge を同居させることはできますが、その記述を回路に合成できないコンパイラーがほとんどです。回路として実装することを考えているのであれば、コーディングスタイルとして、

always @(posedge CLK) begin ... end

の中に、wait@(...) を入れない記述をまずマスターすべきです。

次に、@(negedge CLK) では、チャタリング防止にはまったくなりません。チャタリング発生時にそれがおさまったかどうかを調べるには、ある一定時間信号が変化しないことを確認しなければなりません。「ある一定時間」を調べるには、スイッチで与えるというCLK以外の、まともなクロック信号が必ず別に必要になります。

ひとまず、このシステムクロックを利用して、チャタリング防止回路を作ってみてはどうでしょうか。スイッチを押すあるいは切り替えるたびにカウントアップしてLEDに表示させれば確認できると思います。ただ、DE0はどうかわかりませんが、ボードによってはスイッチにあらかじめチャタリング防止回路が仕込まれていることもあります。

投稿2017/01/25 08:47

編集2017/01/25 13:45
punchan

総合スコア81

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

大体のプログラミング言語、例えばCとか、は
コードの上下は処理の時間的な流れに対応します。

なので、処理にディレイをかけようと思ったら、

処理() delay(1000) 続きの処理()

みたいな書き方になると思います。

一方でVerilog HDL、それも回路記述で書くのは回路の定義、配線情報なので、
コードの上下は処理の時間的な流れになっていません。全部同時に動いてます。

なので、処理にディレイをかけようと思ったら、
入力と、ディレイ回路を配線するように書く必要があります。


で、今回の場合はチャタリング除去なので、そもそもディレイじゃなくて、
ボタンの入力を適当な長さのシフトレジスタに入れて、全部H(L)になったときに出力をH(L)に切り替えれば
チャタリング防止になります

例えばシフトレジスタの長さが3のときはこんな感じのタイミングです。

chart

投稿2017/01/26 03:05

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問