【Verilog】 記述言語で論理設計Project13 【VHDL】
レス数が1000を超えています。これ以上書き込みはできません。
HDLの処理系も、それを実際に動かすシミュレータ・評価基板も、
安価で入手できるようになってきました。
このスレが目に入ったお嬢さん! HDLで何か作って遊んでみませんか。
日曜工作のHDL書き、学生さん、プロの方、主婦の方、カキコお待ちしております。
関連情報は >2-10 あたり。
入れ食いキーワード
・Nios、MicroBraze
・Artix-7、Kintex-7、Virtex-7、ハードコアCPU内蔵 Zynq-7000
前スレ (直近スレのみ)
2012/11/03〜 【Verilog】 記述言語で論理設計Project12 【VHDL】
http://uni.2ch.net/test/read.cgi/denki/1351913871/
2011/12/07〜 Project11
http://uni.2ch.net/test/read.cgi/denki/1323187568/
2010/09/17〜 Project10
http://kamome.2ch.net/test/read.cgi/denki/1284652343/ ・FPGA
Xilinx ttp://japan.xilinx.com/
ALTERA ttp://www.altera.co.jp/
Lattice ttp://www.latticesemi.co.jp/
Actel ttp://www.actel.com/intl/japan/
QuickLogic ttp://www.quicklogic.com/
・ASICベンダ推奨ツール類 (高価)
Synopsys ttp://www.synopsys.co.jp/
Cadence ttp://www.cadence.co.jp/
Mentor ttp://www.mentorg.co.jp/
Synplicity ttp://www.synplicity.jp/
・Verilogシミュレーター (無料)
Icarus Verilog
ttp://iverilog.icarus.com/
ttp://ryusai-hp.web.infoseek.co.jp/icarus.htm (解説)
ttp://www.ice.gunma-ct.ac.jp/~kimsyn/verilog/FreeSim/iverilog/iverilog.html (解説)
IVI
ttp://ivi.sourceforge.net/
ttp://www.kumikomi.net/archives/2005/06/10icarus.php (解説)
・VCDフォーマットの波形表示 (無料)
GTKWave
ttp://gtkwave.sourceforge.net/
ttp://ryusai-hp.web.infoseek.co.jp/gtkwave.htm (解説)
・関連書籍
STARC ttp://www.starc.jp/
CQ出版 ttp://www.cqpub.co.jp/
Interface ttp://interface.cqpub.co.jp/
Design Wave Magazine (休刊) ttp://www.cqpub.co.jp/dwm/
ディジタル・デザイン・テクノロジ (旧DWM) ttp://digital-design.cqpub.co.jp/
・解説サイト
やるおと学ぶ Verilog-HDL ttp://hirokinakaharaoboe.net/yaruo_verilog/
・関連スレ
【FPGA/CPLD】 XILINX/ALTERA/Lattice/Actel
http://uni.2ch.net/test/read.cgi/denki/1387718215/
【EP3】DE0で始めるVerilog HDL【C16】
http://uni.2ch.net/test/read.cgi/denki/1310362001/ 過去ログ参照したいときは、外部キャッシュサイトも便利です。
スレタイで検索しましょう。
・ログ速 ttp://www.logsoku.com/
・2chビューアーD ttp://2ch.viewerd.com/
・unkar ttp://unkar.org/r/denki/
他にもあると思う
以上、テンプレらしきもの。
_,,,
_/::o・ァ
∈ミ;;∧,ノ∧ ,,,,, ,,,,,
( ´・ω・) ,,,,(o・e・),(。・e・),, 新スレです
/ヽ○==(。・e・)(。・e・)(o・e・) 仲良くつかってね。
/ ||_彡,,, ノ彡,,, ノ彡,,, ノ
し' ̄(_)) ̄ ̄ ̄(_)) ̄(_)) ガラガラ FPGAでキャラクタLCDの初期化とか、
74HC595、74HC166などのシリアルものをやったときは、
FPGAを窓から投げたくなった。
マイコンが神様のように思えた。 ノ ゚.ノヽ , /} ...
,,イ`" 、-' `;_' ' ..::::::::::::::...
,-、 _.._ ( (,(~ヽ'~ ..:::::::::::::::::::::::
)'~ レー' 〉 ヽ i`'} .:::::::::::::::::::::::
~つ '-ー、 i | i' ...:::::::::::::::::::::::
/ < / 。/ ! ......::::::::::::::::::::::::: これは>>1乙じゃなくて
/ ~^´ /},-'' ,●::::::::::::::::::::::::::::::::::::
i、 ,i' _,,...,-‐-、/ i :::::::: .:::::::::::::
..ゝ <,,-==、 ,,-,/ .::::::::::: 放射能がうんたら
) {~''~>`v-''`ー゙`'~ ..::::::::: ........::.
{ レ_ノ ..::::::::. ......:::::::::
ノ '' ..::::::: ...::.:...:::::::::
.::::::::: ...:......:::::::::::: .
.:::::::::::. ..... .. ..:::::::::::::::::::::::: :::.
::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. :: ::..
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::: ::.
::::::::::::::::: :::::::::::::::::::::::::::::: :::::
.:: ::. ::: FPGAで家電作ってもおかしくないだろうけど
コスト合うのかな
お得意のウォン安パワー? 1000台作る製品のコストを1円下げるために、
何万円ぶんも人間をタダ働きさせるのが日本式だからなw TATが間に合わない事もあるしな
TVだとASIC作る時代でも無いし
ASSP+FPGAで急場を凌ぐかな 開発期間短縮の為、FPGAを採用。
その後、4Kが大量に売れそうだったらASIC化するって事じゃないの? FPGAで何か家電を作るとすれば・・・
炊飯器か
マイコン炊飯器より売れそう 4Kは売りつけるんだよ
その次はSHV(8K)を売りつける
ここまでは決まってるんじゃね
炊飯器よりエアコンにFPGA合うかも
センサー高度化してるし冷却も万全? 炊飯器やエアコンでFPGA必要なほど高速な処理って何よ FPGAが高速とか、笑わせるwww
そんなに高速なんだったら、お前の家からintel PCを一掃して全部FPGA PCにしろよw そんな物もあったな
MSXは俺のルーツだからつい買ってしまったが、一度も通電する事無くどこかに放置してある >>19 規模の利益を全く無視したご意見、どうもありがとうございますw PSoC4 pioneerで遊んでるんだけど、alwaysのトリガに同期系
条件(posedgeとか)と非同期系条件(ピンチェンジ)を混ぜては
いけないってのはVerilogの制限?それともPSoCローカルな制限? 何をしたいのかがよくわからんけどVerilogの制限ではないな。
ただFPGAでVerilog使う場合でもそうだけど合成可能かどうかはまた別問題。
一般論としてリセット付きF/Fは合成可能だから大丈夫だと思うけど。 reg_cntをインデックスにしてreg_buffバッファにreg_fooの値を突っ込みたいのですが
↓みたいにすればOKですか?
always @ (posedge xxx) begin
if (RESET) begin
reg_cnt <= 0;
end else begin
reg_cnt <= reg_cnt + 1;
reg_buff[reg_cnt] <= reg_foo;
end
end やってみろ
まずはそれからだ・・・
まぁ良かったと思うけど サンクスです。やってみました。できました。
でも質問した時はできなかったんですよね。。
今日はできた!
何が変わったんだろ
よくわからんw
すみませんでした。。 出来なかったというのは
合成すら出来なかったと言うこと?
じゃないよね Icarus Verilogに関して御存知の方いらっしゃいましたら教えて下さい。
フリー環境でSystemVerilogを動かしてみようとIcarus Verilogを使ってみたのですが、0.9.7版、20130827版と幾つかの版数を渡り歩いてみましたが、classやinterfaceといったkeywordに対してsyntax errorを吐きます。
webで検索したところ0.9版以降ではサポート中断という記事を見つけたので0.8.6版も試してみましたが同じでした。
questaやiesでは通るので文法的にはOKだと思っていますが、Icarus Verilogが対応していないのか御存知でしょうか? SystemVerilog対応なんて、Wikipedia日本語版にしか書いてないような気がする。
英語版は、portions of SystemVerilog としか書いてない。 >>29
合成はできたんですけどワーニングが出てて
出てきた電子回路見てみるとつなげてるはずの配線がざっくり無くなってました。
セレクタ?を記述しないといけないんだけどそれがうまく表現できず、ツールに伝わってないみたいでした。 >>31
やはり、現版数では対応していないようですね。幾つかのサイトを見て回ったのですが、対応していると今後対応予定という情報が入り交じっていました。
Behavior simulationを目的としているので、試しにXilinxのVivado入れてみましたが、simulatorがSystemVerilog非対応でした...
現状、SystemVerilogのsimを行うとすると、やはり御三家のsimulator使うしか無いのですかね... QuartusはsystemVerilog対応って謳われてて
modelsimの無料版入ってるけどそれではだめなん? >>33
御三家って、シノプとケーデンスと・・・? >>34
日頃馴染みが無かったのでアルテラ試していませんでした。情報ありがとうございます。ユーザー登録してダウンロードしてみます。
>>35
あと品川の御殿山をイメージしていましたが(^_^; >>37
GM音源とDSPを内蔵した専用チップだったはずだけど、FPGAなの?
http://download.yamaha.com/api/asset/file/?language=ja&site=jp.yamaha.com&asset_id=60768
ちなみに子音が出せないのは、ボタンが押される前に子音が出せてないと、音に合わせて声が出せないからだからな。 http://nlab.itmedia.co.jp/nl/articles/1403/03/news057.html
筆者は昨年11月のMake Faireで披露された「歌うキーボード」のプロトタイプを実際に試してみたのだが、
そのときから長足の進化を遂げたようだ。まず、レスポンスがぜんぜん違う。
Make Faireのときには操作はできるものの、反応はちょっと微妙で、演奏はコツがいる感じだったが、
現在のバージョンは十分リアルタイムでの演奏に追従できる。なんらかの改良が行われているようだ。
「さしすせそ」の発音は、VOCALOIDでは母音の前の子音部分が長く、
鍵盤を押してから発音されるまでタイムラグがあるものだが、
ポケット・ミクではそこが実用になる範囲に収まっている。
ひょっとしたら、素のままのNSX-1チップではないのかもしれない。
http://nlab.itmedia.co.jp/nl/articles/1311/04/news010.html
http://nlab.itmedia.co.jp/nl/articles/1204/29/news007.html 全然使ってないPT2の基盤眺めてたら
ざいりんくす乗ってた
なんのシリーズかは見てない >>37-41
音源としてはえらい安いな
そのうちすべてのPCやスマホに標準搭載されると良いな そこらじゅうのスマホからミクの声がしてたら
それはそれで嫌だな
せからしか!ってなる >>42
っ ttp://earthsoft.jp/PT1_PT2/tech-static-timing-report-PT2-01.html >>19
FPGAはいくつもの処理を平行して処理できる。 こんな計画もあったのか
また、今回の製品版には実装されていないが、これを利用して歌詞を入力する機能も試作された。
カーボンキーボードで文字入力を行なうプロトタイプの説明図。
鍵盤部で「あかさたな〜」といった子音の行を選び、リボン部で母音の段を選択する。
写真 https://fabcross.jp/interview/dmln530000007pmi-img/0314_uda_005.jpg
本文 https://fabcross.jp/interview/140314_uda_02_03.html 某N社の仕事で、VHDLの回路改修を頼まれ、
アドレスデコーダーの回路見たら、
全部IF-ELSIF文でアドレスデコーダーを数百構文も書いてあった。
CASE文とIF文の使い分けもできないのか、この大手企業はと思った。
しかも担当者に聞いたら、その書き方じゃなきゃダメだと。
日本の「もの作り」とか言って、これじゃおわっとるよな。 言語的にはIfでcaseかけるので
ちゃんと書けば
同じ回路になるはず
ただデコーダエンコーダ
もしくはCPUのフェッチはcaseが良い(ほぼデコーダ)
人為的なミスが減る
ソースコードは人に優しくないと 「もの作り」って、論理以前の物理的な「もの」しか対象に考えてないからな。
ブール先生から150年経つんだから、ざっと考えて200年前の伝統芸でしかない。 >>57
人手で書くわけじゃなくて、
何かのソフトが吐き出すんだろうね。
アドレスデコーダならテーブル引くほうがいいけど。 合成ツールの変なバグがあって、治るまで使うなと言ってたのが
いつのまにか絶対使うなに化けるとか、いろいろあるものだ。 教えてください。
FPGAで、sin波はDDSで出せますが、ノコギリ波は、どうやって出すのでしょうか?
工場の屋根みたいなヤツです。
シンメトリ(矩形波で言うDutyです)は変えませんが、
周波数を変えたいです。ROMにテーブルを入れて、読み出しを間引けばいいのかしら。
それとも、毎点毎点、計算を行うとか・・・・
宜しくお願いします。 >>61
DDSの様にROMでテーブル作ってアドレスカウンタで飛ばし読みするとか、
固定小数点を含んだような積和演算器(カウンタ)を作って
その加算値の整数部を出して行くとか、方法はいろいろあると思うよ。 DDSで、sin波を形生成する場合は、まだ良いと思うのですが、
三角波など、1ドットで「+ピーク」→「-ピーク」に変化する値を持った信号だと、
間引きstepにより、そのピーク点が採用されたり採用されなかったりして、
その結果、出力波形のピーク値が変化しないでしょうか?
また間引きstepが大きくなると、ほぼ直線変化だったものが、
階段のようにガタガタになってしまいます。
これは、外付けのLPFで除去するのかと思いますが、
その方法だと、ピーク点の尖りまで鈍ってしまいそうです。
DDSにおいて、
ピーク点の確保とガタガタ波形に対して、どのように考えれば良いのでしょうか? 少しは自分の頭で考えて試してみたらいいんじゃねぇの?
シミュレーションだっていくらでもできるだろうて ありがとうございます。
考えました。
例えば、16ステップの鋸歯状波を考えたとき、
間引き0だと、0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15と再生しますが、
1つ間引くと、0 2 4 6 8 10 12 14 と再生し、15番(ピーク値)が欠落すると思います。
どうでしょうか? そういうやり方をしたら、欠落するだろうね。
だったら、欠落しないようにする方法は?って考える。 >>66
同じようなことはsin波形でも起きる。
しかしD/Aした後にsinπx/πxのアナログフィルタを通すと、
このガタガタがきれいに取れる。
出力する周波数に対してサンプリング周波数が十分高ければ
そんなに気にしなくても大丈夫だよ。
ちなみに経験的なことを言うと、100KHz位の鋸歯状波を10MHzの位の
サンプリング周波数で出力してみたけど、ちゃんと鋸歯状波になってた@12bit分解能。
あくまで主観だけど。 サイン波は高調波を持ってないけどノコギリ波は無限の高調波を持つ。
エイリアシングの影響を避けるためには出来るだけサンプリング周波数を
高くするということじゃないの? Windows 8.1 update 64bitでicarus verilog 0.9.7が動かない・・・
コマンドプロンプトで "iverilog" って打つと "iverilog: no source files."みたいにちゃんと実行されるんだけど、
"iverilog hogehoge.v"って打つと "ivl.exeは動作を停止しました" ってエラーウィンドウが表示されてコンパイルできない
Windows 8 64bit上のicarus verilog 0.9.7では同じソースファイルをコンパイルできるのに
誰か助けてください・・・ >>71
パスに日本語は含まれてない
ソースファイルにも含まれてない この際だから、Linuxに移行したほうがいいんでないかい? Verilogを使い始めた初心者です。
LTC1744A/DコンバータをXilinxで動かしたいですが、質問があります。
FPGAからADにスタート信号を送ると、ADからADクロックとともにデータが出てきます。
ADのデータを取り込むには、そのクロック信号の立ち上がり立ち下がりで取り込むらしいです。
データーはADのクロックに合わせて出てくるので、FPGAのクロックと合っていません。(周波数は同じようです)
こういう場合、どのようにしてデータを取り込むのでしょうか?
・水晶→A/Dクロック信号で1つ完結。ADからのクロックを使ってそれ以降のFPGa全体を動かす。
・あくまでFPGAのクロックで動かし、A/Dクロックの変化点を見つけて、そのときのADデータを取り込む。
・FIFO変換回路を使う
・ディアルポートメモリーを追加する FIFOで正解
デュアルポートでもできるっちゃできるが FPGAのクロックをPLLで
ADの10倍くらいで動かせば余裕のよっちゃん
と何も考えず・・・
常にADの方が遅いイメージ >>75
ありがとうございます。
やはりFIFOですか、了解です。コアジェンのFIFOジェネレーターで実験してみます。
>>76
>FPGAのクロックをPLLでADの10倍くらいで動かせば余裕
ヒントをありがとうございます。
これは、A/Dからの信号をFPGAで「高速に」刻めば、FPGAでA/Dのクロック変化を検出でき、
そのタイミングでデータを取り込めば、FIFOなしで良いということでしょうか?
もしそうだとすると、10倍も上でなくても3倍くらいではだめでしょうか?
・A/Dからのクロック信号を取り込み記憶。
・前回からの差を見て、変化点を検出。
・変化ありなら、その次点のデータを取り込む。(データは、この時点までホールドされていることが前提)
こんな感じでしょうか。 >>77
3倍程度だとインターバルがグダグダになるからダメ。
タイミングが一定のように見えてわずかに揺らぐため、2倍と4倍が入り混じる可能性がある。
# もちろん、個体差があるので念のため。 ありがとうございます。
3倍程度ではだめですか。了解しました。
やはりFIFOですね。 一度クロック直で誤作動っぽい動きしていて
PLLに一度食わせただけで直った経緯から
最近はPLL使わない事の方が少ない
保険みたいな感じ PLLじゃなくてもNOTとかインバーター通しただけでも治ったかもね チップスコープで、16bitの値を見ているのですが、
観測点を、それ単独でコンパイルしたときと、
他の観測信号も一緒にしてコンパイルした時で、
表示される値が違うことないですか? >>83
ありがとうございます。
いえ、xxx.cdcで、メンバーに入れてコンパイル、入れないでコンパイル、
それだけで違うんです。半日悩んでいました。PCの再起動とかしてみたのですが。
一つ教えてください。
Verilogで、C言語のような、こんな書き方ってできるのでしょうか?
if( a == 'A' ) begin ...
end else if( a == 'K' ) begin ...
end else if( a == 'B' ) begin ...
試して見ればよいですね。すみませんでした。 >試して見ればよいですね。すみませんでした。
ダメでした。残念 確かに、その表記ができると便利だと思う。
Cは本当によく考えられた言語だね。
Cで assign や <=代入ができるなら、もうVerilogやめてCで書けばいいと思う。
もちろん、beginは{に変更して。 文法的にはいけるはず…?
ttp://www.verilog.com/VerilogBNF.html 232cの入力bitを検査するのにcase使ったけど
別に問題はなかったような
シミュレーションしかないかねぇ CSP有効無効で、ユーザ回路側の挙動が異なる、ということ?
>82では
・16bitの値=観測点
・16bitの値だけをCSPで見た場合と
・16bitの値と同時に、他の信号をCSPで見た場合で
・得られる16bitの値が異なる(他の信号は?)
と読みました。
・16bitの値を、CSPを入れずに観測し(ピンなどに出した?)た結果と
・16bitの値を、CSで観測した結果が異なる
ということ?「他の観測信号」はどこでどう絡んでくる?
CSPで挙動がおかしい時の基本確認事項は
・タイミングレポートを確認する。CSP入れると周波数は落ちる傾向がある。
・観測対象の信号をドライブしているクロックとCSPが参照しているクロックが同じか?
辺りが第一歩ですかね。 それとも
・16bitの値を、CSPを入れずピンに出した結果と
・16bitの値を、CSPを入れてピンに出した結果が異なる
ということかな?CSPの観測結果は無関係? >82
君と同じ現象かどうかわからないけど
観測点増やしすぎると最高動作周波数が下がって
まともに観測できなくなることはあった。 Verilog初心者です
本を読んで勉強してます。
その本によるとalwayブロックで、ブロッキング代入すると順番が保障されるとありました。
a=a+4
b=b+a
だとa=6, b=4だったらbは14になるし、
a<=a+4
b<=b+a
だったらどうなるかはわからないよーとのことでした。
またその本では別の章ではこうも書いてました。
data[i * 3 + offset] <= val;
i <=i+1
この例の場合、dataのindexにiが使われていて、次の行ではiを増やしています。
これっておかしくないですか?先にiが増えたらindexが違う場所をさしちゃいますよね?
ちなみにRGBデータを処理する話で、文脈から言って
必ずdata[i * 3 + offset] <= valが実行されてからi<=i+1が
実行されないとおかしくなるような状況です。
どなたか解説オナシャス! ブロッキング代入なんて使うな
どの本だ、そのブロッキング代入を推奨してる本は 実行順番が保障されるのだろ?
ちゃんと「data[i * 3 + offset] <= val」の後に「i <=i+1」
が記述されてあるだろ。
自分で言ってることじゃない。
何が分からないのだ? data[i * 3 + offset] <= val;
i <=i+1
はノンブロッキング代入だから順番が保障されないのかなぁ?と思った次第です・・ もし今i=0の状態でalwaysの信号が来たとき、
data[i * 3 + offset] <= val;
i <= i + 1;
はまずdata[0 * 3 + offset] <= val;
をやって、次にiが1になるべきじゃないですか。
でもノンブロッキングなら先にiが1になっちゃって
data[1 * 3 + offset]<=val;が次に起きたりしないのかな?ってことです。 >>94
・ <= は、always @ ()の中だけ使用。
・ = は、assign だけで使用。
のほうが、いいですよ。
どちらも同時に起こりますのでわかりやすいです。
それよりも、慣れるまでは、以下のようにbit数を意識する癖を付けた方が良いと思います。
wire a;
wire [7:0] b;
reg [1:0] s;
reg [3:0] c;
always @ ( posedge clock ) begin
if( RESET==1'd1 )begin
s <= 2'd0; // s <= 0; と書きたくなるけど 2'd0とbit数を意識
c <= 4'd0;
end else begin
s <= { s[0], a };
if( s == 2'b01 ) begin
c <= c + 4'd1; // c <= c + 1; と書きたくなるけど 4'd1と....
end
end
end
assign b = { c, s, 2'b00 }; // = は、assignだけで使う
endmodule >>94
>a<=a+4
>b<=b+a
>だったらどうなるかはわからないよーとのことでした。
ここが間違い。
クロック同期なら右辺に使われる変数は
次のクロックエッジまで変化しない。 >>100
すみません、よく読み直したらノンブロッキング代入はどうなるかわからないとは書いてませんでした。
それは自分が勝手に思い込んでたことでした。。
ノンブロッキング代入は、alwaysを抜けたときに値が確定し、
それまでは変更前の値で動作するって書いてありました。
すみません&ありがとうございました! 複数のalwaysに別れてたらどうなるかわからないんだっけ? >>102
複数のalwaysに分かれるとmultiple driver的なメッセージでコンパイルエラーじゃないかな >>101
>alwaysを抜けたときに値が確定し、
どういうときに,alwaysを抜けるの? 教えてください。
Verilogで、以下のようなことはできるでしょうか?
wire [7:0] A; // 8bit幅
wire [2:0] B; // 3bit幅
wire [1:0] C; // 3bit幅
assign A[6:4] = B; // 8bit幅の変数に、3bit幅の値を接続する
assign A[2:1] = C; // 8bit幅の変数に、3bit幅の値を接続する
Aは、 0 B2 B1 B0 0 C1 C0 0 のように、
指定位置に入れ込んで、他を0で埋めてくれるのでしょうか?
それとも
Aは、 ? B2 B1 B0 ? C1 C0 ? のように、不定になるでしょうか >>106
やってみれば?
assignがひとつもなかったらどうなる? なんか学生ぽいのが増えてきましたね
さすがゴールデンウィーク明けですか
どしどし!
さてWin8にいかろす入れてみますかね VerilogでHDLを書いていますが、ミスが多くて思うように進みません。
どのようにしたら、スイスイと作成できるでしょうか?
今までわかっていることは、
・自分の性格は、おっちょこちょいで落ち着きがありません。
・記憶力も悪いです。
・変数の内容がわかるように、u16_reg_AAAとか s32_wire_BBBとか書いています。
・代入する即値は、32'h1234_4c7f と、bit数を書いて_で4桁ずつ区切っています。 追記です。
一番多いエラーは、
「その変数、いつまでたっても0だよ。だから省略するからね」というやつです。
カウンターで使ったのに、常に0って、困るんですが。 Cleanup Projectって何でしょうか?
プランヘッドを起動してもメッセージが出てエラーになります。 114です。おかげさまでわかりました。ありがとうございます。 >>112
検証済みでサポート付きモジュールを使えばいいよ。 何度もすみません。教えてください。(帰れない)
reg [3:0] hoge;
alwys @ (posedge clock) begin
if( res ) begin
end else begin
hoge[3] <= ....
:
:
hoge[2] <= ....
:
:
hoge[1] <= ....
:
:
if( hoge== ...) begin
:
end
end
上記のように、4bitのhogeを、4bit まとめて
hoge <= ....
とせずに、各bitをバラバラな回路で評価、代入することができるのでしょうか?
連接で{ } することは良いと思うのですが。 なんか一般化の下手な人だなって印象
俺ならそれくらい受け入れてくれるだろって見切り発車して
万一だめなら、何だこの使えないクソ言語って投げ捨てるところ とりあえずソース書いてコンパイラ通してみればいいのに
こんなところで聞いても返事がいつ来るかわからないし
返事が来ても間違った内容かもしれない(悪意を持ってワザとウソ教えるケースも) >121,122
まー、
コンパイラ的には許されるけど作法的にあんまやっちゃいかんこと、
といった類のことは避けたいとかあるかもしれんし。
にしても一回試すには試さんとな。 D-FFのD端子のH/Lを決めるのは、どんな方法でもいいよね。
ただ、4bit同時にclockされるというだけで。
しかし、やるなら全ビット書き込んであげなきゃ。 generateを使わずに、8回同じインスタンシエーションを書いたら、
大笑いされました。
そんなに可笑しい事でしょうか?
for()で書かないとうまく動かないのでしょうか? 人に見せた分だけ
コードは見やすくなる
ベタでも良い
見難いだけ
generateでかけば今度は笑われない だけ 8回だとベタ書きとどちらが見やすいかは微妙。
大笑いするのはおかしいな。
ニヤけるレベル。 >>130
でも将来8が16や64になる可能性がわかってるのにベタに書いたら
大笑いというより怒られてもおかしくない
それより>>129のいうように学ぶための機会を得たと思えばいい Verilogじゃないけど、回路図インスタンスの配列記述が禁止の会社はあったな…… VHDLで
a <= '1' when b=c;
とelse無しで書いたらエラー出ずにラッチが生成されるのは普通なの?
Quartusなんだけど、この前これではまったよ。 >>134
> VHDLで
> a <= '1' when b=c;
> とelse無しで書いたらエラー出ずにラッチが生成されるのは普通なの?
普通です。
ラッチを記述してるからラッチが出来ただけ。 字面だけ見るとラッチができそうだが、134が聞きたいのは、
(半分愚痴を込めて)これが規格的に合法なのかってことだろう。
俺が持ってる参考書には「必ずelse項を記述する必要があります」
って書いてある。 どう合成されるかなんて規格で決まってるわけじゃないからね。 >>136
そうなんですよ。
一般的にはどうなのかと、VHDLの文法的、規格的にはどうなのかと。
VHDLは厳格な印象があったのでかなり意外だったし。 LRM調べてみたら文法的にはelseがなくても正しいらしい。
conditional_signal_assignment ::=
target <= options conditional_waveforms ;
conditional_waveforms ::=
{ waveform when condition else }
waveform [ when condition ]
{ }は繰り返せる記述で0個でもよいらしい。
エラーであったほしかった… もしかして
q <= d when clk'event and clk='1';
なんてのもありなのか?
今度試してみるかな。 Hardware Description Languageでユーザーがラッチ推定なモノをdescriptionしたのに
合法なのかとかエラーにしてくれとか、いちゃもんをつけられるHDLタン可哀想だ・・・
>>136の持ってる参考書がちと気になるけど、単に「不用意なラッチ推定を避ける為に
条件分岐は必ずelseやdefaultを使って全ての条件を並べたほうがいい」って程度の事を
「言語仕様的にelse必須」と勝手に読み替えてるだけ・・・なんて事はないよね? 「文法」という、構文と意味のどちらを指すのか、はっきりしない表現で言語を理解しているからダメ。
構文と意味をちゃんと峻別しなさい、ってこと。 まぁ指示してないことを
指示してないので知りませんやりません、といわれるか
自分なりに考えて頑張りました、と言われるか
HDLたん頑張れ だから >>134 はラッチの記述なんだって。
b=cのときにaを1にして、それ以外のときは保持するわけだから。
>>140
> エラーであったほしかった
VHDLの文法としてwhenでラッチも記述しているようにしているわけで、
VHDLの文法の段階でエラーにして欲しいとか意味がよくわからない。
>>141
文法上はOKだけど、その記述でFFを推定するかは合成ツール依存。
デザインコンパイラはFFを推定するはず。 >>146
HDLと合成ツールの関係を理解したほうがいいと思う。 このスレは>>146がHDLから巣立ち
スケマ書きエンジニアになっていく様を
温かく見守るスレになりました spyglass使ってみたいけど、確か1000万円コースじゃなかったっけ? 落とし所としては、こいつはラッチになってほしくないよー、と明示したら、
ラッチになったらエラーにしてほしい、ですかねぇ >>152
やろうと思えば、いくつか縛りを入れれば近いことはできそう。
条件付信号代入文は使わない
選択信号代入文は使わない
組み合わせ回路を作るprocess文では必ず変数経由で記述する
process (...)
variable a : ....
begin
a:=0;
if b=c then a:=1234;
elsif d=e then a:=5678;
end if;
out <= a;
end process;
上の例では効果がわかりずらいけど、
条件が複雑になると、どこかでelseが抜ける可能性があるので・・・
他にもやり方は有るとおもう。
言語としての仕様はそのままでよくて、
記述の自由度を下げてまで何か縛りを入れるかは、
ユーザ側で考えればいいと思う。 つーか・・・
FFのクロックにクロック以外が入るような記述なんて
めったにしないから、ラッチの出来ようがないのだけど >>154
組み合わせ回路をprocess文で記述するとセンシティビティリストに変数書き忘れるだけでラッチになるから逆効果でしょ。 何言ってんだ。
LUTの出力を自身の入力につなげば自己保持回路できるじゃないか。
FPGA設計では禁止回路として真っ先に指摘される回路のひとつだけどw >>156
合成のときはセンシティビティリストは無視だよ。
RTLシミュレーションのときに問題になるけど。 無視?無視されると逆にラッチが実装できなくなる気がするけど。
センシティビティリストを書かないということか? ほんとbeginとendにした奴死んでほしい
なんで{}を使わなかったんだ
あと[7:0]とかって打ちにくい。これ考えたやつも死んだ方がいい >ほんとbeginとendにした奴死んでほしい
これには同意。せっかくC言語風なのになんでここだけPascal風なんだ
>あと[7:0]とかって打ちにくい。これ考えたやつも死んだ方がいい
VHDLの(7 downto 0)よりはマシかと。 endの後にセミコロンが来ないのはC言語風なんだな。
そう考えるとずいぶん中途半端なんだな。 ソースの変換プログラム作れば、C言語風でキー入力して
HDL処理系にかかるソースに変換できるよ。 いわゆる
プリプロセッサみたいなプログラムな。 >>161
でも'rangeとかは便利だと思った。 わしは++が実装されなかったのが残念。SystemVerilogでもブロッキング文だけだし。 符号と配列の扱いをもう少し真面目に考えて欲しかったな。あと、変数のスコープも変だ。 VHDLみたいにオーバーロードには対応して欲しかった。 ++欲しいって、バカか
プログラムじゃねえっつーの
[7:0]がイヤならどんなならいいんだろう? ビットスライスする関数が欲しいかな。
(a+b)の[4:1]なんて、一度別の変数に入れるか、function作るしかないからね。 わしは++が実装されなかったのが残念。SystemVerilogでもブロッキング文だけだし。 >>171はnand(out, in1, in2)とかで実装しているのか?
++あったら便利だと思うけどなぁ。 >>172
(a+b)>>1でいいだろ。
++は合った方が良いな >>175
(((a+b)>>1)&4'hF) だよ そもそも他の言語にもないだろ。
++はインデックスを増やすためのもんだから。 こうとか。
procedure tt(signal a : inout std_logic_vector) is
begin
a <= a + 1;
end procedure; レジスタってカウントアップしていくと0にループして戻りますか? レジスタの説明
カウンタ4種調べて説明
オーバーフロー、アンダーフローの説明とその活用
以上をレポート形式でまとめる事
文字数の規定無し
Wikiは認める >>185
カウンタ4種ってなんだろ
ジョンソンカウンタとかリングカウンタとかグレイコードカウンタとかだろうか しくしく
ベリログの本に4つあったから適当にかいたんだよー
レジスタのループはかいてなかったけど あるalways1(CLK1で同期)でフラグを立てて
別のalways2(CLK2で同期)の中でフラグが立っていたら一回だけ処理したい場合どうすればよいのですか?
reg flag;
always(posedge clk1 or rst) begin
if(rst) flag <= 0;
else begin
if(エラー) flag <= 1;
end
end
always(posedge clk2 or rst) begin
if(rst) xx
else begin
if(flag) begin
なんか一度だけのことをする。たとえばエラーメッセージをバッファに入れるとか。
flag <= 0;//ここで落とす。もうエラー処理したので。
end
end
end
これだとFFを複数のクロックでドライブできませんみたいなエラーになります。
こういう問題を扱うときはどうしてますか? それぞれのクロック側で別々にフラグをもってハンドシェークする。 >>192
ありがとうございます
ちょっと考える時間ください。。 >>193
FFのクロック端子に別の信号を入れるのは基本的にタブー。
共通のクロックで出来ないかもう一度考えたほうがいい。
事情があって共通のクロックに出来ないなら同じに出来ないなら、
お互いが外部モジュール(非同期の)と考えて設計すればいい。
あと"メタステーブル"で検索して調べることを薦める。 >>192
ハンドシェークって言うとちょっとわかりづらくない?
要は、処理したよフラグも用意しろって言えばいいじゃん clk1側は一回立てるだけだからハンドシェイクなんていらないだろ。 >>197
いつフラグを落とせばいいか分かっているならね。 >>197
clk2がclk1より周波数が高かったらどうなる? みなさんありがとうございます!
とりあえず、clk1とclk2でそれぞれカウンタを用意して、clk1ブロックがclk2ブロックにお願いしたいときは
カウンタを進め、clk2ではそのカウンタと自分のカウンタが違ったら処理する、というやり方にしました。
always(clk1) begin
if(なんか処理をお願いしたいとき)
cnt1 <= cnt1 + 1;
end
always(clk2) begin
cnt1tmp <= cnt1;
if(cnt2 != cnt1tmp) begin
処理
cnt2 <= cnt2 + 1;
end
end
でも2つのクロックはまったく関係ない外部デバイスから引っ張ってきてるので、
周波数も位相も違います。
clk1側でカウンタを進めたときに、clk2側でそれをcnt1tmpに読んだときに
おかしな値になってないか心配です。
clk1側のカウンタがまさにインクリメントされる瞬間にとてつもなくおかしな値に見えたらどうなってしまうんだろう。。
今のところうまく動いてます。 CDCチェッカでエラーになるソースコードだな
まあ数百の製品に載せる訳じゃないなら十分だけど >>200
>DPRAM or FIFO
DPRAM
Dynamic Programming Radio Active Material
放射性物質の動的計画法
FIFO
Furtherment of International Friendship Organization.
国際的な乱交パーティー >>201
処理が終わる前に次の処理依頼が来ないのなら、
1ビットのカウンタでいいんじゃないの?
つまり、1足さずに、反転。 >>198-199
>>191 のコード見た?
一回フラグ上げたらリセットまで上がりっぱなしだろ? CLK2系統に直接スタート信号渡して
CLK2系統が受け取ったらRDY下げて
処理終わったらRDYあげたらダメなの? >>206
191のコードは明からに間違えてるだろ?
上げたフラグは下げたい、って言ってるだろ?
で、おまえはclk1だけで一方的に制御すれば良いって言ったんだろ? >>208
>あるalways1(CLK1で同期)でフラグを立てて
>別のalways2(CLK2で同期)の中でフラグが立っていたら一回だけ処理したい場合どうすればよいのですか?
フラグを下げたいとは書いてない。
CLK1でフラグを立てて、CLK2でエッジ検出すればいいだけ。 >>191
このソースの一つ目の順次処理文のflagと、
二つ目の順次処理文のflagはまったく同じ信号のつもりっぽいね。
このレベルで非同期の設計は難しいかな。
>>201
記述の間違いはおいといて、というかぜんぜん違うけど。
やりたいことをエスパーして答えると、
その考えの延長では非同期だと上手く動かないよ。
タイミングによって処理1回行うところを間違えて2回行っちゃったりね。 なぜカウンタに!
やりたいことによるが、>>205 のいうとおり1ビットでできるはず。
カウンタを使うならグレイコードカウンタを使わないと。 >>201
はダメダメかとおもったけど、恐ろしいことに意外とうまく動くかも。
191が懸念している通りcnt1の変化時にラッチするとおかしな値にになるのだが、
cnt1とcnt2が等しいかどうかだけ分ければよいわけだし、cnt1とcnt2が等しいのに
等しくないと判定される可能性はなさそうなのでうまく動きそう。
cnt1とcnt2が等しくないのに等しいと判定されることはあるが、一時的なもので次のクロックでは
正しく判定されるだろうし。 一応理由を書いとくと、
たとえば3->4に変化するときを2進で書くと011->100となる。
ビットごとに変化を書くとb2:0->1、b1:1->0、b0:1->0。
これらの信号の変化は完全に同時とはならない。
3->4になる瞬間に0,1,2,5,6,7などの複数の信号状態を経由する。
どの信号状態を経由するかは合成・配線毎、
あるいは環境温度で変わるかもしれない。
これを非同期で受けると・・・・以下略。 >>214
それを非同期で受けたとして、以下略せずにまずいことが起こるパターンを教えてくれ。
今回に限ってはまずいことが起きないように思えるのよ。 cnt2が正しくないタイミングでインクリする
以上 たとえばcnt2=3でcnt1が3->4に変化する瞬間にラッチするとき。すなわちエラー処理を一度だけ行う必要のある状態。
cnt1が3に見えたらその時は何もしない。次のクロックで4に見えるのでその時エラー処理する。OK。
cnt1が4に見えたらその時エラー処理する。OK。
cnt1が5や6に見えたらその時エラー処理する。次のクロックでは4に見える。OK!! メタスタが起こったら何が起こるか分かんねーからダメに決まってんだろ まあ、いずれにしてもお勧めできる回路ではないから深追いすることもないか。
何かしら191の参考になっていればよいが、混乱させてしまっていたらすまぬ。 非同期信号扱う以上、メタスタは回避できないしなぁ… >>219
君の言いたいことはこうかな?
要するに、>>201のソースで。
たとえば cnt1:3->4 と変化するときに
cnt1tmp:3->6->4見たいに変化することがある。
cnt2 != cnt1tmpのときにcnt2はインクリメントされるわけだから、
& 同時性を示すためにcnt2をそのままcnt1tmpの方を括弧付きであらわすと、
cnt2(cnt1tmp):3(3)->3(6)->4(4)
でつじつまが合うと。このケースは確かにそうかな。
メタスと一度でもcnt1<cnt2になったらcnt2がインクリメントし続けるのが気になるけど。 FPGAで非同期セットとリセット両方が使えるとは限らんね
Spartan3は出来たと思うけど、Spartan6はムリ
Cycloneは出来るかな? メタが気になるなら
cnt1tmp <= cnt1;
cnt1tmp2<= cnt1tmp;
cnt1tmp3<= cnt1tmp2;
と何段かのFFにすればよいんじゃない?
何段にしてもメタの確率0になることはないけど。(これは非同期の宿命) >>225
アドバイスありがとうございます!
さっそく実践したいと思います。
FPGAも電子回路も初心者なものでとんでもない物をさらしてしまいましたが
大変勉強になりました。
聞くは一時の恥ってやつですね。 191氏がまだ見てるかどうか知らんが、191のシチュエーションだと、
フラグを立てる代わりにフラグをトグルして、トグルされたフラグを
clk2のFFで2回たたいて同期化し、そのあとflagのエッジ検出して処理開始すれば確実だよ。
異なるクロック間で処理開始の伝達はよくある事なので、俺はこれ専用の回路を
モジュール化(IP化)して使いまわしてるけど。
修正案↓
reg flag;
reg [2:0] flag_sync; //flagのclk2同期化とエッジ検出用レジスタ
always(posedge clk1 or rst) begin
if(rst) flag <= 0;
else begin
if(エラー) flag <= !flag;
end
end
always(posedge clk2 or rst) begin
if(rst) xx
else begin
flag_sync <= {flag_sync[1:0],flag} //flagをclk2に同期化
if(flag_sync[2] != flag_sync[1]) begin //エッジ検出
なんか一度だけのことをする。たとえばエラーメッセージをバッファに入れるとか。
end
end
end >>228
うん、この1bitの同期化受渡しが正解だな
>>225の多bit同期化はbit毎にズレが発生するのでやってはいけない設計 非同期のバイナリカウンタでも、2回叩いて値が変わってなければ同期化できたってことでいい。 ×flag_sync <= {flag_sync[1:0],flag} //flagをclk2に同期化
○flag_sync <= {flag_sync[1:0],flag}; //flagをclk2に同期化
コロン付け忘れたw
>>230
clk1でフラグをトグルする間隔が、clk2の3クロック周期以上という意味だね。 191君がどういう理由でカウンタにしたかは定かではないが、
下記のような状況を考慮した可能性はないのかな?
clk1側でclk2側に処理させたい事象が短期間に5回発生した。
clk2側はその期間に1回の事象しか処理出来ないケースがまれにある。
見たいな。 こんな印象ね。cnt2に直接メタステ乗るけど、面倒なんでcnt1tmpは省略した。
http://codepad.org/4bRwSelw 書いた後思ったけど、
(cnt1!=cnt2)の同期が保障されて無いと、
cnt2のビット毎にcnt2+1を通すか、
そのまま保持するか異なってくるタイミングあるかな?
cnt1tmpは省略不可か? >>228
191です。わざわざありがとうございます!
ありがたく使わせていただきます。
メタステーブルという言葉を教えていただいたので
自分でもいろいろ調べることができました。
おかげさまで勉強がだいぶ進みました。
みなさんありがとうございました テストしてない回路は動いていないと考えた方がいいよ。 シュミレーションは通るけど実機だと動かないから
見てくれと渡されたソースを調べてるんだけど
ちょと見ただけでゲートクロックやシーケンサもどきの部分で
組み合わせ回路からの非同期リセットが
あるんでISEでQuartusのDesign Assistantみたいなチェックをする方法ないですか? あるてらばっかし使ってたんでISEの設定がわからん
ソースごととにQuartusでコンパイルしなそえばみつかるかも知れないけど Verilogになる前のインテルの独自仕様のHDLがどんなだったか興味あるわ やっぱりツールは内製しないと負けるよな
fpgaとかでも、日本は駄目過ぎる ソフトも電子回路ももう日本は圧倒的に後進国だろう
モノづくりが強かったのは金型作るときの職人の腕がすごかっただけで
もう時代が違う まだ web は準備中な感じ
Tachyon DA's CVC Full 1364 Verilog HDL Compiled Simulator is now Open Source
http://www.tachyon-da.com/ つーかな、
日本のメーカーはソフトを軽視しすぎ。
ソフトというより、
あくせく汗水流してるとがんばって働いてるとか。
ホントの頭脳労働してても評価されない。
研究、開発、設計に現場と同じ感覚でQC活動なんかさせんな。
結局、勤勉さと、手先の器用さ以外の部分で見るべきものが全くなくなった 殆どの付加価値はソフトウェアで実装されているが、
お客は、ハードが機能を実現していると思っている
経営者がこの感覚におちいっていると、ソフト技術者を冷遇する
経営者がこの現象を理解していると、ソフトを無料で配ってハードを高値で売る
いずれにしてもソフト技術者が尊敬されることは無い いかろすが8月一日に上がってた
入れはしたけど試しようがない・・・
サマリー読む気もない・・・ Verilog で複数リセットに対応したいとき
always @(posedge ck or negedge res1 or negedge res2)
と書いても一応論理合成できたんだけどこれでいいんだろうか。
assign res = res1 & res2;
always @(posedge ck or negedge res)
みたいに書かないとダメかなとか思ったりしたけど。 >>252
むむ、何を見ればいいんでしょう。Quartus 使ってます。 252じゃないけど
Quartusなら
Tools → Netlist Viewer → Technology Map Viewer (Post-Fittinng)
で合成後の回路が見られる おー、面白い。こんなふうになっていました。
http://img.wazamono.jp/pc/thumb/1410739993472s.jpg
assign res = res1 & res2;
always @(posedge ck or negedge res)
と同じかな?
複数リセットを使ってる例って見ないんですよね。 verilogの非同期リセットは何度見ても気持ち悪い。 >>258
クロックのエッジとリセットのエッジで何らかの動作をするという本質をよく表してると思うけど >>259
リセットはエッジじゃなくレベルでかかるべきだろ
ダウンエッジでFFがリセットされても
その後強烈なノイズが乗ってFFが1に化けたら
ダウンエッジでしか効かないリセットだとリセットは0なのに
FFは1に化けたままになりそう 一応こうとも書けるらしいけど、
http://www.mtl.t.u-tokyo.ac.jp/~jikken/cpu/wiki/index.php?Env%2FVerilog%2FOutline
これはこれでなにか気持ちが悪いんだよな。
いや、単に俺が気持ち悪いだけですけどね・・・ >>260
うーん、その強烈なノイズってリセット期間中だけ発生してくれるもんなの? >>262
でもレベルでリセットが効く方が有利だろ。
車のパーキングブレーキが
「引いた瞬間しか効かない」ものだったらどうなるか想像してみてくれ。 >>263
まぁわかるんだけどね。実装はどうせそうなるし。
でもロジック上は区別がないのが気持ち悪さになるのかな。 センシティビティリストってシミュレーションでしか使わないんじゃなかったっけ? >>266
VHDLではRTLシミュレーションでしか意味が無い。
でもverilogはそうじゃない。 だから
強烈なnoiseが来たときに
FFを不定なり
リセットなり
掛ければ良いのでは
・・・まぁそんなこと回路か動くことのまえでは意味ないし
ノイズならRTL以外でケアすべきところ >>261
どっちにしてもVHDLにしても変化があった時に動作するのがセンシティビティリストなので結局はレベル動作を表しているわけじゃないけどね。 RTLで表現出来る非同期リセットのノイズなら、エッジ評価で問題無いでしょうに。gate cellモデルならprimitive文で非同期リセットをレベル動作モデリングするのが通例。 下記のようなラッチを
always@(G or D)
if (G) Q <= D;
こう書くのと似た気持ち悪さってことかね。
always@(posedge G or posedge D or negedge G or negedge D)
if (G) Q <= D;
VHDLはそもそもセンシティビティリスト自体不要だったと思うんだけど、
なぜあるんだろうね。 5・7・5
の後に「それにつけても 金の欲しさよ」
を付ける。 VerilogでALU的なのを書いていたらはまったのですが、
ModelSim-Altera Starter Edition 10.1e で次のコードを実行したら、
なぜか三つめだけ論理シフトになってしまいます。
これはVerilogの仕様なんでしょうか?あるいはModelSimのバグ?
他の環境ではどうなるのでしょう?
`timescale 1ns / 1ps
module alu_tb;
wire dummy;
initial begin
$display("%x",
$signed(32'hffff8180) >>> 8);
$display("%x",
1 ? $signed(32'hffff8180) >>> 8 :
0);
$display("%x",
1 ? $signed(32'hffff8180) >>> 8 :
0 ? 32'hffff8180 >>> 8 :
0);
$display("%x",
1 ? $signed($signed(32'hffff8180) >>> 8) :
0 ? 32'hffff8180 >>> 8 :
0);
$stop;
end
endmodule >>281
多分Verilogの仕様 。
32'hffff8180はunsignedなので算術シフトしても論理シフトになる。
算術シフトしたいなら32'shffff8180か $signed(32'hffff8180)のように
signedとして扱われるように記述する必要がある。
ただ、後者がセレクトされる理由は分かんないや。ゴメン。 >>282
あ、3つめも後者の論理シフトが選択されてるわけではなくて、
$signedの付いている方の式を実行してるんです。
紛らわしい例でごめんなさい。 >>281
うちにもフリーのツールしかないからModelSim ASEとVerilatorでしか試せてないけど、
Verilatorではちゃんと全部同じ値になった。
ffffff81
ffffff81
ffffff81
ffffff81
Verilogの仕様ってことはないんじゃないかな。 >>281
仕様書読んでみたけど、3項演算子のときどうなるのかよく分からない。
verilogでsignedは後から追加された仕様だから謎の部分が多い。
どうしても使わなきゃいけない部分以外は、unsigned にしとくほうが安全だね。
http://www.edaplayground.com/ 3番目はこう解釈されてるのかな?
$display("%x",
(1 ? $signed(32'hffff8180) >>> 8 : 0) ? 32'hffff8180 >>> 8 :0);
なぜ3番目だけこうなるのだろう。 演算子の優先度を調べてみたけど、下記表現が
a ? b : c ? d : e ・・・(1)
下記のどちらで解釈されるかは
(a ? b : c) ? d : e
a ? b : (c ? d : e)
どこにも書いてない。
未定義なのかな?
未定義だとすると(1)と書くのがそもそも間違いという結論になるのかね。 >>286
手元のModelSim ASE 10.1dで試してみると
$display("%x", 1 ? $signed(32'hffff8180) >>> 8 : 0 ? 32'h12345678 : 0);
としても結果は
00ffff81
になるので、後ろの項が選択されているわけではないっぽい。 >>287
「同じ優先度の場合は左から右」って書いてあるよ a / b / c != a / ( b / c ) >>289
結合性が左ということは、
>>281
の実行結果は本来こうなるのが正しいということでOK?
ffffff81
ffffff81
00ffff81
00ffff81 >>289
三項演算子が左から右ってありえなくない?
そんなことになったらマルチプレクサ書くのにカッコの山になる。 >>293
always文で組み合わせ回路書くの好きじゃない >>292
foo= a ? b : c ? d : e; だと、
c じゃなくて a を先に評価しろってことでしょ?
a が真なら b、
偽なら c ? d : e 。 >>296
あぁ、結合順じゃなくて評価順のことね。 条件演算子(3項演算子)の優先順位が変テコりんな言語はPHPだけ。
PHP以外は全てC言語と同じだろ? セレクタとして使う信号には
頭にs_を付けて見るとー みなさんありがとうございます。
ISE14.7のISimでもやはり三つめが論理シフトになってしまいました。
ModelSimと同じエンジンを使っているという可能性もありますが、
どうもVerilogの仕様かもしれません。
式をいろいろいじったところ、次のような結果になりました。
`timescale 1ns / 1ps
module alu_tb;
wire dummy;
initial begin
$display("%x", $signed(32'hffff8180) >>> 8); //ffffff81
$display("%x", $signed(32'hffff8180) >>> 32'd8); //ffffff81
$display("%x", ($signed(32'hffff8180) >>> 8) + 0); //ffffff81
$display("%x", ($signed(32'hffff8180) >>> 8) + 1); //ffffff82
$display("%x", ($signed(32'hffff8180) >>> 8) + 32'b0); //00ffff81
$display("%x", ($signed(32'hffff8180) >>> 8) + $signed(32'b0));//ffffff81
$display("%x", $signed($signed(32'hffff8180) >>> 8) + 32'b0); //ffffff81
$display("%x", $signed(($signed(32'hffff8180) >>> 8) + 32'b0));//00ffff81
$stop;
end
endmodule
推測ですが、次のようなルールと思われます。
・0や1は符号なしではないが、32'b0は符号なし。
・右辺式のいずれかの値が符号なしだと、全体が符号なしになる。
このとき$signed()をつけていてもはがれる。
ただし
三項演算子では、a ? b : c のとき、aの符号有無はb, cには無関係。
シフト演算子の第2項の符号有無も第2項には無関係。
・$singed($signed())と二重になっていると、一つだけ(たぶん内側?)はがれる。
これが本当に仕様かどうかは確認できていません。 × シフト演算子の第2項の符号有無も第2項には無関係。
○ シフト演算子の第2項の符号有無も第1項には無関係。 >>302
> ・0や1は符号なしではないが、32'b0は符号なし。
例を見るとそれっぽいね。
> ・右辺式のいずれかの値が符号なしだと、全体が符号なしになる。
近い感じだけどちょっと違うかな?
> ・$singed($signed())と二重になっていると、一つだけ(たぶん内側?)はがれる。
これはたぶん違うんじゃないかな?
下から2番目
$display("%x", $signed($signed(32'hffff8180) >>> 8) + 32'b0); //ffffff81
に適応すると
$display("%x", ($signed(32'hffff8180) >>> 8) + 32'b0); //ffffff81
これは上から5番目と同じ形だから結果は00ffff81になるはず。
だから >>302 に共通するルールは
論理シフトを実行する場合、その次に実行される演算まで評価して数値型を決める。
上記評価範囲内に符号なしが存在すれば符号なし型となり、
すべて符号付であれば符号付型となる。
じゃないかな?
下から2番目の最初に実行されるシフト演算と、その次に実施される演算を抜き出すと、
$signed($signed(32'hffff8180) >>> 8)
だから、上記部分は$signed(32'hffffff81)となり、以下略。
一番下の最初に実行されるシフト演算と、その次に実施される演算を抜き出すと、
($signed(32'hffff8180) >>> 8) + 32'b0
だから、上記部分は32'h00ffff81 + 32'b0となり、以下略。 >>304
> 論理シフトを実行する場合
算術シフトね。 度々すいません。
もっと単純なルールで説明できますね。
・計算式中一つでも符号なしが存在した場合、
その式は符号なしとして計算される。
・$signed(*)見たいなものは*が先に計算されてから$signedに渡される。
これはFunc(*)等の関数でも同様。
考えてみれば当たり前ですね。
// 08000000
$display("%x",'sh80000001/'sh10 + 'sh0 + 'sh0 + 'h0);
$display("%x",$signed('sh80000001/'sh10 + 'sh0 + 'sh0 + 'h0));
// f8000001
$display("%x",'sh80000001/'sh10 + 'sh0 + 'sh0 + 'sh0 + 'sh0);
$display("%x",$signed('sh80000001/'sh10 + 'sh0 + 'sh0) + 'h0);
$display("%x",$unsigned('sh80000001/'sh10 + 'sh0 + 'sh0) + 'h0); Cならやってみた。符号はどの言語でもややこしい・・・
http://codepad.org/ooLUGl7shttp://codepad.org/UGnOMahv
シミュレーション実行可能なVerilogのソースアップローダってないのかな。 符号の扱いは、ieeeの規格書にちゃんと書いてあるだろ。見ているのか? >>307
VCS と irun(nc-verilog) でやってみたぜ。
>>281 をそのままやったら、どちらも
ffffff81
ffffff81
00ffff81
ffffff81 >>308
オレが >>285 にリンク貼ってやっただろ 算術演算のIP作ったとき、符号付、符号無の混在演算のサポートで結構悩んだなぁ。
割り算IPの場合、符号付A÷符号付B=符号付Qの演算の時とか、
Qの整数部のビット数=Aの整数部のビット数+1にしないと、Qの整数部がオーバーフローするんだよね。
例)
-65536÷(-1) = +65536 http://www.eecg.toronto.edu/~laforest/hdl_references/coding_guidelines.pdf
3. Mixed unsigned/signed expression (Verilog)
? Rule: Do not mix unsigned and signed types in one expression 身もふたも無いので・・・
>>306
↓これでOK?
$signed(32'hffff8180) >>> 8
$signed(u) >>> s
s >>> s すべてsなので算術シフト
s
結果は32'shffff8180(signed)。
1 ? $signed(32'hffff8180) >>> 8 : 0
s ? $signed(u) >>> s : s
s ? s >>> s : s すべてsなので算術シフト
s
結果は32'shffff8180(signed)。
1 ? $signed(32'hffff8180) >>> 8 : 0 ? 32'hffff8180 >>> 8 :0
s ? $signed(u) >>> s : s ? u >>> s : s
s ? s >>> s : s ? u >>> s : s uがあるので論理シフト
u
結果は32'h00ffff81(unsigned)。
1 ? $signed($signed(32'hffff8180) >>> 8) : 0 ? 32'hffff8180 >>> 8 :0
s ? $signed($signed(u) >>> s) : s ? u >>> s : s
s ? $signed(s >>> s) : s ? u >>> s : s $signedに渡される s >>> s がすべてsなので算術シフト
s ? $signed(s) : s ? u >>> s : s
s ? s : s ? u >>> s : s uがあるので論理シフト
u
結果は32'hffff8180(unsigned)。 最近はルート配線で悩んでる
スラックを満たしてるけどクロックに対して余裕が少ない
単クロックばら撒いてるのに配線遅延のせいかタイミングが満たせない
スライス量が増えると適切な配置に限界があるのか タイミングの類はベストとワーストでやるだろうから
結構マージンあると思うよ ルート配線… シンセサイズ合成みたいなものか
スラック満たしてるなら全く問題ないと思うけど
ツールは制約満たしてればそれ以上無駄な努力はしないよ
無駄な努力を強制するなら、XilinxならContinue on Impossibleなんてオプションがあるけど マージン増やそうと思ってクロック制約を割増なんてやっていいですか >322
リソース無駄に使うことになるけどそれでもよければ 多クロック入れる場合は各々入力に制約つけてるがまずいんか このスレでvhdlは少数派か
俺もバイリンガルになろう Verilogに対するSystemVerilogのようなものって、VHDLにはあるの? ドワンゴ「急募!FPGA機器開発経験者!」 ニコニコ動画をFPGAで高速化、ハード技術者を募集中©2ch.net
http://hayabusa3.2ch.net/test/read.cgi/news/1417266799/ >>328
テクノマセマティカルでも買ったほうがいいよ。
エンジニアはほとんど残ってないみたいだけど。 >>328
このスレで「これができる奴は30代でも年収1000万超えてるレベルだろ」って言われてるけど
500万の俺は一体・・・ IPオフロード処理関連では無く、トランスコーダーの方なんだねぇ
素直にOpenMPとかOpenCL使ったアルゴリズムに力入れた方がヨクネ?とか思ったら負けなんだろうな… デバイスドライバの実装はハードウェア設計者とは別だと思うんだが… なんだかなぁ、IP集めて何か作ればそれで作ったような気になる、
こんな技術者が多すぎる。
何も自分の頭で基礎を考えようとしない?
それがものづくりなのか? ライブラリをまったく持っていないだろうな。完成まで2,3年かかると見た。 デバドラはMS-DOS時代に書いた事はあるけどWindowsやLinuxでは書いたことないからパスだな 誰か応募しないのかよ。
2000万くらいふっかけてさ。 勉強中の身なのですが質問があります。
verilogでnビット加算回路を作成したく思っています。
調べたところ、+記号を用いて簡単に作成しているものがありました。
+記号を使わずに、全加算器を用いてnビット加算回路を作成する方法はありますか?
例えば3ビットの場合、全加算器を3つ(または半加算1つと全加算3つ)記述しなければならないのと思うのですが、こういったものをn個(指定した個数)にするといった方法はあるのでしょうか? generate
演算子使わないで全加算器連結なんて、お勉強以外で実際に使う事は無いと思うけど >>344
verilogじゃないけどVHDLで全加算器を自動で並べる記述をして
作ったことがあるよ。
この場合、FPGAだとキャリーチェーンを使わなくなってしまい
ロジックの消費も増えてだめだった。
結局素直に+演算子で記述した方が、ロジックの消費を抑えられたよ。 初心者なんだけどビヘイビアレベルってなに?
vhdlで普通にかいたらrtlレベルの記述になるよね
それと
process(clk)
begin
if(clk'event)
って意味が重複してない?
process(clk)っでclkが変化したときだけ実行されるんだよね? >>346
そうなる罠
FPGAベンダのツールじゃ無くて、Synplifyみたいな高級品使えばそういう所も意図を汲んでくれる、らしい
使った事ないから知らんけど
>>347
ネタじゃ無くて実際にそんなやり方してるの? >>349
Xilinx の何とかwizardもそうだろ?
何でも出来るぞ。 マジだったのか…そりゃ何でも出来るだろうけどさ
>>344 みたいな言語の構文で十分出来るような事までスクリプト組んで自動生成したいのか?
以前にPCヲタが仕事で「Excelで16進表記したいからVBAでマクロ組んだった」ってドヤ顔するの思い出したわ >>348
> 意味が重複してない?
> process(clk)っでclkが変化したときだけ実行されるんだよね?
そう。だから、clk'eventは必ず真になる。
でもこれはVHDLの文法での話であって、
合成ツールはそうじゃない。
合成ツールはVHDLのセンシビティリスト無視するから、
意図した回路ができない。 後、ビヘイビアレベルだけど、
設計の初期段階に、
回路合成できるかどうかは無視して抽象的な設計をする
レベルって感じの意味。
たとえば、下記は合成はできないが、
1秒毎進むカウンタを表現している。
細かいことは無視して構想設計して、
次の段階で合成可能なRTLレベルに落とし込んでいくイメージ。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity Test1 is
port(A : out integer);
end Test1;
architecture behavior of Test1 is
signal B : integer;
begin
A <= B;
process begin
B <= 0;
while true loop
wait for 1 sec;
B <= B +1;
end loop;
end process;
end behavior; つかココ人居たんだ・・・
アルテラかなんかで32bit加算器を
適当APPNAと+記号で比べたら
+が断然速かったなぁ >>353
ありがとう!なんとなくわかってきた!
ビヘービアでは論理合成できるとは限らないのか
テストとかでなら使えそうだね テスト用にでっち上げたスタブのRAMとかドライバは中身ちょ〜適当なので合成不可ばっかりだわw 何が合成可能なのかいまいちわからん
wait系ならwait untilだけ、それも1processにつき一個まで
とか
断片的な知識しかない
合成不可なパターンをまとめたページとかありませんか? うろ覚えだけど、XilinxのXSTはこんなのも合成してくれると資料に書かれていたような
誰得…
process begin
wait until rising_edge(CLK);
data <= '0';
wait until rising_edge(CLK);
data <= '1';
end process;
クロック信号と極性は全部同じでないと駄目で、さらにステート保持用にレジスタが生成されるはず >>357
こう書けば合成可能というしっかりした規格は無いと思う。
が、DesignCompilerという論理合成ツールがスタンダードと考えていい。
下記あたりで回路推定可能な記述はどんな形かを知っておくといい。
http://cseweb.ucsd.edu/~tweng/cse143/VHDLReference/08.pdf 初心者ですが、教えて下さい。
Verilogで、ADコンバータの値を8回の移動平均しようと考えています。
以下のように記述を考えましたが、何か勘違いしているでしょうか?
always @ (posedge CK) begin
if( RESET ) begin
・・・・
end else begin
meta <= AD_pin; //メタフィルタ
AD0 <= meta; //記憶(最新)
AD1 <= AD0; //
AD2 <= AD1; //
AD3 <= AD2; //
AD4 <= AD3; //
AD5 <= AD4; //
AD6 <= AD5; //
AD7 <= AD6; //記憶(最古)
AD_gokei <= AD0+AD1+AD2+AD3+AD4+AD5+AD6+AD7; //合計する
AD_heikin <= AD_gokei[19:2]; //8で割る
end
end
過去7個を持たなくても、前回平均値に「最新値を8で割って」加算すればよいか....
と思っていましたが、それは違うと思いました。
いかがでしょうか >>361
FIRとIIRの違い。調べてみよう。
ちなみに、AD_goukei は、レジスタでなくていいのでは? >>363
8個前のデータを保持する方法が気になる 8個前のデータを保持するのは、言い換えれば、
8個手前のデータを与えることなので、
8個分の遅延をした値を与えればOK。 FPGAで2行LCDを駆動しようとプログラム(Verlog)していましたが、
結局今日1日かかってもできませんでした。
待ちに次ぐ待ちで、タイマーを何本も作りましたが、うまく文字が出ませんでした。
reg [19:0] count;
reg timer_start1;
reg timer_start_0;
reg timer_start_1;
reg timer_end1;
timer_start_0 <= timer_start1;
timer_start_1 <= timer_start_0;
if( (timer_start1==1'b0) && (timer_start0==1'b1) ) begin // 立ち上がったら
if( count < 20'd50000 ) begin // カウンタが50000より小さいなら
count <= count + 20'd1; // カウンタアップ
timer_end1 <= 1'b0; // 終了ではない
end else begin
timer_end1 <= 1'b1; // タイマ終了である
end
end
マイコンだと、__delay_ms(5)って書くと5ms待つんですが、
FPGAは何行も書くのですが、そういう1行の命令はないのでしょうか?
何かコツはありますでしょうか? FPGAがどういうものかっていうのを今一度調べ直してみるといいのではなかろうか >>366
うまく出ないというよりコンパイルできてないだろそもそも すみません、教えてください。
Verilogで、符号付きの計算で苦戦しています。
符号付きのレジスタは、
reg signed [7:0] tinco [0:7];
で宣言できます。また、正の定数は、
tinco [4] <= 8'sd250;
で、代入できます。
しかし、負の定数の記述方法がわかりません。
tinco [5] <= 8'sd-250;
は違うと思いますし。
宜しくお願いします。 -8'sd250 でも -8'd250 でもどちらでも。
ビット長なんて気にしなくていいから、-250 でいいと思うけど。 ってか、signed 8bit だと、-128〜+127 じゃない! 10年振りにHDLでも弄ろうと思ったら、センシティビティリストとか手抜きできてびっくりした。 Verilogで signed って使えるんだ。すごい。
reg signed [15:0] s16_aaa;
reg signed [11:0] s12_bbb;
があったとき、
s12_bbb <= s16_aaa; ってやると、どうなるの? ちゃんと値のLSB側が切られて
キャストされて代入されるの?
また逆に、s16_aaa <= s12_bbb; ってやると、ちゃんと符号拡張もやってくれるのかしら。 >>374
IEEE1364-2005 に書いてあるから読め Verilogで、負の数値が扱えなかったころは、どうやって処理したのだろうか。
自分で負の処理を書いたのだろうか。
if( a == 16'h0 ) begin
a <= 16'hffff;
end else begin
a <= a - 16'h1;
end
とか 負数の内部表現は2の補数。unsignedだけでも符号拡張が面倒くさいがさほど困らんよ。 1995と2005では負の値に対するnumberの扱いがちと違う。
詳しくは規格を見てもらうとして、xやzを無視した10進整数に限って言えば
// 1995
decimal_number ::=
[sign] unsingned_number
| [size] decimal_base unsigned_number
decimal_base ::= 'd | 'D
// 2005
decimal_number ::=
unsigned_number
| [size] decimal_base unsigned_number
decimal_base ::= '[s|S]d | '[s|S]D
もちろん2005でも単項演算子としての-があるからあまり違いを気にする事はないけどね。 Xilinx ISEでVerilogをやっています。
少し修正するだけでも一通り全部のコンパイルをするので
時間がかかって困っています。
修正したファイルだけをコンパイルするだけで良いとか、
そういう方法はないのでしょうか? 時間がかかるのはコンパイルよりP&Rですよ。
困るほど時間がかかるのは、デバイスの使用率が大きすぎるからだと思う。
あと、PCのメモリが足りないんじゃないかな? >>380
>修正したファイルだけをコンパイルするだけで良いとか、そういう方法
たぶん無いと思います。ガマンするしかありません。
PCのスペックを上げれば、確かに速くなりますが、劇的ではない予感がします。
時間がかかると言っても、30分程度なら短い方ですよ。
1晩とか平気でかかっていた時代もあったらしいです。 最上位だけ別に作っとけば、下位階層は別々にコンパイル出来るよ。
P&Rは、Virtex5で90%くらい使ってたときは一晩かかった。
コンパイル(論理合成)はSynplify Premierだったけど。 90%って、またスゴイね。
で、ちゃんと入ったの? ISEってインクリメンタルコンパイルってないの?
QuartusIIは有料版なら使えるけど無償版はできない
ISEも似たようなもん? >>384
96%くらいまでは入るよ。
スッゴい時間かかるけど。 仕事としてHDL使ってる人ってどんなもの作ってるの?
大学2年くらいの時に時計作らされたけどそれだけで発狂しそうになったわ FPGAはもちろん、ほとんどのデジタルICはHDL使ってるんじゃね?
FPGAそのものもHDL使って設計してるらしいよ。 学生にやらせるのは良いことだと思うよ
キャラクタLCDの初期化を通してマイコンの神々しさを知り崇拝するようになるだろう つーか「HDL」ってくくりがおおまかすぎるねん。
たとえば「プログラミング言語」やったら、アセンブリ言語からPrologまで含まれるんやで。 HDLとRTLの違いは、何ですか?
意味的にいうと、どっちかが、どっちかに包まれる言葉でしょうか? 高位合成界隈にはHDLだけどRTLじゃないってものはいくつかありそう。
ただ、OpenCLとかMATLABから高位合成した時にソースをHDLと認識するかとか考えると、
どっちも言ったもん勝ちの部分はありそうだけど。 >>392
HDL ⊃ RTL だけど、
この場合のHDL は、Verilog と VHDL くらいで、
edif とか SystemC は入らない気がする。 RTLのLはlanguageじゃなくてlevel。直交した概念だ。 RTL = Registor Transfer Level
データは、クロックによりFFを通って処理されるという回路接続方法という理解で
よいでしょうか? >>395
「HDL言語を使って」とか
「RTLレベルで書かないと」とかつい言っちゃうよね。
「HD言語」「RTレベル」が正しい。 高水準のほうから見てくとわかりにくいが、低水準のほうから考えてゆけば良い。
ネットリストのレベルだと、全ての接続を静的に記述するわけだけど、
RTLの場合はそうじゃなくて、「こういった場合の時のはここからここにデータが伝わる」
という感じの記述になる、ということ。
それより高水準のビヘイビア記述は、メーカーとかも結局何がなんだか状態なんじゃねーのw あなたもネットで告発しませんか?
ビッ苦カメラ札幌店 佐藤伸弦 暴行事件 HDLの類は、あと10年か20年くらいで、ソフトウェアプログラミング言語と融合すると思うのだが。
眺めていると、そうなってほしくないという感情があるっぽい。
もともとハード屋かな。 ソースを書いて、書き換え可能なメモリのようなものに記録する状態で、もう限りなくソフトに近い。
メモリにCPU解釈の命令列を出力するか、実行可能な回路を出力するか、その程度の違い。 >>402
僕もそう思う。
だから、人前で「FPGAのプログラム作ってる」と言っています。
マイコンのプログラムと何も違わないから。
しかし、Verilogに慣れると、久々にマイコンでCを書くとき、
Verilogには結構便利な機能があること気づきます。
一番感心するのは「 { } 」連接です。
bit単位で連結したり入れ替えたりできて、とてもありがたい。
Cでやろうとすると、シフトと&の連続ですよね。 ソフト屋だけどFPGAに初めて挑戦して
ソフトとハードは考え方から根本的に違うと思った。まる。 そもそも初期のコンピュータは配線を変えることによって
処理を変えていたんだから、それをプログラミングと呼ぶなら同等だろう。
C言語からそのままハードウェアってのはここ20年くらい言われているけど
ろくに実現できていない。言語の問題じゃなくて、
>>405 の感覚が正しいんだと思う。 ブロッキング代入とノンブロッキング代入、どっちが主流なんだろう。 ASICはまあなんとかなるかって記述しちゃうけど
FPGAの時は構造がアレだから記述はこうするか
って物理的な問題でブロッキング気にする事はあるが
主流とかは考えてはいないかなぁ >>406
HDLとFPGAの組み合わせは、配線を変えたプログラミングより、明らかにソフト寄り。
CPU設計者やFPGA設計者を本物のハード屋だけれども、
HDL屋はハード屋といいにくいと思う。
プログラミングという言葉には命令列生成というニュアンスがあるので、
ソフト的なものであっても『回路設計』にプログラミングという言葉を使うのは
違和感があるのかもしれない。
「ハードウェアとソフトウェア」と「回路設計と命令列設計」という
それぞれの概念軸は直行する考えていいかも。
命令列設計のほうが早くにソフト化したので、ソフトウェア設計と命令列設計
は同一視されたけども、20年後くらいはどうか。
ハードウェア回路設計(古典的な回路設計、CPU設計、FPGA設計)
ソフトウェア回路設計(HDLとFPGAの組み合わせ)
ハードウェア命令列設計(配線変更による太古のプログラミング)
ソフトウェア命令列設計(現在のプログラミング)
ソフトウェア回路設計とソフトウェア命令列設計は現在は「まだ」融合していない。 >>403
>一番感心するのは「 { } 」連接です。
>Cでやろうとすると、シフトと&の連続ですよね。
具体的にCでやるとどうなるんだろう。
MSB←→LSBの入替は、
#define N 0x12
unsigned chr a;
a =(N&0x01)? 0x80 : 0x00;
a+=(N&0x02)? 0x40 : 0x00;
a+=(N&0x04)? 0x20 : 0x00;
a+=(N&0x08)? 0x10 : 0x00;
a+=(N&0x10)? 0x08 : 0x00;
a+=(N&0x20)? 0x04 : 0x00;
a+=(N&0x40)? 0x02 : 0x00;
a+=(N&0x80)? 0x01 : 0x00;
Verilog
wire [7:0] N = 8'h12;
wire [7:0] a = 8'h00;
assign a = { N[0],N[1],N[2],N[3],N[4],N[5],N[6],N[7] };
というところでしょうか? >>411
これがいいかも
ttp://ikautak.hatenablog.com/entry/2013/02/14/221500
他にも分岐不要で出来るものが色々あったと思う >>412
何という情報量の少なさ。
>>411
ハードウェアのすごいところは、ビット入れ替えはゲート数がゼロ。 >ハードウェアのすごいところは、ビット入れ替えはゲート数がゼロ。
そうとも限らない verilogで書いた回路をFPGAに実装する場合にテストベンチに当たるものってある? assign a = { N[0],N[1],N[2],N[3],N[4],N[5],N[6],N[7] };
って、VHDLでは、なんと書くのでしょうか?
というか、VHDLでも連接ってできるのでしょうか? Cでのビットの入れ替えは16ビット程度ならテーブルで一発だけどね 教えてください。
Xilinxのスパルタン6をVerilogで書いていますが、回路がちょっと多くなるとスグに
「・・・・Dedicated route・・・・」というメッセージが出ます。
クロック信号を、いきなり外に出せるわけないじゃん とか
バンクをまたいでいるので、タイミングの保証はできませんよ。
だから上の呪文をucfに追加してね、という意味かと思います。
このwarningをでないように組むには、どのような点に注意すれば良いのでしょうか?
そもそも このメッセージがでる用では、まだまだプロとは言えない、ということでしょうか? 事実をそのまま書いてもらわないと余計にわけわからない ロジックの出力をクロック信号に使ってるんだろう
誰もが最初に通る道だ
Spartan6ならまず↓を全部読む
ttp://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx14_3/sim.pdf
ttp://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx14_4/xst_v6s6.pdf ISE Web packはWin8に対応まーだじかんかかりそうですかねぇ ISEくらい自分でWin8で使えるようにしろよ
もうメインストリームはVivadoに移行してんだから Vivado PlanAheadって、起動にめちゃくちゃ時間がかかりません? マイコンやって来た人にFPGAを説明するのって、とても難しいね。
同時に、一斉に、バラバラに、全速力で動くのが、わからないらしい。 >>429
マイコンだけとかパソコンのプログラムだけの人に説明するのには苦労しました
わかっていただけたかはわからないけど ソフト屋にとって同期という概念はない。
概してソフト屋は言葉をハード屋から盗んでくるらしく
「同期」という言葉自体はある。同期・非同期呼出しとか。
でもそれはハードの言う概念とは全く違うんだよなぁ。 僕らも便利だから「変数」と言う言葉を使ってしまうけど、実体はD-FFであり、
D端子が入力でQが出力で・・・と思うけど、彼らにとって「変数」とは、
数値記憶という考え方でしかない様子。
reg wire と説明すると、wireって何? と来る。 >>432
reg で宣言しても FF になるとは限らないし、
仕様書でも Variable って呼んでるのも混乱の元。 >>433
>reg で宣言しても FF になるとは限らないし、
それは、どういう時でしょうか? 教えてください always で組み合わせ回路作るとき。
センシティブリストを間違えてラッチができるとかもあるよね。 Apple Japan合同会社の求人概要 -IC検証エンジニア-
http://next.rikunabi.com/company/cmi0239655055/nx1_rq0011827045/?fr=cp_s01810&list_disp_no=3
仕事の内容
IC検証エンジニアを担当して頂きます。
対象となる方
8年以上のSystem Verilogとその他の検証言語に関する経験をお持ちの方 本職さんはここを覗いてる暇なんぞないと思うぞ。
特にアナログ系なんぞ。
ルネとかが放出した人材でもあたってみれば? 2ちゃんが、まともな掲示板だと思うようなおめでたい頭しているんだろうなぁ。
ここに書かれてることは便所の落書きと一緒だよ 僕は、そうは思わない。
有用なことも書いてある。玉石混淆。 日本語は正しく使おうネ
× 書いてある
○ 書いている(440が)
(※ >>439はうんこレスしか書いてない) 昔、便所の落書きに書いてあった電話番号に電話してみたのはオレだけじゃないはず。 昔、便所の落書きに書いてあった。
正面に「右を見ろ」
右の面に「左を見ろ」
左の面に「後ろを見ろ」
後ろの面に「キョロキョロするな」 FPGAを使って、FIRのデジタルフィルタを試したいですが、係数を出してくれるフリーのソフトはないでしょうか?
マトラボは持っていません マイコン屋はタイマーとかDMAとかそれぞれ全力で動いてるからわかりそうな気がするけどどうなんだろうな
とりあえず全レジスタの動作を1個のalwaysで書こうとすんのは勘弁してほしい 全部を1つのalwaysはやらないけど、SPIとか、関連するregは1つのalwaysで書くよ。
「1つのalwaysにはFF1個だけだ」という人がいたけど、見にくくてしょうがない。
あと、条件に演算記号を書かない人がいるけど、どうなの?
if( Push_SW ) begin...じゃなくて
if( Push_SW==1'b1 ) begin...と書いて欲しいわ。 if (Push_SW==1'b1) beginと書いて欲しいわ。 if文でbegin end書かない奴が一番許せない if (Push_SW != 0) begin ... だろ? if(1'b1==Push_SW) begin じゃないか? スイッチは基本、プルアップだからONだと1'b0だな・・・ 1000行越えるようなcaseを書かなければそれでいいよ。。。 verilogでROMを推論させようとするとcase文になるお
この前SystemVerilogなら配列で推論してくれると思って書いたら推論してくれなくてイラッとしたよ。 >>456
それ言語仕様じゃなく
コンパイラの仕様な 中小ってマジで仕様書書かずに作りはじめて物が出来てから手直し繰り返して仕上げるんだな
いままでと真逆のやり方すぎてついていけない・・・ >461
そうなんです。では、その仕様書は最後に出来上がった物とどの位合っているの?
最初から完璧な仕様書書ける位なら、とんでもなく楽な仕事だよ。
多分、過去に非常に類似した仕事をしている。
書かないことが悪いのではなく、書けるほど目標が見えていない。
最終的には報酬との相談になる。
ユーザー側からみたら”ボッタクリだ”と思うかもしれないが、
では”あなたの希望を完璧な文書で渡してください”と言われてどこまで詳細に仕様を決定できるの?
出来合いの製品や他社製品の似たような製品で良ければそれでもいいが、発注者と受注者の間で
認識の差がない開発案件はまず無いよ。
そこをどうやって調整していくかが中小企業とユーザーの努力すべき所です。
多分、大手に依頼しても相手にされない規模の案件でしょ。 >>462
中小企業がgdgdだということは理解した。 目標が見えてないってのがズバリだな
場当たり的で目の前の一時間だけが最優先で後行程に手間押し付けてる
一事が万事そんな感じ
勘で仕事してるんじゃなく運で仕事してる ----------------------------------------------------------------------------
◆間違いだらけの設計レビュー [演習付き実践セミナー]
http://coin.nikkeibp.co.jp/coin/itpro-s/seminar/sys/150526/?10mlmg/
システム構築の生産性や品質を高めるには、仕様書や設計書といったドキュメント
をしっかりとレビューすることが不可欠ですが、実際には、レビューアーがドキュメ
ント作成者の人格攻撃をしてしまったりと、多くの現場が間違ったレビューに陥って
います。 FPGA仕事あります?
みなさんやっぱりマイコン屋兼業ですか? FPGAだけの仕事って、無いでしょう。
マイコン出来ーの、FPGA出来ーの、回路設計出来ーの、デジタル、アナログ回路設計出来ーの、
オールマイティにできることが重要。 そんな奴は、まずいない。
人材を育てることが重要。 >実際には、レビューアーがドキュメント作成者の人格攻撃をしてしまったりと、
世の中女性化していますからな。
個人的な好き嫌いが全てに影響してしまったりする
じょせーのしゃかいしんしゅつーーー
とやらで、女が増えるとそういう問題も増えるだろうね >>475
議論で勝てなくなると相手のあら捜しやら過去のことを
引きずり出して個人攻撃に走るというのが女の定番パターン >>477
まあ、それは一般化のしすぎだろ。
全体的に見て、もしかするとそういう傾向はあるかもしれないが。 >>478
脳味噌の構造上そういう傾向が出やすいみたいだよ。 論理記述だけでなく、一般的に、仕様を書いてその通り実装できる程度の仕事の場合、商品企画の出来がかなりいい。
実際には実現可能性と要求仕様の瀬戸際を攻めることになる。
ま、最終的に、モノと仕様が合ってればいいんじゃない。
青筋立てて怒って他人のせいにする輩はどこにでもいるけど。 >>480
つまり、仕様書を書いている段階で「出来ること」と「出来るかどうか」という壁が分かっている組織は成功しやすい。
問題は中小企業が出す委託ではそれを望めない現実がある。
要求仕様は高いが当人はそれを理解できず、見積金額は過去の実績を超えることを許さない。
正直、完全な新規では二の足を踏む。 >>483
それは、なぜなんでしょうか?
僕は、Verilogで始めました。
5年位して、やっと思い通りのソースが書けるようになりました。 Altera使うならSystemVerilogがいい 今時のFPGA開発環境ってVHDLとVerilog両対応してるのがデフォだと思ってました 俺の都合で言語は決められないからどちらも使うけど、
VHDLのほうが言語として好きだな。 VHDL習ってからVerilog覚えたけどVerilogの方が好きだったわ
VHDLはなんか記述が面倒というかなんというか使いにくいイメージだった エラーやワーニングを、たくさん出してくれるので
VerilogよりVHDLをやっておけば良かったかな、と思った時期もあった。
けど今は、Verilogでやってる。
文字タイプの数が少ないし、好き。
data_bus[7:3] <= { d6, d[2:0], d4 }; とかの連接は、しびれる。
VHDLではできない表記かな。 >>492
data_bus(7 downto 3) <= (d(6) & d(2 downto 0) & d(4));
記述数は確かに多い。
Verilogは左右のビット数があってなくてもエラーが出ない。
VHDLはエラーになる。
unsignedとsignedの掛け算やるとなぜか結果がunsignedになるVerilogの
糞仕様が許せないので俺はVHDL使ってる。
それとVerilogで書かれたコード見てると可読性の悪いきたない書き方する
コードばかりだからverilogはあまり好きになれん。
最初に覚えたのはverilogだったがw
確かケイデンスのセミナーで95年当時小林優氏がやってたセミナーだったと思う。 「:」の1文字で表せるものを、なんで downto とか書くのですか?
また、&でつなげるのはVBAと似ていますね。
6bit目を示すカッコが ( ) なんですね。計算式の優先順位の ( ) と混乱しませんか? verilog2001だかなんだかで $signed だかなんかがあった希ガス 乗算の出力信号定義がsignedじゃないからunsignedになってるんじゃないの? 乗算器が、アンサインド×アンサインドしかできないので、
アンサインド × アンサインド = アンサインド
アンサインド × サインド = アンサインド
サインド × アンサインド = アンサインド
サインド × サインド = サインド
ということでしょうか? vhdlが好きなのはaccess recorde unitsとか記述が豊富で、
attributesも豊富で色んな条件記述ができるところかな。 じゃあなんでVerilogなんか作ったのよぉ〜
新しいものを生み出す人を卑下するつもりはないけど、自己満と意地で
分裂するあるあるはいい加減やめて欲しいわ
優秀なんだから心の広さも優秀であってほしい なんとかアーキテクチャー is とか
downto とか
妙に文章が長いので、Verilogで始めた。
やっぱりVerilogのほうがいいよね。 一つのprocess文で、機能を全部書こうとする人いるけど、どうなの? ステートマシンでしっかり状態が遷移するなら、いいと思う。
あとはツールが頑張れるかどうかです。 見た目、書く量が少ないからと言ってVerilogを勉強し始めて
思わぬところでハマる人はよく見る >>305
最近VHDLの入門書立ち読みしたら
サンプルコードそれだったんだよなー
絶望した
頑張って独学で勉強したやつがクソコード覚えさせられるとか
最初が肝心なのに >>506
どういう書き方だと良いと思うの?
FF 1個につき、1つのprocess文なら満足なの? >>508
そうそう、そういう人いるよね。
でも、FFが離れて記述され、判読性が悪くなると思う。
僕は5つでも6つでも alwaysの中に入れてしまう。 前の会社で紙に回路図書いてからHDL書いてる人がいて悲惨だった。 >>510
AND ORの詳細までは書かないけど、FPGA開発ツールの回路図エディタで
機能ブロックとレジスタ、信号の内部構成は必ず書いてる。
そうしないと後で他人が見たとき効率的にデバッグできないし、
1年以上たってから改修するときとか、回路図みて
必要なコードだけ読み返せばいいので効率的だ。
それと回路の無駄な部分が見えてくるのでコンパクト化しやすい。
まさに「急がばまわれ」 >>511
それだと回路図直した方が早いだろう。
HDLの意味ないと思うが。 回路図ではない、機能構成図みたいなもの。
回路図だとHDLシミュレータに通せないだろう? >>513
回路からならedifとか出してシミュレーション出来るだろ。
ってか、普通そうするが。 edif読めるテストベンチがHDLで書ける
フリーのHDLシミュレーターなんてあるの? >>516
フリー限定かよw
edif 出せるフリーのスケマなんてあるの? >>516
フリーの意味がわからんけど、
Xilinx の isim は edif 読めるよ。 VHDLでnumeric_stdを使用しています。
real型をstd_logic_vectorに変換するにはどう記述すれば良いでしょうか?
ModelSimでreal型数値を与えてシミュレーションしたいと考えています。
回路内は浮動小数点をstd_logic_vectorとして扱っており演算処理するつもりです。
逆は↓で良いようですが、、、
to_real(to_integer(unsigned(slv))); ↓でコンパイル通りました。
std_logic_vector(to_signed(integer(real(i)),32));
お騒がせしました。 VHDLで、トップレベルエンティティのportを、定数によって追加したり無効にする記述
(#ifdefのように)があったら教えて下さい。
シミュレーションの時のみPLLを無効にし、portを追加してテストベンチからクロックを
入れてやりたいのですがうまくいかず、今はコメントアウトで切り替えています。 >>524
やはりプリプロセッサを使うしかないのですか…。
LINTツールが日本語コメントにwarning出すのも対処したいので、外部ツールに掛けることにします。
>>525
if generateは「architecture本体、block本体、generate文に記述することができる」そうで、
エンティティ宣言中のportには使えなかったです。 >>523
VHDLではportの追加はできないのでport内各入力信号にデフォルト値を定義しておき、
上の階層から呼び出すときにcomponent宣言部で必要なport信号だけ呼び出せば?
(入力ポートを省略するとデフォルト値が入力されたものとして機能することを応用する) 俺がやっている手法
・PLL.vhdコピー 名前をTEST_PLL.vhdとでもしておく
・端子以外の中身を削除 ※エンティティ名は変更しない
・中身をテスト用のCLK出す記述にする
・PLL.vhdの代わりにTEST_PLL.vhdをコンパイルする
・エンティティ名が一緒なのでPLL.vhdの代わりにTEST_PLL.vhdでSimが走る
ソースをいじらなくて済むし、Sim前に差し替えるものだけコンパイルすればいいので面倒が少ない どこで質問していいかわからなかったので、ここで質問します。
宜しくお願いします。
Spartan6を使って、Verilogを勉強しています。
今はSPIを使って、A/DやD/Aを動かしています。
なんとなく動いているのですが、Warningが100個とか出て、困っています。
SPIでICの内部を設定しますが、24bitとかのレジスタに固定値を書くので、
「このbitが、いつもゼロじゃん」のWarningが大量に出ます。それがいくつかあって
100個以上もWarningが出ます。多すぎて気持ちが悪いので、
これを出ないようにしたいのですが、どのようにしたら良いでしょうか?
固定値なので、ソースの中に即値を埋め込めばWarningは減ると思いますが、
それではHDLで書くうまみがないと思います。
このような場合、みなさんは、どのようにしているのでしょうか?
宜しく教えて下さい。 ありがとうございます。
気にしないでOKなのでしょうか。
YouTubeでISEの画面を見ていると、緑色の丸いマークが綺麗に並ぶのに、
僕のものでは、黄色三角ばっかりなんです。 うちもそういうのは気にしないかなあ
設計段階で極力そういうのないようにしてるけど、今後の拡張を見越して予備端子を持ってる時はどうしても出るし
業務でWarningなしで通ったことないよ
もちろんWarningは全部チェックしてるけど 全部なくすのは難しいよね。
Warning 除けの記述ばかりになると何してるのか分からなくなるし。
少なくとも趣味なら気にしないかな。 でも、ニコ動の、ネギ降りマスターのやつは、気持ちよく緑丸ばかりなんですが。 >>529
ビット幅はParameter使って対応するのはダメなの? xのwarningは糞味噌ごちゃまぜだし、おめー(ip内部)の問題だろ、ってのが多い。
全部チェックしてる人はすごいと思うわ。
vivadoは少しましになったけども。
alteraもこんな感じ? >>534
ばか、おまえ、そこは動画用に一生懸命Warning消しに勤しんだに決まってんだろ そのワーニングが無視してもいい内容だけど、無視できないワーニングが出たときに
気がつきにくくなるから、なるべくワーニングはとるようにしている。
リセット信号で反転でもしておくとか。消費リソース増えるだろうけど。 default nettype none
にしているとき、IP内部がwire宣言してないぞ!というワーニングも出る。
「そんなの、俺は知らないよ。XilinxのIPの話じゃんか」
ということで、また1つワーニングが増える。 横文字は許容する。国語ができないのは
アレなんだなと納得する。 cpuからアドレスデータバスなど使ってfpgaのレジスタに機能情報をライトするが
多次元配列を使ってるからスライスを消費してしまう
本当はRAMを使いたいが、RAMだとFPGA側からアドレスカウンタとかFIFO使ってアクセスせにゃならん
CPUのコントローラー部分が一番消費するがいい方法はないだろうか 箱根山日経平均Appleギリシャ神田愛花なでしこ
その日の夕方、部屋で布団に入りうつ伏せになってたら、父(父=嶋●慎太郎)が来て
後ろから覆いかぶさり、胸を触りもみ。「舐めていいか?」と聴かれ結子は舐められ、次はクリを触られ
結子(ザキシマ結子=元稲城市立向陽台小学校評判Y子)は「気持ちいい」と言ってしまい父は「そうか、気持ちいいのかぁ」
と嬉しそうに沢山触っていました。兄(嶋●亮介(東京電機大学中学校評判万引少年)は小人病を苦に自殺。
ザキシマ結子一家の顔がGoogle検索『稲城市立向陽台小学校評判Y子』 Vivadoはシミュレーションでアナログ表示あるのにISEではない
VHDLだからうんこ しばらく書き込みが途切れているようなので、
ネタとして頭の体操w 知っている人も多いかな?
---
wire [15:0] X , P , Q , R , S ;
とする時、以下の乗算を行う回路を16bitのCarry In付き加算器で実現して下さい。
それぞれ何個必要になるでしょうか?
なお、インバータは任意に使用してもらって可です。
また演算のオーバーフローに対するケアは不要(頭の体操ということで考え方重視)。
(1) P = X * 80 ;
(2) Q = X * 60 ;
(3) R = X * 81 ;
(4) S = X * 75 ;
※(1)〜(4)はそれぞれ独立の(個別の)問題です。
ですので、(1)の結果のPを(3)の演算に利用するのはナシ、ね。 >>555
(1) 1個
(2) 1個
(3) 2個
(4) 2個
これで良いのかな。 >>556
解説を頼む。
(1)(2)(3)はすぐできたけど、(4)が分からん。 >>555
(1) 0個
(2) 1個
(3) 1個
(4) 2個
かな こうか
(1) 0個
(2) 1個
(3) 1個
(4) 3個 違う、こうだ
(1) 0個
(2) 1個
(3) 0個
(4) 2個 閑古鳥が鳴いているスレなのに、釣り認定だけは早いのねwww
>>556〜565
ほかにも解はあると思うけど、標準的な解答。
wire [15:0] X , P , Q , R , S ;
wire [15:0] X64 , X16 , X4 , nX4 , X9, X15 , nX ;
(1)80倍は64倍+16倍
assign X64 = ( X << 6 ) ;
assign X16 = ( X << 4 ) ;
assign P = X64 + X16 ; // →加算器1個
(2)60倍は64倍−4倍
assign X4 = ( X << 2 ) ;
assign nX4 = ~X4 ; // Xの4倍値の補数。
assign Q = X64 + nX4 + 1 ; // →加算器1個(+1はcarry in に)
(3)81倍は64倍+16倍+1倍
assign R = X64 + X16 + X ; // →加算器2個
別解として、81倍は9倍(=8倍+1倍)の9倍(=8倍+1倍)
assign X9 = ( X << 3 ) + X ; // →加算器1個
assign R = ( X9 << 3 ) + X9 ; // →加算器1個。合計で加算器2個
(4)75倍は15倍(=16倍-1倍)の5倍(=4倍+1倍)
assign nX = ~X ; // Xの補数。
assign X15 = X16 + nX + 1 ; // →加算器1個(+1はcarry in に)
assign S = ( X15 << 2 ) + X15 ; // →加算器1個。合計で加算器2個
ということで、>>556は全問正解かな(詳細が分からないけど)。
>>562の「0個」という答えはマジで気になっている。 完全に16倍を16ビットシフトと勘違いしてたわwww
0個はないわwww タイミング制約で、クロックの50%になるようにかける制約の
記述って何でしたっけ? 乗算器はspartanなら18×18でロジック遅延含めて、パイプライン化するのが定石だけど
32×32で2つ乗算器使う場合は遅延も大きくなるんだよな
高クロックかつ、時分割で乗算器使い回すとき32×32は無謀か Xilinxのスパルタン3でVerlilogの勉強をしています。
質問があり書き込みました。宜しくご指導願います。
異なる更新周期のデータの受け渡しの方法がわかりません。
例えば、A/Dコンバータでデジタルデータを得て、その結果を別のクロック同期回路が読む
という場合です。
・A/Dのサンプルが1ms、それを読み出す側の周期が1msなら、出入りの速度が同じなので
FIFOで一時的に保管すれば、不足も過剰もなくできそうに思います。
・A/D周期1ms、読み取り周期1.2msだと、FIFOは満タンになってしまいます。
FIFO満タンならA/Dが書き込むのを諦めればいいですが、古いデータを読むことになってしまいます。
・逆の場合は、A/Dの書き込みは問題ありませんが、読み出すデータが空になってしまいます。
前回のデータで代用して済ますのでしょうか?
一般にこういう場合、どのように処理をしているのでしょうか?
宜しくお願いします。 読み出したデータをどうしたいのか?
来たデータだけ処理するのでは不都合なのか? >>572
ADのデータが全て必要なら1ms以内で読み出すように作る。
読み出し側が早い場合は無効な値を読み込まない処理が必要。
例えばFIFO内のデータ数を読んでからデータを読み出すとか、
FIFOステータスも一緒に読み出すとか。
ADサンプルが常に実行されていて(止まらない)、
読み取りが遅い場合はデータ取りこぼしは仕方ないよね。
ADサンプルが一定期間ならその期間分データを貯められる
FIFOサイズにすれば良いと思う。 >>572
ADCを別な周期で動作させない
後段の処理がそんなブレブレならADCのサンプルを後段のタイミングに合わせも問題無いんじゃねえの
そうじゃ無いなら後段を確実に速くして処理落ちしないようにするかだね 要は非同期回路間のデータの受け渡しと考えていいのかな。
この場合だと
AD側が"データ取ってくれ信号"を発行して、
↓
使う側がその信号を見てデータを取得して、
"データ取ったよ信号"を発行する。
↓
取ったよ信号を受けたAD側が"データ取ってくれ信号"を無効にする。
↓
使う側が取ってくれ信号無効を見て、"データ取ったよ信号"を無効にする。
こんな感じじゃね。 ん?最初はボード上にADCとFPGA並べて単純に繋げるイメージかと思ったけど
ストリーミングの同期再生みたいに完全に独立してて限り無く歪まないシステムを組たいのかな? >>580
それなら読み出しを高速にしないとデータ取りこぼすのは当たり前だよね
AD出力が連続データなのか歯抜けデータなのか分からんと何もアドバイスできんよね >>572
Xilinxのスパルタン3でVerlilogの勉強中、とあるので、
ふと思いついた素朴な疑問なのかな?
前提条件がはっきりしないので何とも言えないけど、
一般にメモリを挟んで書き込み側と読み出し側のクロックが違う場合
(メモリを用いてクロックを乗換える場合)っていうのは、
映像信号みたいな、規則的で断続的なデータ入出力じゃないのかな。
その場合はブランキング期間というデータが途切れる期間を有効活用して、
書き込みと読み出しのメモリアドレスが追いつき追い越されないように
ちゃんとタイミング設計するので、
読み出す前に新しいデータで上書きしてしまったりとか、
新しいデータが来ないので古いデータを読んでしまう、なんて回路は作らないよ。 携帯電話のときはどうなんでしょうかね。
自分のDACは相手のADCクロックに同期しないと
(圧縮コーデックはとりあえず無しとして)
いけないような気がするけど
そんなことしてるのかなぁ
音声波形データだったら誤魔化せそうだけど
時々(10秒に一回くらい?)サンプル抜けても/重複しても
人は判らないよね 普通は必要な帯域が40KHzなり、100KHzだとしたら、
それより十分早いDACやADC使うと思うけど。 2kHzの正弦波を24MHzでA/Dする私は、優等生だね >・A/D周期1ms、読み取り周期1.2msだと、FIFOは満タンになってしまいます。
そもそも、1.2ms周期でしか読み取らないということは、1.2msよりも
速い変化が捉えられてもしょうがないということなんだから、
1.2ms周期で読んだら新規データよこせっていうので充分。
スタートかける=>+1ms後に次のデータ確定=>+1.2ms後にデータ取得
=>スタートかける=>・・・ XilinxのMicroBlaze MCS は、途中でTclを操作しなければなりません。(と、本に書いてあった)
でもTclができません。
何かもう少し簡単にSpartaの上にマイコンを日宇制する方法は無いでしょうか? 32bitのレジスタが更新されたのを判断したいんだが、前の値と比較するしか無いですよね? ライトイネーブル見るだけだと、
同じ値が書かれたときに困るか。 タイミングが間に合えば書こうとしている値と今の値を比較するとか 更新条件が自明なんだから、その信号を引き出せばよい。 更新の定義があいまい。
書き込み動作の前後で値変わらなくても更新でいいなら >>593 だし。
変わったことを検出するなら、
入力と出力の比較結果を同期で受けるぐらいしかないでしょ。 教えてください。
マイコンのPIOとしてFPGAを使うことがあると思います。 クロックを5分周したいだけの簡単なことなんですけど
statement is not synthesizable since it does not hold its value under NOT(clock-edge) condition
ってエラーが、 if (RST = '1') thenの行にでるのはなぜでしょう?
まだvhdl初めて間もないのですが、ここは別の動作したコードをコピーしただけのつもりです
CLKが2.5周期の時点でQ5をあげて、さらに2.5周期の時点でQ5を下げるだけのコンセプトです library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity frec5 is
Port ( CLK : in STD_LOGIC;
RST : in STD_LOGIC;
Q5 : inout STD_LOGIC;
Q : out STD_LOGIC_VECTOR (2 downto 0));
end frec5;
architecture Behavioral of frec5 is
signal DFF_8 : std_logic_vector(2 downto 0);
begin
Q <= DFF_8;
process(CLK,RST,DFF_8)
begin
if (RST = '1') then ←ここ
DFF_8 <= "000";
Q5 <= '0';
elsif (falling_edge(CLK)) then
if (DFF_8 = "010") then
Q5 <= not Q5;
end if;
elsif (rising_edge(CLK)) then
if (DFF_8 = "100")then
Q5 <= not Q5;
DFF_8 <= "000";
else
DFF_8 <= DFF_8 + '1';
end if;
end if;
end process;
end Behavioral; あぁごめんなさい、こうなるの想定してませんでした
http://imgs.link/KyCWDL.png
一応画像です >>601
その行に出るのは、そのifが閉じるend processの直前のend ifまでにエラーがあるから。
クロック信号の立ち上がりと立ち下がりのどちらでも値を更新できる回路は合成できないんじゃないかな。 回答ありがとうございます
if ・・・
elsif ・・・
elsif ・・・
endif
endif
endif
(インデント略)
という何重にもなっているのif文一つのなかに立ち上がり、立下り両方を書くことができないわけですね
今環境がないので試せないのですが、対策として
a(4bit)という別の信号を定義して
if falling_edge(CLK)
a<=a+1
endif
if rising_edge(CLK)
a<=a+1
endif
と別々に記述すれば、aのLSBはclkの2倍の周波数をもつようになって
aが4の時かつclk立ち上がりで5Q反転(0→1)
aが9の時かつclk立ち下がりで5Q反転(1→0)
としようと考えています >>605
HDL の前に、どんな回路になるか考えたほうがいいよ。 >aのLSBはclkの2倍の周波数をもつようになって
ならないしさ・・・
タイミングチャートからかな。 それはどうがんばってもムリです
ロジックではクロックの奇数分周はできない
↑↓両エッジで書き換えられるレジスタは作れないから
HDLは正しくてもハードに落とせない
プログラムとは違うのだよ。プログラムとは >>608
>ロジックではクロックの奇数分周はできない
そうだね。
一番理解しやすそうなのは、0〜4まで回るカウンタを回して
0,1の時にHigh
2,3,4の時にLow
という回路かな。デューティ比が2:3だけどたいていの場合は問題ないよ。 >それはどうがんばってもムリです
>ロジックではクロックの奇数分周はできない
そんなことないでしょ。
>↑↓両エッジで書き換えられるレジスタは作れないから
「作れない」というのは、原理的にということ?合成ツールのこと? >>610 そんな事無いならロジックで5分周出来る具体例を出して下さいな
>>609が出してる以外の方法があるんなら是非知りたい
>>↑↓両エッジで書き換えられるレジスタは作れないから
>「作れない」というのは、原理的にということ?合成ツールのこと?
ASICにならそんな便利なFFもあるのかもしれんが、一般的なCPLD/FPGAでは両エッジトリガのFFは出来ない
確かXilinxのCoolRunner-2辺りが両エッジFFがあるけど、あれは相当特殊なケース >>611
ほれ
module div5(input clk, output clk5, input rstn);
reg [2:0] cnt;
always @(posedge clk or negedge rstn)
if(!rstn) cnt<= 0;
else cnt<= (cnt==4) ? 0 : (cnt + 1);
assign clk5= cnt[1] | (cnt[2] & clk);
endmodule
VHDL でなくて悪いな。
そもそも、>>601 はFPGAだともASICだとも言っていないが? module div5(input clk, output clk5, input rstn);
reg [2:0] cnt;
always @(posedge clk or negedge rstn)
if(!rstn) cnt<= 0;
else cnt<= (cnt==4) ? 0 : (cnt + 1);
reg [2:0] ncnt;
always @(negedge clk or negedge rstn)
if(!rstn) ncnt<= 0;
else ncnt<= cnt;
assign clk5= cnt[1] | ncnt[1];
endmodule
こっちのほうがグリッジが出なくていいな。実用的。
まあ普通はPLL回すだろうが。 >>613
>まあ普通はPLL回すだろうが。
最初にPLLでclkの2倍の周波数のマスタークロックmclkを作っといて
その2分周で本番用のclkを作る。
また>>609の考え方でmclkの5分周クロックmclk5を作って、
それを2分周してデューティ50:50の本番用の5分周クロックclk5を作る。
そんな感じかな。 それが正道だけど結局は5clkに一回のenableで良かったってオチだよな大抵 そうだね
例えば以前は雑誌なんかにも載ってたのが、非同期シリアルとかI2Cのモジュール
クロックにビットレートの16倍のを供給前提とかね
他のモジュールとのインタフェースがなきゃそれでいいかもだけど
FPGAの設計教科書としては、クロックじゃなく enable 作るっていうの
教えないと、って思った 601です、遅れました
現段階の知識では不可能みたいですねぇ
ありがとうございました CD-ROMでVerilongの独習をしているものです。
下記の修了判定が分かりません。
・8ビットのダウンカウンタを記述する
・ckの立ち上がりで、255,254,253とダウンカウントする
・RESが1で非同期リセットする(初期値は全ビット1とする)
・減算演算子を用いて記述する
module DOWNCOUNT(CK, RES, Q);
input CK,RES;
output [7:0] Q;
always @(posedge CK orposedge RES)
if(RES ==1'b1')
Q <= 「ここにどう記述すればいいんでしょうか?」 ;
else
Q <= Q - 8'h01;
endmodule >>622
つまり、どのように下記に記述すればよいのでしょうか?
「Q <= ;」 (!RES != 1'sd0 )? 44'hbad_dead_baca: {4{2'd3}}; >>621
>・減算演算子を用いて記述する
とあるけど、こういう書き方はいかが?
(実際の回路設計だとマイナスは使わないと思うので)
module DOWNCOUNT(CK, RES, Q) ;
input CK, RES ;
output [7:0] Q ;
always @(posedge CK or posedge RES)
Q <= RES ? 8'hff : Q + 8'hff ;
endmodule
動作は、255,254,・・・2,1,0の次は255になる。 >>626
マイナス使うだろ・・
8'd255、8'hFF、8'b1111_1111 減算って、補数にして加算(+)する書き方が普通じゃないの?
シミュレーションだけだったら、マイナスで書いてもいいと思うけど。 >>628
そんなこともわからない合成ツールなんていらね。 >>628
掛け算も自分で書いたほうが高速だとか思ってる? >>631
*4 とか *8 って書くけど?
乗算器に割り当てるかシフターにするかは合成ツールが考えればいいこと。 まさか、*20 だったら、
(a << 4) + (a << 2) とか書いてる? 合成環境ないからわからないけどunsigned設定で a+a , a*2 , a<<2 って、
違う回路合成するのかな? 昔入れたQuartusの環境を思い出したんで、
下記を合成して見たら全部同じ回路になってた。
module Test0001
( input [31:0] a
, output [31:0] b
, output [31:0] c
, output [31:0] d
);
assign b = a+a;
assign c = a*2;
assign d = a<<1;
endmodule
スケマの感覚で下手に気を使ってソース書くと、
合成ツールの最適化が上手く働かなくなる可能性があるから、
(入力の不定値等も考えて厳密に同じ演算ではなくなってるケースなど)
やりたい演算を素直に書くのがいいと俺も思う。
タイミング間に合わなくなったらしょうがなくお世話する程度で。 >>636
乙デアリマス。
定数乗算器をシフトで書くとか、
減算を補数でとか、20年前で止まってんじゃないかな?
(Abel でも減算は出来たけど)
生産性低いよね・・・
まあ、好きにすればいいけど。 ((N-1)*8 + 15 downto (N-1)*8)
とかなら使う Synthesizeがエラーも出ずにずっと回りっぱなしで終わらないんですけど,
どういう時に起こるんですか? Building and optimizing final netlist ...
から進みません >>621
module DOWNCOUNT(
input rst_n,
input clk,
output reg [7:0] Q
);
always @(negedge rst_n or posedge clk) begin
if (rst_n ==1'b0) begin
Q <= {8{1'b1}};
end else begin
Q <= Q - 1;
end
end
endmodule
リセットを非同期負論理リセット、クロックの信号名を変えておいたがこんな感じ。 >>643
input rst_n, clk, と続けて書かない理由は何?
また
input wire rst_n,
input wire clk, と wire と書かない理由は何? >>644
input wire clk なんて、初めて見た。 >>643
最近はinput,outputの書き方変わったのか。
Q - 1; はカウンターを推定させるために1'b1と書いてた。
20年以上前の話だけど。 >>644
input は、wire しかないんだから、わざわざ書く必要なくね?
むしろ、書く理由は?
output reg も、「一見してレジスタ出力だと判る」という利点がありそうだけど、実は組み合わせ回路にもなりうるという落とし穴がある。 DNA用の「プログラミング言語」をMITが開発。望みの機能をコーディング〜コンパイルし、細胞へインストール
http://japanese.engadget.com/2016/04/05/dna-mit/
verilogベースで作られているらしい
転職先として……と思ったけど、さすがに分野違いすぎてつらいな >>647
直行性があり、ミスが起こりにくいと思う。
`default nettype none
module AAA (
input wire CLK,
input wire RESET,
output reg [7:0] DBUS,
output wire [3:0] CODE
);
always @ ( posedge CLK ) begin
if( RESET == `L ) begin
・・・・
else
・・・・
end
end
という感じね。 >>649
最後に
`default nettype wire
で戻しておかないと。 アメリカの半導体メーカーで働いてるけど、verilogで input wire xxx って記述初めて見たわ >>652
だったら今回見ておいて良かったですね。
Googleで input wire で検索しただけでも、ゾロゾロでて来るんですが、
>>652の国では、出てこないのかな。
直交性という意味では、
input wire [0:0] CLOCK,
input wire [7:0] BUS,
output wire [0:0] ENABLE,
output reg [3:0] state,
など、省略せずにちゃんと書くようにしたほうが、バグが出にくくていいよね。
先頭行で
`default_nettype none にしておけば、input CLOCK, と書いたときにエラーを出してくれる。
最終行で
`default_nettype wire にしておかないといけない。
XilinxのCoreGenで生成したソースで、 input XXX と書いてあって、エラーになるから。 ミスが少なくなるので良さそうだけど、
手書きで書いた部分と自動生成した部分で扱いが異なるのは、ちょっと気持ち悪くないですか?
今社内のコーディングルールを改定しようとしてるので提案してみるわ。
うちも自動生成されるコードもあるけど、その位はツールベンダーに依頼すれば対応してもらえるし。 >>657
FPGAは同期リセット推奨らしいぞ
Xilinxの人が「リセットは同期で作ってくれ〜」って言ってた
又聞きだがAlteraもそうらしい
というかできるならリセット記述すらしないでレジスタ宣言やsignal宣言(VHDL)に初期値を書けということだった リセットなしで、どうやってIPの初期化するんだろうね?
初期値書くのは、シミュレーションやFPGAの初期化直後はいいけど。
非同期だとタイミングの保証が面倒くさい。 >>653
>output wire [0:0] ENABLE,
使うときも if(ENABLE[0]) begin って書いてね〜 >>658
漏れASICにするのをFPGAで組んでる 非同期リセットは解除時のタイミングが合わないから必要最低限にして、他は同期リセットにするのがわしは好き。 >>646
>Q - 1; はカウンターを推定させるために1'b1と書いてた。
それを言うなら、8'b1じゃないの? [7:0]Q なんだから 僕は、常時、100%、必ず、いつも、同期Resetで書いています。
どんな時に非同期Resetが必要なのでしょうか? >>665
1990年ぐらいかな古いHDL Compilerですけど
ビット数を合わせると加算器が選択されるので
あえて1ビットと書いていました。 >>666
クロックがなくてもリセットがかかってほしいとき。 >>666
ASICの合成で、リセットがないFFが構築され、論理合成後のゲートシミュレーションで、不定が乗って仕事にならない。 >>666
複数の、非同期クロックがある場合。同期リセットだと、リセット回路を考えなくてはならない。
結果、FPGA上のグローバルラインの節約になる。
結局どっちがいいという議論は常にあって、最適なほうを選択する。
RTL設計スタイルガイド に書いてあったような気がするが、高額だし絶版っぽくなってきて。よくわかんねー 非同期resetの場合、reset信号の優先度が一番高いという理解で良いでしょうか? >>673
そらそうだろ。何のためのリセットなんだ。
ファミコンで、リセットボタンを押さないで電源を切って、冒険の書が消えたら大変だろうが。 >>672
STARC 解散か、それは良かった。
スタイルガイドはタメにはなるけど、
古い合成ツールのクセを引きずってたり、
そもそも、「絶対守れ」みたいに思ってる人がいると面倒だからな。 >>676
$signed(8'b1) を解釈できるとは思わないから、VHDLで書くべきだw いずれにしろ、signed は、扱いが難しいよね。
式の右辺に、1つでもunsigned が入ると、もうsigned ではなくなるし。
signed の変数に、負のsignedをセットする命令も、なかなか出てこない。 signedの場合は必ずsignedと記述するようにしてるよ
ミスもなくなるし、コード見ただけでsignedの信号だとわかるし >signedの場合は必ずsignedと記述するようにしてるよ
これは、変数の中に signed の文字を入れている、という意味ですよね?
例)
signed16_zahyou >>681
VHDLだとsigned(信号名)
Verilogだと$signed(信号名) >>683
Verilogで キャストが出来るんですか? use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_signed.all;
書いたことない奴と語りたくない。 >>671
同期リセットのほうがグローバルラインの節約にならない?ファンアウトが大きければ複数のFFを使えばよいし。
もちろんリセット回路などでロジックは消費するけど。 リセットは同期式で書いてください、とTEDの人が言っていた 非同期リセットだと各FFでリセットタイミングが非同期なので気持ち悪いわ。 十年ほど前までASICの論理設計をずっとやっていたけど、
原則、非同期リセット使用だったな。
回路は大きくなるけど、検証で不定に悩まされること考えたら
リセットを入れさえすれば値が確定し、不定を一掃できるのは、
短期間設計を強いられる身にはありがたい。
>>689の言っていることは分からないな。 fpgaで非同期リセット使うと使用率が跳ね上がるよな 鬼のように情け容赦がなく値を確定させるのが非道鬼リセット。
不定が残らないか胸をドキドキさせながら実行するのが動悸リセット。 フリップフロップの非同期リセットと同期リセット
http://imgur.com/4gtd5BM
非同期リセットフリップフロップはRST_X=Lだけでリセットがかかる。
同期リセットの場合、クロック(CLK)が入らないとリセットはかからない。 マ イ ン ド コ ン ト ロ ー ル の手法
・沢山の人が、偏った意見を一貫して支持する
偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法
・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法
偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い
靖 国 参 拝、皇 族、国 旗 国 歌、神 社 神 道を嫌う カ ル ト
10人に一人は カ ル ト か 外 国 人
「ガ ス ラ イ テ ィ ン グ」 で 検 索 を ! >>689
リセット信号はクロックに同期化して使うものじゃないの?
ここで言ってる非同期、同期リセットってのは
DFFのリセット端子に接続するのが非同期リセットで
組み合わせ回路に組み込むのが同期リセット 素朴な疑問だけど、
"リセット信号はクロックに同期化して使う"ならば、
非同期リセットを使うメリットって何?
同期リセットのメリットは、
同期にするだけで対ノイズ性はよくなるし、
CTSはりやすくなるだろうしなんとなく分かるんだけど。 >>702
設計の失敗でFF出力がダイレクトにバスドライバーをON/OFFしているとき。 >>670や>>693が書いているように、
また>>699の図 http://imgur.com/4gtd5BM.jpg を見たら明らかなように、
同期リセットは回路を(FFを)リセットする訳じゃないからね。
(FFを通常動作をさせて値を流し込む、ってかんじかな) リセットするまでクロック出ないとかいう設計するの? Xilinxのホワイトペーパー WP231から抜粋
同期リセットと非同期リセットでLUTの数に差が出る
すべてのFFに対してLUTが増えるのでリソースを圧迫する
http://i.imgur.com/XkeuvjZ.png
http://i.imgur.com/94gDLs6.png
まぁこれはFPGAの合成についての話なので、ASIC化を考えているなら非同期リセット使うべきだろうね 考え方は変わらないよ。FPGAでは同期リセット使った方が得な感じだね。
Xの話だけど
FFのR、C、CEの線はSlice単位で共通
DSP Blockは同期リセットしかない
リセットが無ければSRLやDMEMが推論出来る
同期の場合はLUT使うかFFのR線使うかをツールが判断する
非同期の場合は強制的にFFのR線を使う
この辺が基本ルールらしい。
回路からリセットを無くせるならそれがベター
フレーム単位ならGSRが使える
US以上ならGSRの自由度は高い
非同期リセットの場合はクロックのとレーシングを必ず考慮する
(全てのFFが同時にリセット解除されるとは「限らない」)
なんて話も。 >>704
自分もそう思ってたんだけど、今Spartan-6のSLICE構造確認したら
FFのSet/Reset機能をSync/Asyncのどちらかに設定できる構造に
なってる
だから、同期リセット使ってもそのために余分なLUT使うこともないし
逆に論理合成の一部にこのSet/Reset機能を使って >>706の引用してる図
みたいにLUT使用を減らすことができるケースもある、ってことらしい すみません、教えて下さい。
VerilogでSpartan6をプログラムしています。
bit幅の違うsignedの値の代入は、どのようになるのでしょうか?
reg signed [15:0] s16bit;
reg signed [13:0] s14bit; が、あるとき、
s16bit <= s14bit;
は、 { [13],[13], [13:0] } でしょうか、
それとも { [13:0], 2'b00 } なのでしょうか、
また
s14bit <= s16bit;
は、{ [15:2] } と、LSB欠落でしょうか
それとも、{ [15][12:0] } [14:13]が欠落でしょうか
宜しくお願いします。 >>711
さっそくありがとうございます。
どちらの場合も、右詰め基準で処理されるということですね。
ありがとうございます。
増える方は符号拡張で、右詰で良いと思いますが、
減る方は[15,14]が欠落しても、符号bitは降りてくると考えれば
よいでしょうか。
つまり、符号は同じで、数値の絶対値が小さくなるということです。 >>712
[15,14]が欠落であって[14,13]が欠落じゃない。
符号は合ってて絶対値が変わるとか便利か?
Cでlongをshortに代入とか左シフトとか想像してみ。
オーバーフローが起きうるなら自分で検出して対処。 >>710=712
質問に対する答えではないんだけど、結果がどうなるか確信持てないときは
とりあえずは確信持てる表記で書くほうがいいのでは?
どういうのを期待してるか分からないけど、例えば
s16bit <= {2'b00, s14bit};
s14bit <= s16bit[13:0];
とか書いたからって、「そんな書き方するな!」とか文句言うやつは
誰もいないと思うけど・・・ 非同期リセットについて色々と調べてみた
Xilinxについては、RAMやDSPが同期リセットを前提とした作りになっているため非同期リセットはそもそもNGなんだと
というか非同期リセットのFF出力をRAMにつないだりするとVivadoでErrorになってそもそも合成できない(たしか)
リセットについて書かれているUserGuideすべてに「Xilinxでは非同期リセットを推奨していません」と注意書きが書かれてる
あと、リセットするときはアクティブHighにすること
FFはアクティブHighの論理で作られているので、アクティブLowで記述した場合、リセット入力前に反転する回路が作られてリソースを圧迫する
そもそもリセットの配線自体が回路を圧迫するので、リセット記述自体の削減を検討すること
signal a : std_logic := '1'; みたいに初期値を書けば、立ち上がった時にその値が反映されるのでそれを活用すること
こういったコーディング手法は「Vivado Design SuiteでのUltraFast設計手法」でトレーニング可能なので知りたい人は受講したほうが良いとのこと
(42,000円かぁ……うーん……)
Alteraについては特に資料見つからなかった
もしかしたら公開してないだけかもしれないけど >>714
むしろうちの会社はそう書かないとコードレビューで弾かれる
社内のコーディング規約にも書いてあるし
STARCルールにもそういうのなかったかな そもそもFPGAだとConfigからのスタートだからなぁ FPGAにおいては、電源投入後 ユーザー回路が動くように
RAMの情報を書き換えて準備すること。 >>715
なんでFPGAだけで調べてんだよ。
ここはHDL言語の板
FPGAの同期リセット推奨の世界でおまえが生きたいんだったらそれ以上調べず押し付けてくんな FFをCMOS回路れべるで描けないと無理だよ。
複数クロックの問題もあるし >>722
下記PDFの10〜14ページ
http://www-vlsi.es.kit.ac.jp/~kobayasi/refresh/0008/html/slide.pdf スキャンまで大学で教えてるところはそうないんじゃね?
スキャン付きFFは面積デカくなるよな。 ソフトウェア出身なのでよくわからないのですが、ハードウェアのテスト(シミュレーション)にも条件網羅や境界値分析のような基準があるのでしょうか?
テスト手法に関する著名な図書があれば教えていただきたく… 100%だよ
緩和については各々の事情による
ゴンペルツ曲線に合うようにテストするんだぞ
見つけ過ぎたりしちゃダメだからな配分考えて >>729
アドバイスありがとうございます
コードカバレッジ100%ですね
基本的な考え方はソフトと同じだと思えてきました
ゴンペルツ曲線は久しぶりに(初めて?)聞きました
今後意識してみます
あと職場の本棚に『Verilog HDL&VHDLテストベンチ記述の初歩』があったので熟読しておきます ソフト屋が RTL やると、カウンタの判定でまずハマる (経験談)。 >>728
システムテストと製造テストに分かれる。
問題はシステムテストだよ。 >>733
ありがとうございます
ModelSimって結構高機能だったんですね(小並感)
ちょっと使い方を調べてきます 開発規模がわからないけどフォーマル検証やランダム検証なんかも使えるといいね
エミュレート環境もあれば便利だよFPGAなら実機あるかもだけど 固定小数点の除算ってどうすればいいでしょうか?
(? / ?)*(2**小数部ビット数)でやってるんですがうまくいきません シミュレーションが出来ない
合成できない
リント通らない
タイミングメットしない
ゲート規模デカすぎる
他になにかあるかな? >>736
固定小数点のまえに整数ならできるのか? >>738
最初は整数で実装してみたんですが小数精度がないとうまく動きませんでした
とりあえず掛け算は resize( (? * ?) / (2 ** 小数部ビット数) , 全ビット数)
でうまく動いているみたいなのですが割り算でつまずいています >>739
割ってから掛けるんじゃなくて、先に掛けるべきだな
>>737
シミュレーションはできるんじゃね? >>740
シミュレーションできて合成出来ないなら合成ツールの問題とも言える。あと20年経ったらできるかも知れない。
そもそも ** なんて演算子あったっけ? みなさんありがとうございます割り算実装できましたm(__)m ASICでやらかしたのを遠目に見たことはある。<除算が合成できない。
配線で直せたらしいが。 合成出来ないのにシリコン化ってのが有り得ないよな
ECOでバグ直したってのなら分かるけど おっしゃる通り。バグ自体は数式の転写ミス。
本来の数式なら除算があったが、
合成が(そのバグ部分は)あっさり成功していた。 altera de1-soc での外部メモリを使う方法がわからん
情弱すぎてつらいんだが
外部メモリ使用した経験ある人いませんか? 差動クロックをタイミング制約で動作周波数を落としたいのですがPN両方ではなくP側のみの制約を掛けなければならないのですか? binファイルが途中から読み込めなくなる現象が起きているんですが、原因わかりませんか?
3次元配列しているbinを$readmembでレジスタに配置して、alwaysで要素を取り出しassignしているのですが
一定アドレスから読み込まれずハイインピー状態になります。
誰か解決策教えてください。 $readmembで reg [31:0]ROM[0:9][0:99]; みたいなのに
読み込んでるってことなのかな?
ROMの内容をダンプしてみたら? 多分読み込めてないんだと思う あ、ゴメン、そこは見当ついてるってことか
原因は $readmemb の仕様だと思うから、上の例だと
reg [31:0]ROM[0:999]; みたいな形にしてみたら行けるのでは 質問いいでしょうか?
FPGAのリセット信号をDCM_Lockを反転して使っている記事なとを見かけますが、
DCM素子を使わないことも多いんです。
リセット信号発生のためだけに DCMがないっていうんなら別だけど、あるなら、リセット信号発生のためだけに
使ってもいいんでは?
単に外部クロックx1として使ってもいいし 触れてはならない闇に触れようとしたから、書いてる途中で消されてしまったのか・・・ すみません、755です。
書いている途中に MPが来て連行されてしまいました。
質問は、リセット信号の生成のためだけに DCMを使うという DCMの使い方は
邪道でしょうか?
外部にリセットICやリセットSWを置くよりも、楽で寿司。
もう一つ教えてください。
FPGAにマイコンを書いて行うのが流行だと思いますが、
Xilinxだと、有料版でないと使えなかったり制限があったりするようです。
なので、マイコン(H8)を外部バスモードにしてFPGAをつなごうと思っています。
「今どき、別々でやるんか?」と言われるのではないかと心配しています。
やはり、おかしいでしょうか? ソフトコアなんぞ話題性を出してソフト屋に売り込みたいだけの話で、主流でも何でもないと思うが。
普通はソフト資産なりハード資産なり大人の事情なりで先にプロセッサーが決まっててそこに足りないものを継ぎ足すものでしょ。 FPGAのソフトコアCPU使ったからといって、FPGAだけでできるっていう
わけにはいかないんだよね
普通は、外部にプログラム・データ用のRAMとかROMが必要になる
今時のマイコンだとそういうのは内蔵されてるから、マイコン+FPGAって
構成は当然ありだし、マイコンに内蔵されてるLCD・USBインターフェイスの
ようなものをFPGAに組み込むことに時間と労力を費やすのもどうかと思う
(いくらIPとライブラリがあったとしても、1日でできるとかありえないから) > ソフトコアなんぞ話題性を出してソフト屋に売り込みたいだけの話
> マイコンに内蔵されてるLCD・USBインターフェイスの
> ようなものをFPGAに組み込むことに時間と労力を費やす
なんかこう・・・ USBもLCDCも内蔵されてるマイコンもあれば無いのもあるし
内蔵してる奴は大抵fpBGAでアマチュアだと厳しく
でもSATA1.5G程度でも実装可能な高速serdes持ってるfpgaもfpBGAだっりする訳で
色々とままならず
つまひは立場によるって話でしかなく MicroBlazeとか、出始めた頃はその頃のマイコンとしては高性能の部類だったけど
今となっては、Cortex-M3の安いやつくらいの性能しかない
だからホントは、マイコン―高速バス―FPGAって感じの構成が一番いいと
思うけど、残念ながら高速バスは標準がないし、最近の高集積マイコンは
外部バス自体なかったりするんだよな んなもん生えてるマイコンは良いじゃん言えるほど無いし、パフォーマンスも出なかったりするけどな ラズパイクラスでもPCIeなんてついてないでしょ
FPGAのほうも、PCIeでインタフェースするくらいなら
Zynqとかってなっちゃうし そんなコスト無視のアドバイスされてもなあ
マイコン+FPGAだと2千円くらいからできるけど
ハードコアCPU内臓FPGAだと1万くらいからでしょ? 訂正:SmartFusionだと5千円くらいからかな? んなもん要件次第だろ。お前が何作ろうとしてるかなんか知るかよ ソフトコアCPUの話は >>761の質問から始まってるんだが・・・ XとかAにも Cortex-M3かM4クラスのがのったチップが欲しいね
ソフトコアの上がA9とかギャップがありすぎ べつに大きい分には困らないでしょ
ZYNQはFPGAにしては安いし VHDLの記述方法に関して教えて下さい。
Vivado2016.2を使用しています。
階層間を接続する記述の仕方でエラーが発生します。
ena <= sig_a, (OK)
ena <= not sig_a, (NG)
調べるとVivadoがサポートしているVHDL-93ではNGの記述がサポートされていない事が
原因と分かったのですが、これを回避するにはどう記述するのが定石なのでしょうか?
今は↓こんな感じで3行で書いているのですが、面倒だし行数が増えて嫌なんですが・・・
何か良い方法をアドバイス頂けませんか?
signal not_sig_a : std_logic;
not_sig_a <= not sig_a;
ena <= sig_a, 集団ストーカー・電磁波犯罪被害の加害装置はレーザー・メーザーらしいな
・レーザー兵器について知ろう!
ドキュメンタリー - 未来の戦争 レーザー兵器
https://www.youtube.com/watch?v=t6vPM-S1YdE
防ぐことは、ほぼ、不可能。核兵器以上かもね
・集団ストーカー・電磁波被害の加害装置がレーザー・メーザーによるものだとしたら、レーダーを使うはず。加害者にはこのように見えているハズ。ちょっと、エロです。
64MHzの電波を使って撮像しているMRIの動画
MRI Shows What Sex Looks Like From The INSIDE | What's Trending Now
https://www.youtube.com/watch?v=nDhYLaGPmGU
見えている各臓器、脳も含めて、レーザーを照射すれば、危害を加える行為が成立する
参考までにCTの動画
Radiologist discusses CT and xray small bowel obstruction Imaging
https://www.youtube.com/watch?v=8dNTHdUO_3Q
PCB Imaging: 3D/CT X-Ray Animated Slicing (Top to Bottom)
https://www.youtube.com/watch?v=itTkItXiHsk
・レーザー・メーザーが開発されたのが、1950年台以降、メーザー初の発振が1953年、レーザーの初の発振が1960年
https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%82%B6%E3%83%BC
この記念すべき年以降の、人体の自然発火現象は怪しい
人体自然発火現象
https://ja.wikipedia.org/wiki/%E4%BA%BA%E4%BD%93%E8%87%AA%E7%84%B6%E7%99%BA%E7%81%AB%E7%8F%BE%E8%B1%A1
No.31 突然人間が燃え上がり、焼死に至る「人体発火現象」
http://ww5.tiki.ne.jp/~qyoshida/kaiki/31zintaihakka.htm
No.157 人体発火現象2
http://ww5.tiki.ne.jp/~qyoshida/kaiki2/157jintaihakka2.htm
人体 自然 発火現象 : 人の体が突然 灰になるまで 燃えつきる / 世界の衝撃ストーリー
dailymotionを上のタイトルで検索してみ
・モスクワシグナル事件
興味のある方は、集団ストーカー・電磁波犯罪被害の基礎知識として、知って下さい
あなたの脳は誰のもの?(1)モスクワシグナル 前編
http://nueq.exblog.jp/17871225/
あなたの脳は誰のもの?(2)モスクワシグナル 後編
http://nueq.exblog.jp/17875689/ 「自分達は手を出さず人を追い込む方法があるんだってさ」
「多人数で人を追い込むんだってさ」
「電波攻撃で攻撃するんだってさ」
「他人の考えとか想いがわかる装置があるんだってさ」
集団ストーカー(組織的ストーカー行為)・電磁波被害の加害装置を持たせる時の誘い文句だそうです。
他にもいろいろあると思いますが、これに類するセリフを聞いた事がある人は、警察に一報をいれて貰えたらと思います。 >>782
矢印の向きが違う気がするけどport mapのことだよね?
であれば標準のVHDL-93はそういうもの。VHDLは何かと行数が増える。
VHDL-2008にしたらNG記述でも行けるはず。
でも、QuartusだとなぜかnotだけならVHDL-93でもNG記述で行けていたような気がする。 >>782
行数増えるのが嫌な人が使う言語ではないわな、VHDLは。 alteraはMAX+plus IIの時代から、かなり汚い文法でも行けた。port mapに定数を置いたり。 port mapに定数よく使ってるけど本当はダメなのか。
でもいままでエラーになったツールはみたことないような気がする。 verilogで論理回路設計の勉強を始めたのですが
例えばあるクロックを生成するモジュールを作って、そのモジュールにワンショットのトリガー信号が入ったら、クロックを10発だけ出すといったような場合どういった記述をすればいいのでしょうか >>790
省電力のためどうしてもというのでない限り、クロックを生成するような回路設計はやめた方がいい。 クロックって書いちゃったからなぁ。
↓以下、ダメ出しが続きます。 >>790です
ご指摘ありがとうございます
一つ勉強になりました。以後気をつけます
>>794
パルスをカウントしたレジスタを見てトリガー信号からイネーブル信号を作ってみたいな感じになるでしょうか トリガーは1でアクティブ
出力はデフォルトL
パルス幅は1クロック周期とする
異常状態は考えない
行頭空白はご愛嬌
input clk,xrst,trigger;
output pulse;
reg [4:0] count;
always@(posedge clk or negedge xrst) begin
if(~xrst) begin
count <= 5'd0;
end
else if(count > 0) begin
count <= count -5'd1;
end
else if(trigger) begin
count <= 5'd19;
end
end
assign pulse = count[0]; troggerを微分しなくていいの? 連続Hが来続けたら、スタートしないよ。
動作中に再trigger来たら、スタートに戻ってしまうよ。
input wire clk, nRESET, trigger;
output wire pulse;
reg p;
reg [4:0] count;
wire RESET;
assign RESET = ~nRESET;
always @ (posedge clk) begin
if (nRESET == 1'd1) begin
p <= 1'd0;
count <= 5'd0;
end else begin
if( p == 3'd0 ) begin
if( trigger == 1'd1 ) begin
count <= 5'd19;
p <= 3'd1;
end
end else if( p == 3'd1 ) begin
if(count > 5'd0) begin
count <= count -5'd1;
end else begin
p <= 3'd0;
count <= 5'd0;
end
end
end
end
assign pulse = count[0]; まちがい
× if (nRESET == 1'd1) begin
○ if ( RESET == 1'd1) begin >>798
もちろん微分した方がいい。
減算を優先しているのでスタートしないことはないが、
逆にtrigger=H固定入力だとパルス列が終わらず、
出続けるという動作をしたりする。 >>790です
ありがとうございます
減算を使ってですね。その発想は出なかったのですごく勉強になりました
トリガ信号は1クロック分のパルスを作るので大丈夫そうです
I2CやSPIのプログラムも自作で作ってみたいみたいのですが、同様の考え方で行うものでしょうか >>797
本質じゃないけど
×画竜点晴
○画竜点睛
どこが違うか見つかるか、×の方は意味なさないからね。 魚に青なのか、その下が円なのかは、単に書体の違いぐらいらしいのに、
日の青なのか、その下が円なのかは、意味が違ってくるんだね。
サバと同じでどっちでも良いものだと思っていました。勉強になるわ。 >>802
>同様の考え方で行うものでしょうか
考え方は同じです。
秋月などの文字表示液晶の初期化などを作ると、しびれるほどエキサイティングです。
マイコン処理のように、ステップ毎に進んで行く処理は、
状態遷移を使って処理していきます。
always @( posedge CLOCK ) begin
if(リセット=1)なら、
その他のFF=初期値にして
状態遷移=0にして
そうではなくて通常なら、
if(状態=0)のなら
if(○○=xx)になったら
aaをして
次は状態=1に行く
end
そうでなくてif(状態=1)なら
if(vvvv)なら
WWWWをして
次は状態=2に行く
end
そうでなくてif(状態=2)なら
if(UUUU)なら
DDDDをして
次は状態=3に行く
end
そうでなくてif(状態=xx)なら
if(UUUU)なら
DDDDをして
次は状態=0に行く
end
end
毎回スキャンしたいことは、ここに書く。
あるいは、
別の状態のグループを置いてもいい。(簡単なマルチタスクのイメージ)
end
end
という感じにすれば、
微分も必要ないし、思い通りの処理ができます。
流れを変えたければ、状態番号を変えるだけで楽だし、
状態の値で、どこを処理しているかわかるので、LEDなどでデバッグ
しやすいです。
この方法に気づくまでは、毎晩徹夜ばかりしていました。 これじゃダメかな。
integer i;
reg CLK;
always @( posedge TRIGGER) begin
for( i=1; i<=10; i=i+1) begin
CLK = 1'b1;
#10 CLK = 1'b0;
#10;
end
end >>804
残念。月と円の違いもあるけど本質的じゃなく、
本当の違いは左側が「日」か「目」か。
晴は天気の良いことだけど、睛は「ひとみ」の意味なんだよ。
画竜点睛を欠くとは、
絵にかいた龍に最後に書き入れる目が足りないという意味。
「がりょうてんせい」全体で漢字変換する事を勧める。
スレチでした。 >>802
横からだけど
「減算で」っていうのは必須じゃないよ
ある値まで加算する、っていうのでもいいし、実装したときの
使用リソースも(固定値と比較する場合は)変わらないはず
減算が有利なのはカウント値をプログラマブルにするときかな >>805
ありがとうございます
あとは自分なりに考えてみたいと思います
例えばI2CであればROMにデータを書いて、それをCLOCK同期でデータを読み出していくような感じで作れればと思ってるのですが、SCLがSDAの半分ってのがこれまたどうするのか?と。。
出来たらあげたいと思うのでその時は指導お願い致します
>>806
ありがとうございます
ソフトウェア的なこういった記述も出来るんですか?
ちょっと調べてみます
>>808
ありがとうございます
減算をこういった形で使うのを意識したことがなかったので目からウロコでした >>809
上の798さんのサンプル見ても分かるとおり、出力するパルスは
FPGAのクロックとイコールじゃない
I2CのSCL,SDAも同じことで、SCLをクロックと考えると間違える
あくまでもFPGAのクロックから生成されるパルスだってことを
しっかり押さえといがほうがいい >>806
それって、配置配線できるの?
シミュレーション専用のおまじないじゅなくて? >>811
>>806はシミュレーション用の記述だろう。合成はできないよ。 申し訳ありません。
シミュレーションするためのクロックだと思ったので。
論理合成するならこちら
reg [1:0] t2;
reg [4:0] count;
reg CLK2; // variable
always @( posedge CLK ) begin
if( t2 == 2'b01 ) begin
count = 5'd20;
end
else begin
if( count != 5'd0 ) begin
count = count - 1'b1;
end
end
CLK2 = count[0];
t2 = {t2[0], TRIGGER};
end
減算に 1'b1 としているのは回路の初期にカウンタを推定させるため
20年ぐらい前の古い書き方かも知れません。 んじゃ、あたいからは一点。
FFだと考えてるならノンブロッキング代入文を使おう。
文中だけでも、CLK2とかSimと実物で動き変わんで。 >>814
昔、Cで検証してからVerilogに書き直してたので
こんな書き方になりました。 .
インデントされていないと、読む気にならないので添削した
reg [1:0] t2;
reg [4:0] count;
reg CLK2; // variable ← 出力のことでしょ?
always @( posedge CLK ) begin
t2 = {t2[0], TRIGGER}; // 意味合い的に、この位置に書こう
// = でいいの? <=ではなくて?
if( t2 == 2'b01 ) begin
count = 5'd20;
end else begin
if( count != 5'd0 ) begin
// count = count - 1'b1; // = は間違いと思う
count <= count - 1'b1; //
end
end
// CLK2 = count[0]; // = でいいの? <=ではなくて?
CLK2 <= count[0]; //
end >>816
重ね重ねすいません。
書き直しました。
wire CLK2;
reg [1:0] t2;
reg [4:0] count;
assign CLK2 = count[0];
always @( posedge CLK ) begin
t2 <= {t2[0], TRIGGER};
if( t2 == 2'b01 ) begin
count <= 5'd20;
end
else begin
if( count != 5'd0 ) begin
count <= count - 1'b1;
end
end
end >>817
>count <= count - 1'b1;
は、count <= count - 5'b1; だと思う。
リトリガー可能な10発パルス発生器ですね。 >>818
>count <= count - 5'b1;
count <= count - 1;
はいけない子ですか? こっちの記述の方が良いわ。
reg [1:0] t2;
reg [19:0] line_buf;
reg CLK;
always @( posedge CLKx2 ) begin
if( t2 == 2'b01 ) begin
CLK = 1'b0;
line_buf = 20'b1010101010101010101010101010101010101010;
end
else begin
{CLK, line_buf} = {line_buf, 1'b0};
end
t2 = {t2[0], TRIGGER};
end >>824
はい、よくないです。
5bit幅の変数に、1bit幅の1は減算できません。
5bit幅の変数には、同じ5bit幅の1、00001を減算します。
あと、if() else では、どちらの場合でも ちゃんと変数の値を指定しましょう。
例
if( t2 == 2'b01 ) begin
CLK <= 1'b0;
end
と、書く人が多いですが、ちゃんと
if( t2 == 2'b01 ) begin
CLK <= 1'b0;
end else begin
CLK <= 1'b1;
end
のように書きましょう。 FFは<=
組み合わせ論理は=
FFで<=使わないのは分周クロック生成ぐらい。 >>826
ありがとう
nビットカウンタのレジスタqをクリアするとき
reg [n-1 : 0] q
q <= 0
としてたけど、これもいけない子ですか? >>826
それは間違い。
//a--------------
if( t2 == 2'b01 ) begin
CLK <= 1'b0;
end
//b-----------------
if( t2 == 2'b01 ) begin
CLK <= 1'b0;
end else begin
CLK <= 1'b1;
end
a,bは意味がちがう。
aは
if( t2 == 2'b01 ) begin
CLK <= 1'b0;
end else
CLK <= CLK;
に等価だ。
それに不必要なbegin endは入れない。ビット幅が決まっているのに
いちいちビットを指定してはいけない。わかりづらい。
if( t2 == 2'b01 )
CLK <= 0;
else
CLK <= 1;
もしくは
CLK = (t2 == 2'b01) ? 1 : 0; >q <= 0 としてたけど、これもいけない子ですか?
このほうが良い。ビット幅を指定しないと誤まるようなコンパイラは今ではない。
であるから悪習は早くやめるべき。 >>817
if( t2 == 1 )
count <= 20;
else if( count != 0 )
count <= count - 1;
このほうが見やすいだろ。 >>830
ありがとう
ちょっと安心しました
ついでにもう一ついいですか?
モジュールの接続は
MODULE_A MODA(
.a(a),
.b(b)
);
と
MODULE_A MODA(a,b);
のどちらの記述がいいですか? >>830
>ビット幅を指定しないと誤まるようなコンパイラは今ではない。
だけど、ISEがWarningをいっぱい出すよね。
常にデフォルトの32bitで書くのはどうかと思います。
>>832
xxx yyy ( .(a), .(b) );
のほうがよいです。寝ぼけていてもミスが発見されやすいです。
順番で書く方の、順番を確認するのが手間です。 >>833
なるほどなるほど
ありがとう
モジュールのほうは共有して認識あるライブラリを使う場合は順番のほうでもありかな? 古いDesign Compiler の制約を引きずった書き方してきたので
最近の記述方法が知りたいなあ。
論理合成のために、こんな記述してた。
count = count - 1'b1;
A = A + B + 1'b1; >>833
ISEはそうなの? Primeしか知らない。Primeは問題なし。 Verilogのテクとして
ifロジック記述ではbegin endは使わない。
どうしても必要な大きなロジックの場合はfunctionにする。
したがって大きな組み合わせ回路はすべてfunctionで書く。
★alwaysを使った組み合わせ回路は書かない。
このようにするとregとwireが意味的に混在することがない。
これはverilog文法の混乱している箇所だから、禁則にする。
<=はレジスタライト専用
=はアサイン、組み合わせ回路専用
最近verilogを始めたばかりだが、驚くほど間違った通説があるようだ。
言語もひどいが教科書が酷い。間違いが多い。
alwaysで組み合わせを書くときにはregで定義するとか、何を考えて
コンパイラを作ったのか理解に苦しむ。 言語仕様で出来上がりが確定しちゃうより
中の人に自由に頑張って貰って、よりラッチやら何やら減らして貰った方が良いじゃん >>838
言語がひどいとならVHDLを使った方が良いと思うよ。 >>838
例えば>>798 のソースを例にとると、
どんなコメントがありますか? もしかしてボロクソに言っちゃいますか?
僕は見やすいと思うんですけど。 >>838
ある条件でデータをロードしつつイネーブルを立てるなんて時はどうするの?
2つのif文に分けるの?
if(x==A) begin
data<= hoge;
enable<= 1;
end >>838
System Verilogを使うといいぞ。 838は自分ルールとしては概ね合理性あるように思うけど
if文でbegin〜end使うなっていうのはちょっと無理があるような if文でbegin〜end使うなっていうのは、マイコンのアセンブラみたい。
次の行を実効するか、1つ飛ばした行を実効するか、みたいな。
実効 → 実行のまちがいです。 >>844
>if文でbegin〜end使うな
の意味がわからないよな
if(hoge) {
hoge;
}
でいう{ }を使うなって言ってるようなもんだろ >>842
これだと
assign 三項演算子で済んでしまわない?
論理合成が違うんだっけ? >begin endは使わない
わいは逆やな。if分岐では必ずbegin endで括る。
case文では可読性重視で削ってるけど。 >>842
まあ例外もあるからどうしてもってときは許可する。
しかしこれのほうがいい。4行が2行だし、紙が節約できる。
enable <= (x == a);
data <= (x == a) ? hoge : data;
always もbeginendはなるべく入れない。
モジュールのinput,outputは2度書きしない。
module oneshot(input clk, reset, pls, output pr_q);
reg srff; wire cy; reg [3:0] count_q;
assign pr_q = srff;
assign cy = (count_q == 4'd10);
always @(posedge clk or posedge reset)
if (reset)
srff <= 0;
else if (pls | cy)
srff <= pls & (!cy);
always @(posedge clk or posedge reset)
if (reset)
count_q <= 0;
else if (srff)
count_q <= cy ? 0 : count_q + 1;
endmodule >>841
798はちょっと意味わからんのだけど、ワンショット回路なら↑ね。 なんで非同期リセットをいれるかというとRTLがきれいになる。非同期リセットを
入れないと、プリミティブのクロックイネーブルを使わない回路になりやすい。
ある寺の場合だけど。
しかたないので非同期リセットを入れてる。W >わいは逆やな。if分岐では必ずbegin endで括る。
いろいろ試してみたがbegin endは煮ても焼いても食えない。
悪いことはいわん、とにかく削除すべし。 >>849
> if(reset)
> srff<=0;
もう1行増えたらどうするの? begin end 使うのですよね?
if(reset)
srff<=0;
dff<=1; if(reset)
{srff,dff}<= {0,1};
上の奴もこういう書き方が望ましい。
if(x==A)
{enable, data} <= {1, hoge}; >もう1行増えたらどうするの? begin end 使うのですよね?
300ページある教科書をみたが、一か所も必要ないな。
それから
独自cpu開発って本400ページあるのをみたがパイプライン処理のところ
1箇所くらいやな。
あとはbegin end 削ったらずいぶん簡単なソースコードになる。
コードが激減する。 だから複雑な組み合わせが発生する可能性はもちろんある。その場合はfunction
で書く。
しかし普通の制御はbegin endなんて必要ない。必要な時は下手な回路やと考えて
間違いない。
教科書に一か所もないというのは嘘で、必要なところは一か所もないということ。
例えばシリパラ変換
reg [7:0] ps;
begin
ps <= ps <<1;
ps[0] <= si;
end
こんな風に教科書にはかいてあるが,こんな書き方はまずい。
正しくは
ps <= {ps[6:0] << 1, si};
こうすると意味がはっきりする。 もっと分かり易くかくとすると
{ps[7:1],ps[0]} <= {ps[6:0] << 1, si}; > {srff,dff}<= {0,1};
こういうの見ただけで儂の頭がバグりそうになる。 >858
慣れよ。
ただし、その場合にはbit幅を指定しないとエラーになる。
正しくは
{srff, dff} <= {1'd0, 1'd1};
ちょっと見づらいな。
{srff, dff} <= {low, high};
これなら見やすいが,,,, >ps <= {ps[6:0] << 1, si};
これも慣れ? >>849
1990年代の懐かしい書き方ですね。
自分には無理。 pythonぽいという意味では今風。
そういう書き方にカブレて言語批判を繰り広げるも、
実力が伴わずバグを続出。 カッコ内に○×をつけてください
( ) begin end を使わないほうが、コンパイル時間が速い
( ) begin end を使う ほうが、コンパイル時間が速い
( ) begin end を使っても使わなくても、コンパイル時間は変わらない
( ) begin end を使わないほうが、FFの使用量が少ない
( ) begin end を使う ほうが、FFの使用量が少ない
( ) begin end を使っても使わなくても、FFの使用量は変わらない Python一目見たが好きになれないな。W
どこが似てるのかなーー?
begin endは大きなゴミ。まずは大きなゴミは履いて捨てる。
ゴミの代わりに?とリストを積極的に使うだけだものな。
assign decode = !ena ? 4'b0000 :
sel == 0 ? 4'b0001 :
sel == 1 ? 4'b0010 :
sel == 2 ? 4'b0100 :
sel == 3 ? 4'b1000 :
4'bxxxx ;
?のこんな使い方はCライクだと思うが、、、どこがPython?
begin
ps <= ps <<1;
ps[0] <= si;
end
こんなんより
ps <= { ps[6:0] << 1, si };
このほうが昔も今もセンスは上だな × ps <= { ps[6:0] << 1, si };
○ ps <= { ps[6:0], si }; ・マイクロ波の危険性 法の外にいる御用学者達
https://www.youtube.com/watch?v=EJluXfJQCuk
・元MI5部員Dr. Barrie Trowerの語る電磁波兵器@
https://www.youtube.com/watch?v=NRoN2Fsci3o
・ニック・ベグジェッチ博士 HAARP 機密科学ハイテク洗脳@
https://www.youtube.com/watch?v=Kpf2iKOtSfg
動画「陰謀論 脳侵略者」
https://vimeo.com/119665215
https://vimeo.com/118485020
https://vimeo.com/119029616
それぞれの動画の加害装置の電磁波の出力が「小さい」と言っている理由について
レーザーに例えると、60Wでプラズマ核融合炉のプラズマを発生させるためにつかっているのに対して、家庭では電球が60W
このギャップに気付かなければならない
誘導放出され、増幅されたマイクロ波を計測するのではなく、メーザーの出力の表示の数字が強さの目安
だから、動画のインタビューに出てくる人達は、「弱い」とか「小さい」という単語を使っていると思われ assign decode = !ena ? 4'b0000 :
sel == 0 ? 4'b0001 :
sel == 1 ? 4'b0010 :
sel == 2 ? 4'b0100 :
sel == 3 ? 4'b1000 :
バスのアドレスデコーダで、こんな書き方していました >>849
紙を節約したいならalwaysもifも改行せずに1行にしたほうがいいんじゃないの? >>864
登場から25年経ってる言語が今風なのかね >○ ps <= { ps[6:0], si };
そうか。こうだ!!!
めっちゃ美しい。
ps <= ps <<1;
こんな書き方では最下位ビットはどうなるのかわからん。
<<の演算子はいらないな。どう考えても使い道がない。ゴミ決定。
ifのbegin end,<<,>> 使用禁止 >紙を節約したいならalwaysもifも改行せずに1行にしたほうがいいんじゃないの?
alwaysを1行にするのはダメ。
ifを1行にするのはありだとは思う。しかし
always @(posedge clk or posedge reset)
if (reset) //DFFの非同期リセット
count_q <= 0;
else if (srff) //DFFのクロックエネーブル
count_q <= cy ? 0 : count_q + 1; //DFFのデータ
RTLをみると上は
count[*].clr =(reset) //DFFの非同期リセット
count[*].ena =(srff) //DFFのクロックエネーブル
count[*].d = cy ? 0 : count[*].q + 1; //DFFのデータ
のように合成される。
ifはenableを意識した書き方だな。 >>874
> ps <= ps <<1;
> こんな書き方では最下位ビットはどうなるのかわからん。
シフトした残りには0が入るって決められてるから、
分からん訳じゃ無いと思うけど。 おまえら、VHDL使え。Verilogの緩い文法議論が、くそうぜえ。使ってないから、そういう議論が頭悪いことに気づかないのか if文でbegin〜end は必ず使え<VHDL上がりの意見。 >>876
なんか、色々分かってない感じだよね。
ハードもソフトも。
「僕の考えた最強の書き方」 >>879
ニッポンから技術者が消えて、馬鹿な豚どもになりつつあるんだよ。だから仕方が無い。 >>874
ps[7:0] <= { ps[6:0], si };
ps(7 downto 0) <= (ps(6 downto 0) & si );
じゃないとだめ。
ああ、VHDLしばらく触らせてもらえないから忘れてきた。
つうか、大手半導体レイアウト会社でも、VHDLをどうして使うかってわかんないんだな。しっかり、符号演算のためって書いてあげたのに。
ニッポンやバイヨ。 >しばらく触らせてもらえない
やはりVHDLは廃れますか。
verilogとVHDLの中間ぐらいでいいんだが、
System-verilogに向かうのかねえ。 >>882
業種による。
アセンブラは廃れるけど、スーパーマリオの重力計算の微分方程式はすごいよ。
最近、オブジェクト指向の「ハードわかんね」というソフトウエアの技術者が、FPGAあたりをかじってマンセーとか、
ニコニコ本社で、「どうだオレサマすごいだろ」とかいうプレゼンをみせられたりして、つまんないというか、めんどくさい。
ぐらいに、廃れはしないと思うよ。
廃れていると思ったら、目線が狭いんだよ >シフトした残りには0が入るって決められてるから、
>分からん訳じゃ無いと思うけど。
つまりps[0]に関していえば、同じalways内で
ps[0] <= 0;
ps[0] <= si;
って2回書くってことだよな。この意味が不明というか、好きじゃない。
この書きかたは好きじゃない。こういう書き方って普通にやるのか?
ps[0] <= a;
ps[0] <= b;
ps[0] <= c;
これと同じなんだろうけど、
ps[0] <= a or b or c; >おまえら、VHDL使え。Verilogの緩い文法議論が、くそうぜえ。使ってないから、そういう議論が頭悪いことに気づかないのか
VHDLはverilogよりもっと糞だということに早く気が付けよ。W >>884
orではない。
最後の代入のみが有効。
>意味が不明というか、好きじゃない。
それは同意。
二回以上代入するような書き方はコンパイラは認めても
真面目なレビューなら落とされる。 psはffの出力
ps<<1はpsを入力とする組み合わせ回路の出力
<<1がpsのffそのものをシフトするように勘違いしてるように見える 国防省がソフトはAda,ハードはVHDLとして無理強いした。
Adaが糞で、糞から生まれたVHDLは糞の子。 ps[0] <= a;
ps[0] <= b;
ps[0] <= c;
これって、エラーで通らないんじゃないですか?
ps[0]俺はどうすりゃいいんだ? となる。
Verilogの柔軟な書き方は歓迎
でも、もう少し厳しい文法チェックが欲しい。
徹夜でもうろうとしているとデバッグが進まないから。 >ps<<1はpsを入力とする組み合わせ回路の出力
><<1がpsのffそのものをシフトするように勘違いしてるように見える
組み合わせ回路だけどシフトだろ。
ps <= ps << 1
これは
ps[7].d = ps[6].q;
ps[6].d = ps[5].q;
ps[5].d = ps[4].q;
ps[4].d = ps[3].q;
ps[3].d = ps[2].q;
ps[2].d = ps[1].q;
ps[1].d = ps[0].q;
ps[0].d = 0;
こういう意味だよ。
だから
ps[0].d = si; こいつをもう一度書く。
2重定義でしか入力をセットできない。 >これって、エラーで通らないんじゃないですか?
通るんじゃね。それなんとなく見たことあるから。
orじゃないかもしれないが、、、、
もしエラーになるんならひょっとするとディフォールトかな?
count <= 99;
if(a == 3)
count <= count + 1;
これはa != 3の時はcount=99になるだろ。
ps[0].d = 0;じゃなくて
ps[0].d = 未定;
ps[0] <= si; で未定が確定なのかもしれない。 久しぶりに設計やらないといけなくなったんだけど
昔Model Simってテストベンチかかなくても、GUIで波形成形出来なかったっけ? if (test&mode[3:0]==4'b0010)
のコードを見て、verilog死ねと思った ちょくちょく教科書という単語が出てくるけど何の本を指してるの? verilogで$signed使うと、バグが出て。
VHDLでuse IEEE.std_logic_unsigned.all すると止まるのは、
何とかならないものでしょうか。 間違った・・・・
verilogで$signed使うと、バグが出て。
VHDLでuse IEEE.std_logic_signed.all すると止まるのは、
何とかならないものでしょうか。 ps<<1を利用してpsを左シフトしつつps[0]にsiを代入したいから
always文の中でシーケンシャルな代入文を記述してるってことか
話を勘違いしてた >>897
何書いたか知らんけどverilogの仕様じゃないの?
過去スレで$signedでさわいでたときがあるよ >>899
VHDLでつくったのを戻してビット幅あわせてもおこるんよ。
VHDLで組むと起きないので、verilogの深くて単純な話にはまりそう。なので仕事では諦めた。
これ以上追うのは趣味の世界だし。
全てVHDLで組む信号処理の分野も理解できるし、verilog万歳な気持ちもよくわかる。
verilogがVHDLのように厳密な言語仕様にする別モードがあったら、VHDLいらない。
負の演算があるFIRフィルターを、verilogで組んでくださいとか言われたら切れるね。
できなくはないけど10倍デバックがかかる。
そこがデバック終わって数値演算ライブラリがverilogでできればいいけど、外部コンポーネント参照山のようにして、誰が見ても理解不能コードになることうけあい
面倒くさいから最初からVHDLでかいたほうがいいいやん。
テストベンチは、verilogの方が便利ね。
特にバス調停の決まり切った物。task文とか
verilogが曖昧過ぎて、その曖昧な部分を埋めたシミュレータとか論理合成ツールは偉いと思う。でも、デバックはVHDLじゃないと出来なさそうw >>900
興味あるなー。でも勘違いしてるんじゃない?
曖昧っていったってビット幅は正確に決められるしどんなところが問題なのか、具体的
な例はないの?
「1−1が0にならよ」とか、まさか負のキャリが立たないとかW
verilogで負の演算ができないなんてことはないだろ。W
FIRって知らんが、x/+-が素直に動けばもんだいなくできると思うが、、、W >>900
>負の演算があるFIRフィルターを、verilogで組んでくださいとか言われたら切れるね。
なんでですか? signedは敬遠してるな。機械様には全部符号なしで宣言してる。
符号付き演算だと思ってるのは人間だけで、あとは設計書類とコメントぐらい。
S*Sだと、{S1,R1}*{S2,R2}に分解して、筆算。
R1*R2 -((S1)? R2<<a:0) -((S2)? R1<<b:0) +((S1&S2)? 2^c:0);
あとは、例えば(-128)*(-128)をサポートするならbit幅が1つ余分に要るとか。
signedを使いこなせたらもっと楽になるんだろうけど
我ながら低レベルな記述をしてる。 signedだからって関係ないだろ。 でも俺もfloat以外では使うことないな。 論理回路設計の勉強をしてるのですが、プロの人達はまず最初にブロック図的なものを書くところから始めるのでしょうか
それとも構想を頭で描きながら記述していくのでしょうか
ブロック図などを書く場合はどういったツールを使用していますか 紙とシャーペン
ブロック図を書いたら回路図を書いて
フリップフロップをalways、AND,ORはassignにする。 基本設計をしてデバイス選定をする。
Libreoffice Writer を立ち上げてタイトルを書く。日付を入れる。
次に概要を書く
解決すべき問題がないかをリストアップする。
IPなど必要資料をリストアップする。
全体構成を箇条書きする。
タイトル名でプロジェクトディレクトリを作成する。
その下に
ドキュメントディレクトリ
VerilogTopディレクトリを作る。さらにその下にサブプロジェクトのディレクトリ
ツリーを作成する。
あとは漫画を描きながら各モジュールを作成してテストベンチを作成してテストする。
漫画はジェットストリームでノートに書く。完成した漫画はスマフォで撮影して
Evernoteでクラウドに挙げて、Libreofficeのドキュメントに貼り付けていく。
テストベンチのWaveデータもsnippingツールで画像コピーをしてドキュメントに
貼り付けていく。
というようなやり方だな。 Excelとかパワポとか言い出したら、目立・ル○サス系なのでそいつには気をつけろ!自分のやった領域以外の仕事はできない!
Wordでも書くよといいだしたら、信用できるかもw
Visioが使いやすいんじゃないかなあ。Word/Excel/パワポと描画エンジンはもう同じだけどw
要は、就職先によるだろ。
個人の場合は、描かない。めんどくさいし。
ブロック図で描かないと、設計できない人と。描いてしまうと、設計できなくなる人と。分かれる。
ASIC時代の人は、前者が多い。最近の人は、後者。
でも、両方体験して、どっちもできる賢者になるのをおすすめします。
>>910
在宅Webプログラマっぽい。かっこいい。w
余談というか、愚痴。
この仕事になった10年前あたりから、テストベンチの波形データを貼り付けたままで。満足。
「この信号のこの部分が、xx[ns]になっているから、仕様と一致することを確認した」
と書く意識のない奴ってなんなの。なぜかベテランに多い。
そういう人のverilogは、たいてい怪しくて、はまることが多い。
>>911
わし、ユニボール シグノ 0.5mm
ブロック図で、微妙な濃淡。微妙な太い細いが表現できて、毛筆のようなそのときの気持ちが表現できて気に入ってる。
ジェットストリームは、車の中とかの過酷な環境で使っている、あれいいよね。でもすぐになくす。
そういえば、最近、論理記号の定規をみないな、何処にしまったんだろ・・・ >>906ですが、みなさんありがとうございました
結局は人それぞれってことみたいですがいろいろと参考になりました
とりあえずジェットストリームが欲しくなりましたw 遠い地平線が消えて、深々とした夜の闇に心を休めるとき… >>809のお世話になった者です
I2Cのパターンを途中まで作ってみたのですが、考え方などあっているでしょうか
DATA[7:0]想定です
reg [4:0] cnt_addr;
reg [6:0] cnt_rate;
wire cnt_enable;
wire cry_addr;
// -- cnt_addr ----------------------------------------
always @(posedge clk or negedge reset) begin
if(reset == 1'b0)
cnt_addr <= 0;
else if(start_trigger == 1'b1)
cnt_addr <= 8;
else if(cnt_addr > 0)
if(cry_addr == 1'b1)
cnt_addr <= cnt_addr - 1;
else
cnt_addr <= cnt_addr;
else
cnt_addr <= 0;
end
assign cnt_enable = (cnt_addr > 0) ? 1'b1 : 1'b0;
// -- cnt_rate ----------------------------------------
always @(posedge clk or negedge reset) begin
if(reset == 1'b0)
cnt_rate <= 0;
else if(cnt_enable == 1'b1)
if(cry_addr == 1'b1)
cnt_rate <= 0;
else
cnt_rate <= cnt_rate + 1;
else
cnt_rate <= 0;
end
assign cry_addr = (cnt_rate == 99) ? 1'b1 : 1'b0; scl/scl_o、sda/sda_oがあるのはどうしたほうがいいのかよくわからなくなり
とりあえず試しているところです。。
// -- scl -------------------------------------------
assign scl = out_scl(cnt_enable,cnt_addr,cnt_rate);
function out_scl;
input en;
input [4:0] addr;
input [6:0] cnt;
begin
if(en == 1'b1)
if(cnt < 50)
out_scl = 1'b1;
else
out_scl = 1'b0;
else
out_scl = 1'b0;
end
endfunction
// -- scl_o -------------------------------------------
always @(posedge clk or negedge reset) begin
if(reset == 1'b0)
scl_o <= 1'b0;
else if(cnt_enable == 1'b1)
if(cnt_rate < 50)
scl_o <= 1'b1;
else
scl_o <= 1'b0;
else
scl_o <= 1'b0;
end reg [7:0] rom_sda = 8'b10110111;
// -- sda -------------------------------------------
assign sda = out_sda(cnt_enable,cnt_addr,rom_sda);
function out_sda;
input en;
input [4:0] addr;
input [7:0] rom_data;
begin
if(en == 1'b1)
out_sda = rom_data[addr - 1];
else
out_sda = 1'b0;
end
endfunction
// -- sda_o -------------------------------------------
always @(posedge clk or negedge reset) begin
if(reset == 1'b0)
sda_o <= 1'b0;
else if(cnt_enable == 1'b1)
sda_o <= rom_sda[cnt_addr - 1];
else
sda_o <= 1'b0;
end 簡単でも仕様を書く(目標を定める)
○ i2cマスタっぽい何かを作りたい
○ clkは何MHz SCLはその1/50
○ SCL↓とSDAの位相をずらさない
○ SCLもSDAもデフォルトLで構わない
○ スレーブアドレスは渡さない
○ r/wも渡さない
○ アクノリッジも見ない
○ データの8bitだけ渡す
○ シングルスレーブ、書き込みのみ
○ SDAはオープンドレインにしない
文法的にはアレだな。かわいそうだけど
begin~else否定派が生まれちゃったな。
resetは負論理ならxでもnでもpreでもsufでも付けましょう。 なかなか筋がいい。綺麗だね。
しかし921がいうように仕様をきめること。
それからステートマシンでプロトコルを書くのが先だな。
スタート待ち
アドレス検出、もし不一致ならストップへ
アック検出
、、、、、、
ストップ
みたいな感じでステートマシンを書く >>921>>922
ありがとうございます
いろいろと至らない点がありすみません
指摘頂いたこと以後注意します
今はまだ考え方がふわふわしてて記述に自信が持てません
一応シミュレーションだけはかけていますが。。
begin〜endは自分も全部付けて複数行かくスタイルでやってましたが、ここ最近のスレのやりとりでちょっと見直してみました
考え方が問題なければ、スタート/ストップコンディション、ACK含めステートマシン的な考え方で出来ればと思ってます うーん、opencore.orgのI2C masterを登録してダウンしてみるといいと思う。
今見たらメンテナンス中ってでるけど。 >>924
ありがとうございます
調べてみます
I2C自体が別に目的ではないんですが、今はいろんな手法を学べればと思ってるのでいろいろ指摘して頂けるとありがたいです 次のような記法は好きでない。(cnt_adrが0の時とかね)
rom_sda[cnt_addr - 1]
scl/sdaを組み合わせ回路で組んでいるが、
外部とやり取りする部分は基本FFにする。 >>915
お供をいたしましたパイロットは
わたくし、城達也でした。 そういえば、alteraだったかのライブラリで
reg <= 1'bz
という記述があって驚いた。
実際に(FPGAで)合成可能で二度驚いた。 >>926
すみません
最終的にはトライステート出力にするつもりです
>>927
そうですよね。。
scl_o/scl_oのほうはそのつもりでやってみたのですが、cnt_addrの立ち上がりから1クロックずれるのでどうしたらいいのかと。。根本的な見直しが必要ですかね >>929
FPGAでもASICでも、CMOS FET のゲート電圧を、ドレインーソース間が貫通しないようにすれば、ハイインピーダンスになるんだから、
何で驚くのかそっちの方が疑問。 そりゃFFにzを保持できる訳がないという先入観があったからな。
代入される信号もI/Oに繋がっていないと駄目だし、
合成結果も1/0を保持するFFと、open/driveを制御するFFの二つが
出力される。ASICしかしてない時は想像もしてなかった。 reg [7:0] rom_sda = 8'b10110111;
sda_o <= rom_sda[cnt_addr - 1];
へー、こういうアクセスってできるんだ。初めて知った。テストベンチなら使い
そうだがロジックでは使ったことがないな。どういう風に合成されるんだろ。
セレクタになるんだろうなきっと。この書き方気に入った。Goodだよ。
>最終的にはトライステート出力にするつもりです
スタート
アドレス
RW選択
アック待ち ここは入力に切り替えてトライステートにしないといけないから、最初
から考えておかないと。
受信はクロックストレッチというのがあって、要するにマスターはHにしてもスレーブがL
にしたままだとSCLがHにならない。
マスターはトライステートにしてSCLがHになるのを確認してから次のSCLをLにする。
ここはI2Cの肝だから、、、 >>932, 933
コンパイラで1か0に置き換えられているんじゃないの?もしくはORで合成されるとか。
本当にHi-Zにできたらタイミング解析が無駄に複雑になるだけでメリットないような気がする。 >>934
8入力のセレクタが作られるだろう。
シフトしてるのと同じかな。 >>936
ROMが合成すると、cnt_addrを使った組み合わせ回路になるだけ。 reg [7:0] decode[7:0]
= '{
8'b00000001,
8'b00000010,
8'b00000100,
8'b00001000,
8'b00010000,
8'b00100000,
8'b01000000,
8'b10000000
};
こういうのもできるから美しいデコーダができそうと喜んだが、できるのはSystemVerilog
だけのようだね。
これだけのためにコンパイラをSystemVerilogにすると何か問題あるだろうか? reg [7:0] decode[7:0]
ではなくて
reg [7:0] decode[0:7]じゃなかったっけ? 文法的にはどっちでもいいと思うよ。アクセスの順番が違うだけ。
上の例だと decode[0] が128,decode[7]が1
上を0にする方がわかりやすいから[0:7]が一般的なんだろう。
ってこっちのつもりだった。W >>939
"コンパイラ"って良く書いてあるけど、何を指してるのさ? >>939
なんでこんなverilogでできるやんググレカスレベルなことを恥ずかしくもなく聞いてくるんだよ >>946
そもそも >>939 は記述が変だし。 >943
Prime
記述はまともだとおもうがな。コンパイラが通るから。テストはそのうち
してみるが、今2chで忙しい。 カウンターやらシフトレジスタやらロムやら教科書に出てくるようなもん一通り出来たら、何作ればいいかな
会社に入ったら練習させられる課題とかありますか? UARTはどうだい?
とりあえず受信したデータをエコーバックするだけ module counter(clk,out)
input clk;
output out;
reg [3:0] out;
always@(posedge clk)begin
if(out==4'b1111)
out<=4'b0000;
else
out<=out+1;
end
endmodule
リセット入力無しの4進カウンタ作ろうと思って書いたんですが何度シミュやってもoutが不定出すんです
問題点あったら教えてもらいたいです >>954
問題なくシミュレーションできてると思いますが。 電源投入直後のレジスタは製造バラつき・温度・電源電圧カーブ・
クロックグリッチ・電磁波・粒子線・量子力学効果その他の影響により、
一般には不定です。 >>955
//テストベンチ
module counter_test;
reg clk;
wire out;
parameter STEP=100;
counter uut (
.clk(clk),
.out(out) );
initial begin
clk=0;
end
always@ #(STEP/2)
clk=~clk;
endmodule
こんな感じに出てしまうんですが何が悪いんでしょうか
http://i.imgur.com/nUnNtSQ.png それをどうやって初期化するかが考えどころだな。
でもな、必死で考えてリセット無しでsim通すことができるようにできても
実際のデバイスには全部リセットが入ってるからな。W Last Modified: January 13, 2012
Version Found: v11.1Type: Errata
Simulation Fails with NativeLink
Description
When you use the NativeLink to run EDA RTL simulations for Verilog top-level file, the simulation fails and displays the following error message:
#**Error: (vlog-7) Failed to open design unit file ?test.vo? in read mode. # No such file or directory. (errno= ENOENT)
Workaround/Fix
On the Simulation page, under EDA Netlist Writer settings, set Format for output netlist to VHDL. Then, replace the following codes of the generated <variation>.v file to a single-line code before running the NativeLink simulation.
このエラッタ知ってる?
いまでも発生するんだよな。さっきまで何の問題もなくsimできてたのに最後の最後
でtopのデバッグをやろうと始めたらエラーがでる。
いくら頑張っても#**Error: (vlog-7) Failed to open が出る。でwebを探したら
これだよ。 VHDLなら問題なくOK。W
こっちはVerilogなのにVHDLでネット出せってよ。
クッソ腹立つ。
しかし考えても、腹立てても無駄。おとなしく従うほかない。 verilogなら外部から強制的に値を入力できるから、シミュレーション上動作させることは可能じゃね? >>957
テストベンチのwireを[3:0]にすればいいよ initial out=0; が抜けてるんじゃね? これならOK リセットなしでも動く
module poweron_reset(input clk, output reset_out);
//1.3msec reset width at 48Mhz
reg [15:0] count_q = 0;
reg res = 0;
assign reset_out = ~res;
always @(posedge clk)
if (count_q != 16'd10)//$1. for test only, Chage to 16'hffff after test.
{ count_q} <= { count_q + 1};
else
{res, count_q} <= {1'd1, count_q};
endmodule テストベンチの
output→output wire [3:0]out
にしたら不定のままで
outputをwire→regにして
initial out=0;
を足したら今度はout=0をずっと出すようになりました
う〜ん >>935
AlteraとXilinxのツールは外部端子に接続されている信号ならトライステートバッファ付きに置き換えてくれるよ。
チップ内の信号は…やらんから分からん おれも不定に困ってめんどくさいから全部リセットを入れて問題なくsimできて喜んだ
のも束の間、最後に「あれ、poweron_resetどうやんの?」
ってことになって焦って作ったのが上。Primeなら問題なく動いてる。W
テストベンチはこれ
`timescale 1 ns/ 1 ps
module poweron_reset_vlg_tst();
parameter CYC = 50; //50nsec
reg clk;
wire reset_out;
poweron_reset i1 (
.clk(clk),
.reset_out(reset_out)
);
initial
begin
#(0) clk = 1'b1;
#(CYC*100) ;
$stop;
end
always #(CYC/2) clk = ~clk; // clock
endmodule パワーオンリセットとかどうやってやってるんだろ。PLLのロック信号とか?
PLL使わないときはどうすんの?
「どうせボード作るのは俺じゃないし、めんどくさいから外部リセットIC追加」
とか? PLLがないチップなら別だけど、そうでないなら(リセット専用に)PLL使えばいいだけ
分からならなおさら CR遅延回路、とかいても。
コンデンサってなんですか?
抵抗ってなんですか?
どうして遅延できるんですか?
とか質問されそう。 合成制約の勉強
複雑な演算(例えば32bit*32bit*32bit)を書いて、周波数を確認
パイプラインという概念の理解
あんまり使わないけど除算回路とかを記述してみる
テストログを出力し、(他の言語で)自動チェック
テスト項目の列挙
わざと間違えた回路を書きエラー検出
ラッチ記述や循環参照を一度合成してみる
合成結果・ログの確認
自分なりにコーディングルールを作ってみる。それを変えてみる(客>自社>マイルール) PLLのリセット用の使い方詳しく教えて頂けないでしょうか PLLは発信機だから、安定するまでに時間がかかる。1msecくらいかな?
安定すると「安定いたしました。クロックを使ってもいいです」って
知らせる信号がHになる。これをPLLロック信号という。PLLが安定したら
回路を動かしてもいいので、このロック信号をリセット解除にするという
のがPLLのロック信号をリセットに使うということですy。 input clk, locked;
output reset ;//1-active
reg [1:0] locked_d;
always@(posedge clk or negedge locked) begin
if(locked == 1'b0)
locked_d <= 2'b00;
else
locked_d <= {locked_d[0], locked};
end
assign reset = ~locked_d[1]; >>976-977
丁寧な説明ありがとうございます
PON〜コンフィングレーション後の挙動がいまいちよくわかっていないのですが、調べて参考にさせて頂きます >>976
便乗ですが、PLLをRESETのためだけに使って、CLOCK出力を未使用にすると、
Warningが出ないでしょうか? >>977
negedge locked は変じゃない? 変ではないよ
非同期信号をD-FFのリセットとデータに入力してクロック乗せ換えをする方法 negedgeをどのタイミングでとらえるの?ってことじゃ
センシティビティリストにいらないんじゃね?じゃないの?違うか locked信号がHになる時、内部のクロックが動き始めた後か?
既に動き始めていることが保障されている→非同期で無くてもよい
ちょっとわからない→非同期で受ける
何故FFで受ける?
完全非同期だと、あるFF群はまだリセットが効いているのに、あるFF群は
動き出してるというケースがあり得る。(実際に不具合が出たと言う話も聞く)
そして、非同期リセットでも解除タイミングは同期化したいという要求が生まれる。
で、同期化の為にFF受けすんだけど、clockに関わらず伝搬させるには非同期で
つまり、〜edgeにする必要がある。
FPGA内臓のPLLは大概locked信号も(PLL自身のクロックで)同期化されてるはずなんだが、
ベンダーがそう言ってるで終わらせず、明示的に書くことも多い。
ASICの場合、こういう細工はSCANモードとの絡みがあるが、実務では先輩が
対策してるだろう。たぶんね。 ちなみに非同期リセットのアサートは、実を言うとエッジじゃなくてレベル。
実デバイスでは時間0から有効だとしてもちゃんと効く。VHDLなんかもレベルで書く。
しかし、verilogのセンシティビティリストでは伝統的に〜edgeと書かれている。
Simでは実際にedgeがないとリセットされなかったり。 always@(posedge clk or locked) って書くと
if文の else のほうは (locked != 1'b0)って解釈するほうが自然って
話になるかも
まあ、元々else のほうを暗黙で if(clk == 1'b1) って解釈するのが
強引なんだけど lockedにedgeが無いと、Simでlockedが立ち上がった時にも
文が実行されちゃう。 適当だけど、こんなんはいけないの?
input clk, locked;
output reset ;//1-active
reg locked_d = 1'b1;
always@(posedge clk) begin
locked_d <= locked;
end
assign reset = ~locked; クロックが安定していない。
って、かいてなかったっけ?君アスペ? 例えばこんな時
vim>wave zoom range 1000 2000
simulationはpsでやってるがTCLで制御したいときに1000000て入れるのは面倒なので制御単位
をnsecにしたいんだがどうやるの? >>989
timescale 1ns / 1ns ヽ(^o^)丿 assign reset = ~locked_d[1];
としてるから、
非同期リセット信号として使われる事を想定しての、メタス対策だろ
なら、普通にこうするよ
この程度、ケチった処でタカが知れてるし >>977>>993
いろいろと勉強になった。ありがとう VHDLでおっぱいを信号処理したい。MATLABじゃなくてscilabで
1000なら叶う!!!! このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 959日 19時間 2分 2秒 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。