【Verilog】 記述言語で論理設計 Project9 【VHDL】
おつかれ3
VHDLとかじゃなしに、もうちょっとマシな言語はできんの?
XHDLとかどう? 昔AHDLってのがあったが、あの方がかなりまし
だったね。
>>4 AHDLって型があってないようなデタラメ加減がすげえ楽だったな
>>7 結構流行ってるみたいよ。
昨日も、○ピタのサービスカウンターで、お姉さんが説明してたし。
客「チラシに出ていたフリーの開発環境の物が欲しいんですが」
サ「WebPackですね。デバイス限定ですがよろしいですか?」
客「Virtex4なんですが、大丈夫でしょうか?」
サ「はい、LX25までなら大丈夫です。18番の通路の奥、洗剤の隣のコーナーです」
って。驚いた。
そのあと家電売り場に行ったら、これがまたビックリ。
「メーカー推奨 Virtex5, Virtex6開発に必須!! RAM 4GB 2枚セット 本日限り」とか。
>>8 たぶんFPGAのやつに4GBもRAMついてたら
論理設計よりOSとか乗っけるレベルだと思う・・・
結局WinXPでは、頑張っても3GBでしょう?
Xilinxは、Virtex6なら8GB RAMで開発してくれって言ってるみたいだけど。
>10
それって、一番でかいのを設計する時の話だろう。
使用するデバイスが小さくて、使用率も高くなければ3GBでもOKだと思われる。
そうだと思いますが、Windowsで簡単に使用できないRAM容量を
要求するメーカーっていったい。
しかもV6はまだ出ていないし。V5でさえ使ったことがない→オレ。
V5だのS3だのを使ってるのがどれだけいるのやら
>>10 でかいのは、Linuxでやれってことじゃない?
>>12 FPGA以外のデバイス開発環境では、winが少数派だから。。
V6はそれぐらいすごいから、それにあわせたの使えよだろ
だから、もう64bitOSでV6は開発汁ってことだ
あと、俺、V6のでかいのなんかをXiの安いツールでやるってどうかなって思うんだよな。
このクラスの開発ツールとなると数百万ぐらい出さんと、カリカリに開発できないんじゃね
64bitOS+DC ultraクラス+最大搭載可能RAM、こんな感じじゃねか
おまえらは、10万ゲート程度にあわせた開発環境を1000万ゲート規模の開発に十分使えるって思ってるのか?
RAM3GB以上じゃないと合成できないような、でかいV6って個人で買える値段なの?
個人といっても様々だし、けど確実に言えるのは
V6の値段>
>>64bit環境の値段
>18
つまり普通の個人じゃ買えないって事だな。
ICだけ買っても基板に実装しないと使えないからな。
>>17 合成できないって事じゃなくて、メモリスワップがおきまくるので時間が掛かるからダメって事だろうな。
V6のスゴイのって、over 100万なんでしょ。
DC に Xilinx のライブラリあるの?
DC FPGA ってのが昔あったけどね。
64bit で最大搭載可能 RAM ってのも
エクサバイトだか、ゼタバイトだか想像もつかんな。
まあSynopsysはSynplicity買収してるから、
FPGAカテゴリはSynplifyへ統合なんでしょうね
>3のASICのベンダーツールのライセンス料っていくらぐらいするものなの?
cadenceのRTLcompilerとかって年数千万とかなんとからしいけど・・・
>>22 Synplify は合成だけで、配置配線は結局 ISE なんだよなぁ。
何というか、中途半端 orz
>>16 1000万ゲートを一気に合成するのか、おまいは?w
>>17 スワップで時間がかかって現実的ではないのではなく
合成やら配置配線やらで使用メモリが2G(ユーザーメモリの最大値)超えて落ちる
まぁこのへんはISEのつくりがおかしいとはおもうがw
26 :
>>22:2009/10/07(水) 00:35:30 ID:EvSiLHxV
>>24 まあ、そうかも知れない
(オイラ今までAオンリーなんで今のところISEを知らないし、Q2に満足してたりする)
そういやAmprifyだかという配置までやるのあった気もする。
配線/STAまでやるかは忘れたw
その後SynplifyPremierに化けたんだっけなあ?
それなら全部出来たりするのかも。
>>25 でかいのを32bitOSでやろうとしている自分自体がどうかしていると思うんだ
てか、クラウド時代の今、自前のPCだけでやろうなんてのも時代遅れだがな
遠くで連携する超高性能計算機群にやらせても良いじゃないか。Gbネットが普通なんだから
もう、手元PC扱う感覚だ。アル、財もそうだがメリケンの大手ベンダはクラウドよる開発サービス提供が
主流でソフトライセンス提供なんて後進国向けだけらしい。自前のハード用意して、それに、ソフト入れて
やる20世紀の古典開発スタイルやっている会社、いまや、ほとんどないだろ。
ソフト、ハード、ネットワークがもすごい勢いで進化しているのに、自前でソフト、それようPCを導入して
て使っているって....
>>27 計算機環境がクラウドになっただけで、大昔の“ベンダさんにお任せ”に回帰してるような気が.
リモートで作業できる点は大進歩なんだけどさ。
クラウドって知らない他人に金玉握らせてるみたいで気持ち悪い気もする。
ギュッってされたらあぼーんしそう。
>>29 むしろ“誰も握っていてくれない”のがヤバいような。
プロジェクト自体が雲の中なのにサービスにトラブルがあった時に
ちゃんと復旧できるんだろうか?
アマゾンの例もあるし......
アマゾン??
クラウドまでは行かないけど、LSFとか使用して開発している。
合成とかそんなメモリ食わないけど、レイアウトみたいな
フィジカルとかは普通に64GBとかもスワップしたりする。
Web 上で合成してくれるやつがなかったけ?
RTL アップロードすると合成結果を返してくれるやつ。
さすがに仕事使うのは憚られたけど。
36 :
774ワット発電中さん:2009/10/07(水) 22:16:45 ID:AZdtKRRk
送信されたデータは、当社の各種サービス提供のため、関連企業に提供されることがあります。
と、サイトのすみっこにコッソリ書いてある気がして怖いw
>>36 いつの間にか無償提供ライブラリに当社製品が!(w
お前ら、台風どうしてる
電車止まっているから家にまだいる。午前中休みだな
台風様様だな
自分の居場所くらい書いていけ
>>7 >
>>1 > 最近は主婦もHDL書くのか? (笑)
さいきん、HDLの値が増えて悩んでいる主婦が多いってな。マジリアルで。
悩むのはいいがHDL書くのか?
HDL欠くのが良くなくて、
LDL多いのがヤバイんじゃないかな???
LDL 高め 尿酸値高め ウエスト90cm
どうみてもメタボです、ありがとうございました。
>>43 本当にありがとうございました、来世でまた☆
去年の夏、尿酸値12、中性脂肪400以上、GOT/GPTいずれも400付近という脂肪肝
体重93KG(身長165)というSPECでしたが、
医者に、10年後に慢性肝炎、10年後に肝硬変、10年後に肝ガンで死ぬよ って言われて
悟った32歳
今全て正常化(体重66)
デスクワークばっかりだと、こうなりがちだね
やせたほうがいいよ
> 医者に、10年後に慢性肝炎、10年後に肝硬変、10年後に肝ガンで死ぬよ って言われて
それ、ヤブ医者。
3年後にまず通風。
>>45 ああ、尿管結石は既に2回済みw
通風はナゼかやってない
10年くらいは尿酸値8以上10付近だったのに???
47 :
くり:2009/10/10(土) 10:56:43 ID:rrUTUW21
つながる訳ではない、の裏には、つながるリスクは異常に高まっている、がある。
正常範囲は≦7
俺は大体8前後w
なぜこんな流れに…?
【HDL】記述言語で体調管理 【LDL】
51 :
くり:2009/10/11(日) 00:57:44 ID:hx+vOv4b
53 :
774ワット発電中さん:2009/10/11(日) 01:51:56 ID:6Af0laWF
>>53 このスレは【HDL】記述言語で体調管理 【LDL】になりました。
スレ違いです。
>>53 画像が見えないぞ
エッチサイトへの誘導か?
二進カウンタとキャリーでぐぐればいくらでも答えが転がってるが 学生なら自分でやった方がいいよ
>>59 あのなぁ、「答えを教えてくれ」じゅなくてさ、
自分なりに書いて、「どうですか?」っていうスタイルくらい取れないの?
うるせえ
カスのくせに説教すんな
うるせえ
本人じゃないくせにレスすんな
そうそう 俺も別人にやられたことがある。
質問書きこんだら5分後に「解決しました」とかいって。
「よかったね」って、それで尾張。しょぼん。
トリつけて質問すれば?
68 :
59:2009/10/12(月) 20:17:58 ID:oMJOa1My
自分で考える気なんてハナからねぇーよ
69 :
59:2009/10/12(月) 20:18:51 ID:cgopNy4R
だな
70 :
59:2009/10/12(月) 20:19:53 ID:L+E+VF1E
モレ漏れも
釣りじゃなくて真面目にわかんないんだろうか・・・
だとすれば向いてないと思う。この方面。
向き不向き以前の問題。
やる気ないんだから、社会人になっても
使えない→退職→ニートの道まっしぐら。
ヤル気が無いけど卒業はしたいのか
だから2chに聞きに来るのか
2ch卒業証書くれてやろうか つ□
Verilogで、教えてください。
以下の信号線は、その右のような呼び方て良いでしょうか?
wire [15:0] w15; ベクターワイヤ
wire w1; スケーラーワイヤ
reg [15:0] r15; ベクターレジ
reg r1; スケーラーレジ
reg 宣言しても、FFに決まるわけではないから、
信号線の名前は名前だけでよいと思うが。
スケベーオヤジ
53でふと思ったが、HDLで書くのは
論理設計(も書けるけど)じゃなくて
機能設計だっけか?
>>75 ありがとうございます。せっかくなのですが、信号名の件ではなくて、
wire [幅] xxxx → これをベクターワイヤという呼び方は正しいでしょうか?という質問でした。
言葉足らずですみません。言い方を変えますと、
複数本のことをベクタ、1本のことをスカラ、という言葉は適当かどうか?というとです。
あと、1つ教えてください。
「reg 宣言しても、FFに決まるわけではないから、 」というお話ですが、
どのようなケースでしょうか。私はregと来たらFFが配置される、と思っています。
宜しくお願いします。
適切
always文で組み合わせ回路を作る場合
>>79 ありがとうございます。安心できました。
>always文で組み合わせ回路を作る場合
ということは「ベクタ=複数線、スカラ=単線」というのは、
常時OKな表現ではないということでしょうか?
よろしければ教えてください。
デジタル集積回路とかハードウェア記述言語の文脈において常時OK
テストベクタって言葉を聞いたことがないかい?
>>81 聞いたことあります。
意味はわかりませんが、予想するにテスト用のデータで、
あの信号、この信号、その信号と、複数種類もあるので、「ベクタ」でしょうか。
>>79 は、「always で組み合わせ回路を作ると
FF が出来ないよ」と言っていると思う。
register という表現が混乱を生じるから
Verilog 2001 からは、variable と呼んでいる。
あと、“ベクター”という表現は普段使わないなぁ。
使うとしても net に対してだと思う。
“5ビットのレジスター”とか言えばすむ話じゃね?
“8ビットバス”とか。
とりあえず、IEEE1364-2001 を読め。
>>83 ありがとうございました。
よくわかりました。
ISEのエラーメッセージでは、平気で vector scaler と言ってくるので、
知識として知っておきたいと思い、質問しました。
resisterは、置数器、数字を記憶する、という意味であれば、
特に混乱はしないかな?なんて思いますが。
variableというのも、言い得ていていいですね。ズバリ「変数」ですね。
vector, scalarよりも親しみが持てます。
ありがとうございました。
always@(a, b)
c = a & b;
このときcはreg宣言だけど果たしてFFになりますでしょうか?
>>85 お前、前スレから簡単な質問をして、それを何回も説明して
もらっても理解できなかったやつだろ。
簡単な質問をするなとは言わないが、教えてもらっているのに
同じ事を何回も聞くな。
どのような記述がFFになるかは、教科書や論理合成ツールの
マニュアルを読んで自分で調べろ。
それ以外の記述はregで宣言してあろうともFFにはならない。
合成してFloorplan Editorとかで中を見れば早いんじゃないの?
上げ
何で、レジになるかどうかで悩まんならんのだ? わかるか?
あほな言語つかうなよ。www
楽な言語で、定義が明確なのがあるだろ。 50年も前の糞言語、使う奴の
気がしれん。
>>91 なんで、草はやしてんの?馬鹿なの?死ぬの?
>>93 何を言いたいんだ?
日本語で挨拶お願いしますとお願いしているのか?
低脳の日本語は肝心なところがないからな、意味不明だよな
>>92 「馬鹿なの?死ぬの?」はねえだろ
何年遅れてんだよ。
自演乙
IDこそ違え、自演そのものって感じだなw
自分も知りたい。
50年も前の言語って、FORTRANかCOBOLくらいしか知らないのだけど
このスレでの発言だから当然HDLの事だよねw
お前らはどう
>>91を解釈してレスしてるんだ
俺的には
50年前からほとんど進化していない糞言語を使うからregとか悩むんだ
俺が現役の50年前は半導体、真空管が超貴重部品で使えなくてメカニカルリレーが使われてた時代でな、
その当時もブール代数的表記のc = a & bで論理設計(各社各様の社内論理設計表記「言語」で)をしていたんだよ。
で、ブール代数に記憶素の表記ないから記憶どうするで悩んだよ
だから、これは記憶素ニダと注記してた。それに毛が生えたような言語を50年後でも使うからそういうことになるんだ。
俺的には、お前らと違って"楽な言語で、定義が明確なのがあるだろ"を知りたいんだがな
なんで、お前らは50年も前の糞言語 に反応したん? そのほうが有用情報の可能性あると思ったのか?
ついでに解釈
レジになるかどうかで悩まんならんのだ <= 必要性疑問提示
わかるか <= 悩む必要理由理解してる?
あほな言語つかうなよ <= これが
>>91の結論、その言語はアホで使用すべきでないと(詳細不明)
楽な言語で、定義が明確なのがあるだろ <= アホ言語より良いのあらしい。キーワードは定義が明確
50年も前の糞言語、使う奴の 気がしれん。 <= 50年前の糞言語を未だに使っているんだ(俺解釈嫁)!頭大丈夫?
短い文で詳細不明だが、
>>91は当然補完できるとレスしたんだろ。
無理ならその程度の脳力ってことだな
今日、俺暇だった
>91乙
発狂すんなよ
なんだかまた面倒くさいのが湧いてるなあ
50年前現役って・・・少なくとも70代か。
すごくじじいだな
>>101 よく「お前の話はただ長くて言いたいことがわからない」って言われない?
>定年すると毎日が日曜日
まで読んだ
reg c;
always@(a, b)
c = a & b;
cがwireで駄目な理由わからんのだが
regでなければいけない理由って何?
そう言う言語なのだから仕方ない。
嫌ならVHDLでもどうぞ
regにはclockが使われていないと
奥歯にゴミが詰まったような不快感が・・・
wire c;
assign c = a & b ;
ではだめなの?
質問なんだけど、RTLの書き始めのコメント(ヘッダ?)には何を書いてる?
なんか書くときに毎回迷う・・・きめりゃいいんだろうけど。
モジュール名
モジュールの説明
作った人
日付
更新履歴
だいたいの階層とかいるの?
昨日の晩ご飯でも書いておけ
客「HDLわからんから、回路図でくれ」(タダで)
うぜー
>>114 あるある、そういうの。
以前、HDLが分からないという客向けに、
同じ機能の回路を大量に作る羽目になったときには、
正直言って参った。
>>112 参考にしたこのスレのURLとレス番も忘れずにな
117 :
112:2009/10/20(火) 11:38:05 ID:XAzMOomh
>>113 プロジェクト名につけよう!って一瞬出ましたよ。
tonkotu_riceプロジェクト
>>114,115
HDLではまだないけどSPICEの方で・・・
>>116 ここで・・・ありましたっけ?
Project7ぐらいからちらほら来てましたけど
ググってもでないんすよね
118 :
113:2009/10/20(火) 23:33:56 ID:SZz3u47Y
>>117 一瞬でも出たのか・・・つか豚骨ライスって何だ?
あとマジレスだけどemacsのvhdl lispだと>112と同じものぐらいしか書かないかな。
コメントだしあんまり長々と書いてもしょうがないかなと。
過去スレにコメントに何故変更したかを細々と書くといった人も居ましたが。
119 :
112:2009/10/21(水) 12:19:32 ID:9rzjGtMt
>>118 後は経験だけですね。
どうもありがとうございました。
そろそろ名無しに、と
あと
>>59の?課題も終わっただろうし
適当に作りたいのですが画像が見れませんね。
ISE早くマルチコアに最適化してくれよ
現状はCore i7のTurbo Boostが効く分かりやすい例だけどさw
>現状はCore i7のTurbo Boostが効く分かりやすい例だけどさw
詳しく!
i7マシン買ったけどあんま速くならなくて…
教えてください。
以前このスレで、Verilogで合成の場合のfor()は、記述の簡略化だと書かれていました。
今、ADの値を移動平均を出そうとしています。
しかしその個数が128個と多いので、僕の知っている知識で書くと、
dat[127] <= dat[126];
dat[126] <= dat[125];
(延々と続く)
dat[2] <= dat[1];
dat[1] <= dat[0];
dat[0] <= new_data; そして引き続き、
sum = dat[0] + dat[1] + dat[2] + dat[3] + ・・・・・・
dat[10] + dat[11] + dat[12] + dat[13] + ・・・・・・
dat[20] + dat[21] + dat[22] + dat[23] + ・・・・・・
dat[30] + dat[31] + dat[32] + dat[33] + ・・・・・・
延々と続く
dat[120] + dat[12] + ・・・・ + dat[126] + new_data;
と書くしかないのですが、
こういうときに、for()を使ってスマートに書ける、と考えれば良いでしょうか?
また、移動平均自身の、もっとスマートな書き方があれば、教えて頂けないでしょうか。
FPGAはスパータン3です。
123 :
774ワット発電中さん:2009/10/25(日) 20:23:36 ID:ou6Vdi6f
俺ならアキュムレータ使う
悪夢霊多
ありがとうございます。
アキュームレータを調べてみましたが、よくわかりませんでした。
アキュームレータと聞くと、マイコンのcpuのワークレジスタを思ってしまいます。
for()で、それっぽく書いているのを見つけましたので、それで一度やってみます。
ありがとうございました。
CPU用のプログラムじゃないんだから・・・
それだけの並列処理加算回路をロジックで生成するつもり?
まぁ、生成できるなら止めはしないけど・・
127 :
774ワット発電中さん:2009/10/25(日) 22:04:52 ID:ou6Vdi6f
それであってるし FIRフィルタとかで調べたらなんぼでも出て来るだろ
>>122の場合、CoreGenでFIRが生成できるなら、
タップ係数が全て1で128段のFIRを生成するのが手っ取り早いと思う。
>>122 せめて、
dat[127:0] <= { dat[126:0], new_data };
これで。
>>122 sum <= sum - dat[127] + new_data;
差分だけ計算すりゃいいじゃん
書き方の問題だけじゃなくて、アルゴリズムを検討すれば。
ADの値はどうくるんだろうか?
1ビットオーディオってやつか・・・
127:0 <= 126:0
どうみても1bitです。
136 :
774ワット発電中さん:2009/10/28(水) 22:16:58 ID:pt3HExvX
1bitのΔΣのADコンバータだろ
sum <= sum + new_data - data[i];
data[i] <= new_data;
i = i + 1;
で終了
ははw
てか、
sum_dat <= sum_dat + new_data;
で、128カウンタつければ?
パラレル出力のADコンバータで、2の補数出力できるものがあります。
この出力を、FPGAに取り込むとき
signed reg またはsigned wireで取り込めば、
signedとしてそのまま扱えると思うのですが、
この考えは正しいでしょうか?
>>139 後段でどのような処理をするか次第。
信号としては、signed/unsignedなんて関係なく取り込むだけ。
>>139 ありがとうございます。確かにそうですね。
私の質問の説明も悪かったです。
次のような理解ですが、もう一度問わせてください。
パラレル出力のADコンバータで、ストレートバイナリと2の補数と切替出力できるADがあります。
後段のFPGA処理で、加減算を行いたい場合、
FPGA内部をunsigned値で0x8000を足して引いてとやるのもありですが、
ADコンバータ出力を2の補数で出力に設定して、
FPGAに取り込むとき、signed reg またはsigned wireで取り込めば、
FPGA内部の計算処理でそのまま加減算が扱えると思っています。
ADコンバータの出力の「2の補数出力」は、
まさにこのような時に使うための出力形式と考えています。
この考えは正しいでしょうか?
142 :
774ワット発電中さん:2009/11/12(木) 20:48:28 ID:wx8Rjg2x
>>141 2の補数なんだから
オーバーフローを切り捨てれば
signed/unsignedなんか関係ないと思うぞ
>>141 いや、だから取り込み信号の符号は実際はどっちでもよくて、
> FPGA内部の計算処理でそのまま加減算
この加減算をどのように処理するか次第。
例えば、signed で加減算のロジックを作ったならば、
取り込み信号線(入力)が signed だろうが unsigned だろうが
関係なく、演算結果(出力)は同じ。
3ビット[0,7][-4,3]ぐらいの範囲で紙に書いて計算したほうが早いよ。
ビット列を人間がどの数と結びつけるかの問題に過ぎないから。
もし考え込むことがあるとしたら、
CPUを作るときのステータス・フラグとかだな。
145 :
774ワット発電中さん:2009/11/12(木) 23:09:00 ID:wx8Rjg2x
>>143 unsigned で加減算のロジックを作っても
同じだと思うが?
signedの加減算とunsignedの加減算って同だろ?
>>145 そのオーバフロー処理というか桁次第だけど。
入力を16bitとして、出力を16bit/20bitの両方考えると、
sb
0xFFFF(65535) + 0x0001(1) = 0x0000(0) / 0x10000(65536)
0xFFFF(65535) - 0x0001(1) = 0xFFFE(65534) / 0x0FFFE(65534)
2's
0xFFFF(-1) + 0x0001(1) = 0x0000(0) / 0x00000(0)
0xFFFF(-1) - 0x0001(1) = 0xFFFE(-2) / 0xFFFFE(65534)
となるから、違う場合もあるということで。
147 :
774ワット発電中さん:2009/11/13(金) 00:58:27 ID:P/gdbOsT
それはないだろ
入力16bit、出力20ビットの加算器ってどんなの?
線のつなぎがよく分からない。
絵で描いてうpろだに上げてみてくれない?
描いてというのも面倒な話だと反省。
たくさん書くの大変なので
>入力を16bitとして、出力を16bit/20bitの両方考えると、
を次のように変えても意味は変わらないよね?
>入力を8bitとして、出力を8bit/12bitの両方考えると、
↓まで書いてみたよ。
入力x[7:0](8bit)
入力y[7:0](8bit)
出力o[7:0](8bit)
出力c[7](1bit)
half_adder0(.C(c0), .O(o0), .X(x0), .Y(y0));
full_adder1(.C(c1), .O(o1), .X(x1), .Y(y1), .Z(c0));
full_adder2(.C(c2), .O(o2), .X(x2), .Y(y2) ,.Z(c1));
full_adder3(.C(c3), .O(o3), .X(x3), .Y(y3), .Z(c2));
full_adder4(.C(c4), .O(o4), .X(x4), .Y(y4), .Z(c3));
full_adder5(.C(c5), .O(o5), .X(x5), .Y(y5), .Z(c4));
full_adder6(.C(c6), .O(o6), .X(x6), .Y(y6), .Z(c5));
full_adder7(.C(c7), .O(o7), .X(x7), .Y(y7), .Z(c6));
>>146 質問です。
sbはストレートbinaryの略だと思います。
2'sは、2の補数だと思いますが、sは何の略でしょうか?
補数だとすると、coplementのcかなって。
146じゃないけど、単に所有格の「's」じゃね
>>151 なるほど、そのsですか。了解しました。
どうもありがとうございます。
でも、Verilog で sb って書くと signed binary のことなんだよな。
8'sb10000000 とかね。
Verilogで、top階層で作った物を、
インスタンシイェーションするだけでエラーが10個以上出て、
修正時間が1時間以上かかります。
・moduleの付け忘れ
・regのままで、wireにしていない
・()の行末の,が抜けている、あるいは最後の行まで,がついている
・コンパイラーに「そんなポートねぇよ」と言われる。
こんな私はまだまだ経験が足りないでしょうか?
インスタンス化でエラー無しで一発で動く人って、すごいと思う。
155 :
774ワット発電中さん:2009/11/16(月) 17:30:00 ID:4ZWUYbRe
emacs LISP
>>155 verilog-mode.el か、
ちなみに、Meadowでも動く。
すみません、教えてください。
Verilogで、signed の代入について 次のような場合、どのようになるのかがわかりません。
1. assign 8bit_signed = 6bit_signed; // bit幅が異なる場合 広=狭 のとき
2. assign 6bit_signed = 8bit_signed; // bit幅が異なる場合 狭=広 のとき
3. assign 8bit_unsigned = 8bit_signed; // bit幅が同じで、型が違う場合 us=s のとき
4. assign 8bit_signed = 8bit_unsigned; // bit幅が同じで、型が違う場合 u=us のとき
考えたのですが、
1の場合、コンパイラが6bit側を符号拡張して計算してくれるので、そのままの値になる。
2の場合、コンパイラが8bit側を符号縮小して計算してくれて、5bitに入らない場合は、11111となる。
3の場合は、signedのbit模様が、そのままunsignedに代入される。ので、
signed が-1(11111111)のとき、unsigned は、0xff=255になる。
4の場合は、unsignedのbit模様が、そのままsignedに代入される。ので、
unsigned が128(10000000)のときは、signed は、-128になる。
よろしくお願いします。
>>157 1,2は、そういう記述してはいけない。
3,4は、そうなるだろう。が、そういう記述をすべきではない。
ソフトではなくて、あくまでも回路だから、
キャスト(型変換)というのは奇妙、というか意味がない。
学部の卒業研究でSFL使ってるけどマイナーなのかなこの言語
それ、国内限定だろ
>>158 ありがとうございます。
>1,2は、そういう記述してはいけない。
そうなのですか。
「いけない」原因は何でしょうか?
・signedだからいけない
・bit幅が異なるからいけない。
・上記がどちらか一方なら良いが、同時に起こるのがいけない。
でも、こういう場合って、往々にして発生しませんか?
unsigned 同士なら、
assign unsgned_16bit = { 4'b0, unsigned_12bit };
とかできますが、signed だと
assign signed_16bit = { {4{signed_12bit[11]}}, signed_12bit };
とかでよいのでしょうか。
>>161 あんたの言う「広=狭」の場合は、「広」の方の足りないビットに詰め物をするべき。
「狭=広」の場合は、明示的に必要なビットを選(よ)って接続すべき。
記述が「配線」を意味するものであるということを考えれば、きちんとビット数を
合わせる必要があることにそう疑問が出ることはないと思うんだけれども。
>>164 >記述が「配線」を意味するものであるということを考えれば、
ありがとうございます。この言葉に納得しました。なるほど。
ということは、signed変数もunsigned変数も同じで、
8'b10000000というデータは、unsignedで扱いたい人にとっては128だし、
unsignedで扱いたい人にとっては、-127ということですね。
なので、signed8bit = unsigned8bit; は、全然問題無しということですね。
すると、if( )での比較でも同じなのでしょうか?
if( unsined8bit==unsined6bit )という比較は、コンパイラが符号拡張してくれる
と思っているんですが、どうでしょう。
>>162 STARCって、たまに見るのですが、何でしょうか? 本の名前でしょうか。
Cで言う「C言語辞典」のVerilog版みたいな本があれば便利なのですが、
ご存じでしたら、教えてください。
CQの本ばっかり何冊も増えていくんです。
>signed8bit = unsigned8bit;
VHDLな俺からするともうこの時点でだめ。
HDLは型なんかは基本的に関係なく、正負論理としか考えない。
>>166 >HDLは型なんかは基本的に関係なく、正負論理としか考えない。
前半と後半の内容が背反な感じがしますけど、どうですか?
168 :
774ワット発電中さん:2009/11/17(火) 18:34:29 ID:3cXiA5e5
型てのは正負論理にあるルールを付け加えたものだろ べつに背反しないと思うが
>>159 ツールはNTTが開発したPARTHENONですか?
>>169 シミュレーションはPARTHENONで、
FPGAに載っけるのはsfl2vl使ってます。
論理合成結果考えたら最初からVerilogとかで書いたほうが明らかにいいんだけどね。
{signed1bit,signed2bit} = {unsigned1bit,unsigned2bit}; とかも全然問題無しですよ。
if( unsined2bit==unsined2bit )は、 if( (unsined2bit[1]==unsined2bit[1] ) && ( unsined2bit[0]==unsined2bit[0]) ) とおおよそ等価です。
符号拡張?なんですか、そんな文法あったっけ?
>符号拡張?なんですか、
すみません、確信犯できに間違って使っていました。
符号拡張ではなくてbit拡張です。すんません。
>{signed1bit,signed2bit} = {unsigned1bit,unsigned2bit}; とかも全然問題無しですよ。
すばらしいですね。連接って、ステキですよね。
ところで、連接で、これもOKでしょうか?
{signed2bit,signed3bit} = {unsigned3bit,unsigned2bit};
何が言いたいかというと、
signed2bit = unsigned3bit[2;1];
signed3bit = { unsigned3bit[0],unsigned2bit };
みたいな変換もできてしまうのでしょうか?ということです。
こうなると、もう何でもアリですね。
>>165の言う「Cで言う「C言語辞典」のVerilog版みたいな本」というのは、
あるんでしょうか? > ALL
あったら、ぜひ解体、いや買いたい。3万円までなら出すよ。Verilog2001対応版ね。
あとISEで、文法チェックというか もろもろのチェックをもっと厳しくしたいんだけど、
設定はないですか?
STARC 厨が沸いてるね
>>158 >>164 マジレスすると、カウンターの記述とかどうやってるの?
hoge<= hoge + 1'b1;
ってすると、左右でビット長変ってくるよね。
一旦、別の変数に入れて、下位ビットだけ入れなおすの?
assign hoge_tmp= hoge + 1'b1;
hoge<= hoge_tmp[7:0]; とか?
158,164ではないですが、
そっか、そう言われると、bit幅の異なる代入は、平気でやってるなぁ。
なるほど、、、、。
ありがとう。
>>175 > hoge<= hoge + 1'b1;
>
> ってすると、左右でビット長変ってくるよね。
変わってこない。
hoge[7:0]<= hoge[7:0] + 1'b1;
としたら、両辺とも 8bit。
右辺がオーバフローしても、
勝手に 9bit とかになったりはしない。
179 :
774ワット発電中さん:2009/11/18(水) 21:49:20 ID:1ePmCu5c
勉強し直しはどっちだよ
ここ最近の書き込み見ていると、
結局プロでやってる皆さんでも、Verilog文法をよく知らずにやってる、ってことですね。
「それでもやっていける」というか、「触れないようにしている」のか。
どこかにバイブルのような本はないのでしょうか? STARTC以外で。
Cのように本が多くないし。
>>180 入門書で概念的な事を理解したら、あとはIEEEの原典。
嫌味や冗談でなく本気で言ってます。自分はそうしているし。
すべての本を見た訳ではないけど、解説本では結局細かいところの
説明を端折っていたり、場合によっては間違っていたりするので
正確さを求めるならばIEEEの規格が一番。
>>180 > 結局プロでやってる皆さんでも、Verilog文法をよく知らずにやってる、ってことですね。
仕事でやってる人だけが、ここに書いてるわけでもないだろう。
趣味とか、学生で、ひとまず動かすことが目的なだけなら、
詳細は知らなくてもいいし。
そういう意味では、Verilog文法をよく知らずにやってるのは、
プロというか仕事人としては駄目だろう。
Verilog の問題点は、文法とシミュレーションと合成とで微妙に異なることにある。
文法的には、
>>157 のビット幅が異なる代入をしても無問題。
符号拡張されるし、上位ビットは捨てられる。
という意味で、
>>164 は間違い。
ハードでしかものを考えてない。74シリーズでも使ってろ。
STARC は、初期の合成ツールで制約が多かったから、それを安全に
使うためのガイドライン。文法の本じゃない。
ただ、合成ツールも進化してるし、それに固執して分かりにくいコードを
書くのもどうかと思う。IP屋なら仕方ないけど。
hoge[7:0]<= hoge[7:0] + 1'b1;
hoge<= hoge + 1;
でどっちでもいいんじゃね?
もっと言うなら、hoge のビット長をパラメータ化しないと使いまわせないから
hoge[hoge_bit_length - 1:0]<= hoge[hoge_bit_length - 1:0] + 1'b1;
とでも書くべきだね。
STARC の本は、自己矛盾がたくさんあるし、だいたい、DC のディレクティブを
使え、使うな、って説明すんなよ。
文法を知りたければ、IEEE Std 1364-200x を見るしかない。
そのIEEEのって、本か何かで手に入る というか、
アマゾンで買えますかね?
買いたい。 でも英文でしょうけど。
加算で1'b1って符号拡張したら+1になるの?-1になるの?
icarusで
$dumpvars;だけでVCDダンプしてくれるのね。
ちょっと感動しちゃった。
188 :
774ワット発電中さん:2009/11/19(木) 22:40:06 ID:eieg7cqB
>>183 STARCが重視しているのは保守性の高い判りやすいコードを書くこと
決して分かりにくいコードでは無い
過去は振り返らない主義
ぱんつははかない主義
>>184 アマゾンからは無理かもしれないけど、
IEEEのWebから直接買えるよ。
もちろん、Webも仕様書も英語。
前に紀伊国屋webからVerilog2001のIEEE本買った気もする
192 :
悩んでます:2009/11/20(金) 18:07:28 ID:u0oSCyr3
下のように書くと・・・
シフトしてからsr[0]入れるのか
sr[0]入れてからシフトするのか
もしくは不定なのでこんな事は出来ない?
always@(posedge clk)
begin
if (shift == 1'b1)
begin
sr[63:1] <= sr[62:0];
sr[0] <= sr_in;
end
end
ノンブロッキング代入 でぐぐるんだ!
連接 でくぐるんだ!
195 :
774ワット発電中さん:2009/11/20(金) 18:50:01 ID:zzMuHcWs
>>192 FF動作なのでノンブロッキング代入でOK
正しい記述になってます
判りやすくしたければ
sr[63:0] <= {sr[62:0],sr_in};
ですけどね
sr[63:0] <= {sr[62:0],sr_in};
のほうが、2.23630679倍見やすいと思うな。
俺は、デバッグ用のピンを出すとき、こんなふうに書いてる。
output wire [7:0] TP
);
TP = {
reset, // 7
clock, // 6
count, // 5
LED1, // 4
start_SW, // 3
1'b0, // 2
1'b0, // 1
1'b0 // 0
};
197 :
悩んでます:2009/11/21(土) 13:05:08 ID:E0eNTL/5
なるほど!
たすかりました。
スッキリしました。
ありがとうございました。
連結使ってスッキリ、で終わらせるのでなく
ノンブロッキング代入が何かも理解しておかないと
後々困ることになるよ。
199 :
悩んでます:2009/11/21(土) 13:44:39 ID:E0eNTL/5
ノンブロッキング代入は
>>192 のように代入文が複数ある場合
どのタイミングで代入されるのですか?
イメージとして
>>192の場合シフト後のsr[0]にsr_inを代入と考えたほうがよいのかな?
なのでclkの↑(立ち上がり)で実行後は 元々あったsr[0]のデータは
sr[1]にあると考えてよい?
じゃぁ・・・
これに
sr[10]<=in_a;
sr[15]<=in_b;
といくつかステートメントを追加して書いても
配列への代入はそれぞれシフト後の[10][15]に入るのでしょうか?
厳密にはステートメントは書いた順に実行されて、どこかに予約され
何かのタイミングで"せーの”で一斉に実行されるのですか?
るのでしょうか?
>>199 clockで動作するソースは、こういう風に読むんだよ。
always@(posedge clk) begin // clockの↑の一瞬で
if (shift == 1'b1) begin
sr[63:1] <= sr[62:0]; // sr63番〜se1番のFFの入力は、sr62番〜sr0番のFFの出力が駆動する。
sr[0] <= sr_in; // sr0番のFFの入力は、sr_inの信号(bufferの出力が駆動する。
end
end
書いてある上から順にやるわけじゃなくて、clockの↑の一瞬だけでしか動かない。
ということは、各行は一斉に1回だけやるということなんだ。
だから、書く順番に関係がない。beginとendに囲まれた範囲を、clockの↑の一瞬だけ1回実施する。
しかも、左辺の物は1回しか登場してはいけない。
マイコンだと上から順にやっていくので、
A = B + C;
A = in_a; とか書ける。HDLは、それはだめ。
なので、
sr[10]<=in_a;
sr[15]<=in_b; を追加するとどうなるかというと
if (shift == 1'b1) begin
sr[63:1] <= sr[62:0]; // sr63番〜se1番のFFの入力は、sr62番〜sr0番のFFの出力が駆動する。
sr[0] <= sr_in; // sr0番のFFの入力は、sr_inの入力bufferの出力が駆動する。
sr[10]<=in_a; // sr10番のFFの入力は、in_aの入力bufferの出力が駆動する。
sr[15]<=in_b; // sr15番のFFの入力は、in_bの入力bufferの出力が駆動する。
end
よく見るとおかしい。sr10番のFFの入力は、
sr[63:1] <= sr[62:0];
の行でsr9番の出力によって駆動される、と言っているのに、
sr[10]<=in_a;
の行で、sr10番のFFの入力は、in_aで駆動される、とも言っている。
「私はどっちの言うことを聞けばいいの?(はぁと)」ということになって、おかしい。
この状態を名古屋弁で「マルチソース駆動になっとるじゃん。あかんじゃん」と言います。
マルチソース=Multi Source=複数の供給源が駆動している状態。
201 :
774ワット発電中さん:2009/11/21(土) 16:27:28 ID:TSlVoV67
>>199 全て間違い
ノンブロッキング代入はその式が評価された時に
代入のスケジューリングが行われるが、代入自身は
同時刻の他の処理が全て終わった後に実行される
(代入する値は評価された時に決まる)
また、複数のノンブロッキング代入の処理順序は
シミュレータによって振る舞いが異なる
FFの動作を理解するのが先じゃない?
今はだいぶ慣れたけど、最初の頃は腹が立ってしょうがなかった。
どんなに記述しても、エラーが必ず出る。
エラーメッセージを見るけど、英語で書いてあってスグにわからない。
コンパイルにも素晴らしく時間がかかって、イライラしてるのに、輪をかけて英文の羅列。
16本の本だとerrorXXX:hoge<15> errorXXX:hoge<14>・・・と16行もメッセージが出る。
わかった、わかった。丁寧に16行言わなくても1行でいいよ。
やっぱりマイコンがいいなぁ。コンパイルはあっという間だし、Cで書けば楽に書けるし。
妙なデバイスに手を出さずに、大人しくマイコンでやれば良かったと、何度思ったかわからない。
みんなよくこんな時間のかかる開発やってるよな。
エラーメッセージをコピーして、web翻訳をかけても、変な和訳で ますますわからない。
エラー番号をクリックすると、メーカーのホームページに飛ぶのは便利だけど、
これは次期バージョンで修正予定とかで、当面の処置が書いてあるが、
すでに使い慣れた人向けのような文章で、疑問が疑問を呼ぶ状態。
周りに聞ける人もいない。販売店に聞いてみる。
「営業なんでわからない。東エレに聞くからしばらく待って」となる。
なんか俺の質問はよっぽど難しいのか、変な内容なんだろうか。
ここで一発逆転を狙おうと、本を読み、自力で修正してみる。
<= を = にしてコンパイル。なんだよ、エラーが増えたじゃねーか。
やっぱり<=が正解みたいだな。
メニューをいろいろ触っていて、変なのを見つけた。クリーンナッププロジェクト。
その後、ダメ元でコンパイル。何事もなかったようにエラー無しで通る。
おいおい、なんだよそれ。こんなのアリかよ?
こんなに難しい言語、というか環境で、みんな良くやってると思うよ。
もうFPGAは使わないよ、マイコンで頑張る。
そうそう
SH6だったか、PLL内蔵で「ど速い」らしい。やっばりマイコンだあ。
母から、本当の父は誰だか分からないと言われて
混乱してるだけなので、
>>203の行為は許してやって下さい。
ここはどこ? 私は誰?
206 :
774ワット発電中さん:2009/11/22(日) 03:52:47 ID:nTmYDl4b
いや、普通にこなしてる人でも最初はこんなリアルな失敗、悩み、疑問があったんだよ
っていうことがよくわかるいい文章だと思う。
惜しいのは、結局マイコンでやるのとは何が違うのかを書かなかったことだ
なんで英語で書いてあるのスグにわからないの?
なんでわざわざ機械翻訳で珍訳を生成するの? 仕事中にも笑いが欲しい?
まさが英語読めないとか? まさかね…
>まさが英語読めないとか? まさかね…
日常言語以外の言語を、
てにをはにいたるまでの理解はできないぞ、普通。
>>207 次のメッセージは何を言っているのか教えてくれませんか?
line 122 Reference to vector wire 'HOGE' is not a legal reg or variable lvalue.
210 :
774ワット発電中さん:2009/11/22(日) 12:42:52 ID:f2AMmf/m
>>200 >>201 Verilog の仕様すら知らずにこういうことを言い出す輩が湧くんだが、
具体的に仕様通りに動かないシミュレータを挙げてくれまいか?
君らの脳内シミュレータが10年前からバージョンアップされてないのは仕方ないが・・・
煽るだけ煽って彼の言う正しい答えを書かない
無能に反応しなくていいと思うよ
213 :
774ワット発電中さん:2009/11/22(日) 13:41:28 ID:pqRRj75R
>>210 >>201 だが
俺はVerilogの仕様を書いたつもりだが
何処が間違えているか書いてくれないか?
>>209 以前もまったく同じ文章の意味が分からんって奴がいたが
これってそんなに難しい英語か??
確かにlvalueってはのは普通の英語じゃないけど、IT系の人間で
lvalueとか左辺値を知らないってのは本人の不勉強だろう。
まあ、以前話題になった時はvectorの意味が分からんという
論外だったけどw
215 :
210:2009/11/22(日) 17:45:04 ID:iLByihQM
>>211 混乱させてすまん。
じゃあ別々に
>>200 >「私はどっちの言うことを聞けばいいの?(はぁと)」ということになって、おかしい。
>この状態を名古屋弁で「マルチソース駆動になっとるじゃん。あかんじゃん」と言います。
IEEE Std 1364-2001
5.4.1 Determinism
2) Non blocking assignments shall be performed in the order the statements were executed.
「実行した順番に評価しろ」だから、どちらに評価するかは明白。それにマルチソースじゃない。
まあ、名古屋弁ではそう言うのかもしらんが、混乱するのでなるべく方言は避けたほうが無難。
>>201 >また、複数のノンブロッキング代入の処理順序は
>シミュレータによって振る舞いが異なる
Verilog の仕様に準拠していれば、振る舞いが異なることはないはず。
だから、もし、振る舞いが異なるシミュレータがあるなら教えて欲しいということ。
別々の @(posedge CLK) 内で評価すれば、「シミュレータによって異なる」というのはその通りなんだけども。
>>215 Verilogの言語仕様書って、実は結構曖昧ですよ。
動作が厳密に定義されてなくて、シミュレータ的に答えのない動作もある。
(そういう時は、大手商用ベンダのシミュレータの動作が正解・・・)
例:
FAQ 160
http://japanese.sugawara-systems.com/faqs.htm とか、典型例。
システムタスク($fopen)なんかは、カオス。
>また、複数のノンブロッキング代入の処理順序は
>シミュレータによって振る舞いが異なる
215さんが書かれているように、同期回路ではあまり聞きませんね。
ノンブロッキング代入という言葉だけだと、最近は、always文で
非同期回路も書けるし、そういう場合は処理順序は異なるでしょうね。
(実行順序は不定。)
217 :
216:2009/11/22(日) 18:37:54 ID:U7q9ahM4
あっ、処理順序は異なるってのは、複数の非同期回路が
書かれていた場合、非同期回路が評価される順番が違うって事ね。
シミュレータ的には、同じ時間であれば
どういう順番で評価しても構わない事になっていたはず。
218 :
774ワット発電中さん:2009/11/22(日) 18:40:39 ID:pqRRj75R
>>215 あんたの思っている仕様はVerilog2001じゃないか?
一般的にVerilogといえばVerilog95を指す
俺の知っている舞いが異なるシミュレータとしては Verilog-XL
もちろんVerilog-XLはVerilog2001に対応していない
そんなにかっちりとした仕様が欲しければVHDL使えば?
220 :
210:2009/11/22(日) 22:01:06 ID:iLByihQM
>>216 そうですね。
バイナリファイル扱うと挙動が違ったりするし。
ただ、ここでは、言語仕様について
>>200 が間違ってたから指摘しただけです。
>>218 Verilog-1995 も同じですってば。仕様書読んでくださいよ。
それ以前のバージョンのVerilog-XLはそうかもしれないけど、そんな古いシミュレータのこといわれてもなぁ。
現行バージョンで試しましたか?
221 :
774ワット発電中さん:2009/11/22(日) 22:58:29 ID:pqRRj75R
>>220 古いシミュレータの事と言いますが、貴方が指摘した元の
私の文章を読んでください
>また、複数のノンブロッキング代入の処理順序は
>シミュレータによって振る舞いが異なる
このシミュレータには全てのVerilogシミュレータが含まれる
のでは無いですか?
それとも最新版ではないVerilog-XLはVerilogシミュレータでは
無いという事ですか?
>>219 それはちがう。これらの柔軟性がVerilogの魅力。
おまじないの文章を何行も書いて、タイピングの練習がしたい人には、VHDLがベストです。
VHDL は vhdl-mode.el があれば人の手で打ち込む必要のある記述量は Verilog と大差ないと思うな。
Verilog も verilog-mode.el を使えば port 宣言記述の自動化が出来て更に入力を減らせるけど。
何が言いたいかというと HDL 入力に emacs 最高w
224 :
210:2009/11/23(月) 06:05:02 ID:R0ImaWo0
>>221 >>218 で、貴殿は「Verilog とは、Verilog-95 を指す」とおっしゃってますよね。
Verilog-XLはそれ以前からあるし、それが1995の仕様を満たしていないのは仕方ないでしょう。
なら、その古いXLは、Verilog のシミュレータではないですね。
何か矛盾でも?
もし現行のシミュレータが Verilog の仕様を満たしていないなら、それはバグなんだからFIXすべきでしょ。
「(初期の)Verilog-XL は仕様を満たしてないよ」ってのは有用な情報です。ありがとうございます。
今のバージョンは大丈夫なですよね。確認したいのですが。
で、あなたは、
>>200 ですか?
もしそうなら、間違いは謙虚に認めませんか?
225 :
774ワット発電中さん:2009/11/23(月) 10:18:34 ID:vbHztXyQ
>>224 私の主張はVerilogの言語仕様を完全に満たす物だけが
Verilogシミュレータでは無いという事
Verilog-XLはVerilogのシミュレータでは無いと言う貴方と
議論しても意味が無い
ここを読んでる多数の人が
Verilog-XLはVerilogのシミュレータでは無いと思うのであれば
私の間違いであり
Verilog-XLはVerilogのシミュレータだと思うのであれば
貴方が間違っているという事だろう
私は
>>201です
226 :
外野:2009/11/23(月) 10:59:25 ID:dHIdYGRg
多数派かどうかは知らないが、俺は
規格非準拠バージョンのVerilog-XLはVerilogのシミュレータでは無い
と思う派
>>222 今の流れからみてその柔軟性が魅力と思えることにびっくり。
>223でも書いてあるようにLisp使えば記述力が減らせる、個人的には補完とか考えれば
VHDLモードの方が記述力は少ない。
記述「力」ってナンだよオイ…
「量」だろ
ところで皆さんそんなにEmacs使ってるの?
>>228 やっぱり vi(クローン含む) だよなw
VHDLかVerilogかの論争の後は
Emacsかviかの論争かよ
終わりがない
お次はインデント論争かなw
私は「SPACE×2個」派
インデントに統一感の無いHDLを見るとイラっと来るわ
>>232 そういうのはLispの自動整形やっちゃうな、まぁ変なネストやると大変だけど。
あと区切り文字も追加で、俺はアンダーバーです。
SPACE×2個やTAB4, TAB8はどうでもいい
見た目はそろってるのにSPACEとTABが混じってるものが腹が立つ
著者と編集の間のやり取りで壊れたんだろうな。
インデントは、TAB4と決まっています。
シミュレーションのタイムアウトって
皆さんどうやって作ってます?
意味が分かりません、$finish?
run時間を指定せず、testbench側で一連の処理完了後したら自動停止させたいとか?
sim終了条件で引っかけて errorレベルで assert すればいいんじゃないかな。
if (sim終了条件) then
assert (FALSE) report "finished !!" severity error;
end if;
initial begin
#1000 // タイムアウトまでの時間
$display("Timeout");
$stop;
end
じゃダメなのか?
VHDLとVerilogが混在してるな
Verilogなら
>>241 で良いし
VHDLにはそもそもそんな機能無いから
>>240 の方法しかない
243 :
238:2009/11/26(木) 12:07:13 ID:Y8ZLocsg
皆さん回答ありがとうございます。
現状で
>>241のような書き方でやってました(先に書けよ自分orz)。
>>240さんのような書き方もあるんですね。
assertの動作がどうなるかちょっと勉強してきます。
verilogでtaskに文字列を引数で渡す時、
受け側では当然十分なビット幅を用意しておくんだけど、
これを$displayすると、余分な空白が付いてしまいます。
lstrip()的な事は出来ないものでしょうか。
task特有の問題かわからないけど
6桁表示とするとたぶん%6dとかでいいと思う。
integer a;
$display("a = %6d",a);
とか、Cと一緒
教えてください。
ASCII文字の数字←→バイナリの変換をするとき、
マイコンだと bin = ASCII - '0'; という書き方が出来て、見やすくていいのですが、
Verilogでは、どのように書けば良いのでしょうか。
assign bin = ASCII - '0'; という書き方はダメなのでしょうか?
ERROR:HDLCompilers:26 - "test.v" line xx unexpected token: ''' と言われてしまいます。
assign bin = ASCII - "0";
>>247 ありがとうございます。
ダブルクォーテーションですか。ありがとうございます。
早速ソースが修正できます。
ありがとうございました。
>>245 うーん、そういうことではなくて、
$display("[DEBUG] %s hoge=%d", str, hoge);
みたいな事をしたいとして、
strが文字列リテラルであればなんの問題もないのだけど、
[MAX_LEN*8:1] str;
のようにしていて、必要以上のビット幅を確保した場合、
余計なスペースが入ってしまって嫌だなぁ、という事です。
str[variable -: constant]
として、任意の位置から固定幅を抜き出すことはできても、
str[variable:1]
とするのはエラーになってしまうし。
>250
Verilog は C言語の printf()ライブラリ関数と同じではない
>245 のような桁数指定は実は規定されていない(最近の規格は知らないが)。
但し対応してるシミュレータもある。
例 (ISE WebPACK 8.1.03i)
ISE Simulator 桁数指定無視
Model Sim XE 桁数指定有効
>249
>244 の書き方では 引数が文字列のとき望みの表示にならない ように読めたが、
>249 を読むと何がやりたいのか分かりません。
エラーにはならないのなら、実際のコードと出力結果、そして 期待する出力 を
書いた方が早いよ
あと、>244 だけを読んでて思ったんだけど、
$display("[DEBUG] %0s hoge=%d", str, hoge);
%s じゃなくて %0s、 左詰印字指定 が欲しかった?
沢山出力するときに 桁位置がずれると読みにくいから、
普通は固定幅にするものだと思うのだが…
>244
先頭に余白があったらスワップさせるルーチン組んだらダメなん?
こんな感じで。
task main_banner;
input [8*80:1] strings;
begin
while(strings[8*80:8*80-7]==8'h0) begin
strings = { strings[8*80-8:1], 8'h0 };
end
$display("%s",strings);
end
endtask
それだと右に余白ができるのでは?
どなたかお力をお貸し下さい。
VHDLのシミュレーションで、同じファイルを何回も読み込みたいのですが
うまく行きません。気持ち(?)を表したソースを載せますので良きアドバイスを!
file READ_FILE : text open read_mode is "param.txt";
−−−中略−−−
for N in 1 to 100 loop
while not(endfile(READ_FILE)) loop
readline(READ_FILE , LINE_DATA);
−−−中略−−−
end loop;
end loop;
これだと初めの一回しか読み込みが行われません。
繰り返し読み込むにはどうすれば良いでしょうか?
file_close(READ_FILE); して、openからやり直す?
257 :
255:2009/12/16(水) 15:32:32 ID:/HAZItS5
>>256さん(ある意味キリ番?)
さっそくヒントをありがとうございます。
「file_close」なるモノを使った事が無いのでさっそく勉強します。
もう少し他にも助言頂けるとありがたいです。
258 :
255:2009/12/16(水) 21:17:25 ID:Mep0dqIg
ヒントを頂き無事に解決しましたので、お礼を兼ねて結果を報告します。
for N in 1 to 100 loop
file_open(READ_FILE, "param.txt", read_mode);
while not(endfile(READ_FILE)) loop
readline(READ_FILE , LINE_DATA);
−−−中略−−−
end loop;
file_close(READ_FILE);
end loop;
頂いたヒントの「file_close」から調べて辿り着きました。
256さんを含めて住人皆様に「ありがとう」です。では。
Verilog のシミュレーションには cver を使っていますが、
フリーの VHDL シミュレータはどんなものがありますか。
というか、Mixed-HDL シミュレーションができるもの。
職場が VHDL なんですが、メーカー提供のモデルは Verilog が多いので
難儀してます。
GHDL
>>260 レスどうも。
VHDL のシミュレータならこんなのもあるようですが、どんなもんでしょう。
ttp://freehdl.seul.org/ やたらバージョン番号が小さいので、実用性がいかがなものか気になるところです。
Verilog と VHDL のミックスドでシミュレーションできるフリーのシミュレータというのはさすがに見当たりませんね。
VHDL を強要されている人たちはどうやってシミュレーションしてますか?
とりあえず今のところ、全部 Verilog で書いて VHDL に変換、というのが現実的かなと思ってます。
会社からmix環境でやれと言われたら会社にEDAを買わせる。
そもそも何でフリーなんだ?
すみません。教えてください。
Windows XP + ISE10.1で、次のようなエラーが出て、困っています。
ERROR:HDLCompilers:26 - "CCC.v" line 3 expecting 'endmodule', found 'module'
上記の意味は、次のように理解しています。正しいでしょうか?
「上から見ていって、endmoduleが来るのを期待していたのに、
moduleが来た。だからエラーだよ」
また、ソースは以下のように記述しているのですが、
何かおかしいところを指摘いただけないでしょうか?
1つのテキストファイルに、次のように記述しています。
module AAA( );
xxxxx
xxxxx
xxxxx
endmodule
module BBB( );
xxxxx
xxxxx
xxxxx
endmodule
module CCC( );
xxxxx
xxxxx
xxxxx
endmodule
module〜endmoduleで閉じていれば、いくつ書いても良いと思っています。
宜しくお願いします。
>>261 Modelsimで混載simが可能になったらハッピーなんですけどね。
混載simをしたい場合、一端 QuartusII の「Generate Functional Simulation Netlist」で
混載部分の VHDL Netlist を生成し、ModelsimにてSimulationしてました。
Simulation時間がとても長くなってしまうのが難点ですが。
>>263 Projectかソースを置いてあるパスにスペースが含まれているとか?
(たぶんブランクになってる)「Verilog Include Directories」に、RTLの置き場所を明示するのも手。
>module〜endmoduleで閉じていれば、いくつ書いても良いと思っています。
無難に「1ファイル=1モジュール」で「ファイル名=Module名」にしておいたほうが良いと思います。
>>263 ありがとうございます。
>無難に「1ファイル=1モジュール」で「ファイル名=Module名」
はい、これは実行しています。
しかしAAAの中だけで使うKKKは、関連性もあるので、1ファイル内に
File名「AAA.v」
module AAA ();
KKK U1 ();
KKK U2 ();
xxxx
endmodule
module KKK ();
xxxx
endmodule
のように、同居させていますが、マズイでしょうか?
KKKはどこにあるんだ? というときに困るかも、という問題はあると思いますが、
秀丸のgrepで検索しています。
あと、
上記のような、Verilog表記というか「作法」について知るには、
どのようにすれば良いのでしょうか?
僕1人で、聞ける人がいなくて困っています。
商社の講習会に何度か参加しましたが、このような内容は特になかったです。
Verilogの作法から教えてくれる講習会があれば、ぜひ参加してみたいです。
>>265 コンパイラ指示子の「`include "ファイル名"」で関連性を明示しちゃうのも手。
-------------------
`include "KKK.v"
module AAA ();
KKK U1 ();
KKK U2 ();
xxxx
endmodule
-------------------
「作法」については、やはり先人の「マネ」から入るのが手っ取り早いですね。
慣れてきたら徐々に自分の記述スタイルを構築して行きましょう。
ちょっと堅苦しい記述だけど、「RTL設計スタイルガイドVerilog-HDL編」を
眺めて見るのも参考になるかもです。
>>265 自分も、特定のモジュールからしか呼ばれないローカルなモジュールを
親モジュールと同じファイルに入れてるよ。
SystemVerilogならモジュールの入れ子ができるけど、
普通のVerilogはダメなんだよなあ。
ISEで、教えてください。
ISEのソースウインドウに表示される内容の読み方についてです。
ウインドウの一番上にから、
+−プロジェクト名
+−+−デバイスの型式
+−AAA (111.v)
+−BBB (222.v)
+−CCC (333.v)
+−top (top.v)
+−U1 KKK(444.v)
+−U2 KKK(444.v)
+−U3 KKK(444.v)
という具合に、インデントが付いて、表示されます。
このインデントで分けられた物の意味がわかりません。上記の例ですと、
444.vというファイル内にある、KKKというインスタンスが、
topモジュールの中で、U1, U2, U3として使用されている、
と読むのだと理解しています。
わからないのは、
topの上に表示されるAAA,BBB,CCCです。これは一体何でしょうか。
topモジュールと同じ位置関係にあるモジュールというのが
イメージ出来ません。
ここに表示されることが、いけないことなのか、良いことなのか、
ワケがわからないので、不安いっぱいです。
また、topモジュール内部で、KKKを記述するとき、
知らずにスペルミスすると、それまでtopモジュールの下に表示されていたKKKが、
AAA〜CCCの仲間と同じ位置に勝手に移動してしまい、これもなんだかわかりません。
頼んでも以内のに表示位置が勝手に移動してしまうのです。
これらの表示位置によって、宣言が無いとか、ダブってるとか、のエラーが出てしまい
なかなか修正ができません。知らずにちょっと何かあると、ドバーっとエラーが出てきて、
どうして良いかわからず、ISEを使うのが 半分怖いです。
とてもとまどっています。この辺りの情報を知るには、どうしたら良いのでしょうか。
Xilinxのwebも探してみましたが、見つけられませんでした。
WebPackなので、Xilinxに聞くわけにも行かず、周りに聞ける人がいなくて困っています。
どうぞ宜しくお願いします。
>>266 ありがとうございます。
`include "ファイル名"は、バリバリ使っています。
マイコンのCのときと同じで、とても便利だと思っています。
>「作法」については、やはり先人の「マネ」から入るのが手っ取り早いですね。
そうですか。本に載っているソースをたくさん見ることですね。
回路図集を眺めて回路を覚えるような感じですね。
>ちょっと堅苦しい記述だけど、「RTL設計スタイルガイドVerilog-HDL編」を
高いですよね、この本。ちょっと躊躇しています。(汗
>>267 ありがとうございます。
>自分も、特定のモジュールからしか呼ばれないローカルなモジュールを
>親モジュールと同じファイルに入れてるよ。
そうですか、安心しました。
>>268 topの中でインスタンス宣言されたモジュールがtopの下に来るだけのこと。
topの同レベル(デバイス直下)にいるモジュールは、source->addされたのにも関わらず
どこからも参照されていないモジュールであることを示す。
ビルドでエラーが起きるのは、Source windowの表示位置が悪いからではなく
ビルドエラーが起きるような記述ミスがあるために正しい位置に表示されないだけ。
因果関係が逆。
>>270 ありがとうございます。
なるほどです。ということは、次のような理解で良いでしょうか?
+−プロジェクト名
+−デバイスの型式
+−AAA (111.v)
+−BBB (222.v)
+−CCC (333.v)
+−top (top.v)
+−U1 KKK(444.v)
+−U2 KKK(444.v)
+−U3 KKK(444.v)
a) 上記の例では、モジュールの表記されている位置だけでは、コンパイルにエラーがあるかどうかはわからない。
b) AAA, BBB, CCC, topは、互いに参照もされず、関係が(からみ)も無い。なので
AAA, BBB, CCC, topは、1つのFPGA上にまるで「回路が同居している」ように考えれば良い。
d) ということは、コンパイルの時に、AAA, BBB, CCC, top全てがコンパイルの対象になる。
e) なので、AAA, BBB, CCC, topは、それぞれ単体で「エラーが無く話が完結している」必要がある。
f) top内でのタイプミス等により、AAA BBB CCCのレベルにモジュールが上がってくると、
e)の理由により、一気にエラーが量産されてしまう。
g) f)のタイプミスを修正すれば、f)で上がってきたモジュールはtopの内部に戻るので、
自動的に?AAA, BBB, CCC, topのレベルから表示が消える。
>>271 いやいやいや
AAA,BBB,CCC,topのうち、トップモジュールに設定されたどれか1つが論理合成の対象。
例えばtopがトップモジュールに設定されている場合、AAA,BBB,CCCに何が書かれていても無視され、論理合成でエラーは出ない。
>>271 論理合成にかける前にシミュレータで文法チェックしたのかな?
Xilinx版Modelsimも無償で入手できるはず。
vlog top.v
vlog 444.v
でコンパイルして
vsim top
でエラーが出なければ、Verilogの文法的には合ってる可能性が高い。
もちろん、論理合成できるかどうかは別問題だけど。
あと、素直にVerilog HDLの本を買ったほうがいいんじゃないかなあ。
vlog top.v 、vsim top って、何?
コマンドラインで実行したことない人ですか?
教えてください。
Verilogで、clockAで動くmodule Aと、clockBで動くmodule Bがあります。
Clock周波数が異なる(非同期な)2つのmodule間で、信号をやりとりしたいです。
module Aから、modeule Bに「AD変換依頼」の信号を定周期で送り、module Bでそれを受けてAD変換処理をする
というものです。
そこで考えたのは、
module B内にRS-FFを置き、module Aの指示でSetされ、
SetされていたらAD変換処理を行い、AD処理終了したらRS-FFをResetするという方法です。
このRS-FFは、Clock Aに同期してSetされClock Bに同期してResetされるわけですが、
module B内部に、どのように記述すればいいかわかりません。
RS-FFは合成できませんと書かれた本もあれば、OKという本もあります。
タスキがけの組み合わせ回路を書けば良いと思うのですが、まずいでしょうか。
RS-FFがダメとなると、どのような手法で実現するのが一般的でしょうか。
DualPortRAMの使用、とか。
>>276 ターゲットデバイスによってやり方は違う。
ASICならRS-FFの非同期セット/リセット使うという手もなくはない。
FPGAならRS-FFなんてないから無理。
送りたい情報が1bit程度なら、ハンドシェイク方式で十分なので
DualPortRAMやら非同期FIFOやらまで持ち出さなくてもいいだろう。
異なるクロックドメイン間の通信は、受け側で2回D-FFを通せば
メタステーブル状態を回避して、状態を検知できる。
対向1組の信号線があれば1bitの情報をハンドシェイクで伝送できる
ModuleA出力 REQ (初期値L)
ModuleB出力 ACK (初期値L)
ModuleA AD変換依頼を発信 REQをL→H
ModuleB REQがHを確認したら ACKをL→H
ModuleA ACKがHなのを確認したら REQをH→L
ModuleB REQがLを確認したら ACKをH→L
ModuleA ACKがLになるまで待機した後、最初に戻る
>>276 1bitのset信号ならFF2段通せばおk
メタステーブルでググれ
ClockBの方が遅いとして、
ClockAからのsetを、ClockBで拾えるように
十分長くする。
always @(posedge ClockA)begin
set_ff <= set_pls;
set_ff2 <= set_ff;
set_ff3 <= set_ff2;
end
assign set_4cycle = set_pls | set_ff | set_ff2 | set_ff3;
//ClockBで叩いてClockB同期信号にする
always @(posedge ClockB)//clock乗せ換え//メタステーブル発生可能性あり
set_clkb_meta <= set_4cycle;//set_4cycle is ClockA domain
always @(posedge CloclB)//メタス伝播保護
set_clkb <= set_clkb_meta;
always @(posedge ClockB)//このレジスタは完全に同期
if(set_clkb)
rs <= 1'b1;
else if(clr)//clrはClockBドメイン
rs <= 1'b0;
279 :
278:2010/02/15(月) 23:39:58 ID:Y1+QD653
グリッジで受け取れませんでした
さーせん
質問いいでしょうか。初心者です。
Verilogで、
モジュールの中のインスタンス化した物の中の、
これまたインスタンス化した中の、
これまたインスタンス化した中の・・・・の最下位moduleの中の信号を、
topまで引っ張り出して、外部端子からオシロで信号が見たいです。
しかし、下からtopに向かって、全てのmodule( )のカッコ内に
モニタのためだけに信号名を追加で書かなければならないのでしょうか?
最下位のmoduleから直接topの端子につなぐことは出来ないのでしょうか?
>>280 できない、はず。
SignalTap(Altera)やChipScope(Xilinx)を使えば、
RTLを変えずにJTAG経由で内部信号を見られるが…。
>>279 set_4cycleをFF(ClockA駆動)で叩いてからClockBドメインに渡せば
動くということ?
>>281 ありがとうございます。
そうすると、そのインスタンスを参照している「全てのmoduleのポートリスト」を
修正しないと行けないのでしょうか?
どれか1つでtopまで上がってきて、他の参照moduleはほったらかし、ということはNGでしょうか?
>SignalTap(Altera)やChipScope(Xilinx)を使えば、
なるほど了解です。
Verilogだとダメだけど、VHDLならできるよ、とかありますか?
>>280 シミュレーション用記述ではカンマで階層参照できますが
assign aaa = testbench.fpgatop.modulea.modulea_b.signal_ccc;
って感じで。
合成して端子から出してオシロで見るなら
おっしゃるとおり通過するmoduleに全部にport追加してます。
>>281 そのとおり。
カンマじゃねえしww
アホだろおれ
>>283 大丈夫です、「点」ですね。
しかし、面倒ですね。RS232の送信回路とか作ったときなど、
最下層の信号が見てみたいことがよくあるのですが・・・。
hoge U1 ( .CK(CK), .RES(RES), .DEBUG(DEBUG ) ) ) );
hoge U2 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U3 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U4 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U5 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U6 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U7 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U8 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
hoge U9 ( .CK(CK), .RES(RES), .DEBUG( ) ) ) );
という感じですよね。
>>285 実機で確認したいなら、深くする前に一部だけ実装して、
浅い段階で確認すれば?
しかし、遅い信号なら、シミュレーションで確認すれば、
ほぼ問題ないと思うけど。
テストベンチの話です。
ALTERA、FPGA、Modelsim AEです。
FPGAのパルス出力の数をテストベンチでカウントしたいのですが
方法を教えていただけないでしょうか。
テストベンチ内のProcess文内で
エッジを検出してカウントさせる方法が思いつきません。
よろしくお願いします。
>>287 wait until CLK'event and CLK='1';
これで出来ました。
失礼しました。
289 :
774ワット発電中さん:2010/02/25(木) 00:47:49 ID:knIewJvt
みなさん読みやすさ重視で記述してます?
記述の段階で最適化(笑)かけちゃいます?
コピペの修正しやすさ重視でif文横に引き伸ばしちゃいます?
カウンタのbit[3]を使い回す時名前そのままでつなげちゃいます?
>みなさん読みやすさ重視で記述してます?
当然です。
>コピペの修正しやすさ重視でif文横に引き伸ばしちゃいます?
もちろんです。
可読性が最優先です。
一年後の自分は他人と同じ、
すぐ理解&メンテし易いように記述しておくのが吉
>>289 おれも
>>290と同じ。
「1年後の自分は他人」って、まったくその通り。半年でも。
if( count >= 4'b1001 ) begin count <= 0; end
else begin count <= count + 1; end
読みにくい例
if( count >= 4'b1001 )
begin
count <= 0;
end
else
begin
count <= count + 1;
end
単なるカウンタなのに、それだと両方読みづらい…。
294 :
drcoop:2010/02/25(木) 06:13:10 ID:bHhCiqJw
>>293 激しく同意。自分もそうだけど、センスなさ杉><
/*
教えてください。もう、わけがわかりません。
以下のソースをコンパイルするのですが、思い通りになってくれません。
0〜9までのcounter変数の、特定の1bitを取り出して、LEDを点ける回路を
書きました。シンセシスした後、回路図を表示させて確認しています。
下の例では、counterの2bit目を取り出そうとしていますが、wire変数LEDで取り出せないんです。
回路図を見ると出力LED自身が消されています。カウンタ回路部分はどの場合でも生成されています。
*/
module test (
input wire clock,
output wire LED
);
reg [3:0] counter;
always @ ( posedge clock ) begin
if( counter >= 4'b1001 ) begin counter <= 4'b0000; end // 9になったら、次回は0
else begin counter <= counter + 4'b0001; end // そうでなければ、++する。
end
// assign LED = ( counter[2] == 1'b1 )? 1'b1 : 1'b0; // パターンA) だめ 消えてしまう。
// assign LED = ( counter[2:2] == 1'b1 )? 1'b1 : 1'b0; // パターンB) だめ 消えてしまう。
assign LED = ( counter & 4'b0100 )? 1'b0 : 1'b1; // パターンC) OK
endmodule
A)では、coubterの2bit目を取りだして評価しているつもりです。本命だと思っていたんですが。
同様にB)では、counterの「2bit目から2bit目」を取りだして、取り出しています。
C)は、別法として疑問はありません。
なぜA)やB)の場合はだめなのでしょうか?
涙出てきました。宜しくお願いします。
>>295 counterが不定のままなんじゃなかろうか?
>>297 外にあるはずのalwaysの記述も、リセット記述も省いてるだけだろ。
>>296 // assign LED = ( counter[2] == 1'b1 )? 1'b1 : 1'b0; // パターンA) だめ 消えてしまう。
↑は、合成したら↓こうなったんじゃないのかな。
assign LED = counter[2];
>>297-
>>299 ありがとうございます。
リセットが書いてありませんでしたが、resetを書いても同じで、変でした。
counterの値も正しく加算されているようでした。
そこで、いろいろとやってみたところ、原因?がわかりました。
これを見てください。↓
http://mcnc.hp.infoseek.co.jp/cgi-bin/img-box/img20100226160605.jpg ISEの回路図表示が変のようです。RTLで見るとclockとLEDがあるのに、
それをダブルクリックして、その中身を見るとLED出力が無くなってる。
ここでビックリしていたわけです。
だけど、その状態でTechnology Schematicで見ると、ちゃんと出力はある。
試しにFPGAで動作させると、ちゃんと出力される。なんだかなぁ。
ISE不信になりそうです。
ありがとうございました。
Technology Schematicで消えるなら問題ありそうだが、RTLのはおまけのイメージが
>RTLのはおまけのイメージが
ユーザーはツールの出力するものすべてを信用してると思います。
RTLスケマの結果を大目にみると、合成結果もいい加減な結果を許容することになるし。
変なツール。要はバグではないかと思います。
Verilogで教えてください。2つあります。
1つ目
defpermやparameter=で設定する値は、
通常、ソースに即値で書き込んでコンパイルします。
これを、外部のスイッチの値を放り込みたいのですが、可能でしょうか?
SW on/off → "true"/"false" とか、
SW[3:0] → WIDTH値 とかです。
2つ目
親moduleから子moduleにセットできる通常のパラメータ値ですが、
さらに上の階層から指示することはできるのでしょうか。
親module → 子module → 孫module → ひ孫moduleをセット という感じです。
いくつも質問してすみません。よろしくお願いします。
>>303 1つ目
質問の意味が、ランタイムな変更という意味ならば、不可。
2つ目
可能。
>>304 ありがとうございます。
やはり、1つ目はだめでしょうか。
例えばPLLの分周比をスイッチの値によって、コロコロ変えたいのです。
そんな用例というか需要はないのでしょうか。ハードウェアで製作するPLLなどは、
DIP SWの値を読み込みながら、PLLのM/N値に反映させることはよくやるんですけど。
2つ目は、どのような記述になるのでしょうか。ぜひ教えていただけないでしょうか?
また、そのようなことは、どこに書かれているのでしょうか。
Verilogの文法書を見つけられないのです。
XilinxのXSTガイドは、それほど詳細に書かれてはいないし。
半導体研究センター?の本に載っているのでしょうか。
>>305 > Verilogの文法書を見つけられないのです。
> XilinxのXSTガイドは、それほど詳細に書かれてはいないし。
> 半導体研究センター?の本に載っているのでしょうか。
IEEEの規格書を買え。
>>305 「verilog IEEE standard」でググればPDFが見つかる。
Verilog-2001の規格名は、IEEE Std 1364-2001な。
>例えばPLLの分周比をスイッチの値によって、コロコロ変えたいのです。
>そんな用例というか需要はないのでしょうか。
alteraもxilinxも上位デバイスでは
そういう機能が付いてるPLLを内蔵してる
おれならマスタークロックは常に最速で
全レジスタにクロックイネーブル付けて
間欠動作させるかな
>>305 AlteraだとStratixII以降であればPLLの設定を変えられるよ。
Megawizardでそういうのがあった。
altpll_reconfigだったかな。
リファレンスデザインや資料もAlteraのサイトにあったよ。
Xilinxだと、Virtex4以上に、DCM_ADV(DCM Advance)に、
DynamicReconfigrationという機能がある。
Spartan3には無いので注意。
というか分周比をスイッチで切り替えれるようにしたらいいだけでは?
PLLどうこうじゃなくて、
parameterが静的なものか、
という認識の問題じゃないのか?
>全レジスタにクロックイネーブル付けて
笑うところ?
Spartan3でucfを書いたのに、ちっとも動かない。1日悩んだ。
よく見たら、Spartan3Aのピン配表を見ていた。がっくり。
けっきょく
>>300は、処理系のバグだったということで決着なの?
似たような現象に遭ったから気になっているんだけど。
仕様だろ?
wireで結んじまったので片方の名前が必要なくなって記載するの止めたってだけの。
シンセサイザに最適化させない程度に変なことしておくと同一と認識されずに残ると。
バグを仕様と言い張った「仕様」じゃなくて、
(賛否はともかく)そういうつもりで作ってるという意味で、仕様。
この程度でごちゃごちゃ言ってたらISEとつきあえないぜ。
ISE12.1が5月らしいが一体いつまで俺たちは有料βテスタなんだろう…
それは次のβテスタ(有料)の始まりですね、わかります
本屋さんの立ち読みで、自分の隣に立つ人って気になるな。
昨日の夜、名古屋のジュ○ク堂で、HDLの本をみていたオレの横に若者来た。
「おっ、こいつもHDLソフト屋か?」と思いつつ。すると手に取ったのは、リレーシーケンスの本。
「そうか、そうか、制御盤屋か」と思ったら、
次に手に取ったのが、ModelSimの本。さらに次は、SystemVerilogの本。
横の人が気になるオレ。
>>320 RFとかアナログとかメカ・素材系の若手が、
急にロジック系の勉強をするように言われて
右往左往しているような感じだな。
とある、CPU評価ボードを貰って遊んでるのですが、教えてください。
回路図を見ているとCPUと、USBホストデバイスや、ネットワークデバイスの間に、ザイリンクスのチップが入っています。
これの目的は、デバイスの切り替えなんだろうなと思いますが、
ふと疑問に思いました。
CPUからつながってるデバイスが一個の場合もこのチップは必要なのでしょうか?
タイミングの調整なんかもしてるのでしょうか?
チップのプログラム?もあったので読みましたが、不思議な言語でチンプンカンプンでした。
おそらくVHDLという言語なのかな?と思い、本を購入しようと思いましたが、
書店にはVHDLとverilogHDLという本がありましたが、これは別物でしょうか?
とりとめない質問で申し訳ないですが、
この勉強をしたい場合、なにの本がお勧めなんでしょう?
盛大な釣りじゃないか?
>CPUからつながってるデバイスが一個の場合もこのチップは必要なのでしょうか?
>タイミングの調整なんかもしてるのでしょうか?
って、そのチップが何をしているかに依るんじゃないか?
中身(プログラム)がわからないと、わかんないよ。
>書店にはVHDLとverilogHDLという本がありましたが、これは別物でしょうか?
言葉がちがうから、もちろん別物じゃないか?
>この勉強をしたい場合、なにの本がお勧めなんでしょう?
みんな「オススメの本ある?」って聞くけど、そんなもん個人の価値観だから、
どれも良いしどれもダメ。本屋さんで、少し読んでみて、簡単そうなやつを1冊だけ買ってくる。
その1冊を何度も何度も読む。そしたら次の本を買ってくる。また何度も何度も読む。
読んでいるうちに必ず中身がわかってくる。本とはそういうものです。
ネットの書込みやホームページのものは、最初はダメね。自分のお金を使って買ってくることに意義がある。
盛大な釣りか・・・そんな感じだ。
自分でなんとかしようという気が微塵も感じられないw
たぶん、モノにはならない。
> 本屋さんで、少し読んでみて、簡単そうなやつを1冊だけ買ってくる。
一通りのことが書いてある本を、ともかく理解できなくても読み通してから、
紹介のようなのに挑戦する。曖昧な記憶でも、最初の本は使える辞書代わりになる。
英語だの中国語だの、そんなのを辞書から始めるのは無理だけど、こういう言語モノは
そこまで覚える量は多くないから、使える手。
別にHDLなんてこれといった本買わなくても使えるけどな。
言語の本っていうよりもっと基礎的な物がを説明してる本の方がよいとおもう
コンピュータアーキテクチャのエッセンス
あたりはどうかな?
俺は買ってないけど
>>325 >別にHDLなんてこれといった本買わなくても使えるけどな。
そんなことないだろう。
reg [7:0] data [2:0];
8bitのregを、
3bitで表せる個数、つまり8個の配列を用意、かと思ったら
3個用意する、という意味らしいじゃないか。
そんなこと、なんでわかるんだ?
やっぱり本を見ないとわからんでしょ。
図書館から本借りれば本買わなくても使えるようになる、って意味なのかしら
>>327 2次元配列と思えば、要素数8には見えない。
>>328 >2次元配列と思えば、要素数8には見えない。
それはわかるけど、だったら素直に reg [7:0] data [3];
と、書かせれば良いと思う。
あえて[2:0]と書かせる理由がわかんないですよね。
だったら reg [8] data [3]; ではダメなのか?
reg [7:0] data; は、data を8個用意するだけだし。
とりあえず規格書を読め。
>>329 そう言う事じゃなくて、[7:0]って書くと8ビット
使えるように見えるってことじゃね?
VHDLだと(7 downto 0)って書くから明らかに「8個」ってわかるのに。
HDLスレの先生!これ、あまりのひどさにトラ技スレ手ではに負えません
どうか教育してやってください
http://science6.2ch.net/test/read.cgi/denki/1267108759/500 500 :774ワット発電中さん:2010/03/28(日) 03:01:42 ID:teNl6CtW
//
// ちょうど 真ん中だね。
//
module TRAGI (
input wire reset, // reset信号
input wire clock, // clock
input wire [7:0] DIP_SW, // ボード上のDIP SW
output reg [7:0] LED // ボード上のLED
);
reg [24:0] count; // counter
reg clock_0.5sec;
always @ ( negedge reset or posedge clock ) begin
if( reset == 1'b0 ) begin
counter <= 0;
clock_0.5sec <= 0;
end else begin
if( counter < 12000000 ) begin
clock_0.5sec <= 1'b1;
end else if( counter < 24000000 ) begin
clock_0.5sec <= 1'b0;
end else begin
counter <= 0;
end
end
end
reg clock_0.5sec_zenkai;
always @ ( negedge reset or posedge clock ) begin
if( reset == 1'b0 ) begin
LED <= 8'b1;
end else begin
if( clock_0.5sec_zenkai==1'b0) && (clock_0.5sec==1'b1) ) begin
// LED <= { LED[6:0], 1'b0 }; //
LED <= { LED[6:0], LED[7] }; // バーレルshifter
end
end
clock_0.5sec_zenkai <= clock_0.5sec;
end
endmodule
何やりたいんだろ。
今の記述だと、24Mクロック毎にLEDの点灯位置を変えたいように見えるが。
そもそもcountがcounterになってたり、countのインクリメントがなかったりで
こりゃ動くわけないわな。
reg [24:0] count;
localparam [24:0] INTERVAL = 25'd24000000;
always @(posedge clock or negedge reset)
if (~reset)
count <= 1'b0;
else if (count == INTERVAL - 1'b1)
count <= 1'b0;
else
count <= count + 1'b1;
always @(posedge clock or negedge reset)
if (~reset)
LED <= 8'b1;
else if (count == INTERVAL - 1'b1)
LED <= {LED[6:0], LED[7]};
>>333 >localparam [24:0] INTERVAL = 25'd24000000;
localparam って、何でしょうか?
parameter とは、違うのでしょうか?
あと、こんな書き方できるの?
module TRAGI (
input wire reset, // reset信号
input wire clock, // clock
input wire [7:0] DIP_SW, // ボード上のDIP SW
output reg [7:0] LED // ボード上のLED
);
>>334 基本的には同じ。
parameterの場合、呼び出し側から値を変更できるけど、
localparamの場合は変更できない。違いはそれだけ。
>>335 こんなって、どこのことだかわからんが、
特に問題ないだろう。
Verilog2001以降ならだが。
どうでもいいかもしれんけど
GTKWAVEがじりじりとバージョンを上げている・・・しぶい。
簡単な除算回路を作りたいと思っているのだけれど、引き放し法をどう記述したらいいのか…。
減算(加算)の結果を得るステート、とかシフトして新たに被除数作るステートとか分ければいいのかな。
このあたりのアルゴリズムを記述するスキル磨かないとだめね…。
大学の教授が研究して考え出した、
理解するのも難儀するアルゴリズムを
回路に実装するのって楽しいですよね。
私の場合は最初はベタ書きでも、無駄な処理サイクルがあっても、
とりあえずsim結果が期待値一致するところまで進めます。
その後の最適化は・・・無能なので・・・
作る予定の回路を人に伝えるためのスキルも必要・・・
ソフトウェアと比べて歴史は深いけどこの辺は浅い気がする。
>>340 タイガー計算機(機械式)割り算の方法の解説とか探してみれば?
カウンターオブジェクトと必要なメソッドがわかるぞ(w
あとは2進法に置き換えて実装するだけ。アルゴリズム最適化についてはシラン。
>>343 なるほど、検索かけたら出てきた。見てみようありがとありがと。
>>344 よし買ってきた。
ホスト規制かかっててレスポンス遅れたけどこの本いいね。
タイトルの胡散臭い感じがたまらんです。ありがとありがと。
module xxx ();
always @ ( ) begin
end
endmodule
GTKWaveってcygwin上でもbuildとINSTALLできるんかな。
gcc4.0になったせいで、コンパイルが通らないっぽいけど。
シミュレータモドキ作ってみたが、興味ある人なんて居るかな?
verilogをはしょったような言語(自分で考案した)で、
C言語のソースを吐き出してくれるのだが。
一応、VCDファイルで波形確認が出来る。
デバッガー募集のお知らせですか?
最近スレ荒れないな。おもしろくない。
規制まだ解けてないかな?
電子産業衰退で書き込み数減少だな
2chにURL貼られたバイナリなんか実行できるわけない
ソース出せ
それ、どんなツール?
教えてください
ISE + Verilogで、シリアルDAの駆動プログラムを作っています。
16bit,12bit,10bitとシリーズ化されたDAコンバータICで、12bitのものを
駆動しようとしています。送信bit数の共通化のため、
上位4bitは常時'0'で送りなさい、となっています。
ですので、reg [15:0] data; として変数を宣言して、送信します。
ちゃんと実機で動作はするのですが、
ISEは、変化しない上位4bitを見つけては、Warningを出します。
bit16〜bit12まで4bitあるので、ご丁寧に、4回も同じWarningを出してくれます。
そこで質問なのですが、このWarningを取るためには、どのようにすれば良いのでしょうか。
reg [11:0] data; として、bit16〜bit12は、処理上でゼロを送出するのでしょうか。
そんなもん、ほっときゃ大丈夫、という話もあると思いますが、
プロセスウインドウにWarningの△マークが付くのがイヤで、全部緑の○にしたいのです。
よろしくお願いします。
verilogの記述次第でどういうwarningが出るかが変わる
シリアル変換している所周りをちゃんと書かないと分からん
>>357 data[15:12]が、4'b0000に固定されているから、警告が出る。
reg data_reg[11:0];
assign data = {4'b0000, data_reg};
ってやればWarningとれるかも?
あと、XSTの設定で、そのWarning出さないようにできないのかなあ。
Warningなんて気にしてたらやってられないと思うんだが。
というかWarningが一つも出ないでコンパイル通った事(書き込みまで)のある奴いるの?
>>357 仕事してるとこの手の強迫神経症クンが一番たちが悪い
理由付けの出来るウォーニングはスルーすべき。
ライブラリIP使うだけでWarning出るしなあ。
無視していいのは無視すべき。
無視してるとどんどん増えて、大切なメッセージを読みこぼす事がありそうなので極力つぶしてる。
>>365 ありがち。
C言語でもgccの-Wallでワーニングでないのを基本にしてる。
リファレンスに用意されたプログラムが変数の初期化しないで通るループあって、
解析に手間がかかった経験あり。
渡した相手に突っ込んだら、とぼけやがったし、次にそういうのが無い様に要求したら
逃げやがった。
そういう相手と仕事していると、仕事の手間ばかりが増えて大変です。(涙)
細かいことはわからんのですが、黄△マークが出ているのが、とにかくイヤ。
全部緑○チェックマークにしたいです。
「Generate programming file」意外では、最近お目にかかったことがない。
ISEのverが上がるだけで△が出るし。もうXイヤ。Aに乗り換えようかな。
みんなISEのバージョンはいくつでやってる?
俺はこの間まで9.2だった。やっと10.1にしたところだ。
12.1でやってる人、いるのかなぁ。
メインは11、ノートに12が入れてある
先日10から11に変更したら、操作がゴロッと変わって戸惑ってる中。
Plan aheadでI/Oピン制約するとき、
1ピンずつ「Wクリック→ピンNo入力→Applyボタン」を繰り返さないといけない。
PACEのように表計算っぽく連続して入力したいのに、疲れる。
電圧の同じね。全部LVCMOS3.3Vにしたいのに、デフォルトが2.5Vになってる。
どこかに設定がないかと思うんだけど。使いにくくなった。
1個コピー>ペースト先複数選択>ペースト
で、コピペできたと思う。
>>371 ありがとうございます。
>1個コピー>ペースト先複数選択>ペースト
この「1個」というのは、何を指すのでしょうか?
PlanAheadの、
・画面の下部の表計算っぽい表示のところでは、「1個」選択仕様と思っても「1行」単位でしか選択出来ません。
・画面左中の「PackagePinProperty」では、表形式の表示を触ることすらできないのですが、
どうでしょうか?
373 :
774ワット発電中さん:2010/06/07(月) 13:42:42 ID:OPCH6Ee7
>>366 >ワーニングでないのを基本にしてる。
鰐がどーしたって?
374 :
イザベラ*アイリス:2010/06/07(月) 18:08:21 ID:Oip0qjpn
****************************
****************************
****************************
http://sakutuu.ddo.jp/sakura2/sanka.asp さくら通信で俺は名古屋の人と交渉する
情報を無料であげよう
しかし私は夜の6時から11時の間だ
ほぼ毎日出現している
私ができるのは
無線と増幅とCPUとVHDLなどのデジタル工学だ
分かりやすく簡単に説明する
****************************
****************************
****************************
↑ 仕事が無くなって新しい取引先でも探しているの
376 :
sage:2010/06/11(金) 13:18:51 ID:QdBkcztn
そういえばVerilogの設計のことをプログラムっていうんだっけ?
どう見てもハードだという結論だけどな。
ソフトと言ってる奴はただ煽ってるだけじゃん。
どうみてもソフトだと言う結論だけどな。
ハードと言ってる奴は無知なだけじゃん。
回路図は絵画、実際の電子回路は彫刻だから、デジタル回路は美術の括りだな。
実際、アートワークっていうしな。
言語化できたら、ハードウェアもソフトウェアとして扱えるわけだ。
まあ、本来のハードウェアって、ヤカンとかフライパンとかだからな。
HDLは、ソフトウェアです。
電源電圧変動も、環境温度も、ノイズも関係のない、クリーンな世界で
プログラム記述次第でなんとでもなる、
これをソフトウェアと言わず何と言う?
チームで仕事してるときに必ず言う。
「えっ、パターンミス? 勘弁してよぉ○○ちゃ〜ん」
オシロもロジアナもがあるんだから、
ハード設計者なら自分で信号追って解決して見せろよ。
HDL屋さんでも内部の遅延(タイミング)設計くらいはするんじゃないの?
それとも実チップにフィティングとかしない人もいるのかな。
うちんとこは基板に実装して動かすまでするけど
コンパイル結果の確認ぐらいするだろ
DCでやるか、FPGAにするかは別にして
バグ取り前に、ある程度のあたりを付けるため、
一発だけコンパイルかけるとかはやるけどね、普通。
チームリーダのやり方次第ではあるが
HDLでシミュレーションした結果、ロジック的な誤りは無いので、
電気的な要因を探って、電源の問題を見つけたり、
やはり、HDLでシミュレーションした結果、ロジック的な誤りが無く、
ファームの誤りである事を見つけたりした俺は、
ソフト屋なのかハード屋なのかどっちでしょうか?
386 :
774ワット発電中さん:2010/06/12(土) 16:36:44 ID:NAUEMUM0
@Vengineer
デバグはやれる人がやるだけだろう。
うちは回路設計(ボード)とかファームもやる人がRTLもやるから、
そのソフト屋ハード屋という区別はないな。
ASICで100人超の大規模設計やってる人は、
RTLで閉じるかもしれない。
そういうのと小規模FPGAと比べてもしょうがないだろう。
そもそも実機とか無いし。
>>387 なるほど。
ちなみに、RTL設計と実機デバッグしていたのはASICのごく一部だった。
389 :
774ワット発電中さん:2010/06/13(日) 16:02:11 ID:8dpgnMpm
ソフトだ、ハードだって話、もういいよ。
HDL書きはソフト屋に決まっているから。
荒らそうと必死な馬鹿は市ね。
HDL書く奴はソフト屋って言われて不名誉なのかな。
どうみてもハード屋とは言えないし、別に問題じゃ無いと思うが。
また嵐がきたか
>>392 今すごい勢いでテレビにも雑誌にもバンバン出てるよね!
万博のコンサート、中止になっちゃったね。
あらら、あっちのスレでフルボッコにされた恨みをこっちのスレでぶつけてるのか。
可哀そうな奴。
397 :
774ワット発電中さん:2010/06/15(火) 10:30:14 ID:nHiSV1aX
round_前半_|~|_|~|_|~|_|~|_|~・・・・
round_後半___|~|_|~|_|~|_|~|_・・・・
こんな信号を作ろうと思ってるんですが
良い信号名ありませんかね?
俺ならこう付けるってのを教えて下さい。
398 :
のうし:2010/06/15(火) 14:38:08 ID:Ei3v2OT5
信号名は波形じゃなく機能や用途で付けようぜ
round_zen
round_kou
400 :
774ワット発電中さん:2010/06/15(火) 19:38:33 ID:hWgSnxqG
コンパイルするとインプットが使われていないので消します、といわれます。
なにがいけないのでしょうか。
port(
S1:in std_logic;
T1:in std_logic;
D1:out std_logic;
)
...
signal X1:std_logic;
process(S1,X1)
begin
if(S1='1' and 1='1') then
X1<=X1+'1';
end if;
end process;
>>400 コンパイルするとインプットが使われていないので消します、といわれます。
なにがいけないのでしょうか。
port(
S1:in std_logic;
T1:in std_logic;
D1:out std_logic);
...
signal X1:std_logic;
process(S1,X1)
begin
if(S1='1' and T1='1' and S1'event) then
X1<=X1+'1';
end if;
end process;
センシティビティリスト
>>402 レスありがとうございます。
process(S1,T1,X1)でしょうか??
X1はセンシティビティリストに入れちゃダメでしょ
なんでですか?
D1をドライブしてる人は?
port(
S1:in std_logic;
T1:in std_logic;
D1:out std_logic
);
...
signal X1:std_logic;
process(S1,X1) begin
if(S1='1' and T1='1' and S1'event) then
X1<=X1+'1';
end if;
end process;
Verilogしかわからないオレがエスパーしてみる。
X1が変化したら中身を実施するよ!と言っている中に、X1がいるのって
おかしくないか?
関係ないけど、D1はどこにあるの?
>>404-407 ありがとうございます。
今日process(S1)とprocess(S1,T1)で試してきます。
中身が変化したら実行という意味ではprocess(S1)でいいと思ったんですが、
先生がX1もいれると言っていたような気がしていました。
>>407 すいません。
X1はstd_logic_vector(3 downto 0);で
if(X1="0000")then
D1<='1';
というような感じになっています。
もしかしてこれがおなじprocessだったらprocess(S1,X1)で
別プロセスだったらprocess(S1)とprocess(X1)ということでしょうか。
何かすごい誤解があるようだから、コードを勝手に切りだすのではなくて
全コードを貼るなりうぷするなりしてくれ
>>409 基本が判っていないみたいだね。
S1がクロックでステート動作したいのであればX1は要らない、というかあったらエラーでない?
412 :
774ワット発電中さん:2010/06/16(水) 10:25:07 ID:YvhxCa8n
学校の宿題関係なら、なぜ先生に聞かないんだ?
その理由を教えてくれ
悪いこと言わない、「わからない」とちゃんと言ってもう一度先生に教えてもらった方が良い。
この問題を解くことが目的ではなく、あなたがちゃんと理解することが目的だから。
>>397 round_pos
round_neg
かなぁ。エッジと間違えそうだけど。
か、round_first round_second .....
はいはい亀レス
>>398-399 >>414 ありがとう。参考にします。
>波形じゃなく機能や用途で付けようぜ
おっしゃる通り機能通りの名前でございます。
前半とか後半の英語をどうしようかと。
後半のことを英語でsecond halfと言うらしい。
>>409 スレ無駄に消費するから情報の小出しはするな。
問題部分を単純化して短くして全文貼り付けるか、
長ければどこかにアップロードせよ。
コンパイルとは何か?(合成?シミュレータにかけるためのコンパイル?)
ツールは何か?
正確なエラーメッセージは何か?
やりたいことは何なのか?
"インプットが使われていないので消します"
基本的に入力信号の変化が出力に現れない場合、
最適化されて回路そのものが出来ない。
>>401 の例だと、X1の変化が何らかの出力信号として外に出ていなければ、
そういった内容のメッセージが出るかもしれない。
>>409 これによるとX1の変化によって外部出力のD1も変化するようだから、
今ある情報では見当がつかない。
>if(S1='1' and T1='1' and S1'event) then
上記は次のどちらとして解釈されるか言語上は未定義。
1.
if (T1='1')then
if(S1='1' and S1'event) then
2.
if(S1='1' and S1'event) then
if (T1='1')then
出来上がる回路が違うのでそのような記述をしてはいけない。
>>417 >>410-413 すごく分かりやすい説明をありがとうございます。m(_ _)m
先生の説明はまったくわからないので途中で聞くのを止めました;;
今日もういちど試して来ます。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity VHDLQ265 is
port(sw1,dip1:in std_logic;--sw1(CLK),dip1(on/off)
tr1,tr2:out std_logic--;tr1(16^0の桁),tr2(16^1の桁)
a1,b1,c1,d1,e1,f1,g1:out std_logic);--デジタル表示
end VHDLQ265;
architecture Behavioral of VHDLQ265 is
signal X1:std_logic_vector(3 downto 0);
signal X2:std_logic_vector(3 downto 0);
begin
X1<="0000";
X2<="0000";
process(sw1)
begin
if(dip1='1' and sw1='1' and sw1'event) then
if(X1="1111") then
X2<=X2+'1';
end if;
X1<=X1+'1';
end if;
end process;
process(X1)
begin
tr1<='0';
tr2<='1';
if(X1="0000") then--dip1='0' and dip2='0' and dip3='0' and dip4='0') then
a1<='0';
b1<='0';
c1<='0';
d1<='0';
e1<='0';
f1<='0';
g1<='1';
elsif(X1="0001") then--dip1='0' and dip2='0' and dip3='0' and dip4='1') then
中略
process(X2)
中略
end if;
end process;
end Behavioral;
>>418 xilink社のツールでコンパイルすると
synthesis
translate
Fit
generate program
のうちFitだけwarningがでます。
WARNING:Cpld:1007 - Removing unused input(s) 'dip1'. The input(s) are unused
after optimization. Please verify functionality via simulation.
WARNING:Cpld:1007 - Removing unused input(s) 'sw1'. The input(s) are unused
after optimization. Please verify functionality via simulation.
WARNING:Cpld:1006 - Design 'vhdlq265' has no inputs.
if(dip1='1' and sw1='1' and sw1'event) then
if(X1="1111") then
X2<=X2+'1';
end if;
X1<=X1+'1';
else
X1<=X1+'0';--<==この一文をいれて試してきます。
end if;
m(_ _)m
コンパイルよりもまずはSimulationしてみるべき。
その記述だとX1とX2が常時"0000"になるんじゃね?
>>418 VHDLはすべてのロジックを記述するのがお約束。
elseは必ず書きましょう。
process(sw1)
begin
if(dip1='1' and sw1='1' and sw1'event) then
if(X1="1111") then
X2<=X2+'1';
else
X2<=X2;
end if;
X1<=X1+'1';
else
X1<=X1;
X2<=X2;
end if;
end process;
>>420 教授の中に
4年の時しかVerilog使わせないのにシミュレーションさせても仕方ない
とかいう理由でFPGAでの動作検証しかさせてない人を思い出した。
ひょっとするとこのVHDLの学生さんはそういう人の下かもしれない。
そういやVHDLのシミュレーションとか忘れたなぁ・・・
>>422 マスクを作る前に、シミュレーションで、ある程度の検証出来るのが
HDLを使うメリットの一つだけど、それを飛ばしちゃよろしくないな。
FPGAでやるのも悪くは無いけど、実際のチップとは違う部分があるから、
できれば、アナログセルとかメモリセルのモデルを組み込んだシミュレーション技法まで、
今の教育課程では入れた方が良いと思う。
アナログセルの挙動は、馬鹿には理解出来ないだろ。
賢くても、結構経験が必要だろうし。
馬鹿でも分かる内部回路のみにしておくのが有用かな。
>>418 正直基礎からやり直したほうが・・・
一応エスパーしとく。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity VHDLQ265 is port
( sw1,dip1:in std_logic;
tr1,tr2,a1,b1,c1,d1,e1,f1,g1:out std_logic
);
end VHDLQ265;
architecture Behavioral of VHDLQ265 is
signal X:std_logic_vector(7 downto 0);
signal tr:std_logic_vector(1 downto 0)
signal dig:std_logic_vector(6 downto 0);
begin
tr1 <= tr(0); tr2 <= tr(1);
a1 <= dig(0); b1 <= dig(1); c1 <= dig(2); -- 略
tr <= "00"; -- trのタイミングを何で作るのか想像できん。
process (sw1) begin
if(sw1='1' and sw1'event) then -- チャタリング心配
if (dip1='0') then X <= (others => '0');
else X <= X +1;
end if;
end if;
end process;
process(tr,X)
variable a : integer;
begin
if (tr="01") then a := conv_integer(X(3 downto 0));
else a := conv_integer(X(7 downto 4));
end if;
case(a)is
when 0 => dig <= "0000001";
when 1 => dig <= 略;
when others => dig <= 略;
end case;
end process;
end Behavioral;
>>420-422 >>424-425 ありがとうございます。elseつけてできました。
数字を表示するパーツに電源を供給するためにトランジスタ(tr)をLowにする必要がありました。
チャタリングしました;;
caseの方が並列に処理できるので良いのですね。
みなさんに授業してもらったほうが遥かに分かりやすかったです。
ありがとうございましたm(_ _)m
> caseの方が並列に処理できるので良いのですね。
これってつまり、
>>389ってこと?
>>426 教える側が糞だとしても、分からないことを人のせいにするな。
VHDLに関する情報はあちこちに溢れている。
君が分からなくとも教える側は痛くもかゆくも無い。
自ら調べる癖を付けよ。
教えてください。
XilinxのISEで、ver10の時に問題なく通ったプロジェクトが、
ver11でやってみると、いきなりSyntaxエラーが出てしまいます。
言語はVerilogです。
エラーの内容は、「変数の2重定義」だとか「`ABC」が定義されていないとかです。
top.vで、AAA.v BBB.v CCC.vをincludeする要に記述してあります。
module top (...)
wire W1;
reg r1;
:
:
`include "AAA.v"
`include "BBB.v"
`include "CCC.v"
endmodule
エラーの内容は、AAA.vやBBB.vを単体で文法チェックしたようなエラーで、
「AAA.vの中で、W1が定義されていない」とか
「BBB.vの中で、r1が定義されていない」とかです。
なんで? top.vの最初に宣言してあるじゃん!!!と思うのですが。
僕が何かおかしな勘違いをしているでしょうか?
宜しくお願いします。
>>429 プロジェクトへのファイルの登録順じゃない?
>caseの方が並列に処理できるので良いのですね。
w
>>429 もしAAA.vとかBBB.vをプロジェクトに登録してるなら
外してtop.vだけにしてみるとか?
あと、単独でコンパイルできないファイルの拡張子は
他と区別するためにvhのほうがいい気がする。
まあ、好みは人それぞれだろうけど。
>>429 include文の中に回路記述はあんまり書かないかなぁ。
defineとかparameterぐらいしか
エラー文から推測してるけど、そういうことしてなかったらごめん。
>>429 端折って書いてるから分からんが、トップはゲートレベル記述?
ならincludeじゃなく
マズタ名 インスタンス名(接続)と書けば問題ないのでは?
>>435 ↑みたいに書いたら、「3行でまとめろ」って言われるぜ
verilogで、C言語のプロトタイプ宣言のような記述は出来ないでしょうか?
「このインスタンス名は今回初めて登場だけど、
あとで出てくるから、この場は見逃してね」
みたいな。
以前のverのISEで作成したucfファイルを ISE11でインプリメントすると、
エラーがメチャメチャ出ます。PaceのucfはPlanAheadだと理解できないのでしょうか?
変換するツールとかあるでしょうか? みなさん、どうしていますか
>>431 普通に出来るだろ。
てかプロトタイプ宣言に代わるものすらいらない。
Cに置き換えて考えるのはやめた方がいい、マイコンの記述言語とHDLは根本的に違うから。
SystemCでもやってろ、ってことですね、SystemCについて詳しく知らんけど。>Cとは違うんだよ、Cとは!
Cを知ってるからSystemCならHDLが書けるぜと思ってる馬鹿はそれでいいんじゃね?
論理合成で挫折するのが目に見えてるけどなw
Cのフロントエンドプロセッサを噛ませば、マクロレベルでの細工はできそうだけどな。
まあ、Cのじゃなくても、テキスト編集系のスクリプト言語処理系でもいいけど。
verilogなら`ifdefがあるから、条件コンパイルもできるから、そんな必要性はない気もするけど。
やればできるけど、そんな必要性を感じるほどHDL書いてないしなあ。
C言語で書いたアルゴリズムをVHDL化したいのですが、
まずは浮動小数点数で記述しているところを、固定小数点で書き直して、
必要なビット幅を詰めていきたいと思っています。
そこで、固定小数点数演算の考え方や注意すべき点などを整理したく、
参考になる書籍やWebサイトをご存知でしたら教えてください。
よろしくお願いします。m(_ _)m
整数演算からやり直しませう
固定小数点は、パーセントとかPPMで計算するのと同じですよ。
他の系とのインターフェース(パーセントなら系に入る時は100倍し、系を出る時は100で割る)さえ気を使えばよくて、
系の中では整数演算そのものですよ。
扱う数値範囲に応じて、小数点の位置を変えてみたりするとかですかね。
446 :
443:2010/06/25(金) 00:31:43 ID:uABfpEqy
>>444-445 ありがとうございます!
本質的には整数演算、ということなんですね。
あとは計算過程でのオーバーフロー、アンダーフロー、小数点位置の調整(常にQ何表記なのか意識)に
注意といったところでしょうか。
C言語ソース上での固定小数点化をスムーズに行うため、
固定小数点数クラス型を作ろうかと画策中です。
コンストラクタでビット幅、小数点位置を指定するようなもので、
=、*、/といった演算子はオーバーロードすることで、固定小数点化ならではの処理をクラス内に
隠蔽してやろうという魂胆です。
このようなクラス型を用いれば、既存のCソースのfloat型宣言記述を「CFixed」みたいに書き換えるだけで、
固定小数点化の効果を検証できるのではと思っています。
型宣言部以降の演算部分は書き換えることがないので、間違いが起こりませんし、
各固定小数点数のビット幅をランタイムで変化させながら効果を検証するといったこともでき、
調整の効率が高まるのではないかと期待しています。
ありがとうございました。
>>446 必要な最大bit数は扱う値の最大値と演算の内容で求め、
そこからどのくらい削るかは仕様から決める、という感じですかね。
自分もそういうクラス作ってます。C++が多いです。
bit精度の検証とか演算回数の計測とか検証用データの作成とかに
使ってます。
CからRTLをぽいっと出すツールはたけーもんなぁ・・・
動くかどうかわからんし
あまり普通には動かないだろ
多分シミレーションは出来ても合成出来ないだろ。
「固定小数点数クラス」でググったら
独自実装した話が大量に引っかかる
452 :
443:2010/06/27(日) 01:12:00 ID:GbRRaOeG
>>447 >必要な最大bit数は扱う値の最大値と演算の内容で求め、
>そこからどのくらい削るかは仕様から決める、という感じですかね。
なるほど。
とても参考になりました。
ありがとうございます。
>自分もそういうクラス作ってます。C++が多いです。
おお、クラス作られたんですね!
>bit精度の検証とか演算回数の計測とか
なるほど、クラスにすればそういうことが可能ですね。
こういった機能も取り入れたいです。
>>448 3社ほど評価使用しましたが、便利そうでした。
結局、不景気と値段が高いのとで不採用になりましたが・・・
でもVHDLでガリガリ組む経験もしたかったので、別によかったかなと。
>>451 ほんとですね。
これは参考になります。
ありがとうございます。
教えてください。
FPGAで、Verilogで、duty50%の1/3分周器を作りたいと考えています。
普通に考えると、
always@( posedge clock ) begin
if( count==2 ) begin
count=0;
end else begin
count++;
end
end
assign out=(count==0)? 1'b1 : 1'b0;
とかになると思うのですが、これだとdutyが1:1になりません。
assign out=(count==1.5)? 1'b1 : 1'b0;
だと50%になりますが、1.5はできないと思います。
どのようにすれば良いでしょうか。
通常のFFを使う限り、dutyが1:1のを作るのは不可能。
また、クロック目的でassignで生成した出力を使うと
ヒゲが出たりして痛い目にあう。
count[1]が2の時だけ'1'なのでそれを使うのがお勧め。
ありがとうございます。
やっぱり_っぽいですよね。
書き込んでから考えたのですが、
00→01→10→00→・・・を、
000→001→010→011→100→101→000→・・・として、
0,1,2→H、3,4,5→Lで、50%になることがわかりました。
早速やってみたのですが、恥ずかしくて結果が書けません。(悲)
それは6分周だろ。w
FPGAで禁じ手のRS-FFを使えば50%に近いのを作れるが、
入力クロックのdutyとdelayばらつき次第で微妙に比率が変わる。
6分周でも 1=>6としてMSBを使えばFFからの直接出力が可能となる
duty33%とduty66%の信号を交互に出して、
外部回路でローパスかけたら、それっぽくなんないかな?
459 :
458:2010/07/05(月) 21:52:38 ID:0OaxSJ+W
いまエクセルの罫線で、タイミングチャートかいてみたら、
全然それっぽく無いと分かった。
duty33%の3分周信号Aと、
信号Aを半相ずらした(立下りエッジFFで作成)信号Bを作り、
AとBをorして出力するとか。
みんなで意見を出し切った頃に質問者が一言。
「31KHzの信号作りたいだけなんだけどね。」とかないかな?
みなさん、ありがとうございます。
現在の周波数のままで、「1/奇数」のduty50%は、難しいことがわかりました。
DCMのFXで2倍して、FFで1/2がいいみたいですね。が、CPLDにはDCMは無いことも判明。
だるまさん状態です。
みなさん、いろいろと考えてくれて、ありがとうございました。
>>461 31kHzだとおいしいことがあります?
僕は、3MHzくらいの周波数でしたが。
RS-FFを使えばこんなのが出来るが、RSのところだけ外部に出さないと弾かれるかもね。
(デバッグしてないので動きが変かもしれないが)
always@( posedge clock ) begin
mctr <= {~&(mctr[1:0]),mctr[1]} ; // 3-count
end
always @( negedge clock ) begin
ctr1 <= mctr==2&b01 ; // half-clk-delay
end
assign ckrst_x = ~({mctr,ctr1}==3'b011 ;
assign ckset_x = ~({mctr,ctr1}==3'b110 ;
// rs-FF
assign rsff_r= ~({rsff_s,ckkrst_x}==2'b11) ;
assign rsff_s= ~({rsff_r,ckset_x}==2'b11) ;
464 :
774ワット発電中さん:2010/07/06(火) 10:50:25 ID:+UaWFo9N
>>462 >>461では無いが
> 僕は、3MHzくらいの周波数でしたが。
21.47727MHz位のクロック使ったら?
>>456 > FPGAで禁じ手のRS-FFを使えば50%に近いのを作れるが、
> 入力クロックのdutyとdelayばらつき次第で微妙に比率が変わる。
そこまで求めてなさそうな・・・・
何、その禁断の秘術みたいなの!?
何かカッコイイw
D-FFだけでも出来そうだが。
>>453 always@( posedge clock ) begin
if( count1==2 ) begin
a <= '0'
count1=0;
end else if( count1==1 ) begin
a <= '1'
count1++;
end else if( count1==0 ) begin
a <= '0'
count1++;
end
end//'a'は2クロック目の立ち上がりのみ1を出力
always@( negedge clock ) begin
if( count2==2 ) begin
b <= '1'
count2=0;
end else if( count2==1 ) begin
b <= '0'
count2++;
end else if( count2==0 ) begin
b <= '0'
count2++;
end
end//'b'は3クロック目の立下りのみ1を出力
c <= a or b//'c'は「2クロック目の立ち上がり」と「3クロック目の立下り」で'1'
always@( posedge c ) begin
out <= not out;
end//'c'の立ち上がりでoutを反転
これで1/3になんね?wwwwwwwwwww
>「1/奇数」のduty50%は、難しいことがわかりました。
1、ポジクロックでカウンター回す。
2、ネガクロックでカウンター回す。
3、ポジ、ネガの立ち上がりエッジをOR取ってそれを1/2分周すれば一応1/奇数のDuty50%
は実現できる。
この時ネガのカウンターは変則にする必要がある。
あれ、書いてる間にダブったかな?
>>468 verilogよく分からんのだが、
↓これじゃだめなの?
always@( posedge clock ) begin
if( count==2 ) begin
count=0;
a <= '1'
end else begin
count++;
a <= '0'
end
end
always@( negedge clock ) begin
b <= a
end
out <= a or b
やや感動したので整形しとく
module div3(
CLK,
RST_X,
ENB,
CLK_DIV3_OUT
);
input CLK;
input RST_X;
input ENB;
output CLK_DIV3_OUT;
reg [1:0] Q;
reg [1:0] Q_neg;
wire Q_num2;
wire Q_neg_num2;
always @(posedge CLK or negedge RST_X)
begin
if(!RST_X)
Q <= 2'd0;
else if (ENB)
begin
if(Q_num2)
Q <= 2'd0;
else
Q <= Q + 2'd1;
end
else
Q <= Q;
end
always @(negedge CLK or negedge RST_X)
begin
if(!RST_X)
Q_neg <= 2'd0;
else
Q_neg <= Q;
end
assign Q_num2 = (Q == 2'd2);
assign Q_neg_num2 = (Q_neg == 2'd2);
assign CLK_DIV3_OUT = Q_num2 | Q_neg_num2;
endmodule
・・・空白うまく出てなかったらごめん
474 :
774ワット発電中さん:2010/07/08(木) 20:16:33 ID:mUfKUoGV
assign clkx2 = clk ^ !clk;
みんな気にせずnegedge使っているけど、
元のクロックのduty 50%は保証されてるの?
PLL通して1/2分周したクロックならDutyは保障されてるけど。
ステートマシンについての質問です。
ムーア型ステートマシンを記述するときalwaysを3つ使い
状態決定部、状態保持部、制御信号出力部に分ける理由なんですか?
なぜすべてをまとめて1つにalwaysで記述しないほうが良いですか?
わかりません
「組み合わせ回路」と「順序回路」の違いに関してなんですが、
ラッチが付いた回路は組み合わせ回路でしょうか?
だとすれば、フリップフロップが使われる=順序回路という自分の考え方は訂正しないといけません・・・
ラッチとFFは違う品
485 :
483:2010/07/17(土) 15:54:01 ID:J1+JNm5o
>>484 ありがとうございます。
FFはより原始的な構成要素であって、それの使われ方によって
DFFやラッチ等となる、という印象を持っています。
>>483 フリップフロップが使われる=順序回路
これは「=」ではないよ。
同期回路は?
488 :
483:2010/07/17(土) 17:23:37 ID:J1+JNm5o
>>486 やはりそうでしたか。
すっきりしました!
>>487 特に何と同期するかを明記しない場合、「クロック信号と」同期する回路を指すと理解しています。
世の中にはクロックを用いない論理回路も存在する
RS-FFみたいなので値を保持しつつ、スパゲティ式に値の加工を伝播させて…という形で
データ駆動型等で書かれているはず
>483が何と何をどう区別したいかが今ひとつ不明
この場合のラッチってトランスペアレント型ラッチのこと?
どっちにしろFFなりラッチなり入ってれば、もう組合せ回路ではなよ
491 :
483:2010/07/18(日) 01:47:58 ID:XehrasD0
>>490 はい、トランスペアレント型のことです。
>どっちにしろFFなりラッチなり入ってれば、もう組合せ回路ではなよ
うーん、やはり「以前の状態が絡む回路」ということで「順序」回路になるんですかね・・・
VHDLを勉強していて、process〜end process外に書かれた回路はすべて組み合わせ回路になるという
解釈でいいのかな?という疑問が湧いたんですが、ラッチが生成されることがあり、これをどう捉えるかで
上記解釈の成否が変わると思ったので気になりました。
ちなみに、process〜end process内に書かれた回路は書き方によっては組み合わせ回路が生成されることもあり
(コンパイラの最適化?)、常に順序回路が生成されると考えないほうがいいと解釈しています。
>>491 クロックイベントを書いて組み合わせを作ることはないと思うが?
勿論クロックイベントが無ければ組み合わせorラッチになるが、基本的に同期回路設計ではラッチは悪だしなぁ
>>493 そのページのテストベンチ31〜34行目でやってるような感じでインスタンス化し、
読み書きする信号線に結線してあげればOK。
VHDLでのインスタンス化記述のサンプルはMegaWizardが吐き出してたと思う。
>>491 process文はVHDLの言語の構文であって、
FFを作るかどうかはprocess文には直接関係が無い。
VHDLのソースを読んで合成ツールが勝手にFFを類推しているだけ。
VHDLの構文は同時処理文であるから、文がソース中どこにあっても全く同じ意味になる。
a<=b;
b<=c;
と書いても
b<=c;
a<=b;
と書いても同じ意味。
process文は上から順に解釈させたい場合に使用する。
文がどの位置にあるかで意味合いが異なってくる。
process(b,c,x,y)begin
if(x=y)then
a<=b;
else
b<=c;
end if;
end process;
と
process(b,c,x,y)begin
if(x=y)then
b<=c;
else
a<=b;
end if;
end process;
とでは意味が異なる。
上から順に解釈すべきif文は結果的にprocess文中にしか存在しえない。(generateとか例外があり)
FFをVHDLで表現するには、if文やwaitといった順次処理的構文でしか表現できず、
都合VHDLでFFを合成ツールに類推させる場合、必ずprocess文を使うことになる。
496 :
483:2010/07/21(水) 00:56:09 ID:JYcY4CAz
>>492 基本、process文はClkをセンシティビティにして書くべきということですね。
しかし、process外のコンカレント部でもwhen〜elseの記述内容によってはラッチができてしまいます・・・
気を付けなくては。
>>495 詳細な説明、ありがとうございます。
あれから勉強を続けて、メモリの生成方法を学びました。
そこではコンパイラにどのようなメモリ(分散メモリ、ブロックメモリ)を推測させるかというのがポイントに
なると知りました。
この「推測」って、メモリ以外でも重要ですよね。
教えていただいたことも参考に、どのような回路ができあがるのか常に意識しながら記述したいと思います。
ありがとうございました。
gtkwaveがwindows7-64bit上で動いてくれない・・・誰か助けて下さい
本体は公式ページので、
gtk+_2.20.0-1_win64.zipとzlib_1.2.3-2_win64.zipの中身をつっこんだんだが
正しく起動できませんでしたになってしまう。。。
何故素直にModelsim使わない?
32bit版のDLLで普通に動いた・・・
gtkwave自体が32bitだったのかw
完全にスルーしてました。お騒がせいたしました
>>498 素直な選択肢がなぜ Modelsim なんだい?
メンターの暴利主義が気にくわないので、おれはModelsimのメンテナンス契約、更新しない。
EDAベンダーなんてどこもそんな物だろ
商売だからね・・・
ケイデンスはもっと滅茶苦茶。
505 :
774ワット発電中さん:2010/07/27(火) 07:57:21 ID:mphPN1WR
しのぷしすなんて・・・
教えてください。
Verilogを勉強していますが、本で、次のような記述を見つけました。
wire a = (cnt>=9) & carry;
これは、
wire a;
assign a = (cnt>=9) & carry;
と同じと考えれば良いのでしょうか?
同じ
大昔なら、ツールによってはそういう記述をサポートしてないこともあった
ありがとうございました。
これは便利そうなので、今後使おうと思います。
ちなみに、regでは使えないでしょうか?
always(....) begin
if( posedge RESET==1'b0 ) begin
reg [3:0] a <= 4'd12; // ここで宣言して、いきなり初期値代入
end else begin
a <= a + 3'd1; // count up
end
end
みたいな。
あんまりお勧めしないよ
予め宣言して無いと変なバグの元になる
あと、そういう部分の記述についてはプロジェクト毎のルールとかもあるかもしれないね
ソフト屋はそういう変な記述しtがる子が多いね。
普通に書いた方が見やすいし、引き継ぎも楽’なのに。
あと記述くらsinpryfiでもダウンロードしてコンパイルしてみりゃ分かるだろうに。
みなさん、ありがとうございました。
やっぱり、やめときます。
変数を見て、これって何bit?と思ったときに、ソース中を探さなくても、
ソースの先頭の方にまとめて書いてあった方が、スグにわかりますね。
横着をせずに、もっと精進したいと思います。
ありがとうございました。
>>512 それは、
a[3:0] <= a[3:0] + 3'd1;
て記述する。
Verilogの$dist_normal(seed, mean, std)について教えてください.
この関数は戻り値がinteger型な仕様のせいで,
指定した標準偏差の白色ガウス雑音が精度よく得られません.
戻り値がreal型だったら全く悩まなくていいところだと思うのですが,
何かいい解決方法をご存知の方はいらっしゃいませんでしょうか?
casexとcarsexって似てるな
どちらか、もしくは両方に、かなり強い思い入れがあるから、そう思うのでしょう。
某マンデータのボードにはSDRAMが張り付いているんで、それを使いたいが、
SDRAMコントローラがない。どこかにSDRAMのフリーIPはないでしょうか?
お前のパソコンの中に入ってるだろ
SDRなら自分で書いた方が楽だと思う
初心者ならサンプルコード付きのボードを手に入れた方がいい。
少しは経験があるのなら、OpenCores だな。
523 :
774ワット発電中さん:2010/08/19(木) 19:53:33 ID:Uum69Jif
SDRAMコントローラは、けっこう難しい。初期設定が・・・・・
SRAMに逃げた。
> SDRなら自分で書いた方が楽だと思う
DDRだと、どう書いていいのかワカラン。
両エッジなんて・・・倍速のクロックを調達してくるのかな?
悩むところか?ADC,DACもDDR多いだろ。
>>524 入力側はposedgeとnegedgeのペアで解決
出力側は切り替えで対処…かな
どちらにしても、端子側のところに専用のI/O無いと速度的に満足できないだろうね
SDRにしても FPGAではそういう指定できるはず…かな
SDRはクロック以外は汎用I/Oで全然OKだよ
試しに使うレベルで、全力で動かす必要もないし。
3.58MHzぐらいでぼちぼちやればいいよ。
FPGAだがAlteraのQuartus使えば、
SRAMよりSDRAMの方がむしろ簡単。
HDDの容量を食うけど落として試してみればいい。
確かに悩むのがアホらしくなる。
>>531 ホント簡単だよ。
どっちもほとんどマウスのクリックだけで接続できるが、
SDRAMの方がより簡単に接続可能。
どれもこれもALTERAだけど、Xilinxはどうでしょ?
アルテラで簡単にできるなら、Xilinxでも簡単にできそうな・・・・
だからSDRぐらい自分で書け。
俺もXilinxにSDRAMをつないで動かしたい。
自分で書くにしても、一番良い方法(参考サイト、本)を知りたい。
MIGを使えばいいんとちゃう?
DDR なら標準で持ってるだろ。
アプリケーションノートにも載ってたはず。
MIGはDDR以上しかサポートしていないっす。
代理店にも確認しますた。
>>540 MIGで構成するのは、FPGA内部のBlockRAMを使ったものであって、
FPGA外部のSDRAMについては、MIGでは・・・・・
>>541 DDRじゃなくてSDRAM。良く読んでね。
SDRだと簡単にかけるので、IPとしての価値は殆どない。
DDRだと遅延量調節をする必要があるので、IPとして価値がある。
逆に、SDR位かけないのなら、それはスキル不足。勉強すべし。
>>543 細かいことだけど、DDRもSDRAMの一種。
あんまり細かくもないがw
SDRをSDRAMと読んでいたとしたら、話が通じない。
すみません
DDR = Double Data Rate ....
SDRAM = Synchronus Dynamic RAM でしたね。失礼。
>>541 DDRじゃなくてSDRですよ。
>>544 >SDRだと簡単にかけるので、IPとしての価値は殆どない。
簡単に書ける割には、本を見ても、ネットで探しても、SDRのIPは出ていないんですよ。
秋月の2行LCD程度のHDLならいいですが、初期化から面倒なことが続くみたいで複雑。
結果、基板上のFPGA外部に大容量SDRAMが張りついて、FPGAに配線もされているのに、
内蔵のブロックRAMを使うことになります。変な違和感が・・・・・・
>>546 簡単に書き捨てられるレベルだからネットで検索しても落ちてないんだよ
つーか、
>>546がネットで拾ってきたコードを改変って一丁上がりって
開発(?)スタイルを捨てない限り、先はないよ
SDR-SDRAMのアクセスコードくらいスクラッチからサクっと書いてくれ
> 初期化から面倒なことが続くみたいで複雑。
面倒だけど複雑ではないのでは。
わかりやすい解説がついて、ソース付きであれば5万円でマジで買います。
だれがやったらいいのに・・・。
S-RAM と違って、書きたいときに書き込めるわけじゃないし、システム側とのアービトレーションが面倒くさい。
だから汎用で使うってのがそもそも間違ってる。
551 :
774ワット発電中さん:2010/08/24(火) 10:53:32 ID:qice5oqM
XilinxのISEの「View RTL Schematic」でRTL図を確認しているんですが、
たまに明らかに接続されているはずのところが繋がって描かれていないときがあります。
シミュレーションではちゃんと繋がっている動作をするので、実際は繋がっているはずなんですが・・・
省略表記?にしても、その基準が分かりません・・・
なぜこのようなことが起こるのでしょうか??
表示ソフトのバグだと思う。僕も最初は驚いた。
だいたい、点線だったり実践だったり、太かったり細かったり、
どういうつもりであの線種を変えているのか、サッパリ予想が付かない。
さらに、箱外からの線と箱内の線が、箱に入ったところでバッサリ切れてるわ、
ちょっとひどくないですかね。
さらに、信号線名の字の小さいこと、じゃってんで、F7,F8で画面拡大縮小をした日には
暴走したかと思うくらい固まってしまう。
RTLの下にあるもう一つの表示方法だと全線つながって見えると思う。
僕は、外部エディタを使っているんだけど、
ISE10以降?から、外部エディタをsaveしてISEの画面に移行すると、
じーーーっと、しばらく考えて、やっとシンセサイズのボタンが触れるようになる。
思わず画面に向かって「何やってんの?」と怒鳴ってしまったよ。
たぶん変更したソースの階層構造を調べ直しているんたろうけと、
だったら「調べてるから、待ってね」とダイアログを出せよ、って感じ。
何も言わずに止まってしまうのは、反則。
これほど重くて、動作がもっさりのソフト、はじめて。
ちなみに、CPUは Core2Duo 3GHz 4GB /3GB XP SP3, 250GB RAID0。
他のアプリ全て停止でね。
そんなISEだけど、いつかきっと「サクサク」動く日が来ると信じてる。
マウスの形は変わってるだろ
556 :
774ワット発電中さん:2010/08/27(金) 23:35:21 ID:3XoGZBtr
>>554 >そんなISEだけど、いつかきっと「サクサク」動く日が来ると信じてる。
いつかっていつだ? と3年前から胃が痛い人が聞いてみる。
ISEのModelSimサポートも終了らしいな
FPGAの部さんで知った。
>>556 遠くはない未来です。戸籍上は168才まで生きますから、それまでには。
日本の平均寿命ってどうなってんだろうね
560 :
553:2010/08/28(土) 20:16:20 ID:dvgnYEXX
>>554 レスありがとうございます。
やっぱり表示おかしいですよね^^;
自分も外部エディタ使ってます。
ISEにフォーカスを移すと、たしかに少し固まりますね。
固まりが解けるとソースの階層構造表示が更新されるので、
変更ソースの解析のためで間違いないと思います。
自分の場合はまだ我慢できるレベルの固まり時間ですが、最終的にモジュールを結合して
大きな回路になったときはかなり長くなるのかな・・・
ISE、昔よりはだいぶ良くなったと聞きますが、
さらなる改善を期待したいですね。
今日、PCがコケて、ISEを入れ直したんだけど、気がついたことがある。
Ver 11.4にするためには、いったん11.1を導入済みでないとインストールできないのね。
都合5GBぐらいのダウンロードになる。これはしんどい。
また、フルなんとかというバージョンは、
ダウンロードが5.3GBくらいあって、それはtarファイル。
デスクトップで解凍後、いざインストールを始めると、
「○○を解凍中・・・」と表示される。圧縮した物をさらに圧縮してるんだね。
なんという巨大、なんという時間のかかること。
ディスク容量が12GB以上余ってないとインストール出来ないのか
MicroBlazeに接続可能な(SDR-)SDRAMのIPってフリーか安い値段で市販されていないでしょうか?
open coreにあった気がする
うまく使えたら、教えて。俺も使いたいと思ってる。
ごめん、MicroBlazeか。じゃわからんわ。
少なくとも2年は放ったらかされてるな
教えてください。
VerilogでHDLを書くときの、考え方についてです。
例えば、
FPGA外部の発振器からメインクロックsysCLKを取り込み、HDL全体のクロックとして使います。
ところが下位層では、ローカル処理用に高速なclockが必要なので、sysCLKを逓倍して作成したCLK10があります。
下位層の状態信号など、top階層でモニタして使用したいと思うのですが、
下位層は高速のCLK10で動作しているため、sysCLKで刻んでいるtop階層では、見逃してしまいます。
こんなときは、どのように対処するのが「正しい」方法なのでしょうか?
僕の考えつくところでは、
1) ハンドシェイクをする方法
下位にFFを設けて、イベント発生をラッチ(記憶)して、上位に知らせ、
上位では、了解信号を下位に送り、下位はそのラッチをクリアする。
やりとりが面倒で、間違いも起きやすいと思います。
2) 全体をCLK10で駆動する
DCMの逓倍部分をtopに持ってきて、このCLK10をFPGA全体のclockにする。
わかりやすく確実だと思いますが、リソースがたくさん必要になると思います。
10nsを100万回数えて、10msを生成して・・・・と、FFが一杯要りそう。
例えばRS232の受信部のように16倍のclockで刻む必要がある場合、
ボーレートの変更により、CLK10が変化してしまい、調子が悪いとも思います。
こういうときは、どうすべきなのでしょうか。
宜しくお願いします。
逓倍したクロックと元のクロック間では位相は保障されないのが普通
高いクロックに合わせて動作させるのが常套手段だが、sirial入力を
オーバサンプリングでデータ取りする場合は、内部接続のパラレルビット幅を
増やし、受け側に対して十分低速にして受け渡す
あとはハンドシェイクするなり何なりだな
異クロックドメイン間の通信はFIFOとメールボックスを使うのが筋だな
>>568の例だと非同期メールボックス(要はハンドシェイク)を使えばいい
つーか、ハンドシェイクってやりとり面倒か?
確かにシミュレーションモデルでの検証は面倒かもしれないけどね
イベントを示すパルスの幅を充分に広げてやれば
めいよううぇんてい
私の場合1)の方法はやったことありますが、2)の方法はやった事は無いですね。
事足りるのであれば、下位から上位に伝えるパルスを
sysCLKで確実に1回以上拾えるように
CLK10の16cycle幅に伸ばすだけでいいと思います。
上位からのclr信号はいりません。
グリッドが出ないようにレジスタ出力で上位に渡しましょう。
心配性なので10cycleだと不安ですしどうせ2のべき乗のカウンタなので16にしました。