質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

FPGA

FPGAは、製造後でも設計者によって書き換えができる論理回路です。即時に書き換えが可能なため、開発期間を短縮することが可能。何度でも書き換えられるといった柔軟性があるため、製造や開発における費用も削減できるといったメリットがあります。

HDL

HDL(ハードウェア記述言語)は、デジタル回路の設計などを行うための記述言語です。プログラミング言語に似ており、回路の設計や構成を記述することが可能。VHDL/Verilog HDL/SFLなどのHDLが広く使用されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1828閲覧

【verilog】代入文に出てくる==の意味を教えてください。

im_a_student

総合スコア6

Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

FPGA

FPGAは、製造後でも設計者によって書き換えができる論理回路です。即時に書き換えが可能なため、開発期間を短縮することが可能。何度でも書き換えられるといった柔軟性があるため、製造や開発における費用も削減できるといったメリットがあります。

HDL

HDL(ハードウェア記述言語)は、デジタル回路の設計などを行うための記述言語です。プログラミング言語に似ており、回路の設計や構成を記述することが可能。VHDL/Verilog HDL/SFLなどのHDLが広く使用されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/09/01 06:52

編集2021/09/01 07:09

verilog初心者です。テキストのソースコードにわからない部分があったので解説お願いいたします。

###分からないこと①
LEDを赤、緑、青、白、消灯の5つの状態に変化させる回路のソースコードです。
26ビットの分周カウンタで125MHzのクロック信号を分周して約1.86Hzにしています。
17行目の以下の文の==の意味が分かりません。==は等しいという意味だと思いますが、代入するものに対して等しいとはどういう意味なのでしょうか。条件式に出てくるのならわかるのですが…
また、26'h3ffffffは2進数で言う1が26桁並んだ数値ですが、なぜここで出てきているのでしょうか。

わからない部分①

wire ledcnten = (cnt26==26'h3ffffff);

###分からないこと②
以下の文はRST≠0のときcnt26に0を代入して、RST=0のときcnt26+1を代入していると思うのですが、テキストのブロック図にはALL1検出と書いてあります。この記述がなぜ26ビットで分周できるのでしょうか。システムクロックを分周というソースコード自体があまりよく分かっていないのかもしれません。

わからない部分②

if ( RST ) cnt26 <= 26'h0; else cnt26 <= cnt26 + 1'h1;

該当のソースコード

verilog

1 2module blink ( 3 input CLK, 4 input RST, 5 output reg [2:0] LED_RGB 6); 7 8/* システムクロックを分周 */ 9reg [25:0] cnt26; 10 11always @( posedge CLK ) begin 12 if ( RST ) 13 cnt26 <= 26'h0; 14 else 15 cnt26 <= cnt26 + 1'h1; 16end 17 18wire ledcnten = (cnt26==26'h3ffffff); 19 20/* LED用5進カウンタ */ 21reg [2:0] cnt3; 22 23always @( posedge CLK ) begin 24 if ( RST ) 25 cnt3 <= 3'h0; 26 else if ( ledcnten ) 27 if ( cnt3==3'd4) 28 cnt3 <=3'h0; 29 else 30 cnt3 <= cnt3 + 3'h1; 31end 32 33/* LEDデコーダ */ 34always @* begin 35 case ( cnt3 ) 36 3'd0: LED_RGB = 3'b100; 37 3'd1: LED_RGB = 3'b010; 38 3'd2: LED_RGB = 3'b001; 39 3'd3: LED_RGB = 3'b111; 40 3'd4: LED_RGB = 3'b000; 41 default:LED_RGB = 3'b000; 42 endcase 43end 44 45endmodule

###わかっていること
・@( posedge CLK ) beginでクロック信号の立ち上がりのタイミングでbegin以下が実行されること。
・if(RST)でRST≠0の時だということ。
・26'h0は26ビットの16進数で0の数値という意味だということ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

125MHzのクロック信号を分周して約1.86Hz

例えば,1秒毎に1回何かをしたい(すなわち,1Hz)のだけど,クロックが10Hzだったら,
このクロックの回数を数えて10回ごとに何かをすれば良いですよね.

今,クロックが125MHzで,1.86Hzにしたいのだから,
このクロックの回数を数えて (125M / 1.86)回 毎に何かをする形にすればよいですね.

26'h3ffffffは2進数で言う1が26桁並んだ数値ですが、なぜここで出てきているのでしょうか。

というのは,目標が 1.86Hz なので,
(125M / 1.86) とだいたい同じ回数(これが 0x3ffffff) 毎に何かをする形にしている,ということです.

投稿2021/09/01 07:29

編集2021/09/01 07:31
fana

総合スコア11652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

im_a_student

2021/09/01 07:43

分周する意味がとてもよくわかりました!ありがとうございます 1.86Hzと近い値という意味で使われていたのですね!なっとくできました 1.86Hzになったらそれ以降の文にすすむことになるわけですね!
fana

2021/09/01 08:13

> wire ledcnten = (cnt26==26'h3ffffff); この ledcnten は, cnt26 が 3ffffff の期間だけ1であり,そうでない期間は0であるわけです. 毎クロック毎にcnt26の値は変化しているので, ledcntenが1である期間の長さは1クロック分の時間になります. なので, cnt26 が 3ffffff に変化したクロックの次のクロックで, cnt3 の値が変化することになります. (同じタイミングで cnt26 は全bit0に変化する)
im_a_student

2021/09/02 07:02

ありがとうございます 1クロック分ledcntenが1になって、次に1になるまでの時間がLEDの色が変わる時間という認識であっていますか? cnt26が3ffffffになった次のクロックでcnt3の値が変化して、同時にcnt26がbit0になることもすごくよくわかりました!ありがとうございます!
fana

2021/09/02 07:10

> 1クロック分ledcntenが1になって、次に1になるまでの時間がLEDの色が変わる時間という認識であっていますか? * ledcnten は cnt26 が 3ffffff の期間だけ1であり * cnt3 の値が変化するのは,クロック立ち上がりエッジのタイミングで ledcnten が1であるときであり * cnt3 の値が変化した際に LED_RGB の値が変更される …という形になっているので,そうなりますね.
fana

2021/09/02 07:20

{ CLK, cnt26, ledcnten cnt3, LED_RGB } に関する タイミングチャート を一度書いてみるとよいかもしれません.
guest

0

分からないこと①

演算子 - recs

等号演算子

等号演算子には==、!=、===、!==がある。指定した関係が真なら1を、偽なら0を返す。


また、26'h3ffffffは2進数で言う1が26桁並んだ数値ですが、なぜここで出てきているのでしょうか。

125MHzのクロック信号を分周して約1.86Hzにするにはこの値がちょうどよかったのでしょう。


分からないこと②

ALL 1検出をしているのはwire ledcnten = (cnt26==26'h3ffffff);の部分です。

投稿2021/09/01 06:55

編集2021/09/01 07:17
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

im_a_student

2021/09/01 07:15

==についてよくわかりました! 26'h3ffffffについてなのですが、cnt26が26'3ffffffになる場合というのは何回もあるのでしょうか。 1回しかないものなのでしょうか。 また、cnt26は初期値を設定していませんがcnt26にcnt26を代入する式が成り立つのはなぜなのでしょうか。 質問が多くてすみません。
ozwk

2021/09/01 07:36 編集

> cnt26が26'3ffffffになる場合というのは何回もあるのでしょうか。 はい、何回もあります。 足し算した結果桁が溢れたら溢れた部分を捨てます。 なので26ビット幅の信号cnt26に26'h3ffffff+1'h1を代入したら0になります。 > また、cnt26は初期値を設定していませんが cnt26は0~26'h3ffffffをぐるぐる回ってればよく 初期値が不定であっても分周の動作には問題ないです。 シミュレーションであれば初期値がX(不定)になりますが、 最初にRST=1にして初期化すればいいののでやっぱり問題ないです このあたりはプログラミングの経験があると逆に分かりづらいかと思います
im_a_student

2021/09/01 07:35

ありがとうございます!初期値は何らかの値になるのですね! cnt26の初期値が0の場合、cnt26+1=1,cnt26+1=2,…となってしばらくの間はcnt26==26'h3ffffffは偽になると思うのですが合っていますでしょうか。一回26'h3ffffffを超えたらずっと真ってことになりますか? cnt26が真で1になって初めてそれ以下の文のelse if(ledcnten)以下が実行されるという感じなのでしょうか。 またまた質問沢山すみません!よろしくお願いします!
ozwk

2021/09/01 07:44 編集

> cnt26の初期値が0の場合、cnt26+1=1,cnt26+1=2,…となってしばらくの間はcnt26==26'h3ffffffは偽になると思うのですが合っていますでしょうか。 はい。 > 一回26'h3ffffffを超えたらずっと真ってことになりますか? いいえ、そもそも超えません。26ビット幅の信号cnt26に26'h3ffffff+1'h1を代入したら0になります。 > cnt26が真で1になって初めてそれ以下の文のelse if(ledcnten)以下が実行されるという感じなのでしょうか。 はい。 ただし、現実の回路においては「実行される」ものではありません。 cnt3は毎クロックごとに * 0 * cnt3+1 * cnt3 のどれかに更新されますが、条件に関わらずcnt3+1は常に計算されていて、条件によってマルチプレクサで選ばれます。
im_a_student

2021/09/01 07:52

ありがとうございます! 0になるのですね!用意されたビット数を超えたら常に0になってしまうものなのでしょうか。例えば2'h3とかを足しても0になりますか?ビット数限界-2の状態に3を足したりした場合などもわかれば教えていただきたいです。 回路は実行という概念ではないんですね!同時に起きているという感覚が近いのでしょうか? 別の質問なのですがRST(リセット信号)はどのような信号か決まっているのでしょうか。RST信号もクロック信号のように定期的に1か0が周期的に来るような信号で、1の時if(RST)の条件が処理されるみたいな感じでしょうか? よろしくお願いします!
ozwk

2021/09/01 08:15 編集

> 回路は実行という概念ではないんですね!同時に起きているという感覚が近いのでしょうか? ああ、そうですそうです。まさにそのとおり。 > 用意されたビット数を超えたら常に0になってしまうものなのでしょうか。 いいえ、ビット幅に合うように最上位ビットから捨てます。 2(b10)という値を1ビットの変数に代入しようとしたら0(1'b0)になりますし 7(b111)という値を2ビットの変数に代入しようとしたら3(2'b11)になります > 別の質問なのですがRST(リセット信号)はどのような信号か決まっているのでしょうか。 別に決まってません。もっと言えばCLKも別に決まってません。 CLKを制約ファイルか何かで125MHzクロックに繋げば125MHzの周期信号となるというだけで、 そのverilogファイルだけでは「1か0が周期的に来るような信号」とは決まってません。 まあ通常CLKという名前の信号はクロックを想定して書いているわけですが。 じゃあ普通の場合RSTはどういう信号を繋ぐかを想定しているかというと 「セットしたいときに1になるような信号」です。 例えば制約ファイルでスイッチにつながっているピンにつなげたりする。
im_a_student

2021/09/02 06:59

ありがとうございます 最上位ビットから捨てるってことなんですね!!めちゃ分かりました!ありがとうございます h3ffffff+h1=h4000000=b100000000000000000000000000(27桁)になるから、26ビット幅の信号に代入されるときは一番上の1が捨てられて0になるということであっていますか? RSTも理解できました!制約ファイルでそういう設定になっているということですね!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問