【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/ >>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を超えています。これ以上書き込みはできません。