【Verilog】 記述言語で論理設計Project13 【VHDL】
過去ログ参照したいときは、外部キャッシュサイトも便利です。
スレタイで検索しましょう。
・ログ速
ttp://www.logsoku.com/ ・2chビューアーD
ttp://2ch.viewerd.com/ ・unkar
ttp://unkar.org/r/denki/ 他にもあると思う
以上、テンプレらしきもの。
_,,,
_/::o・ァ
∈ミ;;∧,ノ∧ ,,,,, ,,,,,
( ´・ω・) ,,,,(o・e・),(。・e・),, 新スレです
/ヽ○==(。・e・)(。・e・)(o・e・) 仲良くつかってね。
/ ||_彡,,, ノ彡,,, ノ彡,,, ノ
し' ̄(_)) ̄ ̄ ̄(_)) ̄(_)) ガラガラ
4 :
あぼーん:2014/03/06(木) 19:25:57.54 ID:c33fa+Z6
あぼーん
5 :
あほ〜ん:2014/03/07(金) 07:29:39.99 ID:kmlRrSr1
あほ〜ん
FPGAでキャラクタLCDの初期化とか、
74HC595、74HC166などのシリアルものをやったときは、
FPGAを窓から投げたくなった。
マイコンが神様のように思えた。
ノ ゚.ノヽ , /} ...
,,イ`" 、-' `;_' ' ..::::::::::::::...
,-、 _.._ ( (,(~ヽ'~ ..:::::::::::::::::::::::
)'~ レー' 〉 ヽ i`'} .:::::::::::::::::::::::
~つ '-ー、 i | i' ...:::::::::::::::::::::::
/ < / 。/ ! ......::::::::::::::::::::::::: これは
>>1乙じゃなくて
/ ~^´ /},-'' ,●::::::::::::::::::::::::::::::::::::
i、 ,i' _,,...,-‐-、/ i :::::::: .:::::::::::::
..ゝ <,,-==、 ,,-,/ .::::::::::: 放射能がうんたら
) {~''~>`v-''`ー゙`'~ ..::::::::: ........::.
{ レ_ノ ..::::::::. ......:::::::::
ノ '' ..::::::: ...::.:...:::::::::
.::::::::: ...:......:::::::::::: .
.:::::::::::. ..... .. ..:::::::::::::::::::::::: :::.
::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. :: ::..
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::: ::.
::::::::::::::::: :::::::::::::::::::::::::::::: :::::
.:: ::. :::
8 :
774ワット発電中さん:2014/03/08(土) 18:57:41.86 ID:67Qa5TNW
FPGAで家電作ってもおかしくないだろうけど
コスト合うのかな
お得意のウォン安パワー?
ICにするほど数が出てないんじゃね?
1000台作る製品のコストを1円下げるために、
何万円ぶんも人間をタダ働きさせるのが日本式だからなw
TATが間に合わない事もあるしな
TVだとASIC作る時代でも無いし
ASSP+FPGAで急場を凌ぐかな
4K売れんの?
開発期間短縮の為、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は合成可能だから大丈夫だと思うけど。
26 :
774ワット発電中さん:2014/03/25(火) 23:07:06.93 ID:sDlLkAoj
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 合成はできたんですけどワーニングが出てて
出てきた電子回路見てみるとつなげてるはずの配線がざっくり無くなってました。
セレクタ?を記述しないといけないんだけどそれがうまく表現できず、ツールに伝わってないみたいでした。
33 :
30:2014/03/29(土) 02:03:34.44 ID:Nmk89wiM
>>31 やはり、現版数では対応していないようですね。幾つかのサイトを見て回ったのですが、対応していると今後対応予定という情報が入り交じっていました。
Behavior simulationを目的としているので、試しにXilinxのVivado入れてみましたが、simulatorがSystemVerilog非対応でした...
現状、SystemVerilogのsimを行うとすると、やはり御三家のsimulator使うしか無いのですかね...
QuartusはsystemVerilog対応って謳われてて
modelsimの無料版入ってるけどそれではだめなん?
>>33 御三家って、シノプとケーデンスと・・・?
36 :
30:2014/03/30(日) 03:31:22.30 ID:PXg3sNCf
>>34 日頃馴染みが無かったのでアルテラ試していませんでした。情報ありがとうございます。ユーザー登録してダウンロードしてみます。
>>35 あと品川の御殿山をイメージしていましたが(^_^;
39 :
774ワット発電中さん:2014/04/08(火) 18:48:23.97 ID:x9l0EXnP
全然使ってないPT2の基盤眺めてたら
ざいりんくす乗ってた
なんのシリーズかは見てない
>>37-41 音源としてはえらい安いな
そのうちすべてのPCやスマホに標準搭載されると良いな
そこらじゅうのスマホからミクの声がしてたら
それはそれで嫌だな
せからしか!ってなる
48 :
774ワット発電中さん:2014/04/15(火) 20:04:37.66 ID:+XCsDHpy
>>19 FPGAはいくつもの処理を平行して処理できる。
もちろん、プロセッサも!
電電系は高慢だよなぁ…
53 :
774ワット発電中さん:2014/05/03(土) 03:47:32.94 ID:qHAfzWFm
某N社の仕事で、VHDLの回路改修を頼まれ、
アドレスデコーダーの回路見たら、
全部IF-ELSIF文でアドレスデコーダーを数百構文も書いてあった。
CASE文とIF文の使い分けもできないのか、この大手企業はと思った。
しかも担当者に聞いたら、その書き方じゃなきゃダメだと。
日本の「もの作り」とか言って、これじゃおわっとるよな。
if()ではだめなの?
言語的にはIfでcaseかけるので
ちゃんと書けば
同じ回路になるはず
ただデコーダエンコーダ
もしくはCPUのフェッチはcaseが良い(ほぼデコーダ)
人為的なミスが減る
ソースコードは人に優しくないと
「もの作り」って、論理以前の物理的な「もの」しか対象に考えてないからな。
ブール先生から150年経つんだから、ざっと考えて200年前の伝統芸でしかない。
>>57 人手で書くわけじゃなくて、
何かのソフトが吐き出すんだろうね。
アドレスデコーダならテーブル引くほうがいいけど。
59 :
774ワット発電中さん:2014/05/03(土) 22:04:53.10 ID:1nIrmqXL
合成ツールの変なバグがあって、治るまで使うなと言ってたのが
いつのまにか絶対使うなに化けるとか、いろいろあるものだ。
60 :
774ワット発電中さん:2014/05/04(日) 00:09:37.20 ID:SII+IkUE
ifでもcaseでも最近の合成ツールなら一緒だろ
教えてください。
FPGAで、sin波はDDSで出せますが、ノコギリ波は、どうやって出すのでしょうか?
工場の屋根みたいなヤツです。
シンメトリ(矩形波で言うDutyです)は変えませんが、
周波数を変えたいです。ROMにテーブルを入れて、読み出しを間引けばいいのかしら。
それとも、毎点毎点、計算を行うとか・・・・
宜しくお願いします。
dds でどんな波形でも出せる
>>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分解能。
あくまで主観だけど。
サイン波は高調波を持ってないけどノコギリ波は無限の高調波を持つ。
エイリアシングの影響を避けるためには出来るだけサンプリング周波数を
高くするということじゃないの?
70 :
774ワット発電中さん:2014/05/18(日) 17:41:18.72 ID:nYV+BQml
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 :
774ワット発電中さん:2014/05/18(日) 18:21:02.31 ID:l/3NqsGD
パスに日本語含まれてないか?
72 :
774ワット発電中さん:2014/05/19(月) 01:19:16.02 ID:rbfBvD0v
>>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とかインバーター通しただけでも治ったかもね
82 :
774ワット発電中さん:2014/05/27(火) 00:11:06.07 ID:LZynj0Uu
チップスコープで、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は{に変更して。
このBNFが規格そのものを表してるかわからないね
232cの入力bitを検査するのにcase使ったけど
別に問題はなかったような
シミュレーションしかないかねぇ
CSP有効無効で、ユーザ回路側の挙動が異なる、ということ?
>82では
・16bitの値=観測点
・16bitの値だけをCSPで見た場合と
・16bitの値と同時に、他の信号をCSPで見た場合で
・得られる16bitの値が異なる(他の信号は?)
と読みました。
・16bitの値を、CSPを入れずに観測し(ピンなどに出した?)た結果と
・16bitの値を、CSで観測した結果が異なる
ということ?「他の観測信号」はどこでどう絡んでくる?
CSPで挙動がおかしい時の基本確認事項は
・タイミングレポートを確認する。CSP入れると周波数は落ちる傾向がある。
・観測対象の信号をドライブしているクロックとCSPが参照しているクロックが同じか?
辺りが第一歩ですかね。
それとも
・16bitの値を、CSPを入れずピンに出した結果と
・16bitの値を、CSPを入れてピンに出した結果が異なる
ということかな?CSPの観測結果は無関係?
>82
君と同じ現象かどうかわからないけど
観測点増やしすぎると最高動作周波数が下がって
まともに観測できなくなることはあった。
94 :
774ワット発電中さん:2014/05/27(火) 21:55:21.23 ID:t8Xgoc8p
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
>だったらどうなるかはわからないよーとのことでした。
ここが間違い。
クロック同期なら右辺に使われる変数は
次のクロックエッジまで変化しない。
101 :
774ワット発電中さん:2014/05/27(火) 23:11:21.16 ID:t8Xgoc8p
>>100 すみません、よく読み直したらノンブロッキング代入はどうなるかわからないとは書いてませんでした。
それは自分が勝手に思い込んでたことでした。。
ノンブロッキング代入は、alwaysを抜けたときに値が確定し、
それまでは変更前の値で動作するって書いてありました。
すみません&ありがとうございました!
複数のalwaysに別れてたらどうなるかわからないんだっけ?
あれ、それはブロッキングの方だったかも
104 :
774ワット発電中さん:2014/05/28(水) 00:01:48.19 ID:QxNKuz4v
>>102 複数のalwaysに分かれるとmultiple driver的なメッセージでコンパイルエラーじゃないかな
105 :
774ワット発電中さん:2014/05/28(水) 02:33:24.00 ID:P8GRCWmu
>>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がひとつもなかったらどうなる?
108 :
774ワット発電中さん:2014/05/29(木) 00:01:15.78 ID:r9wyqbqv
?じゃなくてzだな
109 :
774ワット発電中さん:2014/05/29(木) 00:01:56.19 ID:r9wyqbqv
あ、ごめん
zじゃなかった
なんか学生ぽいのが増えてきましたね
さすがゴールデンウィーク明けですか
どしどし!
さてWin8にいかろす入れてみますかね
112 :
774ワット発電中さん:2014/05/30(金) 14:26:56.92 ID:UpNH0mQC
VerilogでHDLを書いていますが、ミスが多くて思うように進みません。
どのようにしたら、スイスイと作成できるでしょうか?
今までわかっていることは、
・自分の性格は、おっちょこちょいで落ち着きがありません。
・記憶力も悪いです。
・変数の内容がわかるように、u16_reg_AAAとか s32_wire_BBBとか書いています。
・代入する即値は、32'h1234_4c7f と、bit数を書いて_で4桁ずつ区切っています。
113 :
774ワット発電中さん:2014/05/30(金) 14:32:36.90 ID:UpNH0mQC
追記です。
一番多いエラーは、
「その変数、いつまでたっても0だよ。だから省略するからね」というやつです。
カウンターで使ったのに、常に0って、困るんですが。
Cleanup Projectって何でしょうか?
プランヘッドを起動してもメッセージが出てエラーになります。
115 :
774ワット発電中さん:2014/05/30(金) 15:07:36.77 ID:UpNH0mQC
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されるというだけで。
しかし、やるなら全ビット書き込んであげなきゃ。
おっと、Xilinxの悪口はそこまでにしとけよ
generateを使わずに、8回同じインスタンシエーションを書いたら、
大笑いされました。
そんなに可笑しい事でしょうか?
for()で書かないとうまく動かないのでしょうか?
人に見せた分だけ
コードは見やすくなる
ベタでも良い
見難いだけ
generateでかけば今度は笑われない だけ
8回だとベタ書きとどちらが見やすいかは微妙。
大笑いするのはおかしいな。
ニヤけるレベル。
>>130 でも将来8が16や64になる可能性がわかってるのにベタに書いたら
大笑いというより怒られてもおかしくない
それより
>>129のいうように学ぶための機会を得たと思えばいい
132 :
774ワット発電中さん:2014/06/03(火) 22:03:54.67 ID:NiiIYSIV
Verilogじゃないけど、回路図インスタンスの配列記述が禁止の会社はあったな……
133 :
774ワット発電中さん:2014/06/04(水) 00:36:33.16 ID:U+InIE9D
内製のツール使ってたりするとNGの場合があるよね
134 :
774ワット発電中さん:2014/06/07(土) 10:49:57.22 ID:PLWZT36o
VHDLで
a <= '1' when b=c;
とelse無しで書いたらエラー出ずにラッチが生成されるのは普通なの?
Quartusなんだけど、この前これではまったよ。
>>134 > VHDLで
> a <= '1' when b=c;
> とelse無しで書いたらエラー出ずにラッチが生成されるのは普通なの?
普通です。
ラッチを記述してるからラッチが出来ただけ。
136 :
774ワット発電中さん:2014/06/07(土) 14:18:38.80 ID:RtUul3Qu
字面だけ見るとラッチができそうだが、134が聞きたいのは、
(半分愚痴を込めて)これが規格的に合法なのかってことだろう。
俺が持ってる参考書には「必ずelse項を記述する必要があります」
って書いてある。
どう合成されるかなんて規格で決まってるわけじゃないからね。
138 :
774ワット発電中さん:2014/06/07(土) 18:26:39.22 ID:PLWZT36o
>>136 そうなんですよ。
一般的にはどうなのかと、VHDLの文法的、規格的にはどうなのかと。
VHDLは厳格な印象があったのでかなり意外だったし。
厳格にelseがないからラッチを合成したんだろ
140 :
774ワット発電中さん:2014/06/07(土) 18:44:05.67 ID:PLWZT36o
LRM調べてみたら文法的にはelseがなくても正しいらしい。
conditional_signal_assignment ::=
target <= options conditional_waveforms ;
conditional_waveforms ::=
{ waveform when condition else }
waveform [ when condition ]
{ }は繰り返せる記述で0個でもよいらしい。
エラーであったほしかった…
141 :
774ワット発電中さん:2014/06/07(土) 19:02:12.45 ID:PLWZT36o
もしかして
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と合成ツールの関係を理解したほうがいいと思う。
spyglass とか使ってみるといいよ
このスレは
>>146がHDLから巣立ち
スケマ書きエンジニアになっていく様を
温かく見守るスレになりました
150 :
774ワット発電中さん:2014/06/09(月) 23:13:50.29 ID:eaOTAJF+
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のクロックにクロック以外が入るような記述なんて
めったにしないから、ラッチの出来ようがないのだけど
156 :
774ワット発電中さん:2014/06/10(火) 22:46:26.64 ID:5viGuzrF
>>154 組み合わせ回路をprocess文で記述するとセンシティビティリストに変数書き忘れるだけでラッチになるから逆効果でしょ。
何言ってんだ。
LUTの出力を自身の入力につなげば自己保持回路できるじゃないか。
FPGA設計では禁止回路として真っ先に指摘される回路のひとつだけどw
>>156 合成のときはセンシティビティリストは無視だよ。
RTLシミュレーションのときに問題になるけど。
159 :
774ワット発電中さん:2014/06/11(水) 00:44:08.73 ID:y95R7ig0
無視?無視されると逆にラッチが実装できなくなる気がするけど。
センシティビティリストを書かないということか?
160 :
774ワット発電中さん:2014/06/14(土) 15:42:03.97 ID:Yyru01VT
ほんとbeginとendにした奴死んでほしい
なんで{}を使わなかったんだ
あと[7:0]とかって打ちにくい。これ考えたやつも死んだ方がいい
>ほんとbeginとendにした奴死んでほしい
これには同意。せっかくC言語風なのになんでここだけPascal風なんだ
>あと[7:0]とかって打ちにくい。これ考えたやつも死んだ方がいい
VHDLの(7 downto 0)よりはマシかと。
endの後にセミコロンが来ないのはC言語風なんだな。
そう考えるとずいぶん中途半端なんだな。
163 :
774ワット発電中さん:2014/06/14(土) 20:20:18.33 ID:c8oKTZaO
ソースの変換プログラム作れば、C言語風でキー入力して
HDL処理系にかかるソースに変換できるよ。 いわゆる
プリプロセッサみたいなプログラムな。
>>161 でも'rangeとかは便利だと思った。
わしは++が実装されなかったのが残念。SystemVerilogでもブロッキング文だけだし。
プログラミング言語ぢゃねぇんだ
符号と配列の扱いをもう少し真面目に考えて欲しかったな。あと、変数のスコープも変だ。
VHDLみたいにオーバーロードには対応して欲しかった。
rubyの話してるのかと思た
++欲しいって、バカか
プログラムじゃねえっつーの
[7:0]がイヤならどんなならいいんだろう?
ビットスライスする関数が欲しいかな。
(a+b)の[4:1]なんて、一度別の変数に入れるか、function作るしかないからね。
わしは++が実装されなかったのが残念。SystemVerilogでもブロッキング文だけだし。
>>171はnand(out, in1, in2)とかで実装しているのか?
++あったら便利だと思うけどなぁ。
++ってインクリメントのこと?
2増やすときどうするの?
++a[7:1]
その発想はなかった
で、3増やすには?
こうなったら・・・
i++++
そもそも他の言語にもないだろ。
++はインデックスを増やすためのもんだから。
こうとか。
procedure tt(signal a : inout std_logic_vector) is
begin
a <= a + 1;
end procedure;
レジスタってカウントアップしていくと0にループして戻りますか?
レジスタの説明
カウンタ4種調べて説明
オーバーフロー、アンダーフローの説明とその活用
以上をレポート形式でまとめる事
文字数の規定無し
Wikiは認める
>>185 カウンタ4種ってなんだろ
ジョンソンカウンタとかリングカウンタとかグレイコードカウンタとかだろうか
クロスカウンタ
カウンタ4種盛り合わせ
ジャンク屋の適当袋?
しくしく
ベリログの本に4つあったから適当にかいたんだよー
レジスタのループはかいてなかったけど
191 :
774ワット発電中さん:2014/06/29(日) 18:12:46.30 ID:q/4APH0d
ある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より周波数が高かったらどうなる?
201 :
191:2014/07/01(火) 00:51:08.50 ID:FN3lKQ8N
みなさんありがとうございます!
とりあえず、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チェッカでエラーになるソースコードだな
まあ数百の製品に載せる訳じゃないなら十分だけど
203 :
191:2014/07/01(火) 01:15:50.26 ID:FN3lKQ8N
やっぱり駄目なやり方なんですね。
204 :
774ワット発電中さん:2014/07/01(火) 05:54:42.27 ID:g3kSawNA
>>200 >DPRAM or FIFO
DPRAM
Dynamic Programming Radio Active Material
放射性物質の動的計画法
FIFO
Furtherment of International Friendship Organization.
国際的な乱交パーティー
>>201 処理が終わる前に次の処理依頼が来ないのなら、
1ビットのカウンタでいいんじゃないの?
つまり、1足さずに、反転。
CLK2系統に直接スタート信号渡して
CLK2系統が受け取ったらRDY下げて
処理終わったらRDYあげたらダメなの?
>>206 191のコードは明からに間違えてるだろ?
上げたフラグは下げたい、って言ってるだろ?
で、おまえはclk1だけで一方的に制御すれば良いって言ったんだろ?
209 :
774ワット発電中さん:2014/07/01(火) 12:35:14.58 ID:RNGxZV4W
>>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!!
メタスタが起こったら何が起こるか分かんねーからダメに決まってんだろ
219 :
215:2014/07/02(水) 00:11:15.51 ID:8gg5QXac
まあ、いずれにしてもお勧めできる回路ではないから深追いすることもないか。
何かしら191の参考になっていればよいが、混乱させてしまっていたらすまぬ。
220 :
215:2014/07/02(水) 00:22:48.64 ID:8gg5QXac
非同期信号扱う以上、メタスタは回避できないしなぁ…
>>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がインクリメントし続けるのが気になるけど。
CLK1とCLK2の水晶を1つにする。
基本に立ち戻って、RS-FF
FPGAで非同期セットとリセット両方が使えるとは限らんね
Spartan3は出来たと思うけど、Spartan6はムリ
Cycloneは出来るかな?
メタが気になるなら
cnt1tmp <= cnt1;
cnt1tmp2<= cnt1tmp;
cnt1tmp3<= cnt1tmp2;
と何段かのFFにすればよいんじゃない?
何段にしてもメタの確率0になることはないけど。(これは非同期の宿命)
226 :
191:2014/07/02(水) 23:12:02.01 ID:kqenebzf
>>225 アドバイスありがとうございます!
さっそく実践したいと思います。
FPGAも電子回路も初心者なものでとんでもない物をさらしてしまいましたが
大変勉強になりました。
聞くは一時の恥ってやつですね。
いや、おかげでこちらも勉強になったよ。
228 :
774ワット発電中さん:2014/07/03(木) 08:41:13.26 ID:jwmrgXxC
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毎にズレが発生するのでやってはいけない設計
clk2が十分に早ければ
非同期のバイナリカウンタでも、2回叩いて値が変わってなければ同期化できたってことでいい。
232 :
228:2014/07/03(木) 12:38:03.10 ID:jwmrgXxC
×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回の事象しか処理出来ないケースがまれにある。
見たいな。
書いた後思ったけど、
(cnt1!=cnt2)の同期が保障されて無いと、
cnt2のビット毎にcnt2+1を通すか、
そのまま保持するか異なってくるタイミングあるかな?
cnt1tmpは省略不可か?
237 :
191:2014/07/04(金) 21:32:11.46 ID:3O9b04Ik
>>228 191です。わざわざありがとうございます!
ありがたく使わせていただきます。
メタステーブルという言葉を教えていただいたので
自分でもいろいろ調べることができました。
おかげさまで勉強がだいぶ進みました。
みなさんありがとうございました
テストしてない回路は動いていないと考えた方がいいよ。
239 :
774ワット発電中さん:2014/07/09(水) 21:14:51.37 ID:DGyXiUmk
シュミレーションは通るけど実機だと動かないから
見てくれと渡されたソースを調べてるんだけど
ちょと見ただけでゲートクロックやシーケンサもどきの部分で
組み合わせ回路からの非同期リセットが
あるんでISEでQuartusのDesign Assistantみたいなチェックをする方法ないですか? あるてらばっかし使ってたんでISEの設定がわからん
ソースごととにQuartusでコンパイルしなそえばみつかるかも知れないけど
シュミレーションて
最低だなおまえ
趣味でやってるもんで…
そーかIntelもVerilogだったんだな
Verilogになる前のインテルの独自仕様のHDLがどんなだったか興味あるわ
やっぱりツールは内製しないと負けるよな
fpgaとかでも、日本は駄目過ぎる
ソフトも電子回路ももう日本は圧倒的に後進国だろう
モノづくりが強かったのは金型作るときの職人の腕がすごかっただけで
もう時代が違う
手作りに賭ける。
つーかな、
日本のメーカーはソフトを軽視しすぎ。
ソフトというより、
あくせく汗水流してるとがんばって働いてるとか。
ホントの頭脳労働してても評価されない。
研究、開発、設計に現場と同じ感覚でQC活動なんかさせんな。
結局、勤勉さと、手先の器用さ以外の部分で見るべきものが全くなくなった
殆どの付加価値はソフトウェアで実装されているが、
お客は、ハードが機能を実現していると思っている
経営者がこの感覚におちいっていると、ソフト技術者を冷遇する
経営者がこの現象を理解していると、ソフトを無料で配ってハードを高値で売る
いずれにしてもソフト技術者が尊敬されることは無い
いかろすが8月一日に上がってた
入れはしたけど試しようがない・・・
サマリー読む気もない・・・
Verilog で複数リセットに対応したいとき
always @(posedge ck or negedge res1 or negedge res2)
と書いても一応論理合成できたんだけどこれでいいんだろうか。
assign res = res1 & res2;
always @(posedge ck or negedge res)
みたいに書かないとダメかなとか思ったりしたけど。
253 :
251:2014/09/15(月) 00:56:42.56 ID:UJFwcfHR
>>252 むむ、何を見ればいいんでしょう。Quartus 使ってます。
252じゃないけど
Quartusなら
Tools → Netlist Viewer → Technology Map Viewer (Post-Fittinng)
で合成後の回路が見られる
257 :
774ワット発電中さん:2014/09/15(月) 18:29:38.41 ID:4YpBRKwJ
素朴な疑問なんだが検証はできるの?
verilogの非同期リセットは何度見ても気持ち悪い。
>>258 クロックのエッジとリセットのエッジで何らかの動作をするという本質をよく表してると思うけど
>>259 リセットはエッジじゃなくレベルでかかるべきだろ
ダウンエッジでFFがリセットされても
その後強烈なノイズが乗ってFFが1に化けたら
ダウンエッジでしか効かないリセットだとリセットは0なのに
FFは1に化けたままになりそう
>>260 うーん、その強烈なノイズってリセット期間中だけ発生してくれるもんなの?
>>262 でもレベルでリセットが効く方が有利だろ。
車のパーキングブレーキが
「引いた瞬間しか効かない」ものだったらどうなるか想像してみてくれ。
>>263 まぁわかるんだけどね。実装はどうせそうなるし。
でもロジック上は区別がないのが気持ち悪さになるのかな。
全FFのセンシティブにnoise追加しとけば
センシティビティリストってシミュレーションでしか使わないんじゃなかったっけ?
>>266 VHDLではRTLシミュレーションでしか意味が無い。
でもverilogはそうじゃない。
レベルの動作はSim.出来ません。
だから
強烈なnoiseが来たときに
FFを不定なり
リセットなり
掛ければ良いのでは
・・・まぁそんなこと回路か動くことのまえでは意味ないし
ノイズならRTL以外でケアすべきところ
270 :
774ワット発電中さん:2014/09/17(水) 23:04:47.86 ID:XEmKdM0X
>>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はそもそもセンシティビティリスト自体不要だったと思うんだけど、
なぜあるんだろうね。
カムリてFFだったんだな
フリップフロップ?
ファイナルファンタジー?
トランジスタ特性条件?
カネが〜すべてさ〜♪
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
282 :
774ワット発電中さん:2014/11/02(日) 14:58:30.19 ID:6RmVD04Q
>>281 多分Verilogの仕様 。
32'hffff8180はunsignedなので算術シフトしても論理シフトになる。
算術シフトしたいなら32'shffff8180か $signed(32'hffff8180)のように
signedとして扱われるように記述する必要がある。
ただ、後者がセレクトされる理由は分かんないや。ゴメン。
>>282 あ、3つめも後者の論理シフトが選択されてるわけではなくて、
$signedの付いている方の式を実行してるんです。
紛らわしい例でごめんなさい。
>>281 うちにもフリーのツールしかないからModelSim ASEとVerilatorでしか試せてないけど、
Verilatorではちゃんと全部同じ値になった。
ffffff81
ffffff81
ffffff81
ffffff81
Verilogの仕様ってことはないんじゃないかな。
285 :
sage:2014/11/02(日) 22:44:59.56 ID:YxW1cfDO
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 三項演算子が左から右ってありえなくない?
そんなことになったらマルチプレクサ書くのにカッコの山になる。
複雑なマルチプレクサならalways文で書け
>>293 always文で組み合わせ回路書くの好きじゃない
じゃあファンクション
>>292 foo= a ? b : c ? d : e; だと、
c じゃなくて a を先に評価しろってことでしょ?
a が真なら b、
偽なら c ? d : e 。
ってか、どちらにせよカッコ付けろよ
>>296 あぁ、結合順じゃなくて評価順のことね。
条件演算子(3項演算子)の優先順位が変テコりんな言語はPHPだけ。
PHP以外は全てC言語と同じだろ?
カッコつけないで括弧つけろ
セレクタとして使う信号には
頭にs_を付けて見るとー
302 :
281:2014/11/05(水) 12:51:59.84 ID:11EZsYb+
みなさんありがとうございます。
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())と二重になっていると、一つだけ(たぶん内側?)はがれる。
これが本当に仕様かどうかは確認できていません。
303 :
281:2014/11/05(水) 12:56:05.99 ID:11EZsYb+
× シフト演算子の第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);
誰かVCSとかNCで試してみてくれないかな
符号の扱いは、ieeeの規格書にちゃんと書いてあるだろ。見ているのか?
>>307 VCS と irun(nc-verilog) でやってみたぜ。
>>281 をそのままやったら、どちらも
ffffff81
ffffff81
00ffff81
ffffff81
312 :
774ワット発電中さん:2014/11/06(木) 12:08:23.58 ID:LdPAe1f3
313 :
774ワット発電中さん:2014/11/07(金) 23:49:04.10 ID:0OzJPhtw
算術演算のIP作ったとき、符号付、符号無の混在演算のサポートで結構悩んだなぁ。
割り算IPの場合、符号付A÷符号付B=符号付Qの演算の時とか、
Qの整数部のビット数=Aの整数部のビット数+1にしないと、Qの整数部がオーバーフローするんだよね。
例)
-65536÷(-1) = +65536
身もふたも無いので・・・
>>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なんてオプションがあるけど
設定次第ではアホみたいにコンパイル時間かかるよね
3日とかね
とりあえずメモリ増やせよ
マージン増やそうと思ってクロック制約を割増なんてやっていいですか
>322
リソース無駄に使うことになるけどそれでもよければ
多クロック入れる場合は各々入力に制約つけてるがまずいんか
このスレでvhdlは少数派か
俺もバイリンガルになろう
326 :
774ワット発電中さん:2014/11/29(土) 00:13:09.45 ID:eqsRZsDi
Verilogに対するSystemVerilogのようなものって、VHDLにはあるの?
VHDL-2008とか?
328 :
774ワット発電中さん:2014/11/30(日) 20:01:39.29 ID:2m6XlH6Z
呼ばれたような気がする
>>328 テクノマセマティカルでも買ったほうがいいよ。
エンジニアはほとんど残ってないみたいだけど。
331 :
774ワット発電中さん:2014/11/30(日) 21:56:50.32 ID:zx8WHH08
>>328 このスレで「これができる奴は30代でも年収1000万超えてるレベルだろ」って言われてるけど
500万の俺は一体・・・
IPオフロード処理関連では無く、トランスコーダーの方なんだねぇ
素直にOpenMPとかOpenCL使ったアルゴリズムに力入れた方がヨクネ?とか思ったら負けなんだろうな…
デバイスドライバの実装はハードウェア設計者とは別だと思うんだが…
334 :
774ワット発電中さん:2014/12/01(月) 00:48:10.80 ID:82dKVpIt
なんだかなぁ、IP集めて何か作ればそれで作ったような気になる、
こんな技術者が多すぎる。
何も自分の頭で基礎を考えようとしない?
それがものづくりなのか?
335 :
774ワット発電中さん:2014/12/01(月) 01:19:23.62 ID:nnM/3m1X
いまさら民主党
動けば勝ち
ライブラリをまったく持っていないだろうな。完成まで2,3年かかると見た。
デバドラはMS-DOS時代に書いた事はあるけどWindowsやLinuxでは書いたことないからパスだな
誰か応募しないのかよ。
2000万くらいふっかけてさ。
やだよぅ
あんたやりなよぉ
勉強中の身なのですが質問があります。
verilogでnビット加算回路を作成したく思っています。
調べたところ、+記号を用いて簡単に作成しているものがありました。
+記号を使わずに、全加算器を用いてnビット加算回路を作成する方法はありますか?
例えば3ビットの場合、全加算器を3つ(または半加算1つと全加算3つ)記述しなければならないのと思うのですが、こういったものをn個(指定した個数)にするといった方法はあるのでしょうか?
generate
演算子使わないで全加算器連結なんて、お勉強以外で実際に使う事は無いと思うけど
346 :
774ワット発電中さん:2015/01/06(火) 14:58:58.25 ID:VCO+erxy
>>344 verilogじゃないけどVHDLで全加算器を自動で並べる記述をして
作ったことがあるよ。
この場合、FPGAだとキャリーチェーンを使わなくなってしまい
ロジックの消費も増えてだめだった。
結局素直に+演算子で記述した方が、ロジックの消費を抑えられたよ。
perlとかrubyでスクリプト組めば?
初心者なんだけどビヘイビアレベルってなに?
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
357 :
774ワット発電中さん:2015/01/07(水) 11:02:38.27 ID:2VspyyQf
何が合成可能なのかいまいちわからん
wait系ならwait untilだけ、それも1processにつき一個まで
とか
断片的な知識しかない
合成不可なパターンをまとめたページとかありませんか?
うろ覚えだけど、XilinxのXSTはこんなのも合成してくれると資料に書かれていたような
誰得…
process begin
wait until rising_edge(CLK);
data <= '0';
wait until rising_edge(CLK);
data <= '1';
end process;
クロック信号と極性は全部同じでないと駄目で、さらにステート保持用にレジスタが生成されるはず
初心者ですが、教えて下さい。
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で割って」加算すればよいか....
と思っていましたが、それは違うと思いました。
いかがでしょうか
8で割るなら3ビット落とさないと駄目なのでは
>>361 FIRとIIRの違い。調べてみよう。
ちなみに、AD_goukei は、レジスタでなくていいのでは?
俺なら、最古引いて最新を足すで合計をだすな
>>363 8個前のデータを保持する方法が気になる
365 :
774ワット発電中さん:2015/01/23(金) 01:52:56.48 ID:7LyKAswa
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 うまく出ないというよりコンパイルできてないだろそもそも
クロックを200Hzで動かすんだ!
すみません、教えてください。
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
あなたもネットで告発しませんか?
ビッ苦カメラ札幌店 佐藤伸弦 暴行事件
401 :
774ワット発電中さん:2015/02/12(木) 23:19:50.05 ID:GlqxZMeS
HDLの類は、あと10年か20年くらいで、ソフトウェアプログラミング言語と融合すると思うのだが。
眺めていると、そうなってほしくないという感情があるっぽい。
もともとハード屋かな。
402 :
774ワット発電中さん:2015/02/12(木) 23:21:49.83 ID:GlqxZMeS
ソースを書いて、書き換え可能なメモリのようなものに記録する状態で、もう限りなくソフトに近い。
メモリにCPU解釈の命令列を出力するか、実行可能な回路を出力するか、その程度の違い。
>>402 僕もそう思う。
だから、人前で「FPGAのプログラム作ってる」と言っています。
マイコンのプログラムと何も違わないから。
しかし、Verilogに慣れると、久々にマイコンでCを書くとき、
Verilogには結構便利な機能があること気づきます。
一番感心するのは「 { } 」連接です。
bit単位で連結したり入れ替えたりできて、とてもありがたい。
Cでやろうとすると、シフトと&の連続ですよね。
どんなものを作ってるんだろう
ソフト屋だけどFPGAに初めて挑戦して
ソフトとハードは考え方から根本的に違うと思った。まる。
そもそも初期のコンピュータは配線を変えることによって
処理を変えていたんだから、それをプログラミングと呼ぶなら同等だろう。
C言語からそのままハードウェアってのはここ20年くらい言われているけど
ろくに実現できていない。言語の問題じゃなくて、
>>405 の感覚が正しいんだと思う。
ブロッキング代入とノンブロッキング代入、どっちが主流なんだろう。
どっちがどっちか知らないけど、<= が好き
ASICはまあなんとかなるかって記述しちゃうけど
FPGAの時は構造がアレだから記述はこうするか
って物理的な問題でブロッキング気にする事はあるが
主流とかは考えてはいないかなぁ
410 :
774ワット発電中さん:2015/02/14(土) 10:39:22.83 ID:O7h4p72O
>>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] };
というところでしょうか?
>>412 何という情報量の少なさ。
>>411 ハードウェアのすごいところは、ビット入れ替えはゲート数がゼロ。
414 :
774ワット発電中さん:2015/02/15(日) 03:22:45.40 ID:5N+tCfqq
>ハードウェアのすごいところは、ビット入れ替えはゲート数がゼロ。
そうとも限らない
verilogで書いた回路をFPGAに実装する場合にテストベンチに当たるものってある?
デジタルはすべてソフト
アナログもソフトだよ。
assign a = { N[0],N[1],N[2],N[3],N[4],N[5],N[6],N[7] };
って、VHDLでは、なんと書くのでしょうか?
というか、VHDLでも連接ってできるのでしょうか?
Cでのビットの入れ替えは16ビット程度ならテーブルで一発だけどね
VBAの文字列の連結みたいだな
教えてください。
Xilinxのスパルタン6をVerilogで書いていますが、回路がちょっと多くなるとスグに
「・・・・Dedicated route・・・・」というメッセージが出ます。
クロック信号を、いきなり外に出せるわけないじゃん とか
バンクをまたいでいるので、タイミングの保証はできませんよ。
だから上の呪文をucfに追加してね、という意味かと思います。
このwarningをでないように組むには、どのような点に注意すれば良いのでしょうか?
そもそも このメッセージがでる用では、まだまだプロとは言えない、ということでしょうか?
事実をそのまま書いてもらわないと余計にわけわからない
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 で組み合わせ回路作るとき。
センシティブリストを間違えてラッチができるとかもあるよね。