
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で質問しましょう!
似たような質問が見つかりました
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
- JavaScript ソースコードは下の共有コードサイト「張り紙」にあります。 入力フォームの javascript で 1 2022/05/11 11:01
- パチンコ・スロット 六号機のアイムジャグラーを 朝から18時まで打ってこれでした。 とてもストレスが溜まりました。 おも 3 2022/04/08 17:34
- パチンコ・スロット ファンキージャグラー2の設定6の BIG確率1/219 REG確率1/262で打ってると結構100G 4 2022/08/25 22:17
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Verilog-HDLによる設計において
-
変数に「.」が含まれる場合...
-
[至急]Project Euler:#21Amicab...
-
matlabのfor文について
-
pascalでの二分探索(バイナリ...
-
VBAでWorkbook_BeforeSaveイベ...
-
Verilog-HDLのFF記述について
-
Verilogの文法
-
リスト間のアイテム移動について
-
delphi
-
BMPファイルを作成し保存
-
VBA public変数はどのようなこ...
-
ベンチマークの実行結果の表示...
-
プログラムにくわしいかた教え...
-
ピクチャボックスのサイズを状...
-
[Excel2000]auto_closeを止めさ...
-
整数かどうかチェックする
-
C#のループでtextboxに値を入れ...
-
サンプルプログラムをコンパイ...
-
ユーザーフォームへのデータ入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードセットにnullの場合
-
タイムアウトする仕組みを作りたい
-
subsequentとnextの違いってな...
-
delphi
-
日付の重複
-
なんで? cEn-P^-1AP=P^-1(cEn-AP)
-
matlabのfor文について
-
TreeViewのTag情報取得
-
pascalでの二分探索(バイナリ...
-
Verilogの文法
-
FORTRAN77でプログラミング
-
vbsのmsgboxランダム表示について
-
クラスモジュールの処理
-
verilogのcase文
-
VBAでWorkbook_BeforeSaveイベ...
-
Why is 77+33 not equal to 100?
-
リスト間のアイテム移動について
-
VBA public変数はどのようなこ...
-
他のフォームから別のフォーム...
-
エクセルVBAでテキストボッ...
おすすめ情報