プロが教える店舗&オフィスのセキュリティ対策術

現在,FPGAとVerilogを用いて、モータの回転数をセンサでカウントする回路を作成しています。
countという名前のカウント回路を作成し、2つのセンサ(センサ1とセンサ2)があるため、count1,count2とインスタンスを2つ作成しています。
トップモジュールでは以下のように宣言しています。

count count1(
.CLK( CLK),
.SENSOR( SENSOR1),
.COUNT_DIGI_0( COUNT_DIGI_20),
.COUNT_DIGI_1( COUNT_DIGI_21),
.COUNT_DIGI_2( COUNT_DIGI_22),
);

count count2(
.CLK( CLK),
.SENSOR( SENSOR2),
.COUNT_DIGI_0( COUNT_DIGI_0),
.COUNT_DIGI_1( COUNT_DIGI_1),
.COUNT_DIGI_2( COUNT_DIGI_2),
);

countモジュール内では、SENSORが入力されると、カウント数が1upするだけです。
COUNT_DIGI_*は別の回路にカウント数を伝えるためにwireで接続しています。

最初に,センサ1をcount1に、センサ2をcount2に接続したところ、2つのカウント数に相違がでてしまいました。(count2のカウント数が多い)
センサの配線が悪いと思い、センサ1の出力をcoun1とcount2に接続してテストしてもカウント数に相違がでてしまいました。

なぜ、同じモジュールを使用し、入力も同じなのに、結果に違いが出るのでしょうか?
FPGAの特性などがあるのでしょうか?
お分かりになられる方がいらっしゃいましたら宜しくご教授お願い致します。

A 回答 (3件)

ハードウェアの基本的なことなので


もしかしたら失礼にあたるかも知れませんが念の為。

SENSOR の信号波形は大丈夫でしょうか。

デジタル波形として文句なければよいですが、
オープンコレクタなのにプルアップ抵抗がないか値が大きすぎて立ち上がりが鈍ってるとか
信号伝達経路が長くてスレッショルドギリギリのノイズが載ってるとか
High レベルの電圧が低すぎるとか。

あと、フォトセンサなら大丈夫とは思いますが
メカ接点にあるチャタリング(バウンス)のような余分なエッジがあるとか。

このような場合、2つの入力端子の電気的特性や伝達経路のわずかな違いにより
エッジを認識する回数が異なり結果カウント数が異なる、という結果も有り得ます。

そんなの確認済み、という事でしたら失礼しました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
当初はマイコンを使用して回路を組んでおり、問題はありませんでした。また、波形も確認済みですので、問題はないと考えます。
当方経験があまりありませんので、基本的なことでもご指摘いただけると幸いです。

お礼日時:2013/10/14 16:02

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とは非同期にしたいなら、ちょっとマニュアルを読んでみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
申し訳ありません。PSはPhoto Seneorの略で、こちらに投稿するときにSENSORに書き換えていたのですが、書き換え漏れがあったようです。

>>もし、CLKの周波数が、SENSOR入力の頻度に比べて十分に高くて、取りこぼすおそれがないなら、CLK同期カウンタにすると、変なことがおこる可能性は減ると思います。

CLK50MHzに対して、SENSORはせいぜい80Hzですので、一度同期カウンタに変更して試してみたいと思います。

お礼日時:2013/10/13 18:18

countモジュールの中身を見せてください。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
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を用いてプログラムしていますので、お見苦しい点などあると思いますが、何卒よろしくお願い致します。

お礼日時:2013/10/12 17:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!