X



トップページ電気・電子
1002コメント353KB

【Verilog】 記述言語で論理設計Project13 【VHDL】

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001774ワット発電中さん
垢版 |
2014/03/06(木) 16:37:02.77ID:sOpHVFq3
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/
0851774ワット発電中さん
垢版 |
2016/10/11(火) 12:11:14.96ID:rkzrhgEy
なんで非同期リセットをいれるかというとRTLがきれいになる。非同期リセットを
入れないと、プリミティブのクロックイネーブルを使わない回路になりやすい。
ある寺の場合だけど。
しかたないので非同期リセットを入れてる。W
0852774ワット発電中さん
垢版 |
2016/10/11(火) 12:33:52.34ID:rkzrhgEy
>わいは逆やな。if分岐では必ずbegin endで括る。

いろいろ試してみたがbegin endは煮ても焼いても食えない。
悪いことはいわん、とにかく削除すべし。
0853774ワット発電中さん
垢版 |
2016/10/11(火) 12:40:29.15ID:uySzsvl5
>>849
>  if(reset)
>    srff<=0;

もう1行増えたらどうするの? begin end 使うのですよね?

  if(reset)
    srff<=0;
    dff<=1;
0854774ワット発電中さん
垢版 |
2016/10/11(火) 14:05:11.72ID:rkzrhgEy
  if(reset)
    {srff,dff}<= {0,1};


上の奴もこういう書き方が望ましい。
 if(x==A)
   {enable, data} <= {1, hoge};
0855774ワット発電中さん
垢版 |
2016/10/11(火) 14:13:45.21ID:rkzrhgEy
>もう1行増えたらどうするの? begin end 使うのですよね?

300ページある教科書をみたが、一か所も必要ないな。

それから
独自cpu開発って本400ページあるのをみたがパイプライン処理のところ
1箇所くらいやな。
あとはbegin end 削ったらずいぶん簡単なソースコードになる。
コードが激減する。
0856774ワット発電中さん
垢版 |
2016/10/11(火) 14:45:05.76ID:rkzrhgEy
だから複雑な組み合わせが発生する可能性はもちろんある。その場合はfunction
で書く。
しかし普通の制御はbegin endなんて必要ない。必要な時は下手な回路やと考えて
間違いない。

教科書に一か所もないというのは嘘で、必要なところは一か所もないということ。
例えばシリパラ変換
reg [7:0] ps;
begin
ps <= ps <<1;
ps[0] <= si;
end
こんな風に教科書にはかいてあるが,こんな書き方はまずい。

正しくは
ps <= {ps[6:0] << 1, si};

こうすると意味がはっきりする。
0857774ワット発電中さん
垢版 |
2016/10/11(火) 14:47:35.71ID:rkzrhgEy
もっと分かり易くかくとすると
{ps[7:1],ps[0]} <= {ps[6:0] << 1, si};
0858774ワット発電中さん
垢版 |
2016/10/11(火) 14:55:13.78ID:03S+S6sS
>    {srff,dff}<= {0,1};
こういうの見ただけで儂の頭がバグりそうになる。
0859774ワット発電中さん
垢版 |
2016/10/11(火) 15:18:54.51ID:rkzrhgEy
>858
慣れよ。
ただし、その場合にはbit幅を指定しないとエラーになる。
正しくは

{srff, dff} <= {1'd0, 1'd1};

ちょっと見づらいな。

{srff, dff} <= {low, high};

これなら見やすいが,,,,
0861774ワット発電中さん
垢版 |
2016/10/11(火) 15:37:36.54ID:rkzrhgEy
俺もまだ慣れてないからな。W
0864774ワット発電中さん
垢版 |
2016/10/11(火) 16:10:19.48ID:03S+S6sS
pythonぽいという意味では今風。
そういう書き方にカブレて言語批判を繰り広げるも、
実力が伴わずバグを続出。
0866774ワット発電中さん
垢版 |
2016/10/11(火) 18:01:09.86ID:uySzsvl5
カッコ内に○×をつけてください
( ) begin end を使わないほうが、コンパイル時間が速い
( ) begin end を使う  ほうが、コンパイル時間が速い
( ) begin end を使っても使わなくても、コンパイル時間は変わらない

( ) begin end を使わないほうが、FFの使用量が少ない
( ) begin end を使う  ほうが、FFの使用量が少ない
( ) begin end を使っても使わなくても、FFの使用量は変わらない
0868774ワット発電中さん
垢版 |
2016/10/11(火) 19:10:50.51ID:rkzrhgEy
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 };

このほうが昔も今もセンスは上だな
0869774ワット発電中さん
垢版 |
2016/10/11(火) 20:35:41.71ID:03S+S6sS
× ps <= { ps[6:0] << 1, si };
○ ps <= { ps[6:0], si };
0870774ワット発電中さん
垢版 |
2016/10/11(火) 22:16:06.01ID:l9D3Os+V
・マイクロ波の危険性 法の外にいる御用学者達
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
このギャップに気付かなければならない
誘導放出され、増幅されたマイクロ波を計測するのではなく、メーザーの出力の表示の数字が強さの目安
だから、動画のインタビューに出てくる人達は、「弱い」とか「小さい」という単語を使っていると思われ
0871774ワット発電中さん
垢版 |
2016/10/11(火) 23:12:53.94ID:uySzsvl5
 assign decode = !ena ? 4'b0000 :
       sel == 0 ? 4'b0001 :
       sel == 1 ? 4'b0010 :
       sel == 2 ? 4'b0100 :
       sel == 3 ? 4'b1000 :
バスのアドレスデコーダで、こんな書き方していました
0872774ワット発電中さん
垢版 |
2016/10/11(火) 23:39:53.72ID:DM05OVZL
>>849
紙を節約したいならalwaysもifも改行せずに1行にしたほうがいいんじゃないの?
0874774ワット発電中さん
垢版 |
2016/10/12(水) 01:23:35.50ID:KzFQnxH+
>○ ps <= { ps[6:0], si };

そうか。こうだ!!!
めっちゃ美しい。

ps <= ps <<1;
こんな書き方では最下位ビットはどうなるのかわからん。
<<の演算子はいらないな。どう考えても使い道がない。ゴミ決定。

ifのbegin end,<<,>> 使用禁止
0875774ワット発電中さん
垢版 |
2016/10/12(水) 01:24:05.70ID:KzFQnxH+
>紙を節約したいなら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を意識した書き方だな。
0876774ワット発電中さん
垢版 |
2016/10/12(水) 06:08:52.13ID:APrV9kJg
>>874
> ps <= ps <<1;
> こんな書き方では最下位ビットはどうなるのかわからん。

シフトした残りには0が入るって決められてるから、
分からん訳じゃ無いと思うけど。
0877774ワット発電中さん
垢版 |
2016/10/12(水) 06:10:37.09ID:C5En5uqG
おまえら、VHDL使え。Verilogの緩い文法議論が、くそうぜえ。使ってないから、そういう議論が頭悪いことに気づかないのか
0879774ワット発電中さん
垢版 |
2016/10/12(水) 06:36:12.10ID:Z8kt2vjy
>>876
なんか、色々分かってない感じだよね。
ハードもソフトも。

「僕の考えた最強の書き方」
0880774ワット発電中さん
垢版 |
2016/10/12(水) 07:04:43.82ID:C5En5uqG
>>879
ニッポンから技術者が消えて、馬鹿な豚どもになりつつあるんだよ。だから仕方が無い。
0881774ワット発電中さん
垢版 |
2016/10/12(水) 07:08:13.45ID:C5En5uqG
>>874
ps[7:0] <= { ps[6:0], si };
ps(7 downto 0) <= (ps(6 downto 0) & si );

じゃないとだめ。

ああ、VHDLしばらく触らせてもらえないから忘れてきた。

つうか、大手半導体レイアウト会社でも、VHDLをどうして使うかってわかんないんだな。しっかり、符号演算のためって書いてあげたのに。

ニッポンやバイヨ。
0882774ワット発電中さん
垢版 |
2016/10/12(水) 07:26:02.86ID:GrfPE86B
>しばらく触らせてもらえない
やはりVHDLは廃れますか。
verilogとVHDLの中間ぐらいでいいんだが、
System-verilogに向かうのかねえ。
0883774ワット発電中さん
垢版 |
2016/10/12(水) 07:35:05.20ID:C5En5uqG
>>882
業種による。

アセンブラは廃れるけど、スーパーマリオの重力計算の微分方程式はすごいよ。

最近、オブジェクト指向の「ハードわかんね」というソフトウエアの技術者が、FPGAあたりをかじってマンセーとか、
ニコニコ本社で、「どうだオレサマすごいだろ」とかいうプレゼンをみせられたりして、つまんないというか、めんどくさい。

ぐらいに、廃れはしないと思うよ。
廃れていると思ったら、目線が狭いんだよ
0884774ワット発電中さん
垢版 |
2016/10/12(水) 08:02:12.04ID:KzFQnxH+
>シフトした残りには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;
0885774ワット発電中さん
垢版 |
2016/10/12(水) 08:04:13.54ID:KzFQnxH+
>おまえら、VHDL使え。Verilogの緩い文法議論が、くそうぜえ。使ってないから、そういう議論が頭悪いことに気づかないのか

VHDLはverilogよりもっと糞だということに早く気が付けよ。W
0886774ワット発電中さん
垢版 |
2016/10/12(水) 08:25:37.39ID:GrfPE86B
>>884
orではない。
最後の代入のみが有効。

>意味が不明というか、好きじゃない。
それは同意。
二回以上代入するような書き方はコンパイラは認めても
真面目なレビューなら落とされる。
0887774ワット発電中さん
垢版 |
2016/10/12(水) 08:51:34.42ID:MInAQ2CY
psはffの出力
ps<<1はpsを入力とする組み合わせ回路の出力
<<1がpsのffそのものをシフトするように勘違いしてるように見える
0888774ワット発電中さん
垢版 |
2016/10/12(水) 09:21:58.82ID:H6KHsZ+P
国防省がソフトはAda,ハードはVHDLとして無理強いした。
Adaが糞で、糞から生まれたVHDLは糞の子。
0889774ワット発電中さん
垢版 |
2016/10/12(水) 11:18:39.63ID:+FcNU1ya
ps[0] <= a;
ps[0] <= b;
ps[0] <= c;
これって、エラーで通らないんじゃないですか?
ps[0]俺はどうすりゃいいんだ? となる。

Verilogの柔軟な書き方は歓迎
でも、もう少し厳しい文法チェックが欲しい。
徹夜でもうろうとしているとデバッグが進まないから。
0890774ワット発電中さん
垢版 |
2016/10/12(水) 12:45:24.04ID:KzFQnxH+
>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重定義でしか入力をセットできない。
0891774ワット発電中さん
垢版 |
2016/10/12(水) 12:46:10.16ID:KzFQnxH+
>これって、エラーで通らないんじゃないですか?

通るんじゃね。それなんとなく見たことあるから。
orじゃないかもしれないが、、、、

もしエラーになるんならひょっとするとディフォールトかな?
count <= 99;
if(a == 3)
count <= count + 1;

これはa != 3の時はcount=99になるだろ。

ps[0].d = 0;じゃなくて
ps[0].d = 未定;
ps[0] <= si; で未定が確定なのかもしれない。
0892774ワット発電中さん
垢版 |
2016/10/12(水) 14:21:30.74ID:cg1IM12S
久しぶりに設計やらないといけなくなったんだけど
昔Model Simってテストベンチかかなくても、GUIで波形成形出来なかったっけ?
0893名無しさん
垢版 |
2016/10/12(水) 15:04:12.25ID:/kKoBx9M
if (test&mode[3:0]==4'b0010)
のコードを見て、verilog死ねと思った
0894774ワット発電中さん
垢版 |
2016/10/12(水) 18:03:22.04ID:qYGEQeZr
ちょくちょく教科書という単語が出てくるけど何の本を指してるの?
0896arisa ◆QaHT6HayjI
垢版 |
2016/10/12(水) 18:12:14.69ID:NOMuf+ZS
verilogで$signed使うと、バグが出て。
VHDLでuse IEEE.std_logic_unsigned.all すると止まるのは、
何とかならないものでしょうか。
0897arisa ◆QaHT6HayjI
垢版 |
2016/10/12(水) 18:13:47.06ID:C5En5uqG
間違った・・・・

verilogで$signed使うと、バグが出て。
VHDLでuse IEEE.std_logic_signed.all すると止まるのは、
何とかならないものでしょうか。
0898774ワット発電中さん
垢版 |
2016/10/12(水) 18:57:27.39ID:6xhXCb4o
ps<<1を利用してpsを左シフトしつつps[0]にsiを代入したいから
always文の中でシーケンシャルな代入文を記述してるってことか

話を勘違いしてた
0899774ワット発電中さん
垢版 |
2016/10/12(水) 20:19:21.64ID:y9GS8u9k
>>897
何書いたか知らんけどverilogの仕様じゃないの?
過去スレで$signedでさわいでたときがあるよ
0900arisa ◆QaHT6HayjI
垢版 |
2016/10/13(木) 05:35:53.77ID:dZW5rAGi
>>899
VHDLでつくったのを戻してビット幅あわせてもおこるんよ。
VHDLで組むと起きないので、verilogの深くて単純な話にはまりそう。なので仕事では諦めた。
これ以上追うのは趣味の世界だし。

全てVHDLで組む信号処理の分野も理解できるし、verilog万歳な気持ちもよくわかる。
verilogがVHDLのように厳密な言語仕様にする別モードがあったら、VHDLいらない。
負の演算があるFIRフィルターを、verilogで組んでくださいとか言われたら切れるね。
できなくはないけど10倍デバックがかかる。
そこがデバック終わって数値演算ライブラリがverilogでできればいいけど、外部コンポーネント参照山のようにして、誰が見ても理解不能コードになることうけあい
面倒くさいから最初からVHDLでかいたほうがいいいやん。

テストベンチは、verilogの方が便利ね。
特にバス調停の決まり切った物。task文とか

verilogが曖昧過ぎて、その曖昧な部分を埋めたシミュレータとか論理合成ツールは偉いと思う。でも、デバックはVHDLじゃないと出来なさそうw
0901774ワット発電中さん
垢版 |
2016/10/13(木) 11:26:42.15ID:i7+FYgaz
>>900
興味あるなー。でも勘違いしてるんじゃない?
曖昧っていったってビット幅は正確に決められるしどんなところが問題なのか、具体的
な例はないの?
「1−1が0にならよ」とか、まさか負のキャリが立たないとかW
verilogで負の演算ができないなんてことはないだろ。W

FIRって知らんが、x/+-が素直に動けばもんだいなくできると思うが、、、W
0902774ワット発電中さん
垢版 |
2016/10/13(木) 12:01:44.40ID:1PGgeP2M
>>900
>負の演算があるFIRフィルターを、verilogで組んでくださいとか言われたら切れるね。
なんでですか?
0903774ワット発電中さん
垢版 |
2016/10/13(木) 12:15:39.05ID:sPFxRlgf
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を使いこなせたらもっと楽になるんだろうけど
我ながら低レベルな記述をしてる。
0904774ワット発電中さん
垢版 |
2016/10/13(木) 12:47:23.77ID:i7+FYgaz
signedだからって関係ないだろ。 でも俺もfloat以外では使うことないな。
0906774ワット発電中さん
垢版 |
2016/10/13(木) 21:53:37.92ID:HgzOp4vD
論理回路設計の勉強をしてるのですが、プロの人達はまず最初にブロック図的なものを書くところから始めるのでしょうか
それとも構想を頭で描きながら記述していくのでしょうか

ブロック図などを書く場合はどういったツールを使用していますか
0909774ワット発電中さん
垢版 |
2016/10/13(木) 22:47:21.08ID:64+HsgyJ
紙とシャーペン
ブロック図を書いたら回路図を書いて
フリップフロップをalways、AND,ORはassignにする。
0910774ワット発電中さん
垢版 |
2016/10/13(木) 23:59:52.10ID:i7+FYgaz
基本設計をしてデバイス選定をする。
Libreoffice Writer を立ち上げてタイトルを書く。日付を入れる。
次に概要を書く
解決すべき問題がないかをリストアップする。
IPなど必要資料をリストアップする。
全体構成を箇条書きする。
タイトル名でプロジェクトディレクトリを作成する。
その下に
ドキュメントディレクトリ
VerilogTopディレクトリを作る。さらにその下にサブプロジェクトのディレクトリ
ツリーを作成する。
あとは漫画を描きながら各モジュールを作成してテストベンチを作成してテストする。
漫画はジェットストリームでノートに書く。完成した漫画はスマフォで撮影して
Evernoteでクラウドに挙げて、Libreofficeのドキュメントに貼り付けていく。
テストベンチのWaveデータもsnippingツールで画像コピーをしてドキュメントに
貼り付けていく。
というようなやり方だな。
0911774ワット発電中さん
垢版 |
2016/10/14(金) 02:40:41.01ID:U+MZJOfy
ジェットストリームって、書きやすいですよね
0912arisa ◆QaHT6HayjI
垢版 |
2016/10/14(金) 05:38:50.68ID:M5fLLkZA
Excelとかパワポとか言い出したら、目立・ル○サス系なのでそいつには気をつけろ!自分のやった領域以外の仕事はできない!
Wordでも書くよといいだしたら、信用できるかもw
Visioが使いやすいんじゃないかなあ。Word/Excel/パワポと描画エンジンはもう同じだけどw
要は、就職先によるだろ。

個人の場合は、描かない。めんどくさいし。

ブロック図で描かないと、設計できない人と。描いてしまうと、設計できなくなる人と。分かれる。

ASIC時代の人は、前者が多い。最近の人は、後者。

でも、両方体験して、どっちもできる賢者になるのをおすすめします。


>>910
在宅Webプログラマっぽい。かっこいい。w

余談というか、愚痴。
この仕事になった10年前あたりから、テストベンチの波形データを貼り付けたままで。満足。
「この信号のこの部分が、xx[ns]になっているから、仕様と一致することを確認した」
と書く意識のない奴ってなんなの。なぜかベテランに多い。
そういう人のverilogは、たいてい怪しくて、はまることが多い。

>>911
わし、ユニボール シグノ 0.5mm
ブロック図で、微妙な濃淡。微妙な太い細いが表現できて、毛筆のようなそのときの気持ちが表現できて気に入ってる。

ジェットストリームは、車の中とかの過酷な環境で使っている、あれいいよね。でもすぐになくす。

そういえば、最近、論理記号の定規をみないな、何処にしまったんだろ・・・
0914774ワット発電中さん
垢版 |
2016/10/14(金) 07:46:30.37ID:M87vCzzy
>>906ですが、みなさんありがとうございました
結局は人それぞれってことみたいですがいろいろと参考になりました
とりあえずジェットストリームが欲しくなりましたw
0915774ワット発電中さん
垢版 |
2016/10/14(金) 12:41:12.51ID:D7c3gZma
遠い地平線が消えて、深々とした夜の闇に心を休めるとき…
0918774ワット発電中さん
垢版 |
2016/10/14(金) 17:07:25.67ID:8geS1lyO
>>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;
0919774ワット発電中さん
垢版 |
2016/10/14(金) 17:08:41.13ID:8geS1lyO
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
0920774ワット発電中さん
垢版 |
2016/10/14(金) 17:09:02.30ID:8geS1lyO
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
0921774ワット発電中さん
垢版 |
2016/10/14(金) 18:01:19.25ID:TNvPoqxe
簡単でも仕様を書く(目標を定める)
○ i2cマスタっぽい何かを作りたい
○ clkは何MHz SCLはその1/50
○ SCL↓とSDAの位相をずらさない
○ SCLもSDAもデフォルトLで構わない
○ スレーブアドレスは渡さない
○ r/wも渡さない
○ アクノリッジも見ない
○ データの8bitだけ渡す
○ シングルスレーブ、書き込みのみ
○ SDAはオープンドレインにしない

文法的にはアレだな。かわいそうだけど
begin~else否定派が生まれちゃったな。
resetは負論理ならxでもnでもpreでもsufでも付けましょう。
0922774ワット発電中さん
垢版 |
2016/10/14(金) 18:09:06.55ID:eJCe6+VN
なかなか筋がいい。綺麗だね。
しかし921がいうように仕様をきめること。
それからステートマシンでプロトコルを書くのが先だな。

スタート待ち
アドレス検出、もし不一致ならストップへ
アック検出
、、、、、、
ストップ
みたいな感じでステートマシンを書く
0923774ワット発電中さん
垢版 |
2016/10/14(金) 19:03:34.03ID:M87vCzzy
>>921>>922
ありがとうございます
いろいろと至らない点がありすみません
指摘頂いたこと以後注意します

今はまだ考え方がふわふわしてて記述に自信が持てません
一応シミュレーションだけはかけていますが。。

begin〜endは自分も全部付けて複数行かくスタイルでやってましたが、ここ最近のスレのやりとりでちょっと見直してみました

考え方が問題なければ、スタート/ストップコンディション、ACK含めステートマシン的な考え方で出来ればと思ってます
0924arisa ◆QaHT6HayjI
垢版 |
2016/10/14(金) 19:13:10.80ID:0y15DUWZ
うーん、opencore.orgのI2C masterを登録してダウンしてみるといいと思う。
今見たらメンテナンス中ってでるけど。
0925774ワット発電中さん
垢版 |
2016/10/14(金) 21:13:05.87ID:M87vCzzy
>>924
ありがとうございます
調べてみます

I2C自体が別に目的ではないんですが、今はいろんな手法を学べればと思ってるのでいろいろ指摘して頂けるとありがたいです
0927774ワット発電中さん
垢版 |
2016/10/14(金) 21:29:27.23ID:TNvPoqxe
次のような記法は好きでない。(cnt_adrが0の時とかね)
rom_sda[cnt_addr - 1]

scl/sdaを組み合わせ回路で組んでいるが、
外部とやり取りする部分は基本FFにする。
0929774ワット発電中さん
垢版 |
2016/10/14(金) 21:38:31.90ID:TNvPoqxe
そういえば、alteraだったかのライブラリで
reg <= 1'bz
という記述があって驚いた。
実際に(FPGAで)合成可能で二度驚いた。
0930774ワット発電中さん
垢版 |
2016/10/14(金) 22:27:22.24ID:M87vCzzy
>>926
すみません
最終的にはトライステート出力にするつもりです

>>927
そうですよね。。
scl_o/scl_oのほうはそのつもりでやってみたのですが、cnt_addrの立ち上がりから1クロックずれるのでどうしたらいいのかと。。根本的な見直しが必要ですかね
0932arisa ◆QaHT6HayjI
垢版 |
2016/10/15(土) 02:28:48.45ID:RFC1SU7U
>>929
FPGAでもASICでも、CMOS FET のゲート電圧を、ドレインーソース間が貫通しないようにすれば、ハイインピーダンスになるんだから、
何で驚くのかそっちの方が疑問。
0933774ワット発電中さん
垢版 |
2016/10/15(土) 07:44:10.02ID:RV4MTfqG
そりゃFFにzを保持できる訳がないという先入観があったからな。
代入される信号もI/Oに繋がっていないと駄目だし、
合成結果も1/0を保持するFFと、open/driveを制御するFFの二つが
出力される。ASICしかしてない時は想像もしてなかった。
0934774ワット発電中さん
垢版 |
2016/10/15(土) 10:35:18.28ID:HFltrKTw
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の肝だから、、、
0935774ワット発電中さん
垢版 |
2016/10/15(土) 11:13:17.23ID:T0D5lwKY
>>932, 933
コンパイラで1か0に置き換えられているんじゃないの?もしくはORで合成されるとか。
本当にHi-Zにできたらタイミング解析が無駄に複雑になるだけでメリットないような気がする。
0939774ワット発電中さん
垢版 |
2016/10/16(日) 00:11:12.50ID:p8eBhC7/
reg [7:0] decode[7:0]
= '{
8'b00000001,
8'b00000010,
8'b00000100,
8'b00001000,
8'b00010000,
8'b00100000,
8'b01000000,
8'b10000000
};
こういうのもできるから美しいデコーダができそうと喜んだが、できるのはSystemVerilog
だけのようだね。
これだけのためにコンパイラをSystemVerilogにすると何か問題あるだろうか?
0941774ワット発電中さん
垢版 |
2016/10/16(日) 01:44:31.79ID:MpNji2nG
reg [7:0] decode[7:0]
ではなくて
reg [7:0] decode[0:7]じゃなかったっけ?
0942774ワット発電中さん
垢版 |
2016/10/16(日) 07:55:03.04ID:p8eBhC7/
文法的にはどっちでもいいと思うよ。アクセスの順番が違うだけ。
上の例だと decode[0] が128,decode[7]が1
上を0にする方がわかりやすいから[0:7]が一般的なんだろう。
ってこっちのつもりだった。W
0944774ワット発電中さん
垢版 |
2016/10/16(日) 08:33:29.38ID:GC2K+fku
>>939
なんでこんなverilogでできるやんググレカスレベルなことを恥ずかしくもなく聞いてくるんだよ
0949774ワット発電中さん
垢版 |
2016/10/16(日) 15:16:43.76ID:p8eBhC7/
>943
Prime
記述はまともだとおもうがな。コンパイラが通るから。テストはそのうち
してみるが、今2chで忙しい。
0951774ワット発電中さん
垢版 |
2016/10/17(月) 23:05:58.78ID:O4bfrZzA
カウンターやらシフトレジスタやらロムやら教科書に出てくるようなもん一通り出来たら、何作ればいいかな
会社に入ったら練習させられる課題とかありますか?
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況