1read 100read
2011年11月2期38: 【Verilog】 記述言語で論理設計Project10 【VHDL】 (968) TOP カテ一覧 スレ一覧 2ch元 削除依頼

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


1 :10/09/17 〜 最終レス :11/11/15

 HDLの処理系も、それを実際に動かすシミュレータ・評価基板も、
 安価で入手できるようになってきました。
 このスレが目に入ったおまえ! HDLで何か作って遊んでみませんか。
 日曜工作のHDL書き、学生さん、プロの方、主婦の方、カキコお待ちしており
ます。
 関連情報は >2-10 あたり。
 前スレ
  【Verilog】記述言語で論理設計 Project9【VHDL】
       カモメが飛んで、どこかに行ってしまいました〜

2 :

参考情報
  FPGA
    Xilinx (p)http://japan.xilinx.com/
    ALTERA (p)http://www.altera.co.jp/
    Lattice  
(p)http://www.latticesemi.co.jp/products/cpldspld/index.cfm?source=topnav
    Actel   (p)http://www.actel.com/intl/japan/
    QuickLogic http://www.quicklogic.co.jp/ 30日間無料だと思った。
ワンタイムだけどね・・・
  ASICベンダ推奨ツール類(高価)
    Synopsys http://www.synopsys.co.jp/
    Cadence http://www.cadence.co.jp/
    Mentor http://www.mentorg.co.jp/
    Synplicity http://www.synplicity.jp/
  Verilogシミュレーター(無料)
    Icarus http://icarus.com/
      説明 http://ryusai.hp.infoseek.co.jp/icarus.htm
      
http://www.ice.gunma-ct.ac.jp/~kimsyn/verilog/FreeSim/iverilog/iverilog.html
    IVI http://ivi.sourceforge.net/
      説明
http://www.kumikomi.net/article/explanation/2005/10icarus/01.html
  VCDフォーマットの波形表示(無料)
    GTKWave http://www.cs.manchester.ac.uk/apt/projects/tools/gtkwave/
      説明 http://ryusai.hp.infoseek.co.jp/gtkwave.htm
         
http://www.is.kyusan-u.ac.jp/cgi-bin/is-admin/wiki.cgi/CAD?page=GTKWave
  本
    CQ出版 http://shop.cqpub.co.jp/
    STARC  http://www.starc.jp/index-j.html
    Design Wave Magazine(DWM) http://www.cqpub.co.jp/dwm/ 2009/03で
終了してまった。
    Interface http://www.cqpub.co.jp/interface/
      ※基板が付録で付いている号はバックナンバー希少になりがち
  関連スレ
    フリーのツール(情報追加よろしく!)
      ALTERA Quartus II Web Edition http://www.altera.co.jp/
      XILINX ISE WebPack http://www.xilinx.co.jp/
    評価基板とか(追加情報よろしく!)
      Spartan-3 Starter Kit
http://www.xilinx.co.jp/products/spartan3e/s3eboards.htm
      CQ出版のシリーズ http://www.cqpub.co.jp/eda/

3 :
初めての
>>1

4 :
こっちに移りました
http://kamome.2ch.net/test/read.cgi/denki/1284233269/

5 :
>>4
>http://kamome.2ch.net/test/read.cgi/denki/1284233269/
はFPGA/CPLD/VHDL/Verilog/論理設計を扱う人の雑談スレですよ

6 :
教えて下さい
Verilogで、16bit配列変数をRS232で送信する部分を作っていますが
うまくできません。何がいけないのか教えてもらえないでしょうか?
reg [15:0] sokutei_data[0:7];  //測定値16bitを、16個用意
always @ (・・・・・) begin
    ・
    ・
  soushinRS232( sokutei_data[1][15:8] );  // 上位1文字送信
    ・
    ・
  soushinRS232( sokutei_data[1][7:0] );  // 下位1文字送信
    ・
    ・
end
soushin_dataの代わりに、
reg aaa;
aaa<=16'b3132;
とすればターミナルに ちゃんと 1 2 と表示されます。
配列には、何か制限があるのでしょうか。
宜しくお願いします。

7 :
そりゃあ,どういう回路を合成すれば良いのか想像すれば良いだろうて

8 :
soushinRS232て下位モジュール?
なんでalwaysの中にあるんだ?
ソフト組んでるのと勘違いしてない?

9 :
そりゃ、sousin232() は、タスクなんだろうさ。
多重配列はできないから、8ビットの変数に変えるか、一旦、別の変数に入れてから代入するしかない。

10 :
だめだこりゃ。最初っから勉強やり直しな。

11 :
さっそく、ありがとうございます。
>soushinRS232て下位モジュール?
下位モジュールでした。記述は間違っています。すみません。
大ボケしてました。
>多重配列はできないから、8ビットの変数に変えるか、一旦、別の変数に入れてから代入するしかない。
16bitの変数の上8bitを取り出したいだけなのですが、多重配列になってしまうのでしょうか。
マイコンのCとは感じが違いますね。
その後いろいろやっていて、下のように書いたらたくさんのエラーが一気に消えました。
  TXchr <= { sokutei_data[15], sokutei_data[14], sokutei_data[13], sokutei_data[12],
        sokutei_data[11], sokutei_data[10], sokutei_data[9], sokutei_data[8] };
  TXgo <= 1'b1; // 送信開始。下位モジュールに知らせる
if(送信終了した) begin
  TXchr <= { sokutei_data[7], sokutei_data[6], sokutei_data[5], sokutei_data[4],
        sokutei_data[3], sokutei_data[2], sokutei_data[1], sokutei_data[0] };
  TXgo <= 1'b1; // 送信開始。下位モジュールに知らせる
ソースが長くなって、見た目ちょっと格好悪いですが、正しく動いています。
>どういう回路を合成すれば良いのか想像すれば良いだろうて
これがわかりません。回路と言っても、D-FFが16個並んでいて、
それが8列あって、添え字デコーダー(アドレスデコーダー)があって、各列のCEにつながって
同時に各列のQをセレクタで1列に選択。その選択された上位8bitを束で扱ってくれれば
いいと思うのですが。違うかな。

12 :
>>11
>多重配列になってしまうのでしょうか。
配列にはビット幅選択ができないが正解

13 :
ありがとうございます。
>配列にはビット幅選択ができないが正解
あっ、なるほど、僕がやったsokutei_data[15]の書き方は、
「ビット選択」であって「ビット幅選択」ではないからOKということでしょうか?
でも、配列のbit幅選択ができないのはツライと思います。シリパラ変換が楽にできないです。
  P <= { P[14:0], RXin };
と、スマートに書けないので、
  P <= { P[14], P[13], P[12], P[11], P[10], P[9], P[8], P[7], P[6], P[5], P[4], P[3], P[2], P[1], P[1], P[0], RXin };
と、なってしまいます。
これを考えて、変数名を短くしておかないと大変なことになりますし。
どんな回路になるか想像してみ、と言われたのですが、
通常の変数では可能なのに、なぜ配列変数だとbit幅選択が出来ないのでしょうか?
VHDLでも同じなのでしょうか。

14 :
>TXchr <= { sokutei_data[7], sokutei_data[6], sokutei_data[5], sokutei_data[4], sokutei_data[3], sokutei_data[2], sokutei_data[1], sokutei_data[0] };
>ソースが長くなって、見た目ちょっと格好悪いですが、正しく動いています。
が既に変だと気づいているか? 本当に確かめてるのか疑問だよw

15 :
配列なんか滅多に使わんよ。

16 :
soushin232 (soukuteidata[0] >> 8);
ってやれば、上位8ビットが渡せるよ。
soushin232 (sokuteidata[0]);
で、下位8ビットが渡る。(上位は無視される)

17 :
>>15
テストベンチ書いたことないの? 実際にはメモリ記述だけどな。
>>16
ウソつけ

18 :
>>17
ベンチでも配列は滅多に使わないな。
メモリのビヘイビアではさすがに使うが。

19 :
>>16
ありがとうございます。
やってみました。バッチリ動きました。
1行でスマートに書けて、ソースが見やすくなって、とても嬉しいです。(AD堀くん風)
今度からは、これでいこうと思います。ありがとう。
ところで
always @ ( posedge reset or posedge clk ) begin
  if( reset ) begin
    sokutei_data[0] <= 0;
    sokutei_data[1] <= 0;
    sokutei_data[2] <= 0;
    sokutei_data[3] <= 0;
    sokutei_data[4] <= 0;
    sokutei_data[5] <= 0;
    sokutei_data[6] <= 0;
    sokutei_data[7] <= 0;
  end else begin
とか書いています。
上記のようなresetの時だけでなく通常の状態遷移の中でも、次のステートに行く前に、
変数をクリアしておきたいことが多々あります。そのときに、毎回8行書いています。
何かお間抜けな感じがしてなりません。もっと簡単にというか少ない行で書きたいです。
調べてみると、VerilogにもCのようにfor()があったので、これを使って書いてみました。
  for( a=0; a<8; a++ ) begin
    sokutei_data[a] <= 0;
  end
しかし、あえなく撃沈。forの行でエラーになりました。
エラー内容の説明が英語でよくわかりませんでしたが、その行のようです。
for()でやるのはいけないのでしょうか。
そもそもfor()の動作がイメージできません。1clockで動作するHDL記述中で
繰り返し文は、そこに来たら1clock期間内にclockの8倍とか10倍で動くわけではないと思います。
かといって、8clockや10clockかかっていては、他に対して遅刻してしまいます。
どのように考えれば良いのでしょうか?
日曜日にすみませんが、宜しく教えていただけないでしょうか

20 :
integer a;
for ( a = 0; a < 8; a = a + 1 ) begin
 sokutei_data[a] <= 0;
end

21 :
>8clockや10clockかかっていては、他に対して遅刻してしまいます。
シミュレータでも使って勉強してみたほうがいいんでない?

22 :
>>20,21
ありがとうございます。
これから出かけてしまうので、試すことができないです。すみません。
++は使えませんでしたね。忘れていました。a<=a+1でなくていいんですね。
町まで出るので、大きめの本屋さんに寄ってVerilogの本を見てみます。
シュミレーターは、ベンチを書くのが面倒なので、オシロとロジアナで
実際のピンの波形を観察しています。
ありがとうございました。

23 :
for()は、記述を簡単にするだけの働きだよ。まるでマクロみたいなもん。
1文字違いの記述を100行書くより、for()で書けば中身は1行で終わる。
マイコンだとforを使うと、スピードがガタっと落ちるけど、FPGAは関係なし。
これはちよっと嬉しい、FPGAのアドバンテージね。

24 :
>>20
integer a;
このaは、32bit幅でしょうか?
for ( a = 0; a < 8; a = a + 1 ) begin
 sokutei_data[a] <= a;
end
としたとき、aのbit幅とsokutei_data[]のbit幅を
合わせないといけないですよね。

25 :
>>24
integer のビット数は“32bit 以上”としか規定されていない。(実装依存)
代入時、ビット長が長いときは上位ビットが捨てられる。
ビットが足りないときは、符号拡張される。但し、ちょっとややこしい。
気持ち悪かったら reg [2:0] a; でもいいけど、for 文がうまく終了しないね。

26 :
XC9500XL使ってます
WARNING:Cpld:265 - Logic for net 'XXX' exceeds physical capacity of device
ってどういう警告ですか?
今のところ実機でも問題なく動いているようですが、
どんな問題が起こる可能性がありますか?

27 :
そのあとはこんな風にメッセージ続いてない?
The logic will be broken into intermediate nodes.
さぁエキサイト翻訳だ。

28 :
>>27さん
ありがとうございます。
XXXのロジックはデバイスの物理的限界を超えています。
中間ノードでロジックは壊れるでしょう。
って感じですか?
今の時点では動いているのですが、動作環境やロットが変われば
動かなくなっても知らないよって感じの警告なのでしょうか?
対策って何かありますでしょうか?
合成オプション帰るくらいで乗り切れるといいのですが。

29 :
broken は「壊れる」じゃなくて「分ける」だと思うな。
----
ロジックは中間のノードに分割されます。
----

30 :
NET'XXX'のロジックがややこしすぎるんで,複数のノードに分けたぞ!
>対策って何かありますでしょうか?
記述を変える
特にCPLD使うときはセルの構造がどうなっているのかに配慮して
書いてやらないとね。(言語の入門書のような単純なロジックを
のんびり動かすくらいならどうでも良いけど)

31 :
Verilogで、文法上のチェックを厳しく出来ないでしょうか?
reg [7;0] hoge;
if( ... ){
  hoge <= 0;
}
というとき、8'b0でないとエラーが出るとか

32 :
>>31
文法上はあってる。
VerilintやSpygrass使えば?

33 :
>>31
そのまえにbegin〜end使えよ

34 :
8'b00000000;
8'h00;
8'd0;
のいずれかにして欲しいです。

35 :
>>31
そのまえにif分に<=使うな

36 :
>>35
え?

37 :
>>35
は?
>>33
begin→{
end→}
にして、連接の{ } は、begin end にする。
そうすれば、記述が楽ちんなのになぁ。
beginをbiginと書いたりするオレは、HDL書きには不向きかも・・・・

38 :
if 文に <= を使うなとか、ただの 0 はいやだとか、
それは、文法を変えてくれってこと?
いやだったら Verilog なんか使うなよ。

39 :
>>37
コンパイル前に置換するバッチいれれば?

40 :
>>37
プリプロセス通す人もいるとかいないとか・・・
ソースを人に見せないといけない事もあるから俺は使わない。

41 :
>連接の{ } は、begin end にする。
ということは
例えば符号拡張の記述なんかはこんな感じか?w
wire [15:0] a;
wire [31:0] b;
//b = { {16{a[15]}} ,a };//現行 verilog
b = begin begin 16 begin a[15] end end ,a end;//提案 verilog
う〜ん、慣れればなんとかなるかな・・・

42 :
出現頻度の問題だね
現行のBEGIN endのほうが 圧倒的に多いからね

43 :
レジスタは
リセット用のif,
イネーブル用のelse if、
そのほかのelse
だけで書けば1レジスタに1個のbegin end

44 :
レジスタごとに always を分けるんですね、わかります。

45 :
>>44
それが普通だと思うけど。

46 :
reg [4:] count;
reg   LED;
always @ () begin
  if( xxxx) begin
    count <= count + 4'b1;      // ここで加算して
  end
end
always @ () begin
  if( yyyy ) begin
    count <= 4'b0;      // ここで Resetし
  end
end
assign b = (count < 4'b 1101 )? 1'b1 : 1'b0;  // そしてここで使う
こんな書き方(1つのregを異なるalwaysにまたいで使用する)は、
いけないのでしょうか?

47 :
>>46
ハードウェア化するのならだめですよ。

48 :
賢いコンパイラならエラー吐きそうだな。

49 :
エラー吐かない合成ツールはないと思うwww

50 :
シミュレータなら実行するまでエラーにならないかな?

51 :
icarusバージョンあがんないなー。
>>46
icarusなら一応とおるっぽいけど推奨は絶対にしない。

52 :
HDL書いてISEを通したとき、
OKの緑色○は、最近ほとんどお目にかかれない。黄色△ばっかり。
みなさんワーニング取ってますか? 全部取れますか? いくつあっても、ほったらかしですか?

53 :
ワーニングは全部は取れないw
でもほったらかしではないよ。

54 :
>>52
理由を理解できているワーニング以外は全てなくす。
っていうルールにしている。

55 :
>>50
文法的にはOKだからシミュレータはエラーを吐かない。

56 :
ISEでVerilogを勉強しているのですが、ISEでは回路図入力もできます。
そこで 教えてください。
1 今でも回路図入力って使われているのでしょうか?
2 回路図は、一旦VHDLに変換されてから、処理されるようです。
なぜVerilogでなく、VHDLなのでしょうか?
3 Verilogを勉強しているのですが、VHDLのふうが優れているのでしょうか
4 ISEの内部では、VerilogもVHDLに変換してから、処理されるのでしょうか?
5 就職したら、VHDLのほうが有利なのでしょうか?

57 :
ISEの開発者がVHDLが好きだったんじゃない?
Verilogができれば、VHDLは特にできなくても良いと思う。自然と読めるようになる。
先輩から聞いたら、VHDLのほうがタイプ数が多いので、周りからカッコ良く見られるらしい。

58 :
>>56
1. 一部では使われている。が少数派。
2. Xだから
3. 言語自体に優劣はない。仕事(要求)にあわせるもんだ。
4. 否
5. VHDL(Verilog)できます。ってだけで就職はできない。

59 :
>>58 が言うように、HDL できるだけじゃだめだよね。
ソフト屋だってコードが書けるだけじゃダメなはずなんだけど・・・
VHDL か Verilog かは会社の方針とかしがらみだかんね。
純粋にロジックをやりたいなら、いろんなアルゴリズムとか
数学系の勉強しておいたほうがいいよ。
回路が好きなら、アナログとかセンサーとか、あと基板周りとか。
論理設計にこだわるのはいいけど、外の世界も見ないとね。

60 :
>>59
>VHDL か Verilog かは会社の方針とかしがらみだかんね。
通信系はVerilogが多く、画像系はVHDLが多いイメージがあるな。
なんでかは知らん。

61 :
VHDLは知らないけど、
バス表記のとき (7 downto 0)とか書くみたいですが、
(0:7)のときは、(0 upto 7)と書くのでしょうか?

62 :
(0 to 7)

63 :
ありがとうございます。
あと、(0 downto 7)って書くと、エラーになりますか?

64 :
それは試せば分かるだろw

65 :
FPGAに限れば、Verilogの方がいい気がする。
まあFPGAとかだと、どちらも要求に応じて必要になってしまうのだけど。

66 :
記述の多さで、VHDLはイヤだ

67 :
最上位階層でコンポーネント同士をただ繋ぐだけでとんでもない記述量になるw

68 :
>>66
>記述の多さで、VHDLはイヤだ
「マクロなどを使えば簡単に記述できる」などと言われそうだから、もっと正確に言った方が良い。
  記述が多くて可読性に劣るので、VHDLはイヤだ

69 :
VHDL書いてる人は、

70 :
人生で初がスケマで
その後VHDLをやったときに相当感動したっけ。
で、先生からVerilogやってみない?といわれ
自「あー、やっぱやめときます」
先「だめ、後の研究生もそれでやるんだから」
で、感動してしまったのが懐かしい。

71 :
2つ目の感動は何に感動したん?

72 :
verilog ≒ C
VHDL ≒ PASCAL

73 :
それを言うなら VHDL≒Ada だろ
BEGIN〜ENDがあればみんなPASCALかい?

74 :
ブロックがbegin〜endで、; がデリミタであって文の一部でないあたり、
どっちもAlgol/Pascal/Adaの系譜だろ。VerilogをC側に分けるほど違う気はしない。

75 :
シミュレーションが早いだけでもVerilogが優位。
FPGAに関して言えば、対応規格にも差がある・・・はず。
最新の開発環境だと、VHDLってどこまで対応してるのかな?
VHDL2002は対応してるのかな?VHDL93とVerilog2001がメインなイメージ。
下位互換とか、無視して採用も出来ないだろうし、色々面倒。

76 :
デバイスのシミュレーションモデルは大抵Verilogで
SecureIPになってたりするからVHDL派は肩身が狭い。

77 :
Verilogに対して、VHDLの優れているところは、どこですか?

78 :
国防相に出すときは VHDL 指定だったかな

79 :
>>77
形宣言とかに
厳格な所とか?
これ、触ってからverilogに行くと
手の抜きどころが絶妙で感動した

80 :
VHDLの厳格さは使う側からすると厳格すぎて
優れているどころか大きな欠点。

81 :
型が厳格だから、些細なバグに悩まされなくてすむ。
合成出来たら、あとは論理的なバグに注力出来る。

82 :
1行いくらでやってる人は行数が増えると嬉しいんでは?

83 :
1行いくらという勘定の仕方は聞いたことある。
プリント基板の「1ピンいくら」と同じでしょ。
でもコメントをいっぱい書いたら、それで行数増えるけど、金額UP?

84 :
VHDL別にそれ程記述量が増えるとも思わないが、
componentだけはいただけない。
その他は言語として素晴らしいと思うよ。

85 :
>>84
Adaのモジュール構造を引き継いでいるからね。
compornentのお陰でモジュール間の差異を、コンパイラーが厳格にチェック出来るのと、
インターフェースさえ決めてしまえばチームで実装出来る。
でもまぁ、キチンと設計して実装している人には、余計お世話かもしんない。
俺は「メンドーな事はコンパイラがチェックしてくれよ〜」だから、重宝してる。

86 :
VHDLでCLKに同期してカウントし、Aの「立ち上がり」で非同期にリセットされる
カウンタが作りたいんだけど、どういう記述にしたらいい?
下のは駄目だったんですけど。
process(CLK,A) begin
if(A'event and A='1') then
COUNT <= "0000000";
elsif(CLK'event and CLK='0') then
if(COUNT="1100111") then
COUNT <= "0000000";
else
COUNT <= COUNT + '1';
end if;
end if;
end process;

87 :
if (A = '0') then

88 :
あ非同期リセットしか読んでなかった

89 :
>>87
「立ち上がり」でたのみます

90 :
>>86
> VHDLで
と言う事ならそれでいい。
シミュレーションではまともに動く。言語としてはそれで合ってる。
もちろん意図としては合成出来したいってことだろうから、
それに関しては出来ないとしかいえんな。
Verilogでもスケマでも不可能。
何か条件があればできる可能性はある。
たとえばこんなのでも、かまわんとか。
U1 : Delay port map(IN=>A, OUT=>B); -- ディレイ素子があるとして・・
process(CLK,A,B) begin
  if(A='1' and B='0') then
    COUNT <= "0000000";
  elsif(CLK'event and CLK='0') then
    if(COUNT="1100111") then
      COUNT <= "0000000";
    else
      COUNT <= COUNT + '1';
    end if;
  end if;
end process;
仮にディレイ素子が合ったとしても、
CLKとのタイミング的な競合も含め、(A='1' and B='0')のパルス幅に熟考が必要。

91 :
>VHDLでCLKに同期してカウントし、Aの「立ち上がり」で非同期にリセットされる
>カウンタが作りたいんだけど、どういう記述にしたらいい?
非同期信号を使うとトラブルの元になるから、適当に早いクロックで
サンプリングして動かしてやるのが吉だけどね。
あとは、「見た目だけ取り繕うテクニック」もいいかもしれない。
・出力がすべて'0'になればリセットされたように見える
・リセット後のCLKの立ち上がりで"0000001"が出てくれば
 0から1にカウントアップしたように見える

92 :
>>90
回答ありがとうどざいます。
なるほど、参考になりました。

93 :
>>91
回答ありがとうどざいます。
低めのクロック使ってるんでそれもいいですね。

94 :
>>86,90
86さんとおなじことをやったことがあるけど、それっぽくできたような。
90さんが言うように、RTLシミュはできるけど合成が出来ない、って
こと?
僕のときはactelで、合成ツールはsinplifyだったかな。むりやり出来
てたのかしら。
>>91
単なる非同期なら、極力同期化すべきで賛成だけど、リセットだけは
非同期がよかろう、ってケースがおおいんだよなあ。起動時とか。

95 :
>>94
リセット解除とクロックタイミングで、妙な状態に飛び込まないように
気をつけないと、痛い目にあいかねないけどね。

96 :
教えてください。
教科書本には、
always @ ( posedge RESET or posedge CLOCK ) begin
と書いてありますが、RESET信号がありません。なので
always @ ( posedge CLOCK ) begin
だけで済ませています。
これは、いけないこと(常識外れ)でしょうか?
FPGAはVirtex4で、ISE11.4でやっています。

97 :
まあ、非同期リセットなしで同期リセットだけでもいいんじゃね。
シミュレーションしにくいけど。

98 :
リセット信号がほしいなら、コンフィグROMの終了でリセットICをスタートさせる。

99 :
グローバルなリセット信号を用意して、シミュレーション時にはそれを
非同期リセットとして使う。
実装段階ではグローバルリセットがクロック同期するよう、グローバルリセット
信号生成ロジックだけを差し替える。
今はそこまでシビアにならなくても大丈夫だよ・・って話も聞くけど
ロートル管理職を納得させるにはそのくらいの細工を入れておくほうが
無駄な小競り合いを避けられる。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼