- ベストアンサー
FPGA/Verilogでのモジュールの違い
- FPGAとVerilogを使用してモータの回転数をカウントする回路を作成している中で、同じモジュールを使用していながら異なる結果が出ることについて疑問が生じました。
- センサとして使用している入力信号が同じであるにもかかわらず、2つのモジュール間でカウント数に差が生じていることに困惑しています。
- この問題はFPGAの特性などに起因するものでしょうか。同じモジュールを使用しているため、モジュールの違いによるものではないと考えています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
always @(posedge PS or posedge C_RESET) の PS ていうのは何ですか? 私がcountモジュールの中身を見たいといったのは、主に、CLKに同期するカウンタ(posedge CLK)なのか、非同期カウンタ(posedge SENSOR)なのかを知りたかったらなんですが、posedge PSとは予想外ですね。。 とりあえず、先回りして言うと、 非同期入力のカウンタ(posedge SENSOR)は、FPGAの種類によっては、うまく扱えない場合があります。 ここらへんは、FPGAの仕様を調べてください、としかいえませんが、非同期カウンタは、 >なぜ、同じモジュールを使用し、入力も同じなのに、結果に違いが出るのでしょうか?FPGAの特性などがあるのでしょうか? となる場合もないとは言えません。 とくに、CLKが入力されているモジュールは、コンパイラが特別扱いして、暗黙のうちに、posedge CLKがある前提でコンパイルされる場合とかもあるので。(コンパイラの設定なんかにもよりますが) もし、CLKの周波数が、SENSOR入力の頻度に比べて十分に高くて、取りこぼすおそれがないなら、CLK同期カウンタにすると、変なことがおこる可能性は減ると思います。 どうしても、CLKとは非同期にしたいなら、ちょっとマニュアルを読んでみてください。
その他の回答 (2)
- unagi-pie
- ベストアンサー率41% (166/397)
ハードウェアの基本的なことなので もしかしたら失礼にあたるかも知れませんが念の為。 SENSOR の信号波形は大丈夫でしょうか。 デジタル波形として文句なければよいですが、 オープンコレクタなのにプルアップ抵抗がないか値が大きすぎて立ち上がりが鈍ってるとか 信号伝達経路が長くてスレッショルドギリギリのノイズが載ってるとか High レベルの電圧が低すぎるとか。 あと、フォトセンサなら大丈夫とは思いますが メカ接点にあるチャタリング(バウンス)のような余分なエッジがあるとか。 このような場合、2つの入力端子の電気的特性や伝達経路のわずかな違いにより エッジを認識する回数が異なり結果カウント数が異なる、という結果も有り得ます。 そんなの確認済み、という事でしたら失礼しました。
お礼
ご回答ありがとうございます。 当初はマイコンを使用して回路を組んでおり、問題はありませんでした。また、波形も確認済みですので、問題はないと考えます。 当方経験があまりありませんので、基本的なことでもご指摘いただけると幸いです。
- rabbit_cat
- ベストアンサー率40% (829/2062)
countモジュールの中身を見せてください。
お礼
ご回答ありがとうございます。 countモジュールは以下のようになります。 module count( SENSOR, CLK, C_RESET, COUNT_DIGI_0, COUNT_DIGI_1, COUNT_DIGI_2, ); input SENSOR; input CLK; input C_RESET; reg [7:0] R_COUNT; output reg [7:0] COUNT_DIGI_0; output reg [7:0] COUNT_DIGI_1; output reg [7:0] COUNT_DIGI_2; always @(posedge PS or posedge C_RESET) begin //Count Clear if(C_RESET == 1'b1) R_COUNT <= 8'b0; else begin //Count Up R_COUNT <= R_COUNT + 1'b1; if (R_COUNT < 4'd10) begin COUNT_DIGI_0 <= R_COUNT + 6'd48; COUNT_DIGI_1 <= 8'b0 + 6'd48; COUNT_DIGI_2 <= 8'b0 + 6'd48; end else if (4'd10 <= R_COUNT && R_COUNT < 7'd100) begin COUNT_DIGI_0 <= R_COUNT % 4'd10 + 6'd48; COUNT_DIGI_1 <= R_COUNT / 4'd10 + 6'd48; COUNT_DIGI_2 <= 8'b0 + 6'd48; end else if (4'd100 <= R_COUNT && R_COUNT < 7'd1000) begin COUNT_DIGI_0 <= R_COUNT % 4'd10 + 6'd48; COUNT_DIGI_1 <= R_COUNT / 4'd10 % 4`d10 + 6'd48; COUNT_DIGI_2 <= R_COUNT / 7'd100 + 6'd48; end end end endmodule C_RESET入力でCOUNTを同時にクリアしています。 始めてVerilog-HDLを用いてプログラムしていますので、お見苦しい点などあると思いますが、何卒よろしくお願い致します。
お礼
ご回答ありがとうございます。 申し訳ありません。PSはPhoto Seneorの略で、こちらに投稿するときにSENSORに書き換えていたのですが、書き換え漏れがあったようです。 >>もし、CLKの周波数が、SENSOR入力の頻度に比べて十分に高くて、取りこぼすおそれがないなら、CLK同期カウンタにすると、変なことがおこる可能性は減ると思います。 CLK50MHzに対して、SENSORはせいぜい80Hzですので、一度同期カウンタに変更して試してみたいと思います。