Verilogの文法について、教えてください。
下のリストのように、if文をネストして2つのカウンタを作っています。
reg1が特定の値になったらreg2をカウントアップするという動作です。
ここで、リスト真ん中当たりの、reg2がカウントアップされるところで、
ネストしたif文(※1の箇所)のelseを入れると、そのif文の上(※2)が
実行されません。
Verilogの場合、elseは直前のif文に対応するはずなので、
影響してしまう理由が分かりません。
どなたか教えてください。
reg [9:0] reg1; // 水平レジスタ
reg [9:0] reg2; // 垂直レジスタ
always @(posedge clk25m or negedge rst_n) begin
if(rst_n == 1'b0) begin // リセット
reg1 <= 10'h000;
reg2 <= 10'h000;
end
else if(clk25m == 1'b1) begin
if(10'd800 < reg1) begin
reg1 <= 10'h000;
reg2 <= reg2 + 10'h001; // ※2
if(10'd600 < reg2) // ※1
reg2 <= 10'h000;
// else
// reg2 <= reg2;
// コメントアウトしないと reg2 <= reg2 + 10'h001;(※2)が実行されない
end
else
reg1 <= reg1 + 10'h001;
end
else
reg1 <= reg1;
end
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
基本的に#1さんの書いている通りC言語の感覚で書くとダメです。
しかし他にも突っ込み所が満載です・・・・。
特にこの行
else if(clk25m == 1'b1) begin
・・・・ありえません。
同期回路には決まった書き方があります。
たぶん投稿者さんが書きたいのは
always @(posedge clk25m or negedge rst_n)
begin
if(!rst_n)
begin
reg1 <= 10'h000;
reg2 <= 10'h000;
end
else if(10'd800 < reg1)
begin
reg1 <= 10'h000;
if(10'd600 < reg2 + 10'h001)
begin
reg2 <= 10'h000;
end
else
begin
reg2 <= reg2 + 10'h001;
end
end
else
begin
reg1 <= reg1 + 10'h001;
reg2 <= reg2;
end
end
これでも、まだありえません。ちゃんとしたlintを適用するとはじかれます。
こんな感じですかね。
wire [9:0] reg2inc;
assign reg2inc = reg2 + 10'h001; //Wrap
always @(posedge clk25m or negedge rst_n)
begin
if(!rst_n)
begin
reg1 <= 10'h000;
end
else if(10'd800 < reg1)
begin
reg1 <= 10'h000;
end
else
begin
reg1 <= reg1 + 10'h001;
end
end
always @(posedge clk25m or negedge rst_n)
begin
if(!rst_n)
begin
reg2 <= 10'h000;
end
else if(10'd800 < reg1)
begin
if(10'd600 < reg2inc)
begin
reg2 <= 10'h000;
end
else
begin
reg2 <= reg2inc;
end
end
else
begin
reg2 <= reg2;
end
end
No.1
- 回答日時:
ノンブロッキング代入(<=)を使用していることが原因.
else節のコメントを解除した場合, 回路のアウトプットには※2が接続されずに"reg2 <= reg2"が接続されるため, インクリメントは行われません.
※1下の"reg2 <= 10'h000;"も同様. インクリメントが行われた後リセットされているのではない.
ノンブロッキング代入では同時処理される並列な回路が用意され, if文に応じてアウトプットに接続される回路が切り替わっているイメージを持つと良いと思います.
手続き型言語(C言語など)の様な動作を期待するのであれば, ブロッキング代入(=)を利用.
ただし同一ブロック内での併用は不可.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbsのmsgboxランダム表示について
-
レコードセットにnullの場合
-
【FPGA】VHDLのprocessとevent
-
リスト間のアイテム移動について
-
delphi
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
他のフォームから別のフォーム...
-
エクセル・VBAでテキストボック...
-
VB.NETでのイベントの途中終了
-
チェックボックスを操作できな...
-
プロシージャまたは関数の引数...
-
エクセルVBAでテキストボッ...
-
TEXTBOXの表示形式の変...
-
String型の値にスラッシュをつ...
-
リストビューの列ヘッダーの幅...
-
ExcelのVBAで文章にある複数の...
-
C言語のサフィックスについて
-
VBでの入力値制限について
-
VB6 ドラッグ&ドロップ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タイムアウトする仕組みを作りたい
-
subsequentとnextの違いってな...
-
レコードセットにnullの場合
-
verilogのcase文
-
Verilog-HDLのFF記述について
-
Why is 77+33 not equal to 100?
-
パスカル言語
-
Verilogの文法
-
pascalでの二分探索(バイナリ...
-
リスト間のアイテム移動について
-
最大公約数を再帰で求める(pas...
-
TreeViewのTag情報取得
-
整順リスト形式の英単語辞書(pa...
-
MATLABによるラグランジェ補間
-
片方のみ成り立つif分岐
-
Delphiでコンポーネント名を変...
-
変数に「.」が含まれる場合...
-
「for next」文と「if then els...
-
文字の連結がうまくいかない
-
Matlab
おすすめ情報