【Verilog】 記述言語で論理設計Project10 【VHDL】
HDLの処理系も、それを実際に動かすシミュレータ・評価基板も、
安価で入手できるようになってきました。
このスレが目に入ったおまえ! HDLで何か作って遊んでみませんか。
日曜工作のHDL書き、学生さん、プロの方、主婦の方、カキコお待ちしており
ます。
関連情報は >2-10 あたり。
前スレ
【Verilog】記述言語で論理設計 Project9【VHDL】
カモメが飛んで、どこかに行ってしまいました〜
6 :
774ワット発電中さん:2010/09/25(土) 19:31:41 ID:77GtutG2
教えて下さい
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 と表示されます。
配列には、何か制限があるのでしょうか。
宜しくお願いします。
そりゃあ,どういう回路を合成すれば良いのか想像すれば良いだろうて
soushinRS232て下位モジュール?
なんでalwaysの中にあるんだ?
ソフト組んでるのと勘違いしてない?
そりゃ、sousin232() は、タスクなんだろうさ。
多重配列はできないから、8ビットの変数に変えるか、一旦、別の変数に入れてから代入するしかない。
だめだこりゃ。最初っから勉強やり直しな。
11 :
774ワット発電中さん:2010/09/25(土) 22:23:38 ID:77GtutG2
さっそく、ありがとうございます。
>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を束で扱ってくれれば
いいと思うのですが。違うかな。
>>11 >多重配列になってしまうのでしょうか。
配列にはビット幅選択ができないが正解
13 :
774ワット発電中さん:2010/09/26(日) 01:17:09 ID:5hVievFb
ありがとうございます。
>配列にはビット幅選択ができないが正解
あっ、なるほど、僕がやった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でも同じなのでしょうか。
>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
配列なんか滅多に使わんよ。
soushin232 (soukuteidata[0] >> 8);
ってやれば、上位8ビットが渡せるよ。
soushin232 (sokuteidata[0]);
で、下位8ビットが渡る。(上位は無視される)
>>15 テストベンチ書いたことないの? 実際にはメモリ記述だけどな。
>>16 ウソつけ
>>17 ベンチでも配列は滅多に使わないな。
メモリのビヘイビアではさすがに使うが。
19 :
774ワット発電中さん:2010/09/26(日) 15:22:46 ID:5hVievFb
>>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かかっていては、他に対して遅刻してしまいます。
どのように考えれば良いのでしょうか?
日曜日にすみませんが、宜しく教えていただけないでしょうか
integer a;
for ( a = 0; a < 8; a = a + 1 ) begin
sokutei_data[a] <= 0;
end
>8clockや10clockかかっていては、他に対して遅刻してしまいます。
シミュレータでも使って勉強してみたほうがいいんでない?
22 :
774ワット発電中さん:2010/09/26(日) 16:32:31 ID:5hVievFb
>>20,21
ありがとうございます。
これから出かけてしまうので、試すことができないです。すみません。
++は使えませんでしたね。忘れていました。a<=a+1でなくていいんですね。
町まで出るので、大きめの本屋さんに寄ってVerilogの本を見てみます。
シュミレーターは、ベンチを書くのが面倒なので、オシロとロジアナで
実際のピンの波形を観察しています。
ありがとうございました。
for()は、記述を簡単にするだけの働きだよ。まるでマクロみたいなもん。
1文字違いの記述を100行書くより、for()で書けば中身は1行で終わる。
マイコンだとforを使うと、スピードがガタっと落ちるけど、FPGAは関係なし。
これはちよっと嬉しい、FPGAのアドバンテージね。
>>20 integer a;
このaは、32bit幅でしょうか?
for ( a = 0; a < 8; a = a + 1 ) begin
sokutei_data[a] <= a;
end
としたとき、aのbit幅とsokutei_data[]のbit幅を
合わせないといけないですよね。
>>24 integer のビット数は“32bit 以上”としか規定されていない。(実装依存)
代入時、ビット長が長いときは上位ビットが捨てられる。
ビットが足りないときは、符号拡張される。但し、ちょっとややこしい。
気持ち悪かったら reg [2:0] a; でもいいけど、for 文がうまく終了しないね。
26 :
774ワット発電中さん:2010/09/27(月) 21:46:06 ID:vpn19l6/
XC9500XL使ってます
WARNING:Cpld:265 - Logic for net 'XXX' exceeds physical capacity of device
ってどういう警告ですか?
今のところ実機でも問題なく動いているようですが、
どんな問題が起こる可能性がありますか?
そのあとはこんな風にメッセージ続いてない?
The logic will be broken into intermediate nodes.
さぁエキサイト翻訳だ。
28 :
26:2010/09/28(火) 09:15:07 ID:e5hif5DO
>>27さん
ありがとうございます。
XXXのロジックはデバイスの物理的限界を超えています。
中間ノードでロジックは壊れるでしょう。
って感じですか?
今の時点では動いているのですが、動作環境やロットが変われば
動かなくなっても知らないよって感じの警告なのでしょうか?
対策って何かありますでしょうか?
合成オプション帰るくらいで乗り切れるといいのですが。
broken は「壊れる」じゃなくて「分ける」だと思うな。
----
ロジックは中間のノードに分割されます。
----
NET'XXX'のロジックがややこしすぎるんで,複数のノードに分けたぞ!
>対策って何かありますでしょうか?
記述を変える
特にCPLD使うときはセルの構造がどうなっているのかに配慮して
書いてやらないとね。(言語の入門書のような単純なロジックを
のんびり動かすくらいならどうでも良いけど)
Verilogで、文法上のチェックを厳しく出来ないでしょうか?
reg [7;0] hoge;
if( ... ){
hoge <= 0;
}
というとき、8'b0でないとエラーが出るとか
>>31 文法上はあってる。
VerilintやSpygrass使えば?
33 :
774ワット発電中さん:2010/09/29(水) 23:27:03 ID:wkJRdjJN
8'b00000000;
8'h00;
8'd0;
のいずれかにして欲しいです。
>>35 は?
>>33 begin→{
end→}
にして、連接の{ } は、begin end にする。
そうすれば、記述が楽ちんなのになぁ。
beginをbiginと書いたりするオレは、HDL書きには不向きかも・・・・
if 文に <= を使うなとか、ただの 0 はいやだとか、
それは、文法を変えてくれってこと?
いやだったら Verilog なんか使うなよ。
>>37 プリプロセス通す人もいるとかいないとか・・・
ソースを人に見せないといけない事もあるから俺は使わない。
>連接の{ } は、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 :
774ワット発電中さん:2010/10/05(火) 09:56:46 ID:i1wP+g+h
出現頻度の問題だね
現行のBEGIN endのほうが 圧倒的に多いからね
レジスタは
リセット用のif,
イネーブル用のelse if、
そのほかのelse
だけで書けば1レジスタに1個のbegin end
レジスタごとに always を分けるんですね、わかります。
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にまたいで使用する)は、
いけないのでしょうか?
賢いコンパイラならエラー吐きそうだな。
エラー吐かない合成ツールはないと思うwww
シミュレータなら実行するまでエラーにならないかな?
icarusバージョンあがんないなー。
>>46 icarusなら一応とおるっぽいけど推奨は絶対にしない。
HDL書いてISEを通したとき、
OKの緑色○は、最近ほとんどお目にかかれない。黄色△ばっかり。
みなさんワーニング取ってますか? 全部取れますか? いくつあっても、ほったらかしですか?
ワーニングは全部は取れないw
でもほったらかしではないよ。
>>52 理由を理解できているワーニング以外は全てなくす。
っていうルールにしている。
>>50 文法的にはOKだからシミュレータはエラーを吐かない。
ISEでVerilogを勉強しているのですが、ISEでは回路図入力もできます。
そこで 教えてください。
1 今でも回路図入力って使われているのでしょうか?
2 回路図は、一旦VHDLに変換されてから、処理されるようです。
なぜVerilogでなく、VHDLなのでしょうか?
3 Verilogを勉強しているのですが、VHDLのふうが優れているのでしょうか
4 ISEの内部では、VerilogもVHDLに変換してから、処理されるのでしょうか?
5 就職したら、VHDLのほうが有利なのでしょうか?
ISEの開発者がVHDLが好きだったんじゃない?
Verilogができれば、VHDLは特にできなくても良いと思う。自然と読めるようになる。
先輩から聞いたら、VHDLのほうがタイプ数が多いので、周りからカッコ良く見られるらしい。
>>56 1. 一部では使われている。が少数派。
2. Xだから
3. 言語自体に優劣はない。仕事(要求)にあわせるもんだ。
4. 否
5. VHDL(Verilog)できます。ってだけで就職はできない。
59 :
774ワット発電中さん:2010/10/18(月) 08:20:17 ID:JqDNou9J
>>58 が言うように、HDL できるだけじゃだめだよね。
ソフト屋だってコードが書けるだけじゃダメなはずなんだけど・・・
VHDL か Verilog かは会社の方針とかしがらみだかんね。
純粋にロジックをやりたいなら、いろんなアルゴリズムとか
数学系の勉強しておいたほうがいいよ。
回路が好きなら、アナログとかセンサーとか、あと基板周りとか。
論理設計にこだわるのはいいけど、外の世界も見ないとね。
>>59 >VHDL か Verilog かは会社の方針とかしがらみだかんね。
通信系はVerilogが多く、画像系はVHDLが多いイメージがあるな。
なんでかは知らん。
VHDLは知らないけど、
バス表記のとき (7 downto 0)とか書くみたいですが、
(0:7)のときは、(0 upto 7)と書くのでしょうか?
(0 to 7)
ありがとうございます。
あと、(0 downto 7)って書くと、エラーになりますか?
それは試せば分かるだろw
FPGAに限れば、Verilogの方がいい気がする。
まあFPGAとかだと、どちらも要求に応じて必要になってしまうのだけど。
記述の多さで、VHDLはイヤだ
最上位階層でコンポーネント同士をただ繋ぐだけでとんでもない記述量になるw
>>66 >記述の多さで、VHDLはイヤだ
「マクロなどを使えば簡単に記述できる」などと言われそうだから、もっと正確に言った方が良い。
記述が多くて可読性に劣るので、VHDLはイヤだ
VHDL書いてる人は、
人生で初がスケマで
その後VHDLをやったときに相当感動したっけ。
で、先生からVerilogやってみない?といわれ
自「あー、やっぱやめときます」
先「だめ、後の研究生もそれでやるんだから」
で、感動してしまったのが懐かしい。
2つ目の感動は何に感動したん?
verilog ≒ C
VHDL ≒ PASCAL
それを言うなら VHDL≒Ada だろ
BEGIN〜ENDがあればみんなPASCALかい?
ブロックがbegin〜endで、; がデリミタであって文の一部でないあたり、
どっちもAlgol/Pascal/Adaの系譜だろ。VerilogをC側に分けるほど違う気はしない。
シミュレーションが早いだけでもVerilogが優位。
FPGAに関して言えば、対応規格にも差がある・・・はず。
最新の開発環境だと、VHDLってどこまで対応してるのかな?
VHDL2002は対応してるのかな?VHDL93とVerilog2001がメインなイメージ。
下位互換とか、無視して採用も出来ないだろうし、色々面倒。
デバイスのシミュレーションモデルは大抵Verilogで
SecureIPになってたりするからVHDL派は肩身が狭い。
Verilogに対して、VHDLの優れているところは、どこですか?
国防相に出すときは VHDL 指定だったかな
>>77 形宣言とかに
厳格な所とか?
これ、触ってからverilogに行くと
手の抜きどころが絶妙で感動した
VHDLの厳格さは使う側からすると厳格すぎて
優れているどころか大きな欠点。
型が厳格だから、些細なバグに悩まされなくてすむ。
合成出来たら、あとは論理的なバグに注力出来る。
1行いくらでやってる人は行数が増えると嬉しいんでは?
1行いくらという勘定の仕方は聞いたことある。
プリント基板の「1ピンいくら」と同じでしょ。
でもコメントをいっぱい書いたら、それで行数増えるけど、金額UP?
VHDL別にそれ程記述量が増えるとも思わないが、
componentだけはいただけない。
その他は言語として素晴らしいと思うよ。
>>84 Adaのモジュール構造を引き継いでいるからね。
compornentのお陰でモジュール間の差異を、コンパイラーが厳格にチェック出来るのと、
インターフェースさえ決めてしまえばチームで実装出来る。
でもまぁ、キチンと設計して実装している人には、余計お世話かもしんない。
俺は「メンドーな事はコンパイラがチェックしてくれよ〜」だから、重宝してる。
86 :
774ワット発電中さん:2010/10/29(金) 15:37:59 ID:ZmcOjoOX
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;
if (A = '0') then
あ非同期リセットしか読んでなかった
89 :
774ワット発電中さん:2010/10/29(金) 16:13:45 ID:ZmcOjoOX
>>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')のパルス幅に熟考が必要。
>VHDLでCLKに同期してカウントし、Aの「立ち上がり」で非同期にリセットされる
>カウンタが作りたいんだけど、どういう記述にしたらいい?
非同期信号を使うとトラブルの元になるから、適当に早いクロックで
サンプリングして動かしてやるのが吉だけどね。
あとは、「見た目だけ取り繕うテクニック」もいいかもしれない。
・出力がすべて'0'になればリセットされたように見える
・リセット後のCLKの立ち上がりで"0000001"が出てくれば
0から1にカウントアップしたように見える
92 :
86:2010/10/29(金) 19:29:02 ID:ZmcOjoOX
>>90 回答ありがとうどざいます。
なるほど、参考になりました。
93 :
86:2010/10/29(金) 19:38:48 ID:ZmcOjoOX
>>91 回答ありがとうどざいます。
低めのクロック使ってるんでそれもいいですね。
>>86,90
86さんとおなじことをやったことがあるけど、それっぽくできたような。
90さんが言うように、RTLシミュはできるけど合成が出来ない、って
こと?
僕のときはactelで、合成ツールはsinplifyだったかな。むりやり出来
てたのかしら。
>>91 単なる非同期なら、極力同期化すべきで賛成だけど、リセットだけは
非同期がよかろう、ってケースがおおいんだよなあ。起動時とか。
>>94 リセット解除とクロックタイミングで、妙な状態に飛び込まないように
気をつけないと、痛い目にあいかねないけどね。
教えてください。
教科書本には、
always @ ( posedge RESET or posedge CLOCK ) begin
と書いてありますが、RESET信号がありません。なので
always @ ( posedge CLOCK ) begin
だけで済ませています。
これは、いけないこと(常識外れ)でしょうか?
FPGAはVirtex4で、ISE11.4でやっています。
まあ、非同期リセットなしで同期リセットだけでもいいんじゃね。
シミュレーションしにくいけど。
リセット信号がほしいなら、コンフィグROMの終了でリセットICをスタートさせる。
グローバルなリセット信号を用意して、シミュレーション時にはそれを
非同期リセットとして使う。
実装段階ではグローバルリセットがクロック同期するよう、グローバルリセット
信号生成ロジックだけを差し替える。
今はそこまでシビアにならなくても大丈夫だよ・・って話も聞くけど
ロートル管理職を納得させるにはそのくらいの細工を入れておくほうが
無駄な小競り合いを避けられる。
PLLのロック信号をリセットとして使う方法もあるよね。
FPGAの場合はRESETを付けるデメリットが無いから、ほぼ無条件に入れてる。
でもucfでRESETピンを割り付けないといけないでしょう?
どこにつないでいるの?
どっか余ってる入力ピンw
俺も無条件にRESET使ってるけど、デメリットは感じないな〜。
RESET無かったら「無いの〜」って言われるし説明が面倒だから。
>>103 だもその余っている入力ピンは、どこにつなぐの?
RESET ICを置くの?
>>100 RESETのために、DCMを使うってことだね。
106 :
103:2010/10/30(土) 23:15:17 ID:rVjP/6G3
>>105 何がしたいの? 知りたいの?
使いたくなきゃ使わなければいいし、使いたきゃ使えばいいだけ。
真面目に話すと、俺が基板も含めて設計する時RESETピンは基板上でプルアップして使っていない。
じゃあ何のためかっつうと、起動時に周囲も含めた状態で挙動不審な動きした時とかの
デバッグ検証用の保険として使っている。後、他の人も言ってるがRESET無いと嫌がるお上がいるんだよ。
リセットが無いと嫌な俺はロートルだったのかorz
まぁ、最近じゃFPGAだけじゃなくて、
ちょっとしたASSPとかMCUもリセットなしで動くみたいだけどね。
108 :
774ワット発電中さん:2010/10/31(日) 03:30:05 ID:6JQ/vp4x
FPGAには、特にRESET用のピンはないけど、CPLDには、GSRがある
>>107 コストダウン要求が厳しい民生用途の場合、リセットICは無論、リセット用のCR
さえも削ろうとするんで、とりあえず外部リセット信号が無くても電源が規定
の立ち上がりをすればOKという風になってきているしね。
おかげで、その前提条件を理解せずに作ってしまって「時々立ち上がらなく
なります。MCUがおかしいんじゃないでしょうか?」なんて言っちゃうのが
出てきたり。
リセットがないんじゃなくて内部でやってるだけだろ。
当然。
で、心配性のひと(特にロートル)は内部リセットが
信用できないので外部からリセットを入力するんだ。
ちなみに私は外部リセット派(ェ、マダシラガナイヨ
外部リセット不要なのはいいけど、
電源の立ち上がり時間に対する要求が厳しくなると、
それはそれで面倒な事になるね。
その辺のバランスを取るのが、
これからの設計では重要になるんだろうな。
何にせよリセットボタン付けといてくれよ。
電池はずしたりコンセント抜いたりはマンドクセ
で、リセットボタンのチャタリング対策をどうするんだ?とかって
なったりするわけだ。
オジサン達を相手にするのもなかなか大変だろうけど、頑張ってな。
リセットボタンならチャタリングあっても何の問題もないんじゃね?
FPGAとASICでかなり事情が違うと思うのだが・・・
はじめてISE12を使ってみたけど、11より動きが速いような気がする。
気のせい?
118ですが、やっぱり12は軽く動くと思います。
RTL Schematic表示の時に、F7/F8の拡大縮小が速くなったです。
外部Editorを使ってソースを開いていると、
シンセシスがスタートできないみたいだけど、optionで直るかも。
13はいつ出るんだ?
GUIに慣れ「よ〜し、頑張るぞ」と言うときに限ってVer UPするんだよな。
動作軽くなるのうれしいね!
11はすぐに考え事するからね・・・w
教えてください。
Verilogのテストベンチについてです。
例えば、以下のような記述をします。
initial begin ←1行目
a = 0; b = 0; ←2行目
#10 a = 1; ←3行目
#10 a = 0; b = 1; ←4行目
#10 a = 1; ←5行目
#10 a = 0; b = 0; ←6行目
#10 $finish; ←7行目
end ←8行目
1行目にbeginとありますが、このbeginに対応するendは8行目だと思います。
そうするとこのbegin〜endは、initialの内容範囲を示すもののように思えます。
initialは初期値なので2行目だけであり、1回目の#10以降はinitialではないように思うのです。
つまり、こんな感じです。
initial begin ←1行目
a = 0; b = 0; ←2行目
end ←8行目
#10 a = 1; ←3行目
#10 a = 0; b = 1; ←4行目
#10 a = 1; ←5行目
#10 a = 0; b = 0; ←6行目
#10 $finish; ←7行目
「別にそんなこと、どっちでもいいじゃん」と思うもしれませんが、釈然としません。
このinitialとbegin〜endの関係について、おわかりになる方がいらしたら、理由を教えて
もらえないでしょうか?
追記です。
あるいは、以下のようだととても自然に納得できるのですが。
begin ←1行目
initial a = 0; b = 0; ←2行目
#10 a = 1; ←3行目
#10 a = 0; b = 1; ←4行目
#10 a = 1; ←5行目
#10 a = 0; b = 0; ←6行目
#10 $finish; ←7行目
end ←8行目
なに言ってんだこいつw
ゆとり&ほめて育てる教育受けてきた”俺様坊主”のなれの果て
アホの子がいる
begin〜endを{ 〜 }に置き換えてみればしっくりくる。
て、その話題は
>>37 >>41で既に見たな。
ワロスww
みなさん、ありがとうございました。
みなさん知らないということですね。
了解しました。
>initialは初期値なので2行目だけであり、1回目の#10以降はinitialではないように思うのです。
はっきり言えば、ここから既に間違ってるわけだ。
え?あれって質問してたのw
>釈然としません。
って言ってるから、質問してるんじゃなくて
納得の仕方を聞いてるだけに見えたんだがなぁ。
んなもん自分でシミュレーションして覚えろ。
みんな仲良く
親身になって相談に乗りましょう。
あなたが学生さんなら、その課題は昼飯1回で誰かに写させてもらい、
HDLのことはスッパリ忘れてしまいましょう。
不幸にして、あなたが社会人なら、急いで転職先を探しましょう。
えっ?言語仕様に文句言ってるだけでしょ?
×初期値
○初期化
>>123 そういう決まりだから文句言ってもしょうがない。
そのように書く理由は、ここのスレの奴らじゃ答えられるわけがない。
文句あるなら自分で言語作ればいいよ。誰も使わんだろうけど。
ジム・クラークやアイルトン・セナなど、優れたドライバーは問題のあるマシンであっても
すぐさま適応して乗りこなしていた。
>>139 じゃあ何故セナは死んだんだろな?
もっとましなこと言えないのかなあ。
正直
1-1=0になるのが納得できません
って言ってるように感じる
答えようがない
>>141 オマエVerilog素人だろ。
Verilogの代入は、いろいろと納得できない種になってるんだぞw
ザイリンクスのページから、ISEデザインシートというフリー版のFPGA開発ソフト
をダウンロードしました。
もしこれの使い方で質問があるときは、どうすればいいのでしょうか。
フリー版なので、サポートはしないことになっているみたいです。
電気をやるのは私一人で、まわりに聞ける人がいないんです。
xilinx forum
>>142 お前123か?
言語仕様で論理的整合性に合わなく納得できないということは
確かにある。
でも上で言ってるのは、そうじゃないだろww
>initialは初期値なので
initial: happening at the beginning
であって、「初期値」ではないのだな。
最終的な回路の状態は、initialが$finishした後の状態で、
そこに至るまでのところはいわば「initial」の範疇だと思えばいいんでは?
簡単な例で言えば「外部から与えられた値を順に加算していく
回路」があったとする。
ここに1から10までの値を順に与えていったとき
結果が55になっているというのが「得たい結果」であって、
そのために10回に分けてデータを与えるようなものを「initial」
として定義したのだと。
ただ、我々としては$finishに至るまでの途中経過こそが見たい部分
だということが多いんだけどね。
147 :
774ワット発電中さん:2010/11/11(木) 03:11:50 ID:WHrRSRvI
input [1:0] a,b;
output a_win,b_win,even;
上記のようにすると入力a,bは2ビットになります。10をグー、01をチョキ、11をパーとします。
aが勝ったときはa_winが1、bが勝ったときはb_winが1、あいこのときはevenが1、それ以外は全て0が出力されるような回路を作りましょう。
(宿題の丸投げではありません。私はベリログ独学です)
最後の一文で、元々なかった答える気が完全に無くなるなw
`default_nettype none
`defin go_ 2'b10
`defin pi_ 2'b01
`defin pa_ 2'b11
`defin winA 1
`defin winB 2
`defin aiko 3
module tsurikamo (
input wire clock,
input wire reset,
input wire [1:0] a, b,
output wire a_win, b_win, even
);
reg [3:0] pattern;
reg [1:0] result;
assign pattern = { a, b };
always @ ( posedge reset or posedge clock ) begin
if( reset == H ) begin
result <= 0;
end else begin
if( pattern=={go_,go_} ) begin result <= `aiko; end
else if( pattern=={go_,pi_} ) begin result <= `winA; end
else if( pattern=={go_,pa_} ) begin result <= `winB; end
else if( pattern=={pi_,go_} ) begin result <= `winB; end
else if( pattern=={pi_,pi_} ) begin result <= `aiko; end
else if( pattern=={pi_,pa_} ) begin result <= `winA; end
else if( pattern=={pa_,go_} ) begin result <= `winA; end
else if( pattern=={pa_,pi_} ) begin result <= `winB; end
else if( pattern=={pa_,pa_} ) begin result <= `aiko; end
end
end
assign a_win = (result==`winA)? 1'b1 : 1'b0;
assign b_win = (result==`winB)? 1'b1 : 1'b0;
assign even = (result==`aiko)? 1'b1 : 1'b0;
Verilog歴 半年の私が書きました。評価をお願いします。
最後に
endmodule 忘れました
ゴー、ピー、パーってのは、方言なのか?
グー:10
チョキ:01
パー:11
かぁ・・
とりあえず、AとBのXORを取って0になれば「あいこ」だ。
あいこじゃないときは
・Aの上位ビットと下位ビットのXORをとったものをXA
・Aの上位ビットとBの上位ビットのXORをとったものをXBH
・Aの下位ビットとBの下位ビットのXORをとったものをXBL
として、
XBH='0'でXBL='0'ならあいこ
あいこじゃないなら、
XA='1'でXBH='1'でBの下位ビットが'1'ならAの勝ち
XA='0'でXBH='0'で、Bの下位ビットが'0'ならAの勝ち
これ以外ならBの勝ち
あっ・・
>とりあえず、AとBのXORを取って0になれば「あいこ」だ。
>あいこじゃないときは
を消し忘れたわ。すまん
module janken(a,b,a_win,b_win,even);
input [1:0] a,b;
output a_win,b_win,even;
reg [2:0] d;
always @( * ) begin
case( {a,b} )
4'b1010: d = 3'b001;
4'b0101: d = 3'b001;
4'b1111: d = 3'b001;
4'b1001: d = 3'b100;
4'b0111: d = 3'b100;
4'b1110: d = 3'b100;
4'b0110: d = 3'b010;
4'b1101: d = 3'b010;
4'b1011: d = 3'b010;
default: d = 3'bxxx;
endcase
end
assign { a_win,b_win,even } = d;
endmodule
合成ツールの論理圧縮に期待する・・と
Verilogで、TextファイルのROMデータ5000個を、配列に格納しようと思います。
さすがにTextファイルに
dat [ 0 ] = 16'h0000;
dat [ 1 ] = 16'h1234; データには規則性がない
というのを延々と書いて、includeというのも、どうかな、と思います。
generate文とfor文でうまくできればいいのですが、考えられませんでした。
どのようにしたら 間違え少なく、効率よく書けますでしょうか?
$readmemh
>>157 ありがとうございます。
それは、システムタスクですよね。
実際に合成して使いたいのですが、使えるのでしょうか?
>>158 ターゲットがASICかFPGAかによるけど、
その場合はROMのマクロセルの仕様に従う必要がある。
無論、レジスタファイルに配置するというのなら、
直接記述するか、includeして使う事になるとは思う。
初心者ですが、戸惑うことが多すぎて質問もできませぬ。
ここの過去スレを参照したいんですが誘導して頂けませんでしょうか。
>>160 2chのサーバーが不調で、過去スレは消えました。
Googleで、
記述言語で論理設計Project
で検索するといいです。
あぁ、消滅してしまってたんですか… 残念。
レスありがとうございます。 そのワードで検索してみます。
163 :
774ワット発電中さん:2010/11/14(日) 14:28:34 ID:qYZiFvU3
下記のようなメモリ回路を設計したい.
[1]メモリは2ビットで8ワードの容量(=16ビット)をもつ.
[2]このメモリの入力はD, WR, AD, 出力はQとする.
(D, Qは2ビット, ADは3ビット, WRは1ビット)
[3]常にAD番地のメモリの値がQに出力される.
[4]WRの立ち上がりでメモリのAD番地にDが記憶される.
下のように作ったんですが、8行目にエラーがあるようです。
error:always statement does not have any delay.
A runtime infinite loop occur.
と表示されてしまいました.どう直せばいいですか?
http://www.dotup.org/uploda/www.dotup.org1249535.txt.html
>>163 always文にセンシティビティリストが入ってないですよ。
Verilogの文法書を参照して見てはどうでしょうか?
>>163 WRの立ち上がりってどこで表現してるの?
Dを記憶しているようにもみえないし。
>>163 エラー箇所以外にも突っ込み所満載なんだけど。
とりあえず、何でWRをqに入力してるのw
あと、大文字と小文字で信号名を区別するのはやめようよ。
後で絶対混乱する(他の人が
>error:always statement does not have any delay.
>A runtime infinite loop occur.
位、ちゃんと読め。
読めないならこの世界からさっさと足を洗え。将来、周囲の皆が迷惑する。
always @ (…) begin 〜 end は、知っていますが
always @ (…) fork 〜 joinというのも書けるのでしょうか?
>>168 ちったあ自分で調べろよ
頭悪すぎるぞ
とか他人には偉そうに言うくせにwww
殺伐とした雰囲気ですが、発言良いでしょうか?
RTLとHDLの違いを教えてください。
みなさん、区別せずに使っているように思うので、
ここで一つ、意味を確認しておきたいと思うのです。
RTL = Registered Transfer Logic 和訳:レジスタでトランスファーするロジック
HDL = Hardware Description Language 和訳:ハードウェアをデスクリブションするランゲージ
ここまでは調べて、なんとかわかりました。
これらの違いがわかりません。
Wikiより
HDLに基づく論理合成が登場し、HDLはデジタル設計の表舞台に立つようになった。
合成ツールはHDLのレジスタ転送水準(Register Transfer Level: RTL)を記述したソースファイルを
コンパイルし、製造可能な論理ゲートやトランジスタのネットリスト記述を生成する。当初のシステムでは、
合成可能なRTLファイルを書くには熟練を要した。RTLで合成したネットリストは、従来の設計に比べると
サイズが大きく、性能も悪いことが多かった。熟練技術者による回路図による設計は、論理合成した同等の
回路設計よりも常に優れていたが、論理合成の生産性の良さから、RTL合成が不得手としていた高速低電力な
回路や非同期回路でもHDLが採用されていった。論理合成は、単にHDLをデジタル設計の中心に押し出した
だけでなく、それ自体がデジタル回路設計のための画期的技術であった。 回路図による設計とRTLによる設計は、
プログラミング言語におけるアセンブリ言語による設計とC言語による設計の関係に似ている。
RTLってのはハードウェア記述の抽象度のレベルのひとつで、
レジスタからレジスタへの値の移動、代入文で動作を記述するようなレベルを指す。
HDLってのはハードウェアを記述する言語ならなんでもHDLなので、
RTLで記述するものもあれば、ネットリストを記述するものもあれば、どちらもという言語とか
いろいろある。
>>172,
>>173 ありがとうございました。
私も
>>172の文章を読みましたが、結局どうなのか、わからなかったです。
お二人のお話を見ると、同じ土俵で比べるものではないということですね。
例えば、プリウスと自動車みたいな感じですね。ありがとうございます。
では、今日から私は、RTLを使わずにHDLを使うことにしたいと思います。
どうもありがとうございました。
VerilogとかVHDLなんかはHDLだよ。
その中のレベルの話。
RTLで書かないと相変わらず合成できない。
生物学で考えると、
原子 < 分子 < 細胞 < 臓器 < 生物個体 < 群集 ・・・
とスケールレベルを挙げることができるけど、
デジタル回路の場合、
電子 < トランジスタ < AND、OR等基本ロジック < RTL < モジュール ・・・
と動作、設計レベルを挙げることができる。
HDLというのは上記の「AND、OR等基本ロジック」以降を記述する手法。
物事をより分かり易く、単純に考えれるようにするという
人間の知恵の賜物だね。
>>177 う〜ん、それはシナプス細胞の構成で得られる「機能」と捉えられるだろうから、
スケールレベルには並べられないかもね・・・
HDLを使ってRTL記述ができるということは、
RTLを記述する用途にHDLが利用可能ということ。
うーむ、イマイチな説明だ。
Verilogを使いCISCのCPUを作ろうと思っているんですがお勧めの本などはありますか?
簡単なRISCのCPUの設計はわかるんですがCISCのCPUをどのように実装すれば良いのか
まったくわかりません
パタヘネとヘネパタに載ってなかったら論文読みあさるしかないんじゃね?
CISCのキモはマイクロプログラムだよ
CISCはRISCのインタープリタで動いていると考えるんだ。
>>180 「わかりません」じゃねぇだろ。「模範解答がみつかりません」だろ?
自分で考えもしないで「わかる」わけがない。
マイクロプログラム方式のサーベイなら bit 別冊「ダイナミック・アーキテクチャ」
>>181-185 ありがとうございます
望んでいるような本はないみたいですね
マイクロプログラム方式を調べてVerilogで実装していこうと思います
Z-80 は、RISC なのか CISC なのか?
Z80はCISC
教えてください
wire [15:0] a; // unsigned 16bit
wire signed [15:0] b; // signed 16bit
assign b = a; // signed にキャスト 0〜65535が、-32768〜+32767に。
unsignedの値を、signedにキャスト代入するのは上記の方法でよいでしょうか?
まずは自分で試せ
$
assign b=a-32768;
signed なんて使うなよ。
いや、signed は使うだろ
俺もsignedは使わない。
負の値の処理をする時は回路的な記述にしてるし・・・。
196 :
774ワット発電中さん:2010/11/21(日) 03:35:26 ID:IGpDSD1l
みなさん シュミレーションはやっていますか?
というのは、「チップスコープを使うようになってから、シミュレーションしなくなったなぁ」という
話を聞いたからです。
しかし、王道としては
1) 状態遷移の設計
2) コーデイング 次々と階層化して ドンドン制約かけて
3) 論理シュミレーション
4) マップ
5) マップ後のシュミレーション
6) チップスコープ組み込み
7) ジェネレート
8) 実機動作
9) チップスコープ解析
10) 完成
となると思うのです。
チップスコープアナライザーだけで済ませてしまって 良い物でしょうか?
ドキュメント
趣味レベルならシミュレーションは不要
RTL出してから実チップが出るまで6ヶ月くらいかかるし、
サインオフできないからしゅみれーしょんしてるよ。
サインオフとは何ですか?
いまどき6ヶ月もかからないよ。少なくとも論理検証できるESサンプルはね。
余程取引先に舐められてるとしか思えん。
35n でもそんなんでできる?
なんか、レイアウトに時間かかるらしい。
まあ、かなりなめられてはいるけど。
レイアウト工数が把握できていない時点でダメな発注元だw
というかレイアウト考えてRTLやSDF作成してないんじゃないか?
新人の練習専門だったりw
>>203 製造プロセスも明示せんのに、35ns大丈夫とか質問する神経を疑うのだがw
半導体ハードウェアについて無能ってことでOK?
あるか分からんけど35nmじゃないの…
趣味レーション
>>206 35ns じゃねーよ 35nm だよ。
まあ、ちゃんと書かなかったのが悪いけどさ。
動作速度を ns で言うかな?MHz じゃなイカ?
レイアウトとか後工程は別の部署だから詳しくは知らないけど。
211 :
774ワット発電中さん:2010/11/24(水) 20:15:09 ID:PUzk19I1
>210
きみ>200じゃないでしょ。 その発言レベルはいくらなんでも>200が可哀想
Verilogは2001とか2005とかSystemVerilogとか対応形式が増えていくのに、
VHDLは全然増えていません。なぜですか?
VHDLなんて糞言語だれも使ってないからだろ
軍用の規格が無闇に変わったら、それはそれで問題だと思う。
>>214 規格が増えてもツールの対応が中途半端だったり、
頭の固い上司がいたりして、なかなか使えないし、
古いIPとかあるから結局うれしくないよなぁ。
どうせならもっとまともな仕様で言語を作り直してほしい。
>>217 小規模なFPGAなら、チームで好きに出来るんだろうけどね。
それでもSystemVerilogなんて選択肢になく、Verilog2001とかになるんだろうけど。
作り直した言語は、よほどのことがない限り主流にならない気がする。
IT系ならいざ知らず、保守的なこの業界は、とくに。
あとSystemCには、早めに滅びて欲しい。
>>218 >>あとSystemCには、早めに滅びて欲しい。
よこやりですまんが、何で?
「そろそろ真面目に勉強した方がいいかな。」とか考えてたもんで・・・
>>219 C++だから嫌なのです。もう少しマシな言語を・・・・
ソフトウェアでは、JAVAやC#のおかげで、やっとC++から解放されつつあるのに。
あとは単価が安くなりそうだからとか、C++は別に使うから頭の切り分け(似て非なる言語は辛い)に違う言語がいいとか、
ソフトウェアとは距離を置きたいとか、今と大きく変わるのは嫌だとか、そんな感じですかね。
別に何の問題もないと思うので、時間が取れるのなら勉強したらいいと思いますよ。
なんかさぁ、無理矢理C++を拡張して
ソフト屋にもハード屋にも使えないものを作って
誰得なんだよ〜
>C++だから嫌なのです。もう少しマシな言語を・・・・
>ソフトウェアでは、JAVAやC#のおかげで、やっとC++から解放されつつあるのに。
なんだそんな馬鹿馬鹿っぽい理由か
もっとSystemCの本質を突いた発言を期待したのに
C++ならgccが使えるから安く済むってとこだろ
gccの対応言語にVerilog-HDLやらVHDLが入れば
SystemCなんか捨ててそっち使うよ
Verilog や VHDL を使わずに SystemC を使ってるの?
それで仕事になるの?シミュレーションだけなの?
225 :
219:2010/12/06(月) 16:37:30 ID:G1cLsq9N
>>220 微妙な質問に回答ありがとう。 なるほど、似て非なる言語は面倒ですよね。
う〜ん、今後主流に発展する可能性は低いのかなー?
低い
ぶっちゃけVHDLでよくないっすか??
必要にして十分だが、単価が安い兵隊どもはVHDLが使えないのだよ
VHDLが使えるとなると単価が上がる
え、VHDL使えるって価値があることなんですか!?
がんばります!
VHDL が残ってるうちだけだよ。
ここってモジュールに関する質問とかおkなんでしょうか?
と、テンプレ読んできたらよさそうだったので。
初歩的な質問で申し訳ないのですが、モジュールをボード上で動作させる際、
スイッチを押したかどうかの判定に、分周を用いる必要性って何でしょうか?
always @(posedge clock) begin
//スイッチの処理
となる、clockに分周を適用しているようなのですが。
クロック周期<チャタリングの時間 or クロック周期≒チャタリングの時間
→分周クロックでもなんでも良いけどチャタリング対策必要
クロック周期>>チャタリングの時間
→多分、チャタリング対策しなくても大丈夫かも
ありがとうございます。
単純にチャタリング対策で、と考えておkということですね。
>>232 >clockに分周を適用しているようなのですが。
分周って言うけど、どこに分周が出てくるの?
always @(posedge clock) begin って、
clockごとに、以下の動作を1回行うということだけど。
分周されたクロック=clockだと思ったけど、
もとのクロック=clockかもしれないわけですね。
ISEのUCFについて、教えてください。
ucfファイルに、次のように書いています。
NET "data_bus[ 0]" LOC = AC16;
NET "data_bus[ 0]" IOSTANDARD = LVCMOS33;
何かにつけて、NET "data_bus[ 0]"を書いているんですが、これを1行で書けないでしょうか?
たとえば、
NET "data_bus[ 0]" LOC = AC16, IOSTANDARD = LVCMOS33;
という感じです。信号名を2回書くのは、間違いの元ですし。
>>239 ありがとうございました。大変助かりました。
こんな資料があるとは、夢にも思っていませんでした。
探し方が足りないようでした。すみません。
質問させてください
ISE12.3 + Verilogで書いています。
その中で、
1 for()の動作イメージができません。
always @ ()で、1clockごとに動作している中に、for()で10回の繰り返し処理を
記述すると、どのような動作になるのでしょうか?
A for()が10回終わるまで、他の動作は停止している。(みんな待っててくれる)
B for()が開始されるが、他の動作は停止せず動いて行ってしまう。(置いてきぼり)
C 1clockの間にfor()は、10倍のスピードで動作して、ほかの動作と帳尻が合う。(forがんばる)
Cは、絶対に無いと思いますが、2でしょうか。そうなると、for()は、何のためにあるの? という感じです。
2 for()に使用する変数の記述について、いくつかの本を見ると、
genvar i; だったり
integer i; だったり
reg [7:0] i; だったり、いろいろですが、どれが正解なのでしょうか?
3 for()の上下を、begin : LABEL , endでくくってあるものもあれば、
そのままのものもあります。これはどちらで書くべきでしょうか。
よろしくお願いします。
forは似たような回路をたくさん並べるために使う表現にすぎない
Cみたいな実行時演算(?)を指示する制御構文ではないよ
>>242 ありがとうございます。
ということは、
reg [7:0] data [0:9];
// --------
integer i;
if( RESET ) begin
for( i=0; i<10; i++ ) begin
data[i] <= 0;
end
end
と書くのは、
if( RESET ) begin
data[0] <= 0;
data[1] <= 0;
data[2] <= 0;
data[3] <= 0;
data[4] <= 0;
data[5] <= 0;
data[6] <= 0;
data[7] <= 0;
data[8] <= 0;
data[9] <= 0;
end
と同じということでしょうか?
つまり、コンパイラーのプリプロセッサみたいに
思えば良いでしょうか?
回路合成のことをコンパイルと呼んでいるなら、その通りの解釈でOK
>>244 ありがとうございます。助かりました。
100個くらいの配列を100行使って、延々と記述していたのですが、
これで楽になります。
ありがとうございました。
>>243 その通りで、プリプロセッサのイメージに近いね。
VHDLは時間の概念がなくて、記述しているのはあくまで回路の「構造」にすぎない。
forと書けば、その分だけ繰り返し構造を「生成」するということになる。
>>246 >VHDLは時間の概念がなくて、
>forと書けば、その分だけ繰り返し構造を「生成」するということになる。
本当ですか? では、上記の例のように、配列10個を1clockでクリアするときは、
どのように記述するのでしょうか?
>>247 VHDLというか、「HDLが」だった。
>>243の例も同様で、これは時間的な処理でなく、構造を記述しているにすぎない。
1クロックでこれらの配列の要素に0が代入される。
ちなみにVHDLだと、( others => ( others => '0' ) )と書くことで、配列の全てを一気に0にすることができるので、
スッキリするよ。
>>248 ありがとうございます。
>ちなみにVHDLだと、( others => ( others => '0' ) )と書くことで、配列の全てを一気に0にすることができるので、
>スッキリするよ。
あ〜、それいいですね。1行で書けるのは素敵です。
さきほど、for()を使ってみましたが、エラーになってしまいました。
for( i=0; i<X; i=i+1)begin ←エラー
end
for( i=0; i<10; i=i+1)begin ←OK
end
とりあえず数字で済ませました。
下手くそなソースが、for()のおかげで、だいぶ見やすくなりました。
今年最後のヒットでした。
ソフト屋の目でヘタクソなソース言われてもねえ。
多分変更後の値を参照しようとしてハマる口だろう。
>>249 なんとなく。
合成後の回路を全くイメージしないままHDLを書いていそうで怖い。
回路を想像した方がいいとおもうよ。。。
252 :
774ワット発電中さん:2010/12/25(土) 12:25:49 ID:dYHVyeh0
VHDL_AMSでモデルを作る話はこのスレでいいの?
>251
100個の配列とか言ってたし、合成用の記述じゃないでしょ。
シミュレーション用のテストベンチの話だと思うよ。
254 :
774ワット発電中さん:2010/12/30(木) 11:38:18 ID:gqMSr89/
初めてQuartus IIを使おうとしているのですが、
色々な説明には登場するシミュレーション関連の機能が全くありません。
ProcessingにSimulationもなければ、Vector Waveform Fileも作れません。
これはWeb Editionだからなのでしょうか?
それとも「将来的にModelSimに一本化」というのが
バージョン10で実行されたのでしょうか。
(チュートリアルにはSimulationも表示されていますが)
以下、環境とインストールしたアプリです。使用言語はVHDL。
Windows XP Prof. SP3
Quartus II 10.1 Web Edition
ModelSim-Altera 6.6c (Quartus II 10.1)
>>220 > ソフトウェアでは、JAVAやC#のおかげで、やっとC++から解放されつつあるのに。
クロックを止めたロジックセルをガベコレして、新しいロジックを上書き
するとかか?(w
VHDLやVerilogが残ってるとか以前に、へら絞り職人みたいに、残存者利益に
預かる一握りを除けば、ロリ設計もとい、論理設計レベルから新規にやる
ようなデバイス開発の仕事なんて、早晩(特に日本国内では)なくなりそうに
思うんだが?
あっても、ワードやエクセルみたく、既存の機能ロジックをペタペタ貼り
付けて終わりでそ。
本来既存の設計資産を生かすとはそういうこと。海外では分業化と資産の蓄積
と再利用が進む間に、日本国内では派遣に丸投げで、毎回フルスクラッチで
スクラップ&ビルドさせていた結果、ウラシマ状態に。
>>254 >それとも「将来的にModelSimに一本化」というのが
>バージョン10で実行されたのでしょうか。
その通り。
>>256 ありがとうございます
大人しくModelSim使うことにします
俺的にはABELが一番使いやすい
理由はプリプロセッサーと回路系がきちんと分離できているからだ
なら PALASM でも使おうぜ
PALASM 懐かしス。16R8とか1個1000円とかしてた気ガス。
言語としてABELも良かったけどツールはCUPLの方が好きだったかな?
すっかり影が薄くなっちゃったけどAHDLも結構好きだったよ
ABELはSynarioになってXilinxに売られ今はもうサポート外?
PALは一発書きで高かったし熱も出たよねぇ
GALが出てMMI終了してしまったが
EPROMに論理入れてた時も有ったなぁ
PALASMとSynarioのガードキーが
会社のどこかに転がってた気がする。
使ったことないけど。
高かっただろうに、今や誰も見向きもしない…。
7セグメントLED×3をスイッチ×3(スタート、ストップ、リセット)で動作させる、という課題が出たのですが、
記述はどういう風に考えたら良いのでしょうか…?
よろしくお願いします。
ABEL語で考えろ
265 :
774ワット発電中さん:2011/01/02(日) 13:00:50 ID:ZJ2X966c
>>264 ABEL語…?
具体的にお願いします!
ステートマシンをまず作るんだ
...入門書の一冊二冊をひっくり返せば、同じ問題が回答付きで載ってるよ
課題なら自分で考えさせるのが親切というものだ。
>>266 何でソフト的な解決方法とらせようするんだよ。
勉強・課題なら、王道進ませろ。
回路図でFF組み合わせてカウンタ作成しろ。
>>268 ステートマシンも答えとして間違っちゃいないだろう。
オートマトンの考え方に基づく基本的な順序回路記述法。
>回路図でFF組み合わせてカウンタ作成しろ。
いきなりそれは無いだろ。
目的の動作を実現する為に、どういった機能ブロックが必要か考えるのが先だろ。
設計の常道としては、
>>269の方針でやるのが正しいだろうね。
たまに、無茶なスケジュールで丸投げされて、
>>268のようなやり方になる事もあるけど、
後でバグが出たりスパゲッティコードになったりする。
>>263の課題の期限に余裕があるなら、
いきなり、どういう風に記述するかを考えるのではなく、
どういう動作を実現させるかという事を考えて、
仕様書を作ってから、それに沿って記述するのが良いと思う。
plan->do->think->plan->do->think->plan->do->think->
上流の記述だと「7セグメントLED×3をスイッチ×3(スタート、ストップ、リセット)で動作させる」でOK
274 :
774ワット発電中さん:2011/01/12(水) 02:28:01 ID:yHrXUNDq
質問良いでしょうか?
メタステーブルについてです。
次のようなHDLを書いています。
module(
wire A; // 非同期の外部信号
);
always @ (.....) begin
if( reset ) begin
s <= 0;
end else begin
if( s==0 )begin
if( xxx )begin
いろいろ
s <= 1;
end
end else if( s==1 )begin
if( A == 1'b1 )begin
いろいろ
s <= 2;
end
end else if( s==2 )begin
if( xxx )begin
いろいろ(十分長い時間の処理)
s <= 3;
end
end else if( s==3 )begin
if( xxx )begin
いろいろ(十分長い時間の処理)
s <= 0;
end
end
end
end
s=1の状態の時にAを見張って、A=1になったら、
s=2に行くのを期待しているのですが、s=2とならずにs=0に戻ってしまいます。
またAの信号が、メタステーブルの状態になると、
http://www.fpga-net.jp/fpga/word/metastable.html のような波形になるようです。
なぜs=0になるのか、わかりません。
仮に、Aが上記のような波形になったとしても、S=1を抜け出れば良くて、
S=2になれば、そのメタステーブルが終了するほど処理が待っています。
なのになぜかS=0に行ってしまいます。
メタステーブルに対する私の理解が不足していると思いますが、
実際にメタステーブルになると、どうなるのでしょうか?
「何が起こってもおかしくない」ということでしょうか?
ハードウェアなんで、プログラムみたいにシーケンシャルに処理される
わけじゃないからねぇ。
この場合だと、sのためのラッチの前段で、if〜elseなんかの組み合わせ
論理によるデータ生成のための組み合わせ論理回路(非同期回路)
が形成されるんじゃねぇの?
クロックと非同期に入力されるからビットごとに制定されるまでの時間差が
できる。
'01'=>'10'
とならなくてはならないけど、ビット0側の変化が間に合って、ビット1側が
間に合わないと'00'になってしまう。
ってあたりじゃね?
「グレイコードカウンタ」でググってやると幸せになれると思うよ。
>>274 つっこみどころ満載だが、メタステーブルを避けたいのなら
A をクロックで叩けばいいだけ。2回叩けって人もいる。
>>275 ありがとうございます。言い換えると、
A==1'b1の瞬間が、
偶々always(clock)の↑のメタステーブル時間に入ってしまったとき、
ということになりそうですね。理解出来ました。ありがとうございます。
>>276 ありがとうございます。さっそくやってみました。
reg AA, AAA;
always @ (.....) begin
if( reset ) begin
s <= 0;
AA <= 0;
AAA <=0;
end else begin
AA <= A;
AAA <= AA;
:
:
if( AAA == 1'b1 )begin
いろいろ
s <= 2;
end
:
:
結果 ・直りました。ちゃんと状態が変化するようになりました。
・ありがとうございました。
>つっこみどころ満載だが、
すみません、この突っ込みどころを教えてもらえないでしょうか?
書いたHDLを評価してくれる人が、私の回りにいなくて、
「本当にこれでいいのか?」と自問自答の毎日です。
いけないところ、良くないところを、是非知りたいです。
ステートマシーンとしてはとりあえずif...else if...else if...の形ではなく
if (s==1) begin ... end; if (s==2) begin ... end;の形じゃね?
ぇ…case文使わんのかい。
>>278 ありがとうございます。
最初の評価でtrueなら、それ以降は評価しなくてもいいと思うので、
else if()にしています。
FPGAはマイコンとは違うので、特にelse if()にしなくても大丈夫でしょうか?
>>279 case文ですか。ほとんど使ったことないです。if()でできてしまいますし。
case文の方がいいでしょうか?
281 :
774ワット発電中さん:2011/01/13(木) 02:55:28 ID:OlHqa35h
横槍ですか、おしえてください。
メタステーブルの話が出ていますが、
実際にメタステーブルの状態だと、どのようなことが起こるのでしょう?
そのFFの出力が不定になるのはなんとなく理解できるのですが、
その不定とは、
・HかLのどちらになるかわからない、なのか
・HとLの他にも、中間の電圧が出たり、Hi-Zになったりするのでしょうか?
・また その時間も、1secとか継続したりするものでしょうか?
わずかな時間暴れるだけ
入力ピン付近にある非同期専用ffをつかえるか、
同期信号を仮定して設計されたffに非同期信号をつっこむかの違いが出るかもしれん
使用するプロセス/テクノロジにも依るだろうけど、参考書とかを見れば
短時間中間レベルでフラフラしたり、オシレーションを起こしたりとか
そんなところでしょ。
ただ、問題としてはセットアップ/ホールドを正しく守ってFFを使用した
場合に比べ、出力が静定するまでの時間が延びることで、運が悪ければ
後段のFFにもタイミングエラーが伝播することがあるだろうね。
そうすると今回のように時々ステートマシンが意味不明な状態になって
みたり、頻度の一定しない問題に悩まされるだろうね。
今回のは実は1つの非同期信号を複数のffでラッチしているから
バラツキがでているんじゃね?
>>281 メタステーブルが発生する状態を作って、それをカウンタのクロックに突っ込んだら面白い事が起きるよ。
非同期回路なので普通こんな記述しないだろうが、実験してみたら現象が良く理解できた。
FPGA個別で「メタステーブルの収斂時間」みたいな規定はあるんだろうか?
もし、1clock<暴れる時間 だったら、D-FFを2個直列にしても意味がないよね。
ifとcaseは意味が違うし
ステートマシンではcaseを使うべきじゃね
>>288 ifとcaseで、何が違うの?
合成されれば同じじゃないの?
ifは入力の優先順位を判断してコンパイルするけどcaseは判断しないので、
ifを使うとコンパクト且つ高速なコードを吐くけどcaseだとそうはならない。
また、ifで非同期信号を使ってはいけないけど、caseだと使える
って書いてあるのかな?
>>288-292 if と case は違うって思ってたけど、
Verilog の仕様だと case も先頭行から評価していくので
言語仕様だけで言うと if も case も同じ。
ただし合成して同じ回路ができるかどうかは処理系依存。
assign H8_bus = ( adr==xx )? Port_xx
: ( adr==ss )? Port_ss
: 16'z;
とかは、どうなるのでしょう?
マイコンのPIOとして、100段ぐらい使っているんですが。
>assign H8_bus = ( adr==xx )? Port_xx
> : ( adr==ss )? Port_ss
> : 16'z;
この場合は、16bit幅で入力が2系統のセレクタがカスケード接続で生成されるはず。
後の方に書かれている信号とH8_busの間に入るセレクタの段数が多くなるから、
100段くらい使うと、一番後ろの方の信号からH8_busまでの遅延が相当大きくなると思う。
>>293 Verilog の仕様上はそう書いてあるのに、条件がかぶってたりすると
ツールに怒られる不思議。
基本、並列処理にしてくるけど、ツールの設定で変えられたりする。
>>294 意外にも、配列を使うのが便利だったり。
wire [15:0] hoge [0:255];
assign hoge[xx]= Port_xx;
assign hoge[ss]= Port_ss;
:
assign H8_bus= hoge[adr];
お世話になります。
Verilogの書き方で質問させてください。
例えば、このようなHDLがあります。
module hoge1(
input wire clock,
input wire reset,
input SW,
output [7:0] COUNT
);
Mona U1 ( .reset(reset), .clock(clock), .SW(SW), .count(count) );
Mona U2 ( .reset(reset), .clock(clock), .SW(SW), .count(count) );
Mona U3 ( .reset(reset), .clock(clock), .SW(SW), .count(count) );
Mona U4 ( .reset(reset), .clock(clock), .SW(SW), .count(count) );
Mona U5 ( .reset(reset), .clock(clock), .SW(SW), .count(count) );
endmodule
上記の例では、入出力端子は4行で書かれています。
このくらいなら別に何ともないのですが、入出力端子が50行、100行と多い場合、
これらのI/O定義?が、ソースの先頭からずーーっと、当分続くことになります。
そしてその後で、初めて本体が登場することになります。
このようなソースは、見にくいので、なんとか短くできないものか、と考えています。
本体部分は、関数化してインスタンシェーションすれば、実体は別のファイルとなり
短くなって、top階層のHDL全体の可視性が向上します。
ところが、入出力端子は、50、100あるのに、相変わらず input reg [7:0]...とかを
100行書くことになります。これをもっと短くできないかと思うのですが、
できないでしょうか?
また、このようにtop階層の入出力定義部分は、下階層の入出力端子も全部書く必要があり
単につなぐだけなのに、1本1本記述していては、結構な労力になります。
入出力端子の記述を、ウマイ具合に、まとめられない者でしょうか?
フォーで出来る。
>>297 入力、出力をそれぞれバスにまとめるんだ!
そうすれば、ポートは2つですむ!
やっぱり、50行、100行と書かないといけない、みんなそうしてる、
ということでしょうか?
ホントに50も100も入出力が必要?モジュールの分割に問題があるような気がする。
自分ならI/Oがそんなに増えるような分割は、なにか間違えてると判断するけとな・・・
>>301 ありがとうございます。
確かにmoduleの分割により、1モジュール当たりのI/O本数は減りますね。
ただ、全モジュールを、プロジェクトのどこかで使うわけですので、
最終的にはtop階層のI/Oポートから、全線が出入りすることに
ならないでしょうか?
>>302 ごめんなさい。よく読んでなかった。topの話ね。
topでは全部の端子を書くことになるかと。
配列が可能なら配列で。
あとは、エディタのブロックをたたみ込む機能で見やすくするとか?
VHDLだと、record使って
type io_t is record
a : std_logic_vector();
b : std_logic;
end record;
entity top is
port (
idata : in io_t;
);
とかたまに。I/Oピン名に.(ドット)が付くけど。SystemVerilogではどうなんだろ?
>>303 ありがとうございます。
>エディタのブロックをたたみ込む機能で見やすくするとか?
これって、ALTERAですよね。Xilinx ISEには無い機能なんです。欲しいんですけど。
>topでは全部の端子を書くことになるかと。
やっぱり、そうですよね。
・なるべく見やすいソースを書きたい。
・でもI/O名はちゃんと信号名を書きたい。
と思うんです。
しかたないので、`includeを使っていますが、なんか残念な感じがして。
top階層だけは、回路図で書ければいいと、よく思います。
そもそも回路図が本分のハードウェアを、文字で表すのには限界があるような気がします。
エディタなんか自分の使いたいもの使えばいい。
トップなんぞIOとモジュール間の接続が主なんだから
スクリプト回せば手作業の部分は1割程度でしょ。
あとはツール買ってもいいし。
>>305 情報ありがとうございます。でもわからないことばかりです。
>スクリプト回せば手作業の部分は1割程度でしょ。
スクリプトとは何でしょうか?
>あとはツール買ってもいいし。
それはどのような名前のものでしょうか? ぜひ教えてください。
>top階層だけは、回路図で書ければいいと、よく思います
回路図で書けば?
ISE は出来なかったっけ?
回路図のCADで Verilog 読み込むとか出きるだろ。
>そもそも回路図が本分のハードウェアを、文字で表すのには限界があるような気がします
回路図で書いても最後は edif とかで吐き出すんだけどな。
そもそも、HDL は、回路の構造を書くんじゃなくて動作を書くんだよ。
>そもそも、HDL は、回路の構造を書くんじゃなくて動作を書くんだよ。
では構造は何で書くべきなの?
回路図だよ。恥ずかしいから言わせんな。
RTL記述でよろしく
下位モジュールの接続だけでできてるモジュールは、回路図(ブロック図)のほうが
構造(接続関係)が分かりやすいことは確かだね
他人の作ったHDLの構造把握するのに、RTLビューア(?)で見たりする
そうそう、「まとめてるだけモジュール」ってあるよね。
そういうのはブロック図で見てる。
Verilog-HDLで躓きましたのでご指導をお願いします。
OpenCoresにあるDESのIPコア(
http://opencores.org/project,des)を使った回路を設計しているのですが
使用している基板のFPGAがCycloneの100ピンの物でピン数的に足りないとエラーが出たのでトップモジュールを別に作りました。
しかし、シミュレーション時に64ビットが吐き出されるはずが32ビットしか出ませんでした。
ちなみにトップモジュールではクロックの分周を行うのと適当なビットを取るために1ビットを取得しています。
//// Top Level Module
module destest(mck, trg);
input mck;
output trg;
reg [2:0] regs = 3'h0;
reg xclk = 1'b0;
always @(posedge mck)
regs <= regs + 1;
always @(posedge mck)
if (regs == 3'h0) xclk <= ~xclk;
des u0( .clk(xclk), .desOut_1(trg));
endmodule
これを追加すると
Warning: Compiler packed, optimized or synthesized away node "des:u0|desOut[奇数ビット]". Ignored vector source file node.
このような注意が出て、32ビット分しか出ませんでした。
なお、トップモジュール部を外すとちゃんと64ビットを吐き出しました。
書き方的にまずい場合はどのように修正すればいいのかご説明をお願いします。
ポートが全部書かれていないから分からないけど、
ビット選択が間違ってるんだろう。
だからいらないと思って捨てられている。
いまどきトリップ解析ってのもなぁ
>>313 まず本買って勉強したほうがいいよ。
回路は逐次実行じゃなくてすべての行が並列実行される。
mckが立ち上がった時
reg [2:0] regs = 3'h0;
と
always @(posedge mck)
regs <= regs + 1;
が矛盾する。
さてregsにはどっちが入るのか。コンパイラはわかりません。
これがシミュレーションするためだけのトップモジュールならば
シミュレーション用の構文initial文も使うべし。
>>316 ちゃんとリセットしないとシミュレーション出来なくね?
たぶん学生だろうな。
♪フルスクラッチで書き上げた、そのロジックで〜 私 へ・ん・し・ん
という歌があるのですが、この場合のフルスクラッチとは、どういうことでしょうか?
メーカー提供のIPを使わずに書くということでしょうか、それとも
インスタンシエーションせずに、top改装に全部を書くということでしょうか?
IPというか、既存のコードを流用しないで、
最初から作る場合の事を指すのでは>フルスクラッチ
ありがとうございます。
既存のコードを使わない、というのは、IPはともかく、
自分が過去に作ったRS232 I/F部分があったとしても、今回は再度ゼロから書くということ
でしょうか? 過去に自分で作った物のコピー&ペーストくらいはいいような気がします。
それさえもしないで書く、という厳格さのある言葉なのでしょうか。
また、スクラッチで作るという行為自体が「俺はスゴイぞ」と自慢するようなことなのかも知りたいです。
すみません
複雑になりすぎてどうしようもなくなったソースコードの流用を止めて、
新規に分かりやすいコードで書き直すという場合の方が多いのではないかと。
>>322 そういうことですか。ありがとう。
だったら、僕は毎回フルスクラッチしてる。
ちなみに、フルスクラッチは和製英語。
正しくはフロムスクラッチ = from scratch
英米人に full scratch と言うと、引っかき傷だらけの
何かをたぶん想像されてしまうだろう。
>>324 >正しくはフロムスクラッチ = from scratch
ありがとうございます。
Google翻訳で「from scratch」で訳したら「ゼロから」と出ました。
また「ゼロからの開発」を訳すと「Development from scratch」と出ます。
これで納得です。以降、フルスクラッチで・・・と言う人がいたら、教えてあげたいです。
どうもありがとうございます。
でも、なんでscratch(ひっかき傷)がゼロなのでしょう。
フルスクラッチビルドを変なふうに略した結果なんじゃないかな?
327 :
774ワット発電中さん:2011/01/28(金) 02:01:11 ID:oiiG+FLu
Full Scratch Buildですか?
1から始めるのと、ゼロから始めるのと、どっちが始めからなのか?
昔はインド以外は1から始めるだったんだろう
へ〜〜〜 そうだったのか。
ゼロの概念は画期的だよな
そうそう
どんなモノでも贋作つくれるなんて画期的だよな
>>329 HDL書きなら、当然ゼロからだろう。
8ビットの信号は wire [7:0] a であって、wire [8:1] a じゃないだろうw
335 :
774ワット発電中さん:2011/01/29(土) 02:51:14 ID:+QdsWzAe
ちなみに、
wire [15:8] UE;
wire [ 7:0] SHITA;
という宣言をしたとき、
UE[15]という指定はだめで、UE[7]なら良いのですよね?
>>335 verilog 初心者本を1冊ぐらい読んだほうがいいぞ。
Verilogの本って、探してみると結構無いですよね。
Verilogの文法書(コマンドリファレンス)みたいなのがあれば買いたいんですが。
Verilog2001の本が欲しい。
ステートマシンの説明が数ページで終わってしまうようなのは嫌。
340 :
774ワット発電中さん:2011/01/31(月) 21:19:50 ID:POO5T2os
チップスコープで、教えてください。
インサーターで、トリガやクロックピンや観測したい信号を割り付けるとき、
左側のペイン(枠)の中の信号名を選んで「Make...」のボタンを押すことで決定しますが、
この左側のペインに表示される信号線には、表示が明るいものと暗いものがあります。
どちらも、選択して「Make....」で線が追加できます。
しかしシンセサイズすると、暗い方の信号名の場合は、エラーになってしまいます。
エラーの内容は「その信号線はダメです」みたいなエラー内容です。(だったら始めに言ってくれよという感じですが)
ここで質問ですが、
1. チップスコープ インサーターの段階で、左側のペインに表示される信号で、明るい表示とくらい表示は、何を表しているのでしょうか?
2. チップスコープは、どんな信号でも引っかけられるのではないのでしょうか?
3. 引っかけられる信号と、引っかけられない信号は、どのように見分ければ良いのでしょうか?
よろしくお願いします。
341 :
774ワット発電中さん:2011/02/01(火) 00:46:26 ID:BFPXDo6z
やってみてダメだったら「そっか、これはダメなんだ」
と覚えることにしてる。
みんなチップスコープ使ってるんだね。
きちんとシミュレーションかけたほうが効率いいと思うけど。
デバッグに必要な信号なら外に出しとけばいいだけだし・・・
いまいち使い道が分からんです。
>>342 いや基本使いたくない
でも内部バスなんかで見たい
時とか有るじゃん
シミュレーションで動くけど、実機で動かない。
ってときにしか使わないな。
チップスコープやシグナルタップは。
デュアルポートRAMのIPで、A側は書き込みだけ、B側だけは読み込みだけという時、
DualPort U1 (
.clkA(xxx), .wea(xxx), .wra(xxx), .adra(xxx), .dina(xxx), .douta(),
.clkB(xxx), .web(xxx), .wrb(xxx), .adrb(xxx), .dinb(), .doutb(xxx),
);
と書きます。コンパイルはちゃんと通りますし、動作もするのですが、
「doutaが無いぞ」と「dinbが無いぞ」とのWarningが300個とか400個とか出ます。
これをWarinigが出ないようにするには、どのような記述をすればよいのでしょうか?
入力は dinb(o) とか書くといいのかな、と思いますが、出力のdouta()には
何を書けばいいのかわかりません。
A側のoutとB側のinは
出力のほうは適当なネットをつないだら Warning 減らない?
wire [15:0] dummy_douta;
.douta(dummy_douta),
.dinb(0),
そうするとdummyの先がどこにもつながっていない、とWARNINGが出るので、
ワーニングの個数は同じじゃないの?
>>345 .douta() で、特にWarning とかは出ないみたいだけど
(QuatusIIとISE で試した)
xilinx の chipscopeで、
wireの信号を観測するには、どのようにしたらよいでしょうか。
clockが掴めないので困っています。
chipscopeは、wireには接続できない。
だから、空いている出力ピンをdummyにして、
wire → reg → 出力ピンと接続して、regの出力を引っかける。
chipscopeは、たまに変な値を示すことない?
ないよ。
予想と違う値が出た時には回路に問題がある。
チップスコープインサーターで、信号を登録するとき、
自分の付けた名前の信号が選択できません。
チップスコープに薄く表示されているので、認識しているみたいなのですが、
選択してもエラーになります。これで正しいのでしょうか?
また、ロジックアナライザを起動して、JTAGで接続が成功すると、
前回のトリガー設定や波形ウインドウが出ます。
これを出さないようにする設定はあるでしょうか?
(回路を変更した後の起動なので、前回と同じ設定を表示したくないんです。
似たような表示が出ていると、知らずにそれで観測してしまいます。
どうせ「右クリック、cofigration」とやって新規に読み込ませる訳ですし
はじめから無しでててと思うんです)
チップスコープ自身のプリファレンスというか、初期設定が見つけられません。
どこにありますでしょうか。
あと、トリガー8本、観測信号50本とか設定して 観測しているときに、
「この信号で観測したい」と思っても、トリガーのグループに登録してない信号は
トリガーにできません。トリガー=観測信号にできないのでしょうか?
毎回、インサーターに戻って登録し直して、またコンパイルって、結構面倒です。
ここで聞くより、
別の会議室のほうが
早くレスポンスが付くと思うよ。
・信号名の表示が勝手に変わらなければ、
・インサーターで信号選択するときに、信号の位置移動に
「UP UP UP・・・・」とか「DOWN DOWN DOWN・・・・」とか
20回も50回もやらなくても良いようになれば、
・ロジックアナライザで、bus表示で値が表示されているのに、印刷すると値が表示されるようになれば、
チップスコープは使いやすいと思うよ。
VHDLで非同期な二つの信号(CLK1、CLK2とでもします)によって値が増えるカウンタを作りたいのですが、
二つの信号がほぼ同時に入力されてもちゃんと値が二つ増えるようにするにはどうしたら良いでしょう?
process (CLK1,CLK2) begin
CLK <= CLK1 and CLK2
end process;
process (CLK) begin
if CLK'event CLK='1' then
(以下略)
というのを考えましたが、二つの入力が重なると一回しか動作しませんので
process( CLK1, CLK2 )
variable Incr : integer;
begin
if CLK1'event CLK1 = '1' then
end process;
途中で送信してもたスマン。
process( CLK1, CLK2 )
variable Incr : integer;
begin
Incr := 0;
if CLK1'event CLK1 = '1' then
Incr := Incr + 1;
end if;
if CLK2'event CLK2 = '1' then
Incr := Incr + 1;
end if;
Cnt <= Cnt + Incr;
end process;
てのはどうだろうか?
本気(マジ)なの?
別々にカウンタ作って、後で加算すればいいだろ
>>358 言語記述じゃなくて、ちょっと回路図書いてみなよ。
CLK1、CLK2の最小パルス幅の1/2以下の周期のクロックでカウントしろよ。
>>363 正解。
>>360 正解
module(
input wire CLK0,
input wire CLK1,
input wire CLK2,
output [15:0] Q
);
reg [1:0] shift1, shift2;
always @ ( CLK1 )begin
shift1 <= { shift1[0], CLK1 };
shift2 <= { shift2[0], CLK2 };
if( shift1 == 2'b01 ){ CLK1 += 1; }
if( shift2 == 2'b01 ){ CLK2 += 1; }
end
assign Q <= CLK1 + CLK2;
endmodule
メタステーブル回避のためのコードが
always @ ( CLK1 )begin
shift1 <= { shift1[0], CLK1 };
..
end
だけではまずい理由を別のスレで尋ねたのに、いまだ何のレスもないんだぜ...。
それ以前にカウンターとクロック信号がごちゃ混ぜに。
>>366 if ( shift1[1] == 1'b1 )
・・ 色々
っていう形で使うなら、定石的な2段FFで受ける形で問題ない
if ( shift1[1:0] == 2'b01 )
・・ 色々
という形でエッジ検出すると、(クロックが速い場合)
メタな状態の可能性のある1段目の値を使うから注意が必要
例えば、
if ( shift1[1:0] == 2'b01 )
count <= count + 1;
みたいなのは一見不都合なさそうだけど、
count の各のFFのEnableに不安定な信号が入ってしまい
セットアップタイム違反を起こして誤動作する
>>369 お〜、勉強になります。ありがとう。
ということは、shiftを3bitにして
always @ ( CLK0 )begin
shift1 <= { shift1[2:1], CLK1 };
shift2 <= { shift2[2:1], CLK2 };
if( shift1 == 3'b011 ){ CLK1 += 1; }
if( shift2 == 3'b011 ){ CLK2 += 1; }
でどうですかね。
ていうか、+=1 に誰も突っ込みを入れてくれない
ジョークだというのがちゃんと理解されてるんでしょw
周波数が高いときは、360案がいいと思うけど
違うクロックで動いてるカウント値を加算するのに一工夫必要になるな
reg [2:0] shift1, shift2;
//
always @ ( posedge CLK0 )begin
shift1 <= { shift1[1:0], CLK1 };
shift2 <= { shift2[1:0], CLK2 };
end
wire pedge1, pedge2;
//
assign pedge1 = ( shift1[2:1] == 2'b01 );
assign pedge2 = ( shift2[2:1] == 2'b01 );
reg [15:0] count;
//
always @ ( posedge CLK0, reset ) begin
if (reset) begin
count <= 0;
end else begin
case ({pedge1, pedge2})
2'b01: count <= count + 1;
2'b10: count <= count + 1;
2'b11: count <= count + 2;
default: ;
endcase
end
end
//
assign Q = count;
ところで、その // は何を表現しようとしている?
>>371 なーるほど、Verilogは見やすいな。
どこかにある文字数の多い言語とは違うなぁ。
>>373 型チェックとか厳しく無いからな
便利だけど読み難いソースになる
事も有る
それは言えてるね。
型チェックをもっと厳しくして欲しいな。
だけど無駄に文字タイプの多い言語はやりたくない。
<= xxx => なんで両方に←→が出てるん?
型チェックは特に記述したときだけする
っていう仕様にしてほしいな。
>>375 > 型チェックをもっと厳しくして欲しいな。
Lint使えば?
> <= xxx => なんで両方に←→が出てるん?
代入と不等号を < と = で表そうとした結果だな。
verilog で唯一惜しいのが、ほとんどCなのに
複分をくくる{}を begin end にしちゃったところ
連接の記号なんて、他の何かで何とでもできただろうに・・
あと、case_item の中に文の並びが書けないのも不便
これも、複文記号が{}なら、そんなにわずらわしくないのに
ぶらさがりif文問題を回避するためじゃない?
分からんけど
それより、中途半端に signed とか対応したから
ミスりやすい。(ってか、ツールのバグも多い)
型変換とかもCと違うのがややこしいし。
>ぶらさがりif文
{〜} を begin〜end で書くという話とは関係ないと思うけど、下の
1.の記述が、2.の意味なのか3.なのか分からんというような
話のことでは?
1.if()
if()
文
else
文
2.if(){
if()
文
else
文
}
3.if(){
if ()
文
}else{
文
}
確か、Cでは2.と解釈されるはず・・ありゃ?3.だったかな・・^^;
ってなるんで、結局 { } をつけなさいよ、ってことになるから
verilog だと end else begin みたいなウザったらしいこと書かないと
いけなくなるんだよなあ
オレは、{〜} を begin〜end にしちゃったせいで if文に関しては
VHDLの if 〜 then 〜 elsif 〜 endif のほうが使いやすいと思う
言ってもしょうがないけど・・
end if とかキモい。
c言語の中に突然現れたVBAって感じ?
確かにendifとか変だと思う。
みんなendだけでいいのに。
Cのように}なら、もっといい。
VBAって、使いたくないね。
それまでの言語とは一線を画すビックリ言語。
記述に関して すごく窮屈で書きにくい。驚いた。
オレの言いたかったのは、本来簡潔な記述が身上のC系の言語で
{ } を begin end にしたばっかりに、「劇的に」簡潔さが
失われちゃったってこと
【verilog】
if (count == 10) begin
・・・
end else if (count == 5) begin
・・・
end else begin
・・・
end
【VHDL】
if (count = 10 ) then
・・・
elsif (count = 5) then
・・・
else
・・・
endif
>>369 これ、ソフトの感覚で考えると、何でこれがいかんの?ってなるね
shift1[0]が不安定だとしても、結局はこの if文の条件が成立するか
どうかじゃねえ?
あるタイミングで成立しなくても次のクロックのときは成立するはずだから
別に問題ない。count が増えるのが1クロック遅れるだけだ。
・・・ていうような論法に言い負かされてしまいそう。
>>387 激しく同意。
{ → begin 5倍のタイプ量
} → ebd 3倍のタイプ量
なぜなんだ。
こう決めたヤツ、ちょっとこっち来い。
} → ebd 30倍の文法エラーメッセージ
なぜなんだぜ!
可読性は言語によらないと思う。
ライトオンリーと言われるPerlで書いても読みやすく書く人もいるし、
Pascalで書いても何じゃこりゃ、ってソース書く人もいる。
上の話は、可読性というより記述性の話なんじゃ?
C, verilog では、{ }, begin end は、if文の一部ではなくて複文の記号だから、
if とか else の後に単文がくるときは本来は不要だけど
単文の場合でも必ずくくるスタイルをとってる人が多いみたいだ。
これも一つには可読性の向上のためだと思うけど、それを記述性をほとんど犠牲
にせずにできてた { } の代わりに begin end にしちゃったのがけしからん、
っていう話だと思う。(誰も{ }に文句言ってたやつはいないと思うのに・・)
ちなみに、最近のC(++)のif文の記述スタイルは
if(・・)
{
・・
}
else
{
・・
}
のようなのが主流になってるようだけど、verilog では
>>387 みたいな
昔風の K&R 流のが多いようだ。
これも、begin end にしちゃったために、↓のような記述をすると
可読性をかえって悪くするからのような気がする。
if(・・)
begin
・・
end
else
begin
・・
end
elseはifの否定である。
>>387 > 簡潔な記述が身上のC系
ていうのは知らないな。
begin end が良かったとは思わないけど。
Cの2代前の先祖の BCPL が begin end の代わりに { } を使った最初の言語らしい。
verilog の文法がCを元にしてるのは明らかだと思うんだけど、何で { } だけは
Cを踏襲せずに先祖がえり(あるいは Ada/Pascal 教に改宗)しちゃったのか、理由を聞いてみたい気がする。
(意外に、ビット連接で { } を使っちゃったから・・というだけの理由かも)
ISO646って知ってる?
世界中どこでもUS-ASCIIを使ってるわけではないんだよ。
[\]^`{|}~
この9文字は各国で異なる文字に割当てられてるのに
Cの言語仕様は独善的にUS文字セットを前提にしている。
日本は幸運にも\と~以外はUS互換なんで影響少ないけど
[]とか{}が括弧に割当てられてない文字セットだと最悪だ。
だからTRIGRAPHなんて不細工な発明がされたとも言える。
>>397 >[\]^`{|}~
>この9文字は各国で異なる文字に割当てられてるのに
それホント?
バックスラッシュ\ はともかく。ホントに?
{}とか[]が非対照なキャラクターに割り当ててある文字セットは大笑いだな。
日本の\もちょっと笑える。
ほんとだぁ。ありがとう。
知らなかったよ。すごいねぇ〜。ヨーロッパ系統だと、{}や[]は全滅だね。
今でもそうなんだろうか? ヨーロッパのPCのキーボードが見てみたいな。
少なくとも{},[]よりかはウムラウトの方が頻度は高いわな。
しょうがねぇ、フランス言って見てくるか。(^^)
今からセントレア行ってくる。
ウムラウトは、ドイツ語だぞっと。
フランスに渡米して来い。
トルコ語なんてIの小文字がiじゃないからなあ
トルコなんてIがなくて即Hだからなあ まで読んだ
ワロタw
406 :
トルコ青年:2011/02/23(水) 02:22:01.70 ID:qwzxgcEi
抗議スル!
新聞に投書シル!!
フランス人やスペイン人は最初のHは声を出さないらしいよ。
>>407 あたしはフランスに生まれないでよかった・・・orz
相手も初めてだったせいか不思議には思われなかったみたいだけど、
そうとう大きいらしい(///)
>>393 のスタイルは、理屈で考えると変だと思うんだよね
if (<式>)
a <= b;
else
a <= c;
っていうスタイルには、恐らく誰も異論ないと思うんだけど
この a <= b; とか a <= c; の部分がブロックに置き換わるんだから
素直に考えると↓のようになるはず
if (<式>)
begin
a <= b;
d <= b;
end
else
begin
a <= c;
d <= c;
end
このスタイルは、C(++) では、たまに見かけるけど
verilog ではなぜか見たことないな
>>409 フリップフロップ毎にalways文で記述する方が、
バグの予防に効果的なのでは?
そう言われていた時代がありました・・・
>>410 フリップフロップ毎に記述するから、always の中に
ブロック(複文)は使わないっていう意味?
413 :
410:2011/03/01(火) 00:38:37.12 ID:+awILjEQ
>>412 >>409の例だと、一つのalwaysブロックに、
aとdという二つのフリップフロップが記述されているので、
後でメンテナンスとか改造をするときに、
修正漏れが起き易い様な印象がある。
例えば
always @(posedge CLK or negedge RESET) begin
if(式)
begin
a <= b;
end
else
begin
a <= c;
end
end
always @(posedge CLK or negedge RESET) begin
if(式)
begin
d <= b;
end
else
begin
d <= c;
end
end
の方が、aとdが別々のF/Fだとすぐ分かるし、
条件式もいじりやすいと思う。
414 :
409:2011/03/01(火) 01:43:41.16 ID:CfG9VC68
私が書いたのは、begin 〜 end ブロックを
どういうふうにインデントするかってことだったんですけどね
確かに順序回路の always 中では、1個(あるいは1組)の
FFしか操作しない、っていうのを徹底すると、begin 〜 end とか
使う必要なくなるから
>>393 とか
>>409 みたいな話は無用になるかも・・
>>413 片方修正して、もう一方を修正し忘れる可能性も大きくなるんだけどな
んだ。
VHDLのif文やwhen文で代入式のように
(1=>'0',others=>'0')みたいな構文は使えないんでしょうか?
代わりになる構文はありませんか?
XilinxのISEを使いFPGAに実装しているのですが、
Synthesizeに非常に時間がかかります
さして最適化する必要はないので、なるべく合成を早くするにはどのようなオプションを指定すればいいのでしょうか
とりあえずEquivalent Register Removalは切っています
ISEは、そういうものです。
I・S・E!!I・S・E!!
ISE〜の、名〜物〜、赤福餅はえじゃないか。
このスレはほのぼのとしていてイイね。
ISEの話が出たところで、教えて欲しいことがあります。
新規プロジェクトを作るときの操作についてです。
例えば、前回「hoge_Ver1.v」というVerilogソースを作成しました。
そうすると、mcsファイルも自動的に「hoge_Ver1.mcs」となり、バージョン情報が付くので
都合が良いからです。
それで、今回改造をすることになり、ソースを改造して「hoge_Ver2.mcs」を生成したいです。
すると、そのためにはVerilogファイルを「hoge_Ver2.v」にする必要があると思います。
このような場合、具体的にISEの操作として、どのようにすればよいのでしょうか?
1. Add existing sourceを使用
File, NewProject, Add existing Source, 「hoge_Ver1.v」(旧ファイル)を指定 とやると、
hoge_Ver2にはならず、再びjoge_Ver1ができてしまいます。
ならば、ということで今回作成したprojectフォルダに行って、手動でhoge_Ver2.vにリネームすると、
ファイルが無いと文句言われますし、仮に出来たとしても、プロジェクト内にVer1というゴミが出来て
しまい、イヤです。
2. 手動でリネーム
別途、仮フォルダーにVer1をコピー、Ver2にリネームした上で、
新規プロジェクトで、それを指定するのもありですが、CoreGenで作成したものは、
どれとどれをコピーしてくればいいかわかりません。特にブラックボックスで組み込むIPがある場合、
どのようにすれば良いのか、わかりません。
このように、ISEのプロジェクト作成時のファイル操作について、書かれた物は、何かあるでしょうか?
ご存じの方があれば、教えてください。
各プロセスのヘルプ読めばどっかに書いてあったと思うけど
ISEの出力ファイル名はソースファイル名からじゃなくてトップエンティティ
(トップモジュール)の名前がつけられるはず
教えてください。
Verilogで、RS232Cの送信部分を作っています。
16bitの数値を、10進数の文字にして、Terminalに送りたいのですが、
この場合、10で割っていく必要があると思います。
reg [15:0] data16;
reg [7:0] tx_data8;
reg [15:0] temp16;
tx_data <= data16 / 10000;
送信して
temp <= data16 - tx_data * 10000;
tx_data <= temp16 / 1000;
送信して
temp <= data16 - tx_data * 1000; という感じです。
でも、2の階乗の割り算でないとダメだ(できない?)と聞いています。
このような場合は、どのような手法をとるべきでしょうか?
16進なら、ニブルを取り出して配列から引いてくる方法が考えられるのですが。
1クロックでやりたいならテーブル引きしかないだろ
複数クロックで処理するならいくらでもやりようがある
割算は面倒だから加算累積してみてはどうかな?
1. 5桁の2進化十進数の加算器をつくる
2. bit0=00001, bit1=00002 .... bit14=16768, bit15=32768と
16個のテーブルだけ作る
3. 変換対象の各bitについて 16回 加算器に足しこんでいく
(もちろんbitが立ってない場合は0を足す)
これなら20bit×16組の小さいテーブル用いて16クロックで計算可能。
>>427 まじめにやると結構めんどくさいよね。
10000 と 10 のとき、
"10000" "10" にするか
"10000" " 10" にするか
"10000" "00010" にするかとか。
もう、"0x2710" "0x000A" でいいんじゃね?
FPGA評価ボードにはLCD文字表示器が載っているけど、
エンコーダ→数値up/down→LCDに10進数で表示とか、
どうやってやっているんだろうか。
結局割り算をしないと表示できないですよね。
ひんと:BCD
>>432 数値は単純に+1 or -1のアップダウンなんですか?
BCDでカウントすれば表示は簡単だと思いますよ。
かぶった・・・ora
なるほど、なるほど。こんな感じですかね。
reg [3:0] digit [0:3];
always @ ( ){
if(エンコーダup){
if(digit[0]==9){ digit[0]=0; } else { digit[0]++; }
if(digit[0]==0){ digit[1]++; }
if(digit[1]==0){ digit[1]++; }
if(digit[3]==0){ digit[1]++; }
}
if(エンコーダdown){
if(digit[0]==0){ digit[0]=9; } else { digit[0]--; }
if((digit[0]==9)&&(digit[1]==0)){ digit[1]=9; }
if((digit[1]==9)&&(digit[2]==0)){ digit[2]=9; }
if((digit[2]==9)&&(digit[3]==0)){ digit[3]=9; }
}
}
Verilogで、モジュールをインスタンシエートして下層に組み込む場合、
最下層モジュールに必要な信号は、途中の階層も全部通って、top階層まで来て、
やっとI/Oと接続できると思います。
しかし、この方法では、各階層のカッコの中に書く信号の数が、とても多くってしまいます。
一番下の階層のために、途中階層では関係ない信号まで通過させなければなりません。
たとえば、最下層の信号を下から上まで布線して、topからピンに出してオシロで観察し、
終わったら、また信号を記述を消去。とても面倒です。
そこで、C言語のグローバル関数のように、clockとかresetなど、
topで宣言すれば下層まで響く、そんな記述方法は無いのでしょうか?
×そこで、C言語のグローバル関数のように、
○そこで、C言語のグローバル変数のように、
チップスコープの出番
>>437 > 最下層モジュールに必要な信号は、途中の階層も全部通って、top階層まで
っていう設計手法が良くないと思うが。
デバッグせずにいきなり下層モジュールとして使っているのか?
”ピンに出してオシロで観察”
って、普通にみんなやってるの?
>>441 どうしようもない時だけ。ただし、大体ロジアナ。
基本的にSimで追いかける。
FPGAならSignalTapかChipScope使えよ。
デジタル回路できる人カッコイイ。
たまにでいいので、Identifyも思い出してあげてください。
446 :
YUI様:2011/04/11(月) 18:42:44.31 ID:J86qGUXX
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
YUIです
ワンタッチBBSをYAHOOで検索してください
サーチのボタンをクリックしてください
リンクの板名をクリックしてください
コンピュータの画像掲示板で板名を検索してください
FPGA CMOSの解説尽き回路図の基礎が出てきます
誰でも簡単に回路図は書けます
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
********************************************
447 :
YUI様:2011/04/11(月) 19:34:15.16 ID:J86qGUXX
このうざいマルチいろんなとこで見かけるんだけどなに
じきにあぼんされるか、規制されていなくなるでしょ。
少なくとも半年以上は電電板に居座ってるぞ。
今までは自分でスレ立てて隔離されていたから規制されなかったのかな?
階層構造時にエラーが出て困っています
FPGAの勉強しており、Verilogを使い開発にはXilinxの10.1を使っています。(ボードが10.1までしか対応していないようです)
現在は拙いプログラムですが、正常に動作しており
1ファイルしかないので、階層構造化したところエラーが発生しました。
内容は
ERROR:HDLCompliers:247 -"ファイル名.v" line 引数使用しているところ全て Reference to vector wire "変数名" is not a legal reg or variable ivalue
ERROR:HDLCompliers:106 -"ファイル名.v" line 引数使用しているところ全て Iligal left hand side of nonbloking assigument
と表示されます。
調べてみたところ、wireを使用しているのに、Always文を使ってはいけないといったことが書かれていたのですが
http://japan.xilinx.com/support/answers/18363.htm regを使っているのにこのエラーが出てきます。
mainプログラムから、下位moduleへ引数を渡し、下位moduleでinputしてキャッチしたのですが、それ全てが駄目なようです。
input側に input[7:0] 変数名や、input 変数名と試してみても変わらず
引数が多すぎるのかと思い、減らしてもやはり駄目でした。
原因としては何が考えられるでしょうか?
http://japan.xilinx.com/support/answers/18363.htm 一応アップローダーに、vファイルとそれをtxtにコピペしたのをアップしました・・・
http://www1.axfc.net/uploader/Sc/so/226418.zip 親module :project
下位module:CLK_Timing、LED_Lighting
です。
もう少し細分化したいのですが、簡単な分割ですらエラーが出てしまいorz
2重でサポートページ張ってしまった、申し訳ない
書き忘れです。何のプログラムかというと
1秒毎7seqの値が+1されていく、カウンターです。(2進数でLEDが光っていく)
最終的にはスイッチ使ったりして、時計やストップウォッチ動作にしたい予定です・・・
SEQ_POINT を定義する階層が違う
じゃなかった、代入してないだろ
SGのビット幅も違うし・・・
こんなに早くレスが来るとは
SEQ_POINTの階層が違うとは・・・
イメージだと
上位module projectで定義して、それを下位moduleのCLK_Timingへ送り
CLK_Timingでデータを取得し、それを上位moduleでLED_Lightingへ送って
動作させるってイメージなのですが・・・
Cで言えば、関数で処理して戻ってきたデータを別の関数で処理するといった
行動をしているつもりなのですが、全然違ったでしょうか?
SGはLED_Lightingの、case文の4bitと3bitの奴でしょうか?
プログラムの流れですが・・・
上位module(LED/ファイル名project)で、階層で使うデータを宣言して
それを各下位moduleで動作させるといった感じです。
上位moduleでやることはダイナミック制御のassign文だけです(絶縁処理)
最初にCLK_Timingへ、データを送り
CLK_Timingで1秒分の分周をさせ、1秒経過したら秒数を+1ずつカウントしていきます。
ここで現在の7Seqの位置を変更するダイナミック制御も行ってます。
LED_Lightingで、現在の秒数を調べ、それに対応する7Seqの数字とLEDを点灯させる
という流れです…。
SEQ_POINT は、誰が出すの?
CLK_Timing でカウントするなら、CLK_Timing 内で
reg 宣言しなきゃダメだし、CLK_Timing からは outputになるはず。
Cで言えば、引数と戻り値があるように、入力と出力は分けないとダメ。
リセットの処理もないけど、これだとミュレーションもできないよ。
>>457 レスありです。
つまりmodule LEDで宣言するときは
<<LED>>
reg[1:0] SEQ_POINTになり下位moduleに渡すときは
<<CLK_Timing>>
inout[1:0] SEQ_POINT
reg[1:0] SEQ_POINT
って書くということでしょうか?
引数がそのまま変わる、参照渡し見たいになるのかなと…
後誰が出すというのはどういうことでしょうか?
加算方法に関しては、CLK_Timingの最後に
SEQ_POINT <= SEQ_POINT + 2'b1;を書いています。
試しに書いてコンパイルしてみましたが
regがある場合はinputとどっちなの的なエラーがやはり出ました。
inout/outputでも変わらず…
そんなもんどうでもいからソース出せやグズ
>>458 inout なんてめったに使わないよ。
モジュールごとにコンパイルしてみれば?
>>466 エラーメッセー時を理解してるか?
>Reference to scalar wire 'SG' is not a legal reg or variable lvalue
SG を定義してないからだろ。
reg [3:0] SG; って書けよ。
>Illegal left hand side of nonblocking assignment
これはクロック同期じゃないのにノンブロッキング使ってるからだろ。
組み合わせ回路に <= を使うなってこと。
>こちらも駄目で、テスト用にこちらはサイズ指定はしてないです。
全部指定しろ。
何で“テスト用だとしなくていい”って理解になるんだ?
>>467 reg[7:0] SG;(reg[3:0] SGでも)と書くと
>>459に書いたとおりエラーが出ます。
内容としては
ERROR:HDLCompilers:27 - "LED_Lighting.v" line 9 Illegal redeclaration of 'SG'
多分上位moduleにあるのに、再度regしているから発生するエラーだと思っています。
ノンブロッキング文に関しても = に変更した場合
ERROR:HDLCompilers:247 - "LED_Lighting.v" line 15 Reference to scalar wire 'SG' is not a legal reg or variable lvalue
ERROR:HDLCompilers:44 - "LED_Lighting.v" line 15 Illegal left hand side of blocking assignment
と出てやはり、エラーが発生します。
テスト用だとしなくていい、ではなくて
このエラーの原因が不明なので、、moduleが違うため原因を探るために、2種類のパターンで探っているだけです。
どちらもサイズ指定しても、しなくても変わらないためです。
日にちがズレてIDが変わっていました
ID:vah6YxA9 = ID:QTDLFlg7
です。
>>467 付け加えますとSGは上位moduleで定義しています。
一部ソースを抜きますと
module LED (LED,CLK,SCAN,SG);
output [7:0] SG;
reg [7:0] SG;
LED_Lighting LED_Light(SEQ_POINT, S1, S2 ,S3 ,S4 ,SG, LED);
と、moduleを呼び出しています。
引数が多いので、最終的には削れるようなプログラムに変更したいと考えてるのですが、
引数に制限があるのでしょうか?
LED_Lightingの方にも、サイズ指定を追加しました。
always内の
reg にたいしての代入は<=の方がいいのではないでしょうか?
wireに対してはassignですので、=だとは思いますが…
良く分からない点の1つとしてregを渡しているはずなのに
このエラーが出るのが全く分からない次第でして…
追記
function文は使っていないので、割愛しまして
testモジュールに、S1,S2,を渡しまして、always文を書かずに
input [2:0] S2;
assign S2 = 3'b001;
と、書いたところエラーが発生せず、正常に動作しました。
上位moduleから下位moduleに渡したらregが強制的にwireになるのですか?
regのまま受け渡すことはできないのですかね…
>多分上位moduleにあるのに、再度regしているから発生するエラーだと思っています。
違う。
単体でコンパイルしてるんだろ。(してないなら、LED_Lighting.v だけでやれ)
上位モジュールは関係ない。
SG は output なんだから、上位で reg 宣言したら信号がぶつかる。
>ERROR:HDLCompilers:27 - "LED_Lighting.v" line 9 Illegal redeclaration of 'SG'
output SG; (1ビット)
なのに
reg [3:0] SG; (4ビット)
って書いてるから、ビット幅が違う信号を再定義してるって怒られてるんだよ。
これ以上はスレの無駄だからオレはレスしない。
>>473 Error27に関しては、打ちミスだったみたいです。申し訳ない
とり合えず、対応全ての上位moduleにあったregを下位moduleに設置し、単体コンパイルを行うと
ERROR:HDLCompilers:120 - "LED_Lighting.v" line 14 Illegal redeclaration of input 'S1' as a reg
と表示される。
これが表示される場所が、inputのため、信号をoutputへと変更
その場合コンパイルは通る。
上位module自体も単体コンパイルし、全てのCheckSyntaxが通ったので全体コンパイルの
Synthesize-XSTをかけるとコンパイルエラーが発生する
ERROR:HDLCompilers:246 - "project.v" line 23 Reference to vector reg 'SEQ_POINT' is not a legal net lvalue
ERROR:HDLCompilers:102 - "project.v" line 23 Connection to output port 'SEQ_POINT' must be a net lvalue
SGのoutputで、信号がブツかるということなので、上位moduleのregを削除したところコンパイルが通り出力は出来たのですが、
今度は正常に作動しない
分からん…
>>474 とりあえずモジュール単位で完結させてから階層接続しようよ。
CLK_Timingで出力、つまり戻り値が存在しないってのはどう考えてもおかしいだろ。
CLK_Timing.v:
input [1:0] SEQ_POINT;
↓
output [1:0] SEQ_POINT;
reg [1:0] SEQ_POINT;
project.v:
reg [1:0] SEQ_POINT;
↓
wire [1:0] SEQ_POINT;
>>475 thx,すごくこんがらがってたんですが、
このverilogの変数宣言って、Cでいうグローバル変数みたいな感じなんですね。
渡す側と渡される側が両方とも同じ変数名もってないと、なにそれ?状態になると思って
両方に色々書いてたりしたんですが・・・
ってことでプログラムを見なおして
http://codepad.org/0AmTjcDi http://codepad.org/bN0rB8Nj http://codepad.org/kxEDtmrq http://iup.2ch-library.com/i/i0290188-1303533517.png というふうに改良し、エラーはなくなったのですが
今度は正常に動作しません。
ワーニングを見てみるとシグナルエラーといった形
WARNING:Xst:638 - in unit LED_Lighting Conflict on KEEP property on signal Mtridata_SSG<0> and Mtridata_SSG<1> Mtridata_SSG<1> signal will be lost.
INFO:Xst:2261 - The FF/Latch <Mtridata_SSG_2> in Unit <LED_Lighting> is equivalent to the following 3 FFs/Latches, which will be removed : <Mtridata_SSG_3> <Mtridata_SSG_4> <Mtridata_SSG_7>
WARNING:Xst:638 - in unit LED_Lighting Conflict on KEEP property on signal Mtridata_SSG<2> and Mtridata_SSG<3> Mtridata_SSG<3> signal will be lost.
が表示されるのですが、output LEDとSGの書き方がまずいのですかね?
いまいちLEDとSGのoutputの書き方がわからず・・・
上位でoutputと書かないとダメみたいですし(module()の中にあるので
でも下位からデータを受けないといけないですし…
一応SSGとLLEDは一旦保管して、それをLEDとSGに渡すといった感じに分けてみたのですが
直接入れてる場合と変わらず‥
>>476 まだこんがらがってる。これで動くほうがおかしい。
言語で書いているとはいえハードなんだよ。同時入力は出来ない。
信号ごとにalwaysを分けてみると同時入力になってるのがはっきり分かる。
CLK_SEC、CLK_ONの同時入力は、まぁ何とか動くだろうけど勝手に直した。
ttp://loda.jp/mcnc/?id=173.txt >Cでいうグローバル変数みたい
そりゃあなたの理解が足りないだけ。信号名は変えられる。
でないと同じモジュールを並べて使うことが出来ないじゃない。
すべてのレジスタは同時に動いているのだよ
俺たちはコンカレントさ。
>>477-478 thx
えーと、全てのレジスタは同時に動いてるから、1つの処理に複数まとめて書くのが良くない
ということでしょうか?
流れ作業としても、別作業に関してはCLK毎に分割すると…
一応それも踏まえてLED_Lightingも7SEQとLEDに関しても分割してみました。
それと、エラーのこと調べていたら何か付けて置いたほうが良さそうなdefineもあったので追加
main LED:
http://codepad.org/2GQ5Wa2w CLK_Timing:
http://codepad.org/SI19PnCH LED_Lighting:
http://codepad.org/0E8Zgz20 ですが、エラーが・・・orz
http://codepad.org/gSypRfAV とり合えず、現状Xilinxのアンサーページとか見てエラーを解決しようとしている最中です。全く分からないけどorz
FPGAのCLKを使用するのでinput CLK
後はLEDと7SEQ、ダイナミックドライブするためにoutputを上位モジュールで書かないといけないと思うのですが
この場合、LEDとSG(7SEQ)を下位モジュールで使うときはどうすればいいのでしょうか?
S1〜S4やSEQ_POINTの場合は、態々メインで書かなくても良いので
下位で、作成しデータを入れ、outputで上位モジュールへ受け渡せばいいですが
上位で作ったやつを下位でデータ入れて、上位で出力する場合には…?
LED.とSGは上位でwire宣言し、下位モジュールと接続?
下位は出力したいので、output
一次保存用の(いるのかな?)regを宣言し、
そのregに取り敢えず保管
regに入ったデータを上位から持ってきたLEDとSGにassignして入れる。
ってやってるんですけど、そもそもS4に関してはよくわらからない_0,_1_2のワーニングが出てるし、
一次保存用に置いておいたSSGとLLEDにもワーニング出てるし、そもそもシグナルがロストしてるとか言われてるしorz
難しい…
>>480 まず回路図を書いて、それをHDLで記述することをお勧めする。
まさか回路図が書けないってことはないよね?
>>482 全く書けないぜ…抵抗とかが何とか分かる位なんだが
FPGA初めて1ヶ月位の状態
取り敢えず、FPGAの回路図みて、使うポートを見つけてそれをセットする位なら出来るんだが…
一応週1で講師から教えてもらってるんだが、取り敢えず”弄ってみろ、やればやるほど分かる”とか
聞くより、やる量だって話になってプログラミングしてるんだ。
で、今回のこの件を質問しても講師すら分からないんだぜ…
取り敢えず落ち着いてやってみて、とかinputされてるよなぁ、なんでだろう的なことしかなくて
ラチがあかない…
回路図作成用にCADLUSサーキットをインストールしたんだけど
起動しかしていないな…
>>483 LED_Lightingと、mainでそれを呼び出すところで、
カッコ内の信号の順番が違うみたい。
FPGAの、1つの出力ピンの、H/L(3.3V/0V)を保持(記憶)するフリップフロップ(reg)は、
FPGAの中で、唯一1つだけ。
練習で作ったモジュールを、下位モジュールとして呼び出すとき(使い回すとき)、
すでにその下位モジュールには、出力を決定するフリップフロップ(reg)が内蔵されているので、
それを呼び出すmainとかでは、wireで受けないといけない。
それを呼び出すmainとかで、その信号を別の下位モジュールにつなぎたいとき、
mainの中に接続用の信号線が無いといけない(宣言されてないといけない)。
前述の理由で、それはwireで宣言することになる。
このことは、基板上で2つのICを接続するのと良く似ている。
まず2つのICのVDDとVSSを電源とGNDに接続するでしょ。
次に、IC1の1pinと、IC2の3pinを接続したいとすると、電線でつなぐじゃない。
その電線がVerilogで言うところの、wire宣言になる。
次にIC間をつなぐ順番についても同様で、
IC1 (1 2 3 4 5)
IC2 (6 3 1 9 5)
上記の例は、IC1-1をIC2-6pinに、IC1-2をIC2-3pinに・・・・と、つなぐ例。
ここで大事なのは、カッコ内に登場する順番。
>講師から教えてもらってるんだが、取り敢えず”弄ってみろ、やればやるほど分かる”とか
自分の勉強不足は悪くない、講師の教え方がいけない、とでも言いたいみたいだな。
甘えていてはダメだ。俺なんて、会社に俺一人。聞ける人、教えてくれる人は誰もいない状態で
本を読んで、失敗して、繰り返して、徹夜して、苦しんで覚えた。
質は別としても、聞ける講師がいるだけマシだと思え。
>>484 thx
wire電線でつなぐってイメージは何となくわかりました。
main→CLK→main→LEDって流れで行く時に
CLKで作った、S1~S4 SEQ_POINTのデータをLEDまで配線してやってなかった(mainにwireがなかった)
これを付けてやれば、取り敢えずダイナミックドライブは作動して、ワーニングも大幅に消えた
後は646が発生してS1とS3に問題があるっぽいから、その信号関連かもです。
ググリにいってきます今原因探し中…
講師に関しては一応書いておかないと講師にきけって感じになりそうなので
言い訳しちゃいました、申し訳ない。
この程度が教えられない講師なのか
それとも自分で考えて分かるようになるまで待ってるのか
失礼main部分だけ更新されてなかった・・・ LED_LighitngのSEQ_POINT渡しと wire宣言の順番等変えました。それでは・・
>>487 それはよかったね。
Verilogは、ICをつなぐことをイメージすると、理解しやすい。(私がそうだった)
wire regの問題は、私も当分填っていたからね。
記憶ものの信号出力は、reg=FFで記憶され、それがFPGA内で唯一1個しかないことに気付いた。
そうしたら、インスタンシエートした時のエラーが激減した。嬉しかったよ。
あと、インスタンシェートするときのカッコの中身は、Cでいう引数と思って問題ない。
ただ、Cでは順番で対応するけど、FPGAではICのピン名で対応させることもできる。
間違いが無いという点で、こちらの方が優れている。
PIC IC1 ( .CLK(clock), .WR(en_a), RD(en_b), LED_out() )とかって書く。
この文章の読み方は、
・IC1 には、PICというICを使用し、
・PIC階層の"CLK"ピンに、この階層の"clock"を接続して、
・PIC階層の"WR"ピンに、この階層の"en_a"を接続して、
・PIC階層の"RD"ピンに、この階層の"en_b"を接続する、
・PIC階層の"LED_out"ピンは、何もつながない(=使わない)
と読む。
欠点=下位階層PICの信号名も書く必要があり面倒くさい。
長所=カッコ内の記述順番は関係ないので、間違いが少ない。
あと、ポイントは、面倒くさくてもwireとregをハッキリ書くと良い。
module PIC (
input wire CLK,
input wire WR,
input wire RD,
outut reg [6;0] LED_out
);
>>489 成程、まだインスタンシェートがどんなもものか分かっていないので
ぐぐって調べてみます。
ただ見た目はクラスっていうか構造体見たいな見た目ですね
wire/reg気をつけます。
有難う御座います
Verilogは2001があるけど、VHDLも最新版は何? VHDL2011とか、あるのかな
1987、1993が一般的だけど2002、2008もあるらしい。
違いは知らん。
>>492 ありがとう。やっぱりあるんだね。
例えばその機能を使おうとした時って、
われわれの手ではどうしようもなくて、
XilinxのISEが対応してくれるのを待つしかない、
という考え方で合っていますか?
Synplifyとか precision synthesis 使ってみれば?
なるほど、そういう手がありましたか。
名前は良く聞くけど、値段はどのくらいするものでしょうか?
5万とか10万くらい?
もちろんUSドルだよね > 5万とか10万くらい
VHDLシミュレーションの質問です.
quartusU9..1でwaveformを用いて回路の中間値を確認したいのです.
waveform上で信号を選択し表示させStartSimulationをするのですが,何度表示する信号を変更しようと毎回同じ信号(入力,出力,クロック)しか表示されません.
中間値を確認するにはどうすれば良いのでしょうか.
もう一つ質問です.
quartusでのシミュレーションが出来なかったためmodelsimを用いてシミュレーションを行いたいのです.
quartusではコンパイルが出来のですが,modelsimでは「Cannot find expanded name」とエラーが表示され,コンパイルが出来ません.
このエラーはなぜ表示されるのでしょうか.
質問ばかりでもうしわけありません.
どなたがわかる方がおられれば教えていただけると幸いです.
自己解決しました.
原因はwaveformのファイル名が正しくないことでした.
お騒がせしてすみませんでした.
>>500 読みにくいコードだし、やってることが変だな。
origin=7281 のときは、carry で divider=7281 になって
あとはカウントアップ。divider=16383 になると carry が立って
7281 に戻る。
一回りに 9103 クロックかかるから、6MHz で動いているとすると
659.12Hz。これで sp が反転するから sp は、329.56Hz だ。
音程だと“ミ”だね。
余談だけど、ブザーが圧電素子だと、2KHz くらいないと音が小さいよ。
>>501 ありがとうございます、Hzの出し方そうだすんですね…
(6M / Origin) / 2 = 周波数
このプログラムを自分なりにアレンジして分かりやすくするよう頑張ります
有難う御座いました。
clockの作り方がいまいち分かりません。
http://www.csun.co.jp/SHOP/2010103101.html こちらの開発ボードを使っているのですが、サンプルソース部分に
always @ ( posedge clk or negedge rst_n)
if (!rst_n )
clk_cnt <= 24'd0;
else
clk_cnt <= clk_cnt + 1'b1;
wire clk_6mhz = (clk_cnt[2]||(clk_cnt[1]&&clk_cnt[0])); //(clk_cnt[2]&&clk_cnt[1]);
wire clk_4hz = (clk_cnt[22]&&clk_cnt[23]);
と書かれています。
....... 128 64 32 16 8 4 2 1
のうち、2と1の部分をANDし、4をORすることで、どうして6MHzが作成されるのでしょうか?
同様に、4Hzの作り方もどうして、それで作れるのかが分かりません…
verilog clockの作り方等でググリましたがピンとくるものがなく、分かりやすいサイトとかあったら
一緒に教えて欲しいです。
>>503 そのボードの販売店に聞くのが一番早くて丁寧だと思うよ。
>どうして6MHzが作成されるのでしょうか?
どこまで考えて、どの部分が分からなかったのでしょうか。
全く考えずに「教えてクレクレ君」ということはないですよね。
>>503 ・元のクロック周波数はいくつでしょう。
・真理値表を書いてみましょう。
正直まともな設計者ならそんな作り方しないと思う。
サンプルソースは営業マン or 新入社員が書いたに違いないw
シミュレーションしてみれば。
mHzと書いてあるのが違和感。
wire宣言が最後に書いてあるのが違和感。
beginとendを書かないので、<=の次の行で=が出てきて驚いた。
if()のbegin endが無いのはわかるけど、
always ()のendは、無しでもいいの?
509 :
503:2011/05/18(水) 10:13:20.59 ID:fGYwStdj
Clock : 50MHz
FPGA内部はDLLがあって、50MHzのクロックをニーズに応じて必要なクロックを分類できる。
特殊なクロックは50MHzで生成出来ない場合はユーザーOptionをご利用ください。
と書いているので50MHzです。
60MHz= 1/60
途中で押してしまった(´・ω・`)
50MHz = 50M回/1s
6MHz = 6M回/1s
処理の差を考えると
50Mhzの動作を8.333(ry回繰り返せば6MHz1回分と同じ処理能力に落ちると思うのですが
その辺の計算も今一
取り敢えず、4Hzの作り方は
50.000.000 / 4 = 12.500.000なので
always @(posedge clk)
begin
if(!rst)
cnt <= 0;
else cnt <= cnt + 1;
end
always @(posedge clk)
begin
if(cnt == 12500000)
clk_4hz = 1;
end
Tab→Enterの罠…
always @(posedge clk_4hz)
begin
ほにゃらら
end
見たいな書き方に直せば動くと思うのですが
wire clk_6mhz = (clk_cnt[2]||(clk_cnt[1]&&clk_cnt[0])); //(clk_cnt[2]&&clk_cnt[1]);
wire clk_4hz = (clk_cnt[22]&&clk_cnt[23]);
↑の書き方がイミフなのです。
ただこのやり方の場合、先ほどの6Mhzの8.333333333333333333333333333
だと割り切れないのでズレが生じてくるのですが…
あれ、でもこれだと分周になってませんよね…
ちょっと考え直します、スレ消費ごめんなさい
いややっぱり、分周になってますよね。すみません
サンプルソースとってこれない...
#define `center 6250000
#define `period 12500000
always @(posedge clk or negedge rst) begin
if(rst==1'b0) begin
cnt <= 0;
else
if(cnt >= `period) begin
cnt <= 0;
end else if(cnt == 0) begin
clk_4hz = 1'b1;
cnt <= cnt + 1;
end else if(cnt == `center) begin
clk_4hz = 1'b0;
cnt <= cnt + 1;
end
end
end
>>516 確かに今落とそうとするとロード始まりませんね…
>>517 これはclk_4hzはregですよね。
periodで、posして、 _|
centerにくるまで_| ̄上がった状態になって
centerにきたら下がる_| ̄|_って感じに
基本的にcenterの値は半分で問題ないのでしょうか?
これに当てはめると、6MHzを作る場合は
period 8
center 4
ただこの場合だと、0.3333ずつ誤差がでていくので、3回目ごとにperiod + 1の判定を作ったほうがいいのでしょうか?
>>518 ごめん、clk_4hzは、regにしないといけないね。
>基本的にcenterの値は半分で問題ないのでしょうか?
この4hzの信号を使う回路が、↑エッジ動くならcenterは、適当な値でいい。
50MHzのclockから、6MHzできません。割り切れないからです。
48MHzのclockに変更が吉。
それか、DCMで(50MHz×3)/25すれば、1発でできる。
>ただこの場合だと、0.3333ずつ誤差がでていくので、3回目ごとにperiod + 1の判定を作ったほうが
平均値で6MHzでいいの? そんな適当な6MHzでいいのなら、それでいいんじゃない?
>>519 いえ、正確な値が良いです。
50MHzを48MHzに変更できるのですか?
マニュアル見たところ、
>>509のとおりユーザーオプションをご利用くださいと書いていますので、
こちらを使用するのだとは思いますが
xxx.ucfに
NET "clk_48MHz" LOC = "p77";
を追加した後はどうしたらよいのでしょうか?(48MHzセット)
NET "CLK_48MHz" LOC = "p77" 48000000;
こんな感じで問題ないんでしょうか?
DCMを調べてみたら何やら難しい模様…
ttp://d.hatena.ne.jp/ippei-r/20080706/1215272062
あ、追加するところ的な意味は、でです。
それとも、ucfではなくてソース内で設定するのでしょうか?
常識的に考えて48MHzのオシレータを自分で実装(半田)しろってことだと思うが
>>523 50Mhzでそのソース(だけ)だと
clk_6mhz6.25MHz、デューティ62.5%、clk_4hzは約5.9Hz、デューティ25%になる。
コピペしたところ以外に関連箇所がありそうだけど、サンプルソース見れないのでそれ以上分からん。
この辺りにうpしてくれると何か分かると思う。
ttp://loda.jp/mcnc/ いずれにせよ、既に回答があるようにDCM使わないと50MHzからジャスト6MHzは作れないんだけどね。
てか、サンプルソースで使ってないジャストの周波数が何で必要になるの?
>>523 >oh...つまりDCMを使うしかないってことですね
なんで?
>>522の言うとおり、水晶発振器を取り替えるということだよ。
水晶発振器を取り替えるとということは、ハードウェアを触るという意味で、
Verilogソフトをやucfファイルを触るわけではない。
一般的な評価ボードだと、水晶発振器は、2つ載せられるようになっているけど
1つしか載っていなくて、あと1つは空き屋になっている。なので自分で通販とかで
希望する水晶発振器を購入して、自分の手で差し込んで、使うということ。
それで、発振器No.2を使うのかNo1を使うのかを切り替えるには、
xxx.ucfファイルの中の1行を書換えて、再度コンパイルして、FPGAに焼き込む。
ucfファイル中の「clkは○○ピンの足につながっているよ」みたいな記述行を、
コピーして、1つコメントアウトしておいて、生きている行のピン番号の値に、
No2の発振器の出力がつながっているピンに変更してセーブ。
>出来ればサンプルものっていると尚嬉しいのですが
DCMは、今のキミにはちょっと難しいかもしれん。だいたいの手順イメージを書いておくね。
1. ISE上から、CoreGen(コアジェネレータ、略してコアジェン)という別アプリを立ち上げる。
2. CoreGenの設定で「'docomo'という名前で、50MHz入力、6MHz出力のICが欲しいじゃんね」と名古屋弁でセット、コンパイル。
「50MHz→6MHz変換IC」が出来上がる。ICとは言ってもソフトなのでVerilogソースが1つ生成されるということね。
3. もともとのtopソースに戻って、
docomo IC1 ( .入力(clk50MHz), .出力(clk6MHz) );
という1行追加する。C言語で言う関数みたいな感じね。
カッコで引数を渡して結果もカッコ内で受け取る。
(このように、「よそにあるIC」を呼び出すように書くことを「インスタンシェートする」と言う。
意味は「組み込む」とほぼ同義)
4. そのICの出力を、何食わぬ顔をして今までのclockとして使ってソースを仕上げる。
5. あとは今まで通り、コンパイルして、FPGAに書き込んで、はい出来上がり。
6. 少し考えると分かると思うけど、4Hzのほうも同様に「softbankという名前で、4Hzを出すICが欲しいぎゃ」として作り、
softbank IC2 ( .入力(clk50MHz), .出力(clk4Hz) );
とできる。これがたまらなく便利なんだ。
おっと、仕事が始まった
>>525 ふむふむ、今月少々余裕がないので
出来ればソフトウェア面で終わらせたいかなと
詳しい説明有難う御座います。CoreGenですか・・・
ググってみます。
使えるようになれば、CPU性能上限としていろいろなのが作れて便利そうですね。
>>524 成程、今出先のためアップ出来ないです申し訳ない。
サンプルが6MHzで作動させてたので、出来ればジャストがいいかな?と思ったのですが
5MHzなら割り切れるので、5MHz作ってあとは微調整すればいいんじゃ、とふと思いました。
取り敢えず5MHzで調整して思いますorz
長々と有難う御座いました。
どもです、取り敢えず5MHzを作成することにして
実機に転送したのですが、音がなりませぬ…
後はimplemente programming fileにて、Warningが1つ出ます。
WARNING:Route:455 - CLK Net:CLK_inst/CLK_5MHz<0> may have excessive skew because
内容としては、CLK以外の場所でCLKとして使ってるというものらしいのですが
確かに5MHzと4Hzを作成してるので、出るのは仕方がないと思うのですが消せるのでしょうか?
取り敢えず、Xilinx ise13.1のシミュレータ(isim)を起動してテストしたのですが
5MHzと4Hzが上がりっぱなしで0になっていませんでした。(20nsゴトに~clock&rstを2000ms)
main:
http://codepad.org/ISxOLChN clk:
http://codepad.org/fBfGjjhk song:
http://codepad.org/8kkDFSll UCF:NETで、 CLK:p76 / RST:p152 / SP:p15
になります。
CLKのpos/neg判定もdefine変更しても変わらず
5MHzの場合、10回カウントしたらpos、5回目でnegといった判定にしてます。
原因として考えられる部分はCLK部分しかないと思うのですが
個人的には、判定式が間違ってるとは思えず、どこが問題あるのでしょうか?
VSのように、デバッグモードで1つずつずらせていければ良いのですが…
ちなみにサンプルの方はこちらになります
main:
http://codepad.org/JuBfVq5v song:
http://codepad.org/BWlxzxpc
ちゃんとコードを書けよ
分周器の動作が、最初と真ん中と最後しか記述されて無いだろ。
>>529 つまり、
//最初から、中央まで1
if(0 >= center -1) begin
CLK_5MHz <= 1'b1;
clk_sec2;
end
//中央から、最後まで0
if(center >= Period_5MHz) begin
CLK_5MHz <= 1'b0;
clk_sec2;
end
という記述が必要ということですか?
regはデータを保存し続けるので、そのままでも
1 _____ _____________
0 |____________| |_________
center period center
こういった動作してくれるのかなと
訂正 clk_sec2 <= clk_sec2 + 1;
あ、おもいっきりif文が間違ってますねorz
if(clk_sec2 >= 0 && clk_sec2 <= center-1)
と
if(clk_sec2 >= center && clk_sec2 <= `Period_5MHz)
でした
なんであんなif文作ったんだ…
おお、出来ました ノд`)
begin
//分周した場合
if(clk_sec2 >= `Period_5MHz)
clk_sec2 <= 0; //最初から
//初期_pos 1
else if(clk_sec2 == 0) //最初の場合
begin
CLK_5MHz <= 1'b1; //クロックをpos
clk_sec2 <= clk_sec2 + 1; //時間を進める
//0 ~ Center_5MHz pos 1
end else if(clk_sec2 >= 0 && clk_sec2 < `Center_5MHz)
begin
CLK_5MHz <= 1'b1;
clk_sec2 <= clk_sec2 + 1;
//Center neg 0
end else if(clk_sec2 == `Center_5MHz) //半分までカウントした場合
begin
CLK_5MHz <= 1'b0; //クロックをneg
clk_sec2 <= clk_sec2 + 1; //時間を進める
//Center ~ Period_5MHz neg 0
end else if(clk_sec2 > `Center_5MHz && clk_sec2 < `Period_5MHz)
begin
CLK_5MHz <= 1'b0;
clk_sec2 <= clk_sec2 + 1;
end
end
ただこのままだと、冗長なので(Centerだけの部分とPeriodだけの部分)
この二つをif文含める用にして、短くしたいと思います。
regで保存していても、毎回動作をしてあげないと駄目なんですね…
有難う御座いました。
>>534 リンク先は何なのか不明。
>>533 ちなみに、regは記憶するので、変化点だけ if()すればよいです。
clockを++するところは、各範囲にそれぞれ書くのは格好悪いので、
else if()で条件を跳ねまくって、最後に else { clock++; }とすれば
いいんでないかな。
(この文章の説明はC表記だけど、Verilogでちゃんと書いてね。)
コツは、reg変数に、同時に2箇所以上で代入が起こらないようにすること。
if(){
clock++;
} else if() {
clock++;
} else if() {
clock++;
} else if() {
clock++;
} else if() {
clock++;
} else {
clock++;
}
は、合格だけど、
if() {
clock++;
}
if() {
clock++;
}
というのは、喧嘩するかも知れないので、エラーになる。
>>533>>534 人それぞれだろうけど、複雑に記述しててバグ誘発しそう。
こんな感じならすっきりしない?(まとめるのではなく分けてみた)
always @(posedge CLK or negedge RST)begin
if(!RST)
clk_sec2 <= 0;
else begin
if(clk_sec2 == (`Period_5MHz-1))
clk_sec2 <= 0;
else
clk_sec2 <= clk_sec2 + 1;
end
end
end
always @(posedge CLK or negedge RST)begin
if(!RST)
CLK_5MHz <= 1'b0; //初期化
else begin
if(clk_sec2 >= (`Center_5MHz-1))
CLK_5MHz <= 1'b1;
else
CLK_5MHz <= 1'b0;
end
end
end
あと、シミュレーションはしっかりと。
パッと見、5MHzの周期が11クロック分になっているのではないかと。。。
最近の論理合成ツールってコンパレーターをカウンタ出力にマップするまで自動で論理圧縮するの?
分周程度にコンパレーターはもったいない気がするけどどうなん?
>>537 こういうやり方ですか?
always @() begin
if( counter < 16'bいくつか )begin
counter <= counter + 1;
end else begin
counter <= 0;
end
end
clock = counter[15];
>>536 有難う御座います。
確かに、そちらのほうがif文を簡略化出来て楽そうです。
個人的には、if(clk_sec2 < (`Center_5MHz)と、最初から1の方が好みなのですが、
同期ウンヌンの問題で、後からposの方が宜しいのでしょうか?
シミュレータのクロック部分ですが、修正(好み版)テストしてみたところ
CLK_50MHz 開始20ns、20ns刻み
CLK_5MHz 開始20ns、200ns刻み
となっております。
ただ、5MHzがnegする部分が _| ̄| ←ここ
↓220ns
5MHz
20ns| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|________
50MHz
20ns| ̄|_| ̄|_| ̄|_| ̄|_| ̄|_| ̄|_| ̄
1 2 3 4 5 1 2
になりましたので、問題なくなったと思います。
>>537 たかだが数ビットだから論理圧縮うんぬんは関係なくね?
1ゲート1ゲート削ってるの?
>>540 なるべくそうしてんな遅延減るから早い回路になるし
一時停止ってどうやればいいのかな?
スイッチを一回押せば停止、もう一回押せば再開って感じのやつ。
一応、今考えてるのは、
何か変数(例えばa)を用意してスイッチを押すと'0'を代入
↓
while a='0' loop でa='0'の間ループ
↓
もう一度スイッチを押すとaに'1'を代入
↓
条件から外れて再開
っていう考え方でやってたんだけど全然できなくて。
他にもwait onとか考えてみたけどどうしても動かない(;w;)
分かる方ご教授お願いします。
>>542 やっつけ。
process(rst_l,clk)begin
if(rst_l='0')then
sw_lat <= '0';
elsif(clk'event and clk='1')then
if(sw='1')then
sw_lat <= not sw_lat;
end if;
end if;
end process;
process(rst_l,clk)begin
if(rst_l='0')then
count <= (others=>'0);
elsif(clk'event and clk='1')then
if(sw_lat='1')then
if(count>=x"1234")then
count <= (others=>'0');
else
count <= count +1;
end if;
end if;
end if;
end process;
Verilog歴1ヶ月の僕が考えた
module hoge (
input wire clock,
input wire reset,
input wire SW_in,
output reg OUT
);
reg SW_mem1;
reg [ 3:0 ] SW_mem2;
reg [ 2:0 ] state;
always @ ( posedge reset or posedge clock ) begin
if( reset == 1'b1 ) begin
OUT <= 1'b0;
SW_mem1 <= 1'b0;
SW_mem 2<= 4'b0;
state <= 1'b0;
end else begin
SW_mem1 <= SW_in;
SW_mem2 <= { SW_mem2[2:0], SW_mem1 };
if( state == 0 ) begin
if( SW_mem2 == 4'b1111 ) begin OUT <= ~OUT; state <= 1; end
end else if( state == 1 ) begin
if( SW_mem2 == 4'b0000 ) begin state <= 0; end
end
end
end
>>542 まず使ってる言語から教えてくれ。
どうも考え方がHDLっぽくない。
>スイッチを一回押せば停止、もう一回押せば再開って感じのやつ。
eorでいいだろ。
オルタネートスイッチでいいだろ・・・
ってのはおいといても、チャタリングを考慮しろよ
チャタリングって、チャタリングフィルタのために、
遅いクロックを生成しませんか? 何かFFがもったいない感じが市内でもない。
ではどうすれば市外があると感じるんだ?
郊外しないからこっそり教えれ
もったいなければ外部でチャタリング除去回路を組めばいいよ。
CR のLPF とヒステリシス・バッファ(7414なんか) で簡単にできるし。
タイマー回すほうがもっと簡単
>>551 タイマーってマイコンの?
FPGAやPLDならカウンタだよな。
わざわざチャタ取りのためにマイコン外付けとか有り得ない。
誰にとって簡単なんだか…
FPGA ならマイコン内蔵できるだろ
ブザー回路をカウンタで作ってチャタ取り用にマイコン内蔵かw
余計にあり得んわ!
HDLって何でC言語とかより人気ないのかなぁ?
どういう意味?
どういう意味?
どういう意味?
基本的にHDL人口が少ないからじゃない?
マイコン職人は、身近に売るほどいるけど、FPGA職人は、5%以下。
同じソフト屋なのに、こんなに違いがあるんだ。
少ない分、市場での価値は相対的に高くなるかな?
それなりにできりゃぁ、食いっぱぐれることない?
>>560 HDLで何が出来るか次第だな。
受託で低速なグルーロジックぐらいしかしてない、
とかなら、付加価値がないと厳しいだろう。
それに人口が少ないのはそもそも需要がソフトより少ないからでもある。
そうだと思う。
でも悲しいかな、半田付けもしたことがないHDL屋が蔓延している。
シュミレータ通してメールで納品らしい。PCだけで商売になるほど、世の中甘くない。
蔓延ってことは商売がなりたってるって意味?
それ理想じゃね?w
問題も多々発生している。次からは依頼しない。
>>562 実際のところ、よっぽどの零細企業でなければ、
半田付けは評価屋や実装屋の仕事になっている。
まあ、評価基板の手直しで半田付けをすることもあるけどね。
半田付けとかヤダー。
デジタル回路だけやってたーい。
そういえば、スイッチ付近に馬鹿でかいローパスフィルタつけりゃ
チャタリング除去用のFFあんまいらんのかね?
で、受けるIOはヒス付で
でもチャタ除去用のHDL作ったほうが、おまけで長押し作れていいんでは
それにしてもFFがもったいないよ〜、という話ね。
50MHz clockで、2ms×3回連続とかやるとき、
50MHz=0.02us, 2ms=2000us, 2000/0.02=1000×100=10万
log10万/log2=13.28771238bit→14個のFF
ザイリンクスのDLページ開けない
HDL屋さんになるにはどうすればいいですか?
まず服を脱ぎます
靴下は何時脱ぐの?
裸に靴下ですねわかります
HDLだけ屋さんはもうお腹いっぱい。
FPGAの中身だけでなくて回路設計とか実機デバッグ、
試験用のソフト作成まで面倒見れる人がほしい。
何でもかんでも全部丸投げ出来る下請けが欲しいってことですか?
FPGA設計、回路設計、実機デバッグ、評価くらいは自分で出来てる。
ソフトも簡単なものなら自分で出来るし、他人のコードを追跡するくらいなら出来る。
ただ一人でやるのは限界あるので、自分がもう一人いたらなぁ…と。
そのもう一人の自分もきっとこう思う
自分がもう一人いたらなぁ…と。
>>578 ぜひ僕を雇ってください。お茶くみでも電話番でもなんでもやります。
>>580 彼が所望しているのは彼と同じ事の出来る人です
お茶くみではありません
どこの企業でも大切なのは教育なのよね。後で気づくけど。
ほっとくとボディーブローのように効いてくる。
特に人口の少ないこの世界はOJTOJT言ってるけどそれでいいんかねぇ。
最後までのノウハウな仕事なんだろうか。
FPGAを使った開発は、ツールの使い方を覚えるのが1つの壁になっている。
バージョンが変わると、操作性がまるで変わってしまう。
一方、ハードウェアは、いつの世も普遍的なものなら覚え解甲斐がある。
言いたいことが、わからなくなってきた。(爆)
FPGAやマイコンソフトができなくてもいいや。
・回路図渡せば、ユニバーサル基板の配線ができて、
・間違いに気付いたら「これおかしくないですか?」と指摘してくれて、
・電流経路やインピーダンスを考えた部品レイアウトや配線ができる
それだけでいい。
CAD 使えよ。
DRC もしてくれるぞ。
インピーダンスとか考えるのヤダーw
な温室(FPGA)育ちですw
587 :
名無しさん:2011/06/01(水) 19:53:04.55 ID:+VwmQLga
考えるけどコントロール出来て無くてもいいですか
インピーダンスコントロールは結構大変だわな。
何よりまず基板代が跳ね上がる。
いまさらだけど
FPGAってPLLあったのねー!
インピーダンスの考えをある程度減らすのにファンナウトというものが・・・
関係ないか。
>>542の子は宿題ちゃんとできたのだろか。
インピーダンス整合を気にするってことは
クロックラインとか高速シリアルI/Oとかなんだろ?
DDR2メモリって等長配線が常識だけど実は適当でも動くんだな
倍も長さ違う配線あるのに140MHzで動いてやんのw
つかこんなレベルのがプロとして仕事してるのが信じられないorz
等長配線にしたいのならそう指示しない限りやってくれないよ。
パターン幅とかスルー・ホールの数とかインピーダンスもしかり。
・・つうか検図しなかったの?
DDR2等長配線しないって・・・
自分みたいな素人でも心配するところだよw
確認取ろうとすらしなかったのかなぁ??
メモリのトレーニングがうまくいってるってことじゃないか。
半分だけ喜んでいいと思うよw
まぁ距離にもよるんじゃない?
例えば3cmと6cmの違いだったら100psの遅延差になるよね。
制御線アドレス線なんかだとシングルエッジ動作だから十分余裕ある。
データ線だったらキャリブレーションするだろうから「誤差の範囲内」で動いてくれるかな。
考えた結果であればマシだけど、まったく考慮してなかったらちょっと怖いかも。
基板アートワーク屋さんって、等長配線とかインピーダンスコントロールとかになると、
急に態度が変わりませんか?
「いつもウチでやっている幅と間隔でやるから。へんな指示するんじゃないぞ」って感じ。
でも結局は、実装屋さんとかにイプシロンとかの値を聞いて、CADの計算のまま。
>>596 うちんとこがよく依頼するところは別に態度は変わらないな。
うちは直系の子会社にお願いしてるけど、
当たり前のように等長配線やインピーダンスコントロールしてた。
新入社員のとき、「そんなことまで気にせにゃならんのかー!」って驚いたw
担当の人に
「お願いしてる基板とPCのマザーボードだったらどっちが難しいですか?」
って聞いたら、
「PCのマザボは積層数や配線数が少ないし、基本的にはガイドに沿って作るだけだから余裕」
って言ってた。
Xilinx
エラー
現在、ウェブ サイトに問題が発生しているためリクエストを実行することができません。
しばらくして再度お試しくださ
ってなに
600 :
774ワット発電中さん:2011/06/06(月) 13:24:16.78 ID:586SEZy4
そろそろ梅雨だねぇ
DDR2等長配線無視と言えば、現物見てないけど、なひたふのRX62評価
ボードがそうだったような。
しかも途中でVIAを打ってて、あんな配線でも動くのかと、別の意味で
「感動した」。(w
未踏JTAGの人だよね!?
さすがに大丈夫という確信があってやったのでは・・・w
>>601 PCなんってソケット2回(CPU,メモリソケット)通過して高速動作しているんだから
viaなんてたいしたことないじゃないか。
等長配線も距離が短ければあんまり気にしなくても良いような気がする。
PCのメモリモジュールはVIAだらけ
つ インピーダンスコントロール
Xilinx主催の6/28のセミナー、行く人いますか?
僕はトラックCに出席する予定です。
僕の目印は、Tシャツ、スラックス、メガネ、リュック、iPhone持ってます。
しかもデブでハゲだろ・・・みんな一緒だよ!!
胸に赤いバラつけなきゃわからん
ここはTシャツに蝶ネクタイで。
このテのセミナーは、いかにもってヤツと、
何で?ってくらいリア充っぽいイケメンなヤツとに極端に分かれる。
オレのことかーーー!
EDIFをVerilogに変換する方法を教えて下さい。
>>612 EDIFをVerilog表記に変換できないことはないけど
あくまでもネットリスト。RTL形式にはならないよ。
614 :
612:2011/06/12(日) 16:28:57.71 ID:lUbWA3Dh
>>613 レスありがとうございます。
はい、ネットリスト形式で構いません。
EDIF(ネットリスト)→Verilog(ネットリスト)変換をやりたいです。
まずフリーなツールを探しています。
次に、有償ツールでもよいのでどのような物があるのか知りたいです。
よろしくお願いします。
普通は、design compiler だろ。
ってか、他に思い付かないんだが。
ケーデンスの何かあるかも。
何のためにそんなことがしたいの?
Freeのソフト作って、UPしてもいいけど。
617 :
612:2011/06/19(日) 02:46:15.99 ID:fgBVhCsQ
>>616 お申し出ありがとうございます。
勉強のためにVerilog論理合成をフリーでやりたいのですが
ズバリなフリーツールが見つけきれなかったため
icarus verilog -tfpga でEDIFで出力して
それをVerilogに変換したいと思っています。
最適化はできなくて良いです。
誰か system verilog のスゴさを語ってくれ!
>>606ですが、
人気無いのでしょうか、まだ募集のメールが来ますよ。
僕は、Tシャツ、Gパン、トレッキングシューズ、リュック、メガネ、NYの帽子してます。
デブですが、禿ではありません。iPhoneとLets Note持って行きます。
胸に赤いバラは、目立つのでやりません。
>僕は、Tシャツ、Gパン、トレッキングシューズ、リュック、メガネ、NYの帽子してます。
Coooooool!!
623 :
549:2011/06/26(日) 20:12:42.75 ID:s1Tye4Xw
>>622頭良さそうとは言われるが、頭良いって言われたコト無い
やるおと学ぶverilog入門なんてのがあるのね。
>>1あたりのテンプレに入れたらどうだろうか?
やるおシリーズは楽しくてイイなw
VHDL編も作ってもらいたいものだ。
ソフトみたいなシーケンシャルな動きのつもりで書いちゃって戸惑うやるおキボンw
うわ!誰かいたんだ!!
そんなのはおいといて
1章だけ見たけどずいぶんコアな・・・
ただ、これくらい知らないと思う回路かけないよね。
さて、おうちに帰ろう・・・今日も疲れた
>>626 みたけど、わかっている人が、初心者頃だった頃を忘れていて、
魔女宅のEDでキキがジジと会話できてない事態に陥っている気がする。
てすと
テストする前に、試験仕様書をお願いします。
じゃあ、説明するから清書しておいて。
まずはテスターのレンジを20Vにあわせて黒のプローブを左手に、赤のプローブを右手に…(略
赤のプローブが尿道で、黒のプローブが肛門ですか?
わからないから、ちゃんと書いておいてよ!!!
肛門には角電池ですねわかります
おまいらがやる夫に見えてきたw
それやったらパンダが死んだんだよな。
>>625 はじめて扱ったHDLがVerilogで、
C言語風の文法なので、社内研修で初めて回路を設計したときには
シーケンシャルな動作を期待して、記述してしまいました。
636 :
774ワット発電中さん:2011/07/10(日) 18:17:23.02 ID:6p/LqeGd
おれも初めてHDL読んだとき、プログラムのようなエントリポイントがどこなのか探したわ。
どこから始まるのよって。
テストベンチ書く場合はプログラムだけど、基本的にHDLは書くんじゃなく作るっていう感覚がないと駄目だと思った。
ソフトウェアプログラムだとやっぱり書くって感覚なんよね。
最初はネットリスト記述から入ったらどうかなとか思うんだけど、どうかな?
やるおと学ぶVerilogわかりやすいけど1章しか出来てないのね
エントリポイントはリセット回路だよな
どんな回路が合成されるか意識しながら記述するようになってから、
思い通りの回路が作れるようになってめちゃくちゃおもしろくなった。
ソフトは命令を、HDLは回路を"描いている"という意識を持てば混同なく、それぞれに最適な組み方ができるよ。
>>641 面白いっていうけど、LSI設計したり、GA設計したりしてる場合ば別として、
ほぼグルーロジック程度のものしか作ってないだろ?
ソフトの方は手っ取り早く作れるけど、
HDLは手間もかかるし、わざわざ回路を起こさなきゃいけないものってそんなにないんだよな。
せいぜいメモリコントローラとウィザード使ってPCIコントローラぐらいか?
ソフトではできない正確なタイミングが欲しい用途にほぼ限定されるんじゃないのか?
MPEG2デコーダや変復調回路趣味で作る奴はそういないだろうし。mp3デコーダだとプロセッサで出来てしまう。
Nios II って、EP3C5でも載りますか?
>>646 ちらっとぐぐった感じではなんとも分からんね。
Alteraさんに聞いてみるとよかろう。
とはいえHDLじゃないんでスレ違い?
>>646 自分でツールダウンロードして試してみりゃいいじゃん。
どんな機能が必要か、あんたにしか分からないんだから。
>>646 NIOS-e+UART+PIO8ビット+
内部ROM起動+デバッグ機能なしであれば
1600LEだった。
NIOS-eはキャッシュとか全然ないし
デバッグ機能載せないと動作確認が厳しいので
性能的に満足できるかどうか…
←←←誰も
いない→→→
STARC の RTL 設計スタイルガイドってクソ高いけど、どんな感じ?
元は取れる内容なのかな。
>>653 いや、あれ安いでしょ。
SpyGlass等を使う人にはおすすめ。
>>653 クソとか もとが取れる とか言う人は、買わなくてよし。
本や知識のために金を出さない人には、無用の長物。
こういうあほが喜んで買うんだなSTARCなんて。
STARCが仕様作ってるもしくは、世界中のHDL書いてる奴がSTARC本を読んでるなら信用してやるよ。wwww
糞情報にアホ値つけてうりくさって、それをあがめるアホが居ると思うと反吐がでるね。
天下り先の会社が元居た職場に売りつけるためだけに作った
誰も読まない1冊数万円のつん読本思い出した。
自腹で買ったけど、FPGAにはまったく役立たんかったw
ASIC向けかいね?
お作法の本だからFPGAではあまり使わない。
「LINTチェック」を知らない人だと猫に小判。
>>656 残念ながら、世界中のLintチェックツールには STARC ルールが導入されています。
>>653 元が取れる取れないじゃなくて、最低限守るべきルールでしょ。
社内に1冊あればじゅうぶん。
IEEE1364調べるのと同じくらいの頻度で使う程度(年に数回レベル)。
っていうか、常識的な設計・コーディングしていればSTARCルールにひっかかるなんてこと無くね?
>>656 購入を考えていますが、思い留まっています。
どういうところが、そうなのでしょうか、詳しく教えていただけないでしょうか?
>>660 最低限守るルールは文法であり言語仕様だろ。
それ以外にエラーにならないけれども やっちゃいけない、
もしくは副作用あるからどうしようもないときに使うにとどめるとか、
いわゆるべからず集、設計思想集というのは
仕様書読んだ後に一度は目を通しておかないとあとあと困るんだが、
Starc本それか?
Effective C++みたいな
>>662 確かに、そういう意味では最低限ではないね。
でも、文法・言語仕様に合致してても、
合成可能かどうか・現実的な回路になるかどうかは別問題でしょ。
”現実的な設計をするにあたって”最低限守るルールだと思う。
設計思想よりも、もう少し低レベルな話。
社内ルールとかもっと厳しくない?
(大手の内情はしらないけど)
いや、合成可能かどうかってのは
LINT通すまでもなく合成してみりゃわかるだろ。
この段階ではじかれるものは、
間違いなく気づくからいいんだよ。
気づかない、エラーにならない、Warningも出ないが、
やってしまうと、あとあとメンテで泣かされることになるとか、
本来の思想とは異なる考え方で設計してるといったことの方が怖い
簡単に言えば、
合成ツールに依存しない書き方
等価検証で問題が出ない書き方
を紹介している。
だから「動けばいい」仕事しかしない人には不要。
ずいぶんと古い合成ツールの問題点を引きずってたりするし、
細かいルールまで全部守ってたら可読性がめちゃくちゃ悪くなる。
仕様書から実装するだけの↑の人にはいいだろうし、
発注元が指定してきたら守らざるを得ないからね。
>>657 なんで?5000円ぐらいだった(よね?確か)頃のやつ読んだことあるけど、
メタステーブルのこととか、ミーリじゃのムーアじゃの結構参考になること
あったと思うけど。
>>667 去年買った。6300円だった。
買って良かったと思ってる。
なんでみんな、そんなに悪口言うのか分からない。
>>664 合成してみりゃって、それじゃ手遅れ。
コード書く前に、遅くても書き終わった直後にチェックできれば、手戻りは極小。
それに、合成ツールのログ見ただけで判断できる?
結構チェックはいい加減だよ。
WarningとErrorとinformationの区別もツールによって違うし。
>>667 その辺の話なら大学の教科書でもいいだろw
>>656 購入を考えていますが、思い留まっています。
どういうところが、そうなのでしょうか、詳しく教えていただけないでしょうか?
>>669 >遅くても書き終わった直後にチェックできれば
ホントあたま悪いのかお前
書き終わった後、チェックするなら合成してチェックするのと同じだろうが。
そんな頭でよくエンジニアやれてるな。どーせ一事が万事、正しい論理判断できてないんだろうけど
>>669 >合成ツールのログ見ただけで判断できる?
やっぱりな。お前故に判断できないんだろwww
教えてください。初心者です。
FPGAのプログラムやる人たちは、
このスレのように「威張った人」が多いのでしょうか?
そんなこと知ってどうするつもり?
FPGAのプログラムってなに?
っていう釣り針かな?
きちがいのあいてすんな
社内では希少なため、どうしても威張りがちになるw
>>676 これからFPGAを勉強/使用するのに、注意しないといけないと思います。
>>677 >FPGAのプログラムってなに?
「HDLなんてプログラム、ソフトだよ、あんなもん」と先輩が言っていました。
ハンダ付けもできない椰子がPCだけで仕事 (略)
ドツボ一直線だな
>>680 危険な兆候だ。
基本設計はハードウェアを意識して、
記述は保守性と重視して、バージョン管理も忘れずに。
デスマーチの罠から身を守るべし。
職場からダメな匂いがプンプンしてる。
>>674 ありがとう。
判断できる人がいるということがわかったので、それはそれでいいと思います。
残念ながら私(と今までであったエンジニア)では判断できませんでした。
合成ツールが通ればOKなら、LINTの必要性って何なのでしょうかね?
>>680 FPGAはやめといたほうがいいよ。FPGAプログラマーには変わった人が多すぎる。
会社に突然無断で来なくなる人、だまって辞めてしまう人、平気で嘘をつく人、
毎日遅刻する人、ハンカチ持ってない人、トイレから出ても手を洗わない人、
酸っぱい臭いのする人、毎日風呂に入らない人、でもビールだけは毎晩飲む人、車の中が汚い人、
PCのキーボードのキーの下がゴミだらけの人、鼻くそほじった手でマウス触る人、
頑固で人の話を聞こうとしない人、自分の思いこみを曲げない人、独り言が多い人、
PC画面を見て寝てる人、
み〜んなも俺のことだ。
最後フイタw
>>684 >合成ツールが通ればOKなら、LINTの必要性って何なのでしょうかね?
LINT って、ベンダーなり発注元なりの受け入れ条件じゃないかな?
一言で LINT って言ったって、ガチガチに STARC なのか、
ベンダーの勝手な条件だったり、LINT かけて見とけよってだけだったり・・・
“合成ツールが通れば”ってのも、きちんと意図したとおりに合成されるのが前提だけどね。
LINT だって、Formality だって、カバレッジだって、確認のためのツールに
過ぎないんだから、うまく使いこなすことが大切だと思うんだけど、
やたらそれにこだわりすぎなんだよ、まったく!
だいたい、コードのチェックだけやっても、仕様の抜けとかアルゴリズムの
ミスとか、そっちはどうなんだよ。
>>684 LINTの必要性ってのは
>>665だよ。
合成できたからといって「ちゃんと」動作するとは限らない。
回路そのものが思い通りの方向で合成できてるか確かめるためにブロック図出力機能があるんだろ
そして、お前のいう"ちゃんと"動作することを確認するためにシミュレーションをやるんだろ。
プログラム言語もHDLもLINTの存在意義なんて何も変わらない。
HDLの方は合成云々の問題があるとか言う奴は、
合成に関するコードチェックは合成ツールがやってるって当たり前のことを理解してるのか?、
実際問題として合成ツールが意図と違うような合成をしうるから問題なわけで
>>689 規模が大きくなったらブロック図出力機能なんて使ってられない。
そもそも、客先にIPとテストベクタ供給してシミュレーションさせるのか?
で、問題でたら「合成ツールがおかしい」って言うのか?
というか、IPベンダやASIC屋だとLINTチェックは絶対必要なんだがねぇ。
>>690 合成ツールがやってるコードチェックは合成ツールに依存するって当たり前のことを理解してるのか?
仲良く汁
>>689 ブロック図出力て・・・それで確認できる規模でよかったね。
RTLシミュレーションOKだけど、ネットでシミュレーションするとコケた時に、
ツールベンダーに文句言うために使う機能だとおもってたよ。
年に1回くらいあるよね、こういうこと。
最新バージョンでエンバグされたり、合成ツールって結構信頼できないよね。
ブロック図クソワロタwww
数百ゲートぐらいならそれでもいいかもしれないけどさぁ、、、
ここの住人って10万ゲート以上、下手したら100万ゲート超の回路書いてる人ばっかりだと思ってたわ。
ある程度大きな粒度でブロック図は確認するよ。
ある程度大きな粒度じゃ合成結果が記述通りになってるか確認できないだろ
ミクロからマクロまで、
いろんな視点で確認するということだよ、アマチュアさん。
「学生」とか「アマチュア」とかレッテル貼って勝利宣言する奴は、
たいてい屑プロフェッショナルであることが多い。
おう!
>>698 スケマ目視で指さし確認は重要っすね。
何のためにHDL書いてるんだろうかw
>>703 おまえこそわかってるのか
HDLで書くのは1にも2にも生産効率あげるためにやってる。
全体像の確認は回路図で確認する方がよほど手っ取り早い
こういうとあほは、全体像を最上位レイヤとしか解釈できねぇんだろな
適材適所使い分けられないアホは死ね
>>696 >ここの住人って10万ゲート以上、下手したら100万ゲート超の回路書いてる人ばっかりだと思ってたわ。
グルーロジックしか書いたことのないお前には手に負えないよなぁwww
え、ほんとにスケマとか見てるの?
そんなことしないためにSTARC本が必要なんじゃないの?
一度はスケマ確認する事が多いよ
スキャンテスト系との親和性や、予想外に冗長な論理合成結果が無いかどうかの確認くらい。
synopsys系のツールがあればGUIで割と簡単にできるしね。
グルーロジックって、何?
グルーランプ?
ホットボンド?
Glue logic
チップ同士を接続するときに追加するちょっとしたロジック回路のことだと思った。
デコード回路とかそういうやつ
>>707 スキャンテストとの親和性ってのはよくわからないけど、
冗長な回路になってるかどうかはarea report見ればわかると思うんだけどな。
普通は合成してそのまま動くし、スケマとか見る気も起きないわ。
観賞用のスケマは持っていた方がよい。
>>710 >冗長な回路になってるかどうかはarea report見ればわかると思うんだけどな。
そりゃ、50ゲートのつもりが100ゲートになってりゃ分かるけどな
>>712 いやいや、逆に大きい回路こそスケマ見たらわかるのか聞きたいわ。
スケマ見るのは、ECO の時くらいだけどね。
アホな合成してんなぁとかたまに思う。
>>708 >グルーロジックって、何?
ゆとり馬鹿はしねよ
716 :
774ワット発電中さん:2011/07/22(金) 15:21:56.24 ID:Oi9++QY6
717 :
774ワット発電中さん:2011/07/22(金) 18:19:56.50 ID:UnSebzFh
スケマというか、大雑把なブロック図は併用した方が早いかも。
どんなバスにどんなファンクションがのってるとか。
もっとも、某大手のAV機器関連のLSIでは細かいスケマを書かされましたね。
パチンコ関連のLSIではソースコードにコメントを書かずに、
設計仕様書と称してソースコードのコメントが書いてあるだけの資料があったりとか。
結局、生産性が上がるのも下がるのもプロジェクトマネージャーの能力次第なんですよね。
verilog、コンパイラiverilog
reg[3:0] a
for(a=0;a<15;a=a+1) #10;
これでaの各ビットを$monitorで監視すると0ビット目が0、1ビット目が1のときだけ
表示されないのですがなぜか教えてほしいです
例
0 0 0 0 0
1 0 0 0 10
1 1 0 0 30
Verilogで、atan()の計算(アークタンジェントのけいさん)は、
とのようにするのでしょうか?
メーカー提供の開発ツールの、組み込みコアの中に関数パッケージみたいな
IPがあるのでしょうか?
岩波数学辞典に載っている atan の表を入力すればいいのですよ。
cordic atan でぐぐれ
cordic は三角関数系はたいてい計算できるぞ
724 :
774ワット発電中さん:2011/08/18(木) 23:04:05.39 ID:lefQx/bY
初歩的な質問なのですが、
1ビットのレジスタへの代入で「1」と「0」はわかるのですが「−1」はどういう意味でしょうか?
たとえば「A <= -1」といった代入文です。
-1 は すべてのビットが1だよ
それってVerilogのみ??
>>726 まずは型をはっきりさせようか。
conv_std_logic_vector(-1,32)なら、全ビット1になるはずだけど。
あー、そういうことか。
729 :
774ワット発電中さん:2011/08/18(木) 23:50:25.07 ID:lefQx/bY
>>724です。みなさん、レスありがと。
verilog専用スレでないことを忘れていました。すみません。verilogの話です。
reg [7:0] A;
と宣言されたレジスタにalways文の中で次のような代入文があります。
A[7] <= -1;
この結果A[7]にどのような値が入るのかわかりません。
1'b0 - 1'b1 はいくつになるでしょう。
つまりだな…
>>725で既に答えが出てるってこった。
731 :
774ワット発電中さん:2011/08/19(金) 01:05:02.86 ID:6eLbYSM+
1とせずに−1とするのはどういう意図があると考えられるのだろう?
1なら素直に1とすればいいんじゃないのかな、とふと思った。
マジレスすると、-1は32ビット符号付きの値。
その最下位ビットがA[7]にセットされる。
733 :
774ワット発電中さん:2011/08/19(金) 12:16:42.37 ID:6eLbYSM+
>>732 省略した表現は32ビットの10進数というのを思い出した。ありがと。
>>733 何か日本語として変だが。それとも頭の方か?
>>732 そうなんだよ。 Verilogって範囲チェックしないんだよな。
reg宣言でバス表記を忘れてもちゃんと単信号として処理されるんだよね。
LINT チェックしてもエラーにならないかもね。
多ビットの信号定義するときって[MSB:LSB]だと思ってたけど
MicroBlaze関連のHDLソース眺めてたら[LSB:MSB]で定義されてるんだが別にどっちでもいいの?
バイトオーダの話とはまた違うものだよねこれ
68kと8086系のコンパイラで違ってきたりして
バイトオーダーじゃなくてビットオーダーかな。
ビットにアドレスが付く時にLSBとMSBのどっちを0とするかはアーキテクチャで違う。
2のn乗、と相性が良いのはLSB=0で、バイトオーダーのビッグエンディアンと
相性が良いのはMSB=0。
[MSB:LSB] か [LSB:MSB] かは言語仕様に依るとしか言いようがないけど、
プログラミング言語の部分配列の記法との連想では、左側に数字が
小さい方が来たほうが一般的なのかなぁ。
んなこたぁないわ。
(MSB,LSB)が大半だ。逆はきわめて特殊
ああそうか、MSBが左にあったほうが自然か。
配列 bitvec(0)がLSBって自然なのは不動として、
(N downto 0) か (0 to N) どっちがいいのって話?
std_logic_vectorは(N downto 0)
配列(メモリ記述)は(0 to N)
ビット列を整数値として考えると [N-1:0] としたほうが自然。
Nが多くなると表現できる桁が増える。
ビット列を固定小数値的に考えると [0:N-1] のほうが都合がよい。
Nが多くなると表現できる精度が増える。
Verilogで、
パラメータで渡された「maxカウント」の値 C によって、
自動的にreg [N : 0]と、Nの値を計算する方法って無いでしょうか?
log(C) / log(2)の結果を切り上げれば良いと思うのですが、
良くわかっていないので、使いもしない多bitで宣言して、
Warningを盛大に出しています。FFがもったいない。
?
Cを二進数で表現したら自ずとわかるのでは
748 :
774ワット発電中さん:2011/09/08(木) 10:04:54.12 ID:UJwDvSBt
>>746 コーディング時に10進を2進に変換するのをめんどくさがっているだけなのか?
それとも動的再構成をやりたいということなのか?
あっちを変更したらこっちも変更しなければならない、という箇所を
ソースコードのあちこちにばらまくのは良くないからどうにかしたい、
ということだと思うけど。
>>746 >使いもしない多bitで宣言して、
>Warningを盛大に出しています。FFがもったいない
最適化で削除されるからもったいないわけではない。
VHDLではfunction使って必要なビット幅計算→signal宣言で使用
で出来るけど、verilogにはコンパイル時の定数算出の仕組みはないかな?
verilogも同じく、
localparam n=log2(m);
wire [n-1:0] data;
って書いてる。
753 :
774ワット発電中さん:2011/09/08(木) 23:50:52.11 ID:UJwDvSBt
>>752 おー、なるほど。
このあたりのコーディングについては入門書にはかかれてないんだが、何を参考にしたらいいのかね?
入門書の次に読むべき書籍がわからない。
log2 は、自分で関数作っとくの?
切り捨て、切り上げの都合の良い物を自分で作る必要がある
log(m)の計算は、どのようにするのでしょうか?
ln(1+x)=Σ (-1)^n x^n/(n+1)
ディーラー展開すればいいだろ
759 :
774ワット発電中さん:2011/09/10(土) 10:30:13.64 ID:UKMdazoa
>ディーラー展開
聞いたことがあるような、ないような。数学とディーラー展開で検索してもヒットしないね。
Taylor? Dealer?
カジノみたいだなw
銀行家と興行主の闘いか
難しく考えなくて良いよ?
if( m < 2 ){ n = 1; }
else if( m < 4 ){ n = 2; }
else if( m < 8 ){ n = 3; }
else if( m < 16 ){ n = 4; }
else if( m < 32 ){ n = 5; }
;
;
つづく
他人のソースを見るのは、疲れます。
特に、我流で気づき上げたS課長のVerilogは、見るに値しません。
それでも「改造頼む」と、電車男状態です。
どうしたらいいでしょうか?
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
|
____.____ |
| | | |
| | ∧_∧ | | 窓から
| |( ´∀`)つ ミ | 投げ捨てろ
| |/ ⊃ ノ | |
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
他人の回路の改造ほどダルいものはないね。
インターフェースくらいちゃんと設計しろと言いたくなる。
みなさん、コメントはどのように書いていますか?
1. ソース行間
2. ソースの右半分
3. その他
僕は2. です。1.は、とても見にくいと思いますし、行数がやたらと
多くなります。「1行1000円」とかの仕事ならともかく・・・・
両方
選択肢が3つあるのに、両方というのはおかしいと思います。
なんでどちらか一方に絞らなければならないの?
目的によってコメントの書き方変えるぞ。
自分も12両方。
と言っても各行間にコメントはいれないよ?ある程度のブロックで行間に、右側に機能のコメント、って分けてる
ありがとうございます。
やっぱり、1. 2. 混合ですよね。僕も、タイトルは
// //
// 液晶に文字を出す練習プログラム //
// //
とか書いて、ソースの途中は、
module (
input wire clock, // main clock
input wire reset, // reset (正論理)
output reg [15:0] // なんとか、かんとか
);
endmodule
とか書いています。
しかし、以前見たソースは、
module (
// main clock
input wire clock,
// reset (正論理)
input wire reset,
// なんとか、かんとか
output reg [15:0]
);
と、各行に1行のコメントがあって、イライラしたことがあるのです。
どんな時にonehotステートマシンって使っている?
コンパイラに任せてますw
>>773 プログラム・・・ね・・・
某人がVerilogで書かれたアプリとつぶやいていたのを思い出した・・・
プログラムでしょ、HDLは。
ハンダ付けもせず、PCだけで終わるのは。
FPGAならね。
少なくとも「ソフトウェア」ではない。
780 :
775:2011/09/12(月) 02:38:52.80 ID:oOy+wfij
>>776 type STATE is ( S0, S1, S2 );
signal State : STATE;
case State is
when S0 => ・・・;
when S1 => ・・・;
when S2 => ・・・;
when others => ・・・;
end case;
てな感じで書けばコンパイラがステートマシンを推論してくれる。
最近やってるプロジェクトだとワンホットで合成してたな。
コンパイラのデザインゴールやステートマシン関連のオプションで
いろいろいじれると思う。
お話に出ているワンホットについて教えてください。
言葉では何度も聞いているのですが、嬉しさがわかりません。
ワンホット = 1 hot = 1つのホット = ホットが論理1のことだと思うので、
論理1が1つある、と読めば良いのでしょうか。
ワンホットでカウンターを組んだとき、10進ならFFが10個を使用し、
その10個の中の1つのFFだけが"1"で、他は全部ゼロになる、そういう記憶の方法。
そしてワンホットは、ハザードが出ない、高速動作、などと書かれています。
ここまでは、ネットで調べてわかりました。
でも、どういうふうに嬉しいのかわかりません。
カウント分のFFが必要なんて、資源の浪費?ではないかと思うです。
FFが8個で256まで行けるのにです。
ハザードが出ないというのも、同期式カウンタなら通常のものでもハザードは出ませんし。
高速と言われても、クロックで同期している以上、どちらも小梨だと思うのです。
ワンホット方式の、いったい何が嬉しいのでしょうか?
何かおわかりの方、ぜひ教えてください。
駆動する対象が、どれか一つがONになってる、という装置の時とか。
バイナリカウンタだったらデコーダで振り分けないといけない。
あるいは、ワンホットシーケンサならフローチャートっぽい構造をそのまま
実装できる。
>高速と言われても、クロックで同期している以上、どちらも小梨だと思うのです。
小梨の意味がわからんが、8ビットアダーよりシフトレジスタのほうが高速だと
思わないか?
そもそもカウンターにワンホット使う必要はないだろ。
小型で高速なカウンターならM系列だな。
ほんとに単純にカウントするだけなら、一つ下の桁を2分周するだけだから
アダーはいらんけどね。
>>783 昔の4ビットマイコンのアドレス生成がM系列だった
デバッグ面倒臭かったじぇ
>781
782も書いてるけど、
FFが256 → 8に減っても、デコーダの組合せ回路が 256個要ったらもとのもくあみだから。
それなら本質的に速いワンホットのほうでいい。
ワンホットだとデコーダーいらないでしょ?
------------------
10個ステートがあるとして、バイナリ表記で4bit。
・バイナリだと「4bit+条件」
・ワンホットだと「1bit+条件」
が入力信号の本数になる。
例えばが条件が4本ある回路を、LUTの入力が6本のFPGAに実装すると、
バイナリだと8入力→LUT2段
ワンホットだと5入力→LUT1段
となり、ワンホットの方が高速になる。
FPGAに限らず、一般的に入力信号の本数が増えると速度が落ちる。
-------------------
10本のうち、1本だけアクティブになるカウンターが必要な場合。
・バイナリ4bitのカウンタで作ると、FFは4個だが、インクリメンター(+1回路)、4to10 デコーダー
・ワンホットで作るとFF10個。だが、単純なシフトレジスタ
回路規模としては微妙。FPGAなら確実にワンホットの方が小さい。
-------------------
8000ステートをワンホットで作ることはそうそう無いだろう。
規模や目的によって使い分ける。
ジョンソンカウンターのほうがよくね?
まさに 4017
質問なのですが、
Verilogでバスで指定したレジスタ1bitごとに名前をつけて定義することは出来ますか?
イメージ的には、
reg [3:0] control{enable,ss2,ss1,ss0};
こんなことがしたいです。
最近VHDLって元気ないんですか?
VHDLなら俺の横で寝てるよ
で、使うのはVerilog
さる代理店のFAEに
VHDLでは記述したまま回路になりやすいけど
Verilogで記述すると論理合成ツール任せで推論させる所が
多いので規模が小さくなる、と言われた。
そんな俺はVHDL派。
最近、verilogも記述するようになってから、signed unsigned の記述をきちんとしないと、違う動作したり、
適当に記述しても、適当に動き出すから、逆に神経使うようになって、いらいらして、VHDLで書いてから、
あとで、会社がverilogなので、機械変換か人間変換した方が楽だなーと思っている。
最初のアルゴリズムを、いきなり書き出す場合は。
>>794 VHDLで規模が小さくなるような書き方ができない技術者は氏ねってことだw
>>794 >論理合成ツール任せ
相当頭が良い奴ならともかく、日本では低脳化が進んでいるから
ツールの方が賢いだろうからな
低脳化のおかげで日本の電子産業落ちぶれてきているんだろ
>>796 日本に技術者ってどれぐらいいるんだ?
実際はドカタなのに自称技術者が超多いんじゃないか
>>797 もーねHDLはソフトウェアなんてすわ。
設計者は機能レベルまでしか面倒見ない。
どーいう回路がいいか考えるのは論理合成Iの仕事
合成鶴くんが推論し易いように、かつ、
人間にとってもある程度読み易い可読性のあるコードを目指すのが最近の自分のトレンド。
>>798 他人がどういう仕事しているか興味ない、自分の世界で生きれる技術者乙。
論理合成Iが、正しくできないんだったら、論理合成I君修正するお仕事しろよ。
論理合成Iなんて所詮人のつくったものだから、人超えられてないんだよいまだに。
>>799 たぶん釣りだからw
>>800 その自分のトレンドを啓蒙して。剃毛はイヤズラ
>>801 人間が作ったコンピュータが
チェスでチャンピオンを負かしてなかったか?
他人が書いたソースは言語に関わらず読み難いよ
最近は記述長くなるのでVHDLはほぼ使わないなぁ
Verilogの記述で、教えてください。
どちらの書き方で書くべきか、という質問です。
reg [2:0] s; // 状態
reg a,b,c;
always @ (・・・) begin // 1つのalwaysの中に、複数のreg
if( s==0 ) begin
s <= 1;
a <= xx;
b <= xx;
end else if( s==1 ) begin
s <= 2;
a <= xx;
b <= xx;
end else if( s==2 ) begin
s <= 3;
a <= xx;
b <= xx;
end else if( s==3 ) begin
s <= 0;
a <= xx;
b <= xx;
end
end
always @ (・・・) begin // regごとにalways()を使用する。
if( s==0 ) begin
s <= 1;
end else if( s==1 ) begin
s <= 2;
end else if( s==2 ) begin
s <= 3;
end else if( s==3 ) begin
s <= 0;
end
end
always @ (・・・) begin
if( s==0 ) begin
a <= xx;
end else if( s==1 ) begin
a <= xx;
end else if( s==2 ) begin
a <= xx;
end else if( s==3 ) begin
a <= xx;
end
end
// bとcも同様に書く (省略します)
どちらでも動くのですが、どちらで「書くべき」でしょうか。
僕は、1つのalwaysだと思います。理由は、行数が少なくて、状態遷移が良くわかるからです。
関連性で記述する。
はい、次の方どうぞ。
分からないって、正直に書けよ。
>804
上と下の記述は s と a の関連性という点で同一じゃない
(かもしれない。xx の内容を定義してないからこれだけでは分からない)
から、優劣はこれだけでは論じられない。
たとえば s と a への代入時刻が #10 だけ違うという記述を挿入したいとき、
上では容易だが下では可読性がほぼない。
逆に、s の代入だけクロックから #10 遅れるべきという記述は下では容易だが
上ではめんどくさい。
この例の場合は上でいいと思うが、
実際は状態を決めるのに幾つもの変数がからんだりする。
そんな場合、上の書き方だと異様に長くなるから、自分は
下の書き方でやる場合が多い。
>>806-808 ありがとうございます。
この程度では、どちらも優劣つけられないということですね。
いつも、どうすべきなのか、悩みながら(迷いなから?)書いています。
たまには、上記の折衷で書いてたりします。
頭が良くないので、
・ミスや勘違いの発生しにくいのは、どちらか。
・1年後に見たとき、動作が思い出しやすいかのは、どちらか。
宗教のような感じで、迷っています。
810 :
774ワット発電中さん:2011/09/26(月) 13:36:07.15 ID:OodnAGCY
どんな書き方しても1年後に見たらあまりかわらないんじゃ...
FPGAにしてもマイコンにしてもソフトの保守ほどいやなものはない(自分にとって)。
今の製品はライフサイクル短くて使い捨てみたいな感覚があるけどソフトの保守って必要?
>>807 #10 遅延とか、テストベンチでも書くのかい?
>>810 一人だけで仕事してるならそれもあり。
仕事ですらないか…
>>810 >ソフトの保守って必要?
納品時に、先方にはソース非公開ですので、重要ですよ。
改造、改造で、大変なことになっています。
「そんなこと、初めから言ってよね。そんなふうに作ってないよ」
「改造するより新規の方がいいですよ」って言っても、
IPなんて、openなんとかに転がってるんじゃないの? それ使ったら?
とか、おっしゃるので、「んじゃ、お前、自分でやってみろよ」と大声で
言ってやる。
心の中でね。
>>810 会社によりけりだろ
自社製品を開発製造販売する企業...下請け開発ドカタ企業
などいろいろあるから、それによって保守の形態も違うだろ
なかには保守必要ないってところもあるんじゃないか
>>812 会社に大変なことしないで楽に仕事のできるところからのみ仕事請けて
って大声で言うと良いよ。
>>804 私の場合、ステートは別にする。
abcは関連度による。
>>804 この場合だとどちらの書き方をしても回路規模は変わらないと思うから
可読性のある上の方で書くといいんじゃないかな。
>>814のようにステートだけ別にするっていう方法もいいと思う。
>>813 ありがとうございます。
>会社に大変なことしないで楽に仕事のできるところからのみ仕事請けて
って大声で言うと良いよ。
いくら携帯から書込だと言っても、句読点くらい打ってください。
文の意味がわかりません。
それより、3ビットのsでs==4以降の記述がない方が気になる。合成でエラーが出そう。
最初は3bitで、4か5まで行こうと考えたけど、
行数が長くなって「改行が多すぎます」と言われたのでは内科と
たまには3項演算子のことも思い出してあげてください
質問です
参考書ではramの実装方法について次のように書かれていました。
always@(write or data) begin
if(write) mem[addr] <= data;
end
RAMは書き込みのタイミングはネゲートした瞬間だと思うんですが、
データが変わったときにも行われるようにしているのはどういう意図でしょうか。
これがないと何か不都合がありますか。
質問です。
ノンブロッキング代入は直前のブロッキング代入のあとに行われることが保証されますか。
例えば、
A <= 1;
B <= 1;
state_change = ~state_change;
とすると、
state_changeの変化で動くイベントで、ABが1は保証されますか。
>>816 人のこと言える文章なのか?
読解力つけようぜ。
日本人じゃないんでしょ
824 :
774ワット発電中さん:2011/09/27(火) 11:26:18.73 ID:mQg8sBHg
>>820 RAMを実現するために if(write) mem[addr] <= data; の一文を紹介するための例として
示しただけで実用コード例ではないんじゃない。
>>812 改造ということは商品の納入先が一般消費者じゃなくて企業ということですね。
一般消費者相手の民生品、たとえば携帯やデジカメなど一度売り始めたら改造とか
はなくて、それが必要なころには機能、性能など別物と思うような次の新製品に
かわるね。そういった性質のものにソフトの保守が必要なのかなってのを聞きたかった。
FPGAだと if(write) mem[addr] <= data; みたいなコードを合成ツールに食わせると
うまくinferenceしてくれてblockRAMを割当てたりする。
いまどきのFPGA搭載のマルチポートblockRAMは、ライトバック/リードスルー
どっちにも対応してたりするんで、書いた通りに動くよ。
>>821 >ノンブロッキング代入は直前のブロッキング代入のあとに行われることが保証されますか。
そうだけど、その例だと、厳密に言うとstage_changeが変化した時点ではA,Bは不定。
でも時間差だよね。
間違えた orz
「でも時間差ゼロだよね。」
>>790 wire[3:0]control= {enable,ss2,ss1,ss0};
か?
内部実装上の処理の動きをC的な書き方するとこんな感じ
A.next = 1;
B.next = 1;
state_change.next = ~state_change.prev;
state_change.prev = ~state_change.prev;
時刻を進める何かがあるとアップデート処理をする
A.prev = A.next;
B.prev = B.next;
state_change.prev = state_change.next;
まぁSim上ではデルタ遅延があるからね。
Verilogにはデルタ遅延ないよ。代入のイベント処理順が曖昧模糊に規定されてるだけ。
今日は これで帰るよ。
また明日ね。
お聞きしたいことがあるのですが、I2Cすれーぶのステートマシン化をこころみています。
I2Cは基本的にSCL線の立ち下がりがステートの切り替わりなのですが、
通信の開始を表すのに、SDAラインの立ち下がりが使われます。
QuaterIIにステートマシンとして認識させるには、ステート変更箇所が
always@(posedge clk or negedge rst)の記述が必要とのことですが、
SCLとSDA両方にトリガーがある場合、ステートマシンにできますか?
SCLクロックの4〜16倍を超す周波数のクロックを用意して
制御線をサンプリングするといいよ
採用させていだだきますm(__)m
always@(posedge CLK)などの、アットマークってどういう意味があるんですか?
そのまんまの意味だと思うけど・・・・
always(posedge CLK) ってしなかったのはなぜですか?
構文的に区別がつかないじゃない
しらんがな
文字通りatって意味を表したかったのかな。プログラミング言語と比べていろいろ無駄が多いna
じゃあ、引っ越せ
プログラミング言語じゃないからね
VHDLがあっちこっち冗長感あふれる設計なのはAdaの影響だけど
あだ〜・・・!
文法上は always @(〜) という固定文句があるわけじゃないぞ?
@ の起動時刻指定つきの always文ってだけで、always #〜 とか書けるし、
@(〜) も always 以外の場所に書ける。
やっぱ@は文法的ないみがあるのね。
も一つ質問なのですが、
if文がなるべく深くならないようにする工夫とかありますか?
普通のコンピュータ言語ならば、メソッドに小分けするなり、continueで中断するなりすればかなり解決しますが。
verilogは有効的な方法はありますか?
っfunction,task
always(3丁目 夕日)
ゲートで書けばif文は一つもいらない。
ゲートで書くのってアセンブラみたいだね。
だとしたらC言語にあたるものがVerilogかって言うと、どうなんだろ
ゲートで書くは機械語直接書き
Verilogはアセンブラ
wire[7:0] R_DATA;
assign R_DATA = (internal == 1) ? I_DATA : DATA;
と書くのと、
wire[7:0] R_DATA = (internal == 1) ? I_DATA : DATA;
と書くのは一緒ですか?
同じじゃね?
>>847 if文の条件次第だけど、うまく条件を整理出来たらif文をcase文に書き直せるのでは?
if分とcase分って、どっちがお得ですかね。
どうもif分ばっかり使って、case分を使わないんです。
case文の記述でインデントが1つずれるのも いやな理由の1つです。
case分のほうが回路規模小さくなる傾向にある。
作られるロジックを考えると納得するよ。
アドレスデコードをifの連なりで書くというとんでもない回路が社内で物議を醸してたw
>>856 ソフト開発ではif分とcase分って、どっちがお得ですかね。
どうもif分ばっかり使って、case分を使わないんです。
case文の記述でインデントが1つずれるのも いやな理由の1つです。
どう思います?
else if って書くのがキモい
elsifかelifだよなやっぱり
elifはないわ〜
862 :
774ワット発電中さん:2011/10/09(日) 23:24:22.04 ID:oyxZ6ydg
elfまで削った言語は無いよな
具象構文にこだわっても得なことは全くない
自作でJKFFを作ったら、
Warning: Entity "JKFF" will be ignored because it conflicts with Quartus II primitive name
と怒られました。
QurtusIIでJKFFなど、デフォルトの組み込みプリミティブの詳細を見るには
どうすればいいのでしょうか?
名前が衝突してるだけだろ。MYJKFF とかに名前変えたら?
そういうことじゃなくてprimitiveを使いたいからspec知りたいというなら
PDFのデータシート読めばいいと思うよ
867 :
857:2011/10/10(月) 10:59:16.81 ID:aGwjZc+v
>>864 そうそうFPGAの話。
ASICは分かんない。
>>864 例えばXilinxのSliceだと、埋め込みのマルチプレクサがあって、case文もしくはif〜then〜else文で使ってくれるとある。
ただ、一般的にif文よりもcase文の方がマルチプレクサを使ってくれる場合が多いらしい。
Dedicated Multiplexerとかで調べると出てくるね。
869 :
774ワット発電中さん:2011/10/10(月) 15:49:49.75 ID:yeGVsMc3
あまり考えずにソフトウェア感覚でコードを書いていくとif文の階層が深くなりやすいね。
解決法はタイミングチャートなり他の方法なりで論理を整理し簡単化することじゃないかな。
それをツールがやってくれるんじゃないの?
>>870 だいたいやってくれる。
回路的に厳しい(規模・遅延)ところだと、人手でやった方が良いね。
ツールのオプションをいじるだけで良いに越したことはないんだが。
ソフトでも最適化が効くようなコード書くでしょ。
変化しないとわかっているメンバ変数は、一度ローカル変数に代入して使うとか。
872 :
774ワット発電中さん:2011/10/11(火) 01:30:07.41 ID:lBh1pr+S
>>870 ツールうんぬんじゃなくてif文が深くならないための対策の話じゃないの?
FPGAの論理の考え方は産業機械で使われてるシーケンサのラダー回路作成と
似てる感じだな。一般にC言語などで書くソフトウェアとはなんか勝手が違う。
ラダーみたいにオンラインエディットデバッグできたらいいんだけれどな〜
>>858 >>869 ソフトウェアなら最近は他段ifや他段のcase文嫌って
BridgeとかStrategyとか使えないかと考える場合もあるけどHDLだとそうもいかないしね〜
taskとか巧く使えないかなと悩むけど。
task使ってシュミレーションしてればいいと思うよ。
別にtaskを合成で使っても何の問題もないが。
GoodBye World
Hello worldの反対をゆってるならSea you world、な
海 そなたは 万国なりや!
この場合see youは違うんじゃない?
生き返れないし
あの世でまた会おう!
涅槃で待ってる
C you later in next world !
VHDLの開発者様はご存命なのだろうか。
VHDLって委員会言語じゃなかったっけ
委員会でも中の人はいるでしょ
888 :
774ワット発電中さん:2011/10/25(火) 18:24:22.88 ID:Qr5tl7yl
module REG (Vin,CLK,M);
input Vin;
input [1:0] CLK;
output M;
reg M;
always @(CLK[0] or CLK[1]) begin
if (CLK[1])
M <= Vin;
else
M <= CLK[0];
end
always @(CLK[0] or CLK [1])としているのに
CLKがどちらも変化していないときにMがVinになってしまうことがあります
どうしてでしょうか?
クロック、立ち下がってないよね?
立ち下がるって変な表現・・・
890 :
774ワット発電中さん:2011/10/25(火) 19:19:43.57 ID:EXPn2BHk
>>888 おっさん、orなんて止めれ
always @*
おい!
鳥海さんは大したことないよ。
なんで?
使えない本書いて絶版になってるし。
そうか? 俺、2冊とも持ってるよ。
漏れは小林さんのファン
小林芳直さんかな。あの人いいよね。
ステートマシンのことは、あの人の本で知った。
CDのE-LARNINGはすばらしい。まじで
>>900 LARNINGじゃなくて、learningね。
> >899
小林優じゃね?
あの人の本嫌いだがw
903 :
109:2011/10/31(月) 13:16:25.93 ID:4hSVA4fT
俺は、枝さんの本が好きだ。
定本なんちゃらは良いな
905 :
774ワット発電中さん:2011/10/31(月) 19:46:13.35 ID:+f1+OzC4
カルノー図を使った論理の簡単化なんてのがあったけど、HDLで回路を書くのに
あれはいまでも必要かな?
CPU作るときは16×16で簡単化しました
論理合成に任せちゃってる
電卓があったって筆算くらいできなきゃダメだろ。
で、何、カルノー図?、何それうまいの?
自分で簡素化すると合成がうまくいかないって聞いたことあるから、自分もすべて任せちゃってるなぁ
最近は合成エンジンが優秀だからなぁ。
できるだけ任せてるよ。
こっちは可読性重視で書いてる。
でもま、パッと見でわかるような場合は簡略化しといた方が良いしな。
多少は論理圧縮を筆算でやる練習も意味はある。
状態数64とかから40箇所ぐらい〜とかだとメンドイっすw
と手抜きをすると、予定したCPLDにフィットしね〜とかなるしwwww
手動簡略化とかオナニーだよな
完全に可読性消えて意図がわからなくなる
デバッグとか改造とか無理っす
>>913 簡略化して消える様な項なんて、要するに最初から不必要な条件だった訳だから
ソース的には見やすくなる場合も多いと思うけど…。
アホだなあ。
コメントで、何をどのようにしたか書いておくだけじゃん
916 :
774ワット発電中さん:2011/11/01(火) 15:01:06.54 ID:o/3h5h8S
>>908 今はコンパイラの進歩のため、論理回路の基礎でカルノー図は出てこないのかな?
それともただ基礎がないだけなのかな?
基礎がないに一票
プログラマなのに2進数とかできないのいるから、ハードもそんな感じになってると勝手に想像
>>917 >2進数とかできないのいるから
2進数ができるってどういうことかな?
四則演算が10進数並にできるとか、8bitなら暗算するとか?
小数部も込みで2進変換とか
>>918 >四則演算が10進数並にできるとか、8bitなら暗算するとか?
最低でもそれぐらい出来ないと、できるって言わないよな。
10111.000111 / 11110011.0011001 = ?
これぐらいは楽に出来ないとできるって言わないだろな
それができる事がプログラマの条件なんですね、判ります。」
基礎は基礎
人力でバグを入れ込むことなくカルノー図による簡単化をやれるのは
6入力か5入力ぐらいまでだろ
ハザード対策とか隣接テーマもあるからやるべきとは思うけど
暗算って言っても脳内で
2進10進変換→10進出で計算→10進2進変換するだけだよな
結局変換作業しかやってねえ
えっー、バレルシフターぐらい実装してないの?
1 1 が 1、1 2 が 2、1 3 が 3・・・・1 a が a、1 b が b、・・・・1 f が f
1 1 が 2、2 2 が 4、2 3 が 6・・・・2 a が 14、2 b が 16、・・・・2 f が 1e
3 1 が 3、3 2 が 6、3 3 が 9・・・・3 a が 1e、3 b が 21、・・・・3 f が
九九ならぬFF
2 2 が 2 だった。すみません。
インドだったか、韓国の人は、2桁の掛け算を全部暗記するんだよね。凄いわ。
すげぇな・・・
ぐぐった。ウィキペディアより
「インドでは二桁の九九が学ばれているが、地域や学校によって差があり、
最低でも1×1〜20×20、最高では1×1〜99×99まで学ぶ。インドの影響を受け、
中国や韓国でも二桁の九九(1×1〜20×20)はブームとなった。」
すぐ真似する中国韓国もすごいw
九九なんて使う機会が全く無いな
電子マネー決済で俺の中の演算機能は小1レベルまで退化したぞ
>>931 あるあるw
スマフォに変えてお財布機能を失ったわけだが、
お釣りの硬貨数を最小化する暗算はけっこう楽しいことを再確認したw
あれって暗算いらないだろ。
まずあらゆる貨幣が使えるとして最適な組み合わせを求めたうえで、
足りない分の貨幣を順次大きいものに変えてくだけじゃん。
105円のもの買って1000円札と5円出すとかそんな感じか?
935 :
932:2011/11/03(木) 14:47:24.16 ID:CaLgOUSO
>>933 >>934 そうそう、それだけではあるんだけど、
一応合ってるか引き算して確認したりして、お釣りが返ってくるまでの暇つぶしにしてるんだ。
コンビニレジで2380円になります、
って言われてから万札出しながら”肉まん2つ下さい”って言うと
加算されない事が多いなw
財布の硬貨を最小枚数にする方が難しい。
>>937 自分もそれ気にしてるw
財布内硬貨最小化の原則とか勝手に呼んでるw
電子マネー使え
セルフレジで小銭を全部投入する。最後に札を投入して、つり銭が大量に払いだされる
最近は偽造硬貨の換金防止のために
半端な小銭は先にスルーして落とすのも多いんだ
おっと、大宮だ。降りるよっ!
日本全体でベリロガーは何万人ぐらいいるのだろうか
だいたい800万人ぐらいじゃないか
VHDLerはどれくらいだろう?
だいたい8000万人ぐらいじゃないか
ヴハドラー
あれっ? Veriloggerは、1億3000万人くらいと聞いたことがあるけど。
中国人民が混ざってるぞ。
インド人か?
時代はSystemVerilogだろjk
ISEでサポートしてないもん
>>947 銀河標準HDLだからな
だいたい8000兆ぐらいと聞いたが
VHDL8001が策定されると更に利用者が増える
でも今日、近所のスーパーで、奥さんたちが
「あたしの回路、メタステーブルを起こしてしまいましたのよ〜、
シンクロナイザは欠かせませんわね、おほほ♪」
「ちょっと、ちょっと奥さん。今日は、SDRAMコントローラの特売日らしいわよ。
ウチでは、今度ヤマダ電機が名駅にできるので、それまで待ってみようって、主人が」
名駅w
>>959 たって、すごいんだよ。
名駅〜ビックカメラ間の50m満たない区間で、
ビックカメラ、ヤマダ電機、ソフマップ、3社乗り入れでチラシ配ってる。
あっ、忘れた。
「〜ざますのよ。おホホホ」
やっぱ、名古屋は えーね。
名駅って名古屋郷の停車場のこと?
だれか名古屋HDL作ってやれよ
Hentai Down Lord
各駅だと思って読んでたら名駅だったのか。
968 :
774ワット発電中さん:2011/11/15(火) 21:38:21.48 ID:3okZ3cml
名駅は、地名です。
愛知県名古屋市中村区名駅1-1-4
営業時間 4:50〜00:20
969 :
774ワット発電中さん:2011/11/18(金) 11:51:04.58 ID:UiMT/axh
電波テロ装置の戦争(始)エンジニアさん参加願います公安はサリンオウム信者の子供を40歳まで社会から隔離している
オウム信者が地方で現在も潜伏している
それは新興宗教を配下としている公安の仕事だ
発案で盗聴器を開発したら霊魂が寄って呼ぶ来た
<電波憑依>
スピリチャル全否定なら江原三輪氏、高橋佳子大川隆法氏は、幻聴で強制入院矛盾する日本宗教と精神科
<コードレス盗聴>
2004既に国民20%被害250〜700台数中国工作員3〜7000万円2005ソウルコピー2010ソウルイン医者アカギ絡む<盗聴証拠>
今年5月に日本の警視庁防課は被害者SDカード15分を保持した有る国民に出せ!!<創価幹部>
キタオカ1962年東北生は二十代で2人の女性をレイプ殺害して入信した創価本尊はこれだけで潰せる<<<韓国工作員鸛<<<創価公明党 <テロ装置>>東芝部品)>>ヤクザ<宗教<同和<<公安<<魂複<<官憲>日本終Googl検索
VHDL初心者です。
Verilog-HDLで
always @(*) begin
end
という記述はVHDLではどうやって記述するのでしょうか?
process(*)
begin
end process
*見たいな横着な書き方はできないのでしょうか?
971 :
970:2011/11/22(火) 14:21:02.98 ID:FahJ8W30
補足するとprocessのセンシティビティリストを全部書きたくないという意図です。
非同期記述をprocess文で書くことが無いので
センシティビティリストはクロックとリセットしか書かないな。
bird seaぼりすぎ
人の悪口を書くんじゃないよ
数少ないHDLer同士、仲良くしようZE。
いつになったらISEでSystemVerilogサポートされるんですか?
具体的にはどんな記述?
シミュレーション?
Alteraマンセー
Xilinxマンセー
Latticeマンセー
74HCマンドクセー
おしり洗浄器にも使われてるんだって
DIPだとチクチクしそうでやだな