【Verilog】記述言語で論理設計 Project5【VHDL】

このエントリーをはてなブックマークに追加
952774ワット発電中さん:2008/03/06(木) 09:54:35 ID:gbp8ZiHh
つ デザインコンパイラ
953774ワット発電中さん:2008/03/06(木) 10:37:03 ID:HL0t0Sy4
コンパイラの一種のような気もする。

合成ツールて言うとマヌケに聞こえるし
シンセサイザて言うと別分野の用語に聞こえてしまう。


ロジックシンセサイザ…長い。
954774ワット発電中さん:2008/03/06(木) 11:27:03 ID:1PQbIh19
>>951はなんと呼ぶのがええと思う?

おいらは違和感ないよ。
だって、HDLで書いた論理を圧縮してさらにそのロジックをデバイスの内部ロジックに置き換えてくれる。
ここまで複雑な変換をしてくれるのをコンパイラーと呼ぶ以外考えられない。

ソフトウェアをやる人には一緒にして欲しくないのかもしれんが、そんなのかんけぇねぇ!
955774ワット発電中さん:2008/03/06(木) 11:32:52 ID:CjuGTT8a
シンセサイザがいいと思う。

「変換」という意味的にはコンパイラでもおかしくないんだろうけど
一緒にして欲しくないとかでなく、違和感はある
956774ワット発電中さん:2008/03/06(木) 12:04:42 ID:E8WKFPXH
合成ツールじゃだめなの?
ついでに言うと、「最適化」ってのも、最適になるわけじゃないから気持ち悪い。
957774ワット発電中さん:2008/03/06(木) 12:13:01 ID:l3Xy6JH0
HDLで書かれたソースコードをシミュレータで動かすために
中間コードまたはバイナリコードに変換する処理がコンパイル

RTL形式で書かれたHDLソースコードをネットリストに変換する処理が論理合成

全然違う
958774ワット発電中さん:2008/03/06(木) 16:04:46 ID:upXGD61x
組み合わせ回路をalwaysで書くとき、case文にdefaultは必須ですが、
順序回路でcase文を使ったときにdefaultは必要なんでしょうか?

というか、順序回路で、どの値にも当てはまらないときは何も処理したくないので、
defaultを書かなくていいならそれだけでいいのですが。
959774ワット発電中さん:2008/03/06(木) 16:08:58 ID:CjuGTT8a
何も処理しないってことを書いときゃいいじゃん。

960774ワット発電中さん:2008/03/06(木) 16:31:02 ID:cZC4E4CF
別に必須じゃないだろ。
全部の条件が書いてあれば無問題。なければラッチw
961774ワット発電中さん:2008/03/06(木) 16:33:57 ID:EKm4epzD
defaultでX入れとけ
962774ワット発電中さん:2008/03/06(木) 16:58:37 ID:VG8qxoBE
>>958
何もしたくないときは"何もしない"ということを明示しな。

記述に絶対の自信があって検証もちゃんとできるなら X 入れて ktkr
963774ワット発電中さん:2008/03/06(木) 17:15:46 ID:cZC4E4CF
X入れるのは、シミュレーションで分かりやすくするのと、回路削減へのわずかな期待。
964958:2008/03/06(木) 18:28:23 ID:upXGD61x
レスありがとうございます。

どうやらFF使う順序回路ではdefault書かなくてもいいみたいですね。
今書いてるのは制御部分で、caseに当てはまらない値が不具合だけでなく
普通に存在するので、不定にするのはまずいのです。

verilogで何もしないことを明示するにはどうするんでしょう?
空のbegin endを書いとけばいいんでしょうか。
965774ワット発電中さん:2008/03/06(木) 18:38:12 ID:2vIpvUE4
出力を入力に突っ込めばいいんじゃないの?>何もしないことを明示
966774ワット発電中さん:2008/03/06(木) 19:14:05 ID:I2m3PRQ6
;
967958:2008/03/06(木) 21:38:00 ID:upXGD61x
>>965
それが一般的のようですが、一部のコンパイラなどのツールでは使えないことがあるそうです。

>>966
やっぱそれですかね。
968948:2008/03/06(木) 22:59:01 ID:fp2TyyYK
>>951
回答ありがとうごさいます。
確かにassignを除いて、"="を"<="に変更したら期待通りの動作をしました。

ただ原因が分からないのが相変わらず。
6回試行してみたのですが、結果は4/6(○×○○×○: ×読み込み不可)
なんでこんな中途半端に動作が変わるのか。
まだ論理合成もかけてないので、ゲート遅延でタイミングが間に合わない
という事態は起きないはずなのですが。
969774ワット発電中さん:2008/03/06(木) 23:27:49 ID:PR594FG9
>>968
“=”と“<=”で、代入がどのタイミングで行われるのか(文法の)違いを調べてみよう
970774ワット発電中さん:2008/03/07(金) 00:05:13 ID:a7MS6wde
>>968
いいこと教えてあげよう。僕も君と同じくらいの初学者なんだけど、
<=と=の違いは、以下のように理解している。

  <= は、次回の予定を表している。a <= a + 1; だとしたら、
      次回のaは、今回のaに+1したものにしてね、ということ。
  =  は、今すぐの動作を表している。a = a + 1; だとしたら、
      その行(正確には、そのかたまりの中)にであったら、スグに
      a+1になる。

  で、次回というのは何かというと、ズバリclockの変化したときね。
  always@( posedge clock )から、対応するendまでの世界。
  そう考えると、<=は、その世界の中にしか置けないし、=は、
  その外側に置くことがわかる。

  で、この「次回の予定」って、どういうことかも考えた。
  これすなわち、D-FFのD端子のこと(だと思う)。
  そのFFのD端子の1/0がQに伝わるのは、clockの↑の一瞬だけだから。
  例えば、Qを反転して自分自身のDにつないだときは
  現在の値Qは1だけど、「次回の予定」は0。で、clock↑になると、
  現在の値Qが0になるけど、「次回の予定」は1。これで分周器のできあがり。

971774ワット発電中さん:2008/03/07(金) 00:12:20 ID:yLuUxgox
すごく親切で丁寧でほめてあげたいんだけど、
ちょっと違う
972774ワット発電中さん:2008/03/07(金) 00:40:42 ID:35BbOFMm
え゛ーっ? 何か違ってますか? ぜひ教えてください。
973774ワット発電中さん:2008/03/07(金) 01:02:51 ID:2lxLRNm4
=は配線の接続を表しているだけ
974774ワット発電中さん:2008/03/07(金) 01:14:07 ID:35BbOFMm
はい、そうだと思っています。74HC00のNANDなどのように、
clockの関係ないものの出力を表しているのだと思います。
なので、assign Q = ~( A & B )のように書くのだと....。
これらは、常時接続というか、D-FFのように次回のclockの↑まで堰き止めておく制御が
できないので、alwyas@()〜endの中には書けない(書かない?)のだと思います。
975774ワット発電中さん:2008/03/07(金) 01:28:51 ID:yZ1AZaIg
「=」:普通のプログラムで言うところの代入文ぽいヤツ(代入してから次の行を実行)
「<=」:同じ時刻だったら(右辺を評価した後に)同時に代入が行われる

ハードの特徴である「並列性」を表現するにはどうすれば良いか、
どんな記述が必要となるかを考えていくと、ノンブロッキング代入文「<=」の
必要性や「=」との違いが認識し易いんじゃないかなぁ。
976774ワット発電中さん:2008/03/07(金) 02:18:28 ID:gutaUPT0
初学者には「次回」=「次のクロックエッジ」と理解した方が混乱は少ないだろうし、
今の例やその他ほとんどのケースでそれは成り立つので、今はそのように
理解していても良いのだけど正確には違う。
多分今説明しても混乱するだけだし、ここで説明できるほど簡単でもないので
説明しないけど、テストベンチを書く時になって、alwaysの順番を変えたら
シミュレーションの結果が変わったとか、シミュレータによって結果が違う
といった事におそらく一回は嵌る事になると思うので、その時に「デルタ遅延」
というキーワードを勉強して欲しい。
977774ワット発電中さん:2008/03/07(金) 02:23:28 ID:2iHf+UYK
>>974
alwyas@()〜endの中でも、=を使うよ。
<=と混在はさせないが。
978774ワット発電中さん:2008/03/07(金) 02:35:00 ID:1KpJyUQ1
A,B,Cそれぞれ0でスタート

B=A+1
C=B+1
A=C+1

普通に計算してみると

B=1
C=2
A=3

でもコンパイルすると

“ループしてますエラー”
979774ワット発電中さん:2008/03/07(金) 03:02:59 ID:0sNfxgNs
B = Aは
#define B ((A)+1)
って理解しとくとOK?
980774ワット発電中さん:2008/03/07(金) 03:04:06 ID:0sNfxgNs
>B = A
B = A+1
のつもりでした。。。orz
981774ワット発電中さん:2008/03/07(金) 07:42:44 ID:ULqBX53S

微妙に分かりやすく書かれていて
初心者には受けが良い説明なんだろうけど
決定的な間違いがあるから
初心者が誤解したまま覚えてしまうとかなり危険


>  =  は、今すぐの動作を表している。a = a + 1; だとしたら、
>      その行(正確には、そのかたまりの中)にであったら、スグに
>      a+1になる。

違う

>次回のclockの↑まで堰き止めておく

違う
982774ワット発電中さん:2008/03/07(金) 07:55:52 ID:s1qZfti+
否定厨キター
正解の解説をかけよ
983774ワット発電中さん:2008/03/07(金) 09:00:23 ID:aGZWtcsO
レジスタ代入に、ブロッキングとノンブロッキングの両方でできるようになっている言語仕様が悪い。ついでに、レジスタにならないものをreg宣言させるのもいくない。
984774ワット発電中さん:2008/03/07(金) 13:42:56 ID:35BbOFMm
>>981
どのように違うか、教えてください。

確かに、a = a + 1 はヤバイと思います。
a = b + 1 なら、まだいいんですが。

次回のclockの↑まで堰き止めておくというのは、その1つのD-FFについての説明で
その出力Qが、レベル動作素子(andとかorとかの組み合わせ回路)につながっていれば
それらは動いてしまいます。
985774ワット発電中さん:2008/03/07(金) 17:55:56 ID:NWaCkhxT
a = a + 1
とか書いてる人はちゃんと頭の中で回路図も描いてるの?
単に記述動作だけでデザインやってるってものすごく怖い
986774ワット発電中さん:2008/03/07(金) 18:36:57 ID:gutaUPT0
>>981
> >  =  は、今すぐの動作を表している。a = a + 1; だとしたら、
> >      その行(正確には、そのかたまりの中)にであったら、スグに
> >      a+1になる。
> 違う

漏れもどこが違うのか知りたい。ちなみに以下は遅延制御なしのブロッキング代入文を
どのように処理するかという定義をVerilogのLRMからコピーしたもの。

if it returns immediately if no delay is specified, the process performs the assignment
to the left-hand side

これ以外の遅延なしブロッキング代入文の動作があるのならば知りたい。
987774ワット発電中さん:2008/03/07(金) 18:39:27 ID:4kn2us9H
>>977 のように分かってやってるならいいと思うよ
988774ワット発電中さん:2008/03/07(金) 18:49:21 ID:gutaUPT0
>>981
> >次回のclockの↑まで堰き止めておく
> 違う

これは同意だが、初心者に今それを説明しても混乱するだけだろうというのは
976で書いたとおり。

>>984
どうしても今知りたければ、
ttp://japanese.sugawara-systems.com/tutorial/verilog/framepage7.htm
の6章 代入文を参照。ただし上級コースなので、そのつもりで。
989774ワット発電中さん:2008/03/07(金) 21:19:07 ID:Hj2AO/bF
すまんけど、VHDL的に言うところの、:= と <= の違いかね?
990774ワット発電中さん:2008/03/07(金) 21:23:11 ID:ajeKem9t
>>988
それ、シミュレータ動作から見た説明になってるんで、回路作りたい人用には分かりづらくね?
なんつーか、抽象度上げっていうか。
991774ワット発電中さん:2008/03/07(金) 21:55:41 ID:9MHwqslE
Veritak ユーザーのオレは勝ち組
992774ワット発電中さん:2008/03/07(金) 23:06:52 ID:TPPzCD9q
VHDLに関し、お勧めの書籍はありますか?
初心者用の本は読んだのですが、なかなか地元の本屋に中級者用の書籍がなくて困っています。
993774ワット発電中さん:2008/03/08(土) 00:17:43 ID:MA4RUCUZ
>992
森岡澄夫 『HDLによる高性能ディジタル回路設計』
とか…というか、その初心者用の本て何よ。

994774ワット発電中さん:2008/03/08(土) 01:36:34 ID:MFFm3J4v
>989
そういうこと。
シミュレーション用は別として
回路で = は使うなってことだ。
995774ワット発電中さん:2008/03/08(土) 01:59:52 ID:2HH4KlIK

ちなみに、ブロッキング代入とノンブロッキング代入というのがありますよね。
なんで「ブロッキング」と言うのでしょうか。
しかも、「=は、ブロッキング代入」「<=は、ノンブロッキング代入」って、
何かイメージと違う気がする。

996774ワット発電中さん:2008/03/08(土) 02:14:03 ID:WuIMuHW2
>>990
だから、初心者は今知る必要はないし上級コースだよと断っているでしょう。
でも、racing問題にはそのうち必ずはまるので、その時には結局はシミュレータの
動作が分かっていないと根本的対策は打てない。
問題を起こした信号に#1のユニット遅延を付加することで直ることは直るけど
それではいつまでたってもモグラ叩きでしょう。
997774ワット発電中さん:2008/03/08(土) 02:18:51 ID:+H0kv0E5
>>994
>回路で = は使うな

普通に使うよ。
998774ワット発電中さん:2008/03/08(土) 02:53:52 ID:MFFm3J4v
>997
中間変数使って速く処理したい場合とか便利ですよね。
あなたは使っても無問題。
新人にはレイアウトを経験させてから使わせてる。
基本的に、頭の悪い俺は自分の作った回路が
あとで見て、わけわからなくなるからつかわん。
999774ワット発電中さん:2008/03/08(土) 02:59:26 ID:BzTCKM0A
うめ
1000774ワット発電中さん:2008/03/08(土) 02:59:58 ID:BzTCKM0A
うめ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。