以下のプログラムを入力し、試してもうまくいきません。どこがいけないのでしょうか。
しようとおもっていることを大まかにいうと、
・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
No.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 ;
No.2
- 回答日時:
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"出力) に成る事を
明示しておくのは、如何でしょうか?
No.1
- 回答日時:
まずは、確認です。
プログラムこれが、全てでしょうか?
それならば、レジスタの初期値は、明示した方が良いと思います。
電源投入時やリセット時は、必ずしも "0"("L")に成るとは限りません。
それと、LED は "H" 入力で 点灯 が正解でしょうか?
後、if に対する else を記入し、排他的な答えも明示しては、如何でしょう?
この回答への補足
アドバイス有難うございます。プログラムはこれがすべてです。
これからは初期値を明示するようにします。
しかし、一度初期値を設定して試してみたのですが、結果は変わりませんでした。
LEDは、H入力で点灯です。
また、この場合、elseをつけるとしたら、1も2も足すことはないので、
money1=money1+3'd0;
や
money2=money2+3'd0;
とすればよいのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- 数学 写真の図は中心(a,b)半径rの円とその円周上の(x1,y1)における接線lと円の中心とlを結ぶ任意 4 2023/08/08 16:20
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- 数学 数学直線の方程式とベクトル方程式について 直線の方程式で 点(x1,y1)を通り、直線ax+by+c 1 2022/08/12 12:13
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- C言語・C++・C# Project Euler #6 Sum square difference 至急教えてください。 1 2022/09/17 16:16
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
C言語で電卓を作成する。
-
C言語プログラムが理解できなくて…
-
while文について、c言語...
-
配列を使って魔方陣
-
scanf関数を用いての加減乗除%...
-
プログラム
-
C言語 数字以外を入力させない...
-
getcの改行判定
-
while文でπ/4の近似値を求める
-
初心者です。for文、if文を使っ...
-
c言語のwhile文を使った計算で...
-
for文の中にswitch文はいれられ...
-
c言語プログラミングで1から100...
-
C言語です
-
C言語。どうしてコンパイルでき...
-
プログラミングで二番目に大き...
-
計算結果がlong型以上になる場...
-
C言語:forを用いたプログラム
-
c言語で平均をだす
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
#if 1 #elseの意味について
-
プログラミングで二番目に大き...
-
getcの改行判定
-
C言語プログラムが理解できなくて…
-
C言語 数字以外を入力させない...
-
配列を関数に渡す方法
-
配列を使って魔方陣
-
初心者です。for文、if文を使っ...
-
c言語for文
-
c言語で平均をだす
-
while文について、c言語...
-
scanf関数を用いての加減乗除%...
-
行列をべき乗させるプログラム
-
c言語プログラミングで1から100...
-
C言語階乗の総和を求める
-
scanfが実行されません
-
階乗のプログラム!!
-
C言語の二分法のプログラムにつ...
おすすめ情報