dポイントプレゼントキャンペーン実施中!

以下のプログラムを入力し、試してもうまくいきません。どこがいけないのでしょうか。

しようとおもっていることを大まかにいうと、
・x1の立ち上がりに、money1に1を足す
・x2の立ち上がりに、money2に2を足す
・クロックの立ち上がりに、sumにmoney1とmoney2を足したものを入れて、
sumが3だったら、z1に割り当てたLEDを光らせる
sumが4だったら、z2に割り当てたLEDを光らせる

というものです。
試してみると結果はz1,z2両方のLEDが、x1,x2を立ち上げなくても最初から光ってしまいます。



module vendmachine(x1,x2,z1,z2,clk);

input x1,x2,clk;
output z1,z2;
reg [2:0] money1;
reg [2:0] money2;
reg [2:0] sum;
reg ledz1,ledz2;

always@(posedge x1) begin
money1=money1+3'd1;
end

always@(posedge x2) begin
   money2=money2+3'd2;
end

always@(posedge clk) begin
sum=money1+money2;
if(sum==3'd3)begin
ledz1=1'b1;
end
if(sum==3'd4)begin
ledz1=1'b1;
ledz2=1'b1;
end
end




assign z1=ledz1;
assign z2=ledz2;

endmodule

A 回答 (3件)

はじめまして。


RTLを見させていただいた範囲で言いますと、LEDが2つとも最初から点灯しているのは、実行時、初期段階でledz1、ledz2が1に設定され、その状態がずっと続いているからではないでしょうか?

always文の中でif文を使っていますが、全てのケース(この場合ですと「sum==3'd3」が成立しないケースや「sum==3'd4」が成立しないケース)の動作を記述しないと、論理合成ツールはフリップ・フロップやラッチなどの記憶素子を合成し、順序回路を出力します。

回路に意図されている動作をさせるためには、組み合わせ回路にしなければいけませんので、always文を使いたいのであれば、上述の通り全てのケースにおいて回路がどの様に動作するかを記述しなければいけません。

尚、他にalways文の中でcase文を使う場合でもif文と同じ様に全てのケースにおける動作を記述しないと意図しない記憶素子が合成されます。

所で、今回の場合、always文にこだわらないのであれば、以下の記述もできます。
こちらの方が簡潔ですし、ご質問のケースだと実際によく用いられる記述なのでご検討されてみては如何でしょうか。


以下を削除して
if(sum==3'd3)begin
ledz1=1'b1;
end
if(sum==3'd4)begin
ledz1=1'b1;
ledz2=1'b1;

代わりにalways文の外に以下を追加

assign z1 = ( (sum==3'd3) |(sum==3'd4) )? 1 : 0 ;
assign z2 = (sum==3'd4) ? 1 : 0 ;
    • good
    • 0

always@(posedge clk) begin


sum=money1+money2;
if(sum==3'd3)begin
ledz1=1'b1;
else < 追加
ledz1=1'b0; < 追加
end

if(sum==3'd4)begin
ledz1=1'b1;
ledz2=1'b1;
else < 追加
ledz1=1'b0; < 追加
ledz2=1'b0; < 追加
end
end

といった、感じで良いのではないのでしょうか?
LED を ON にしたい時以外は、必ず、 OFF("L"出力) に成る事を
明示しておくのは、如何でしょうか?
    • good
    • 0

まずは、確認です。



プログラムこれが、全てでしょうか?
それならば、レジスタの初期値は、明示した方が良いと思います。
電源投入時やリセット時は、必ずしも "0"("L")に成るとは限りません。

それと、LED は "H" 入力で 点灯 が正解でしょうか?

後、if に対する else を記入し、排他的な答えも明示しては、如何でしょう?

この回答への補足

アドバイス有難うございます。プログラムはこれがすべてです。
これからは初期値を明示するようにします。
しかし、一度初期値を設定して試してみたのですが、結果は変わりませんでした。

LEDは、H入力で点灯です。

また、この場合、elseをつけるとしたら、1も2も足すことはないので、
money1=money1+3'd0;

money2=money2+3'd0;
とすればよいのでしょうか。

補足日時:2012/12/02 06:16
    • good
    • 0

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