Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PICを作ろう、Lintチェック (6)

コンパレータモジュールのチェックは一通り終了したので、Lintチェックを念のためかけている。大きな問題はないが、時間と手間のかかる作業ではある。

ところで、PICのVerilogモデル(一応論理合成可)って、だれか欲しいひといますかね?
----
本日の御託
「いや~、俺はいやだったんだけど、加藤さんがどうしてもって言うから…」とか男らしくない言い訳しながらカラオケへ行き、帰宅が遅くなって家内をごまかすが、喉は痛い…

スポンサーサイト

PICを作ろう、コンパレータモジュール、デバッグ中

相変わらずコンパレータモジュールのデバッグをしている。CMCONのCMフィールドによる入力のマルチプレクサのモードが面倒くさい。思ったとおり、バグってるのを直して、とりあえず、CMCON.CM= b'010'まで終了。あと少し。Lintチェックもしなければ・・・
----
本日の御託
今日、ちょっと(ホントはかなり)職場で凹む事があった。泣いちゃおうかな…



PICを作ろう、コンパレータもジュールのテスト

コンパレータモジュールの残りのテストだが、動作モードによって、合計4系統の入出力を面倒見なければならない。
モードごとに、トップモジュールをちょっとずつ変更すればよいのだが、どうも面倒くさくて手がつかなかったのだが、コンパレータそのものは既にテストをしているので、細かなアナログ値を与えなくてくてもよいだろうということで、ハイ・インピーダンス、5v,0vと変化させてやればいいだろうということで、簡単なモジュールを作った。これでディジタル出力を擬似アナログ系の入力に接続できる。実際の回路をシミュレーションするときにも役に立つだろう。ポイントは、ifの条件式の===。RTLを書くときは普通使いませんが、これで、値がZかどうかを判断できます。実際の回路では、ハイインピーダンスかどうかを知るのはメンドウですけど、シミュレーションならではです。3ステートバスでハイインピーダンスになっているか否かをチェックする必要がありますので、必須ですね。
Spiceなどのアナログ・シミュレータなら、簡単なのだが、しょせんVerilogでアナログ量を扱おうとするところにムリがあるのは承知の上です(哂ってやってください)。
----
本日の御託
報道によれば、日立がパソコンの製造から撤退するそうだ。
最近,HPのOEMとかもはじめてたので,やばいなーって感じでしたが・・・
「ベーシックマスター」は日本発の「パソコン」だったのですが,伊藤美咲をつかっても,フローラはだめでしたねェ.
ベーシックマスターにはお世話になりましたよ。
-初代。
-ほぼ同じでBasicが実数型になったレベル2。
-初代のROMをレベル2とほぼ同等にしたものと交換したもの。
と使いましたね。カセットテープのインターフェースがついていたのだけれど、Basicのソースをテキストイメージでセーブ(しかも300ボーとかだった思う)するのでめちゃ遅いうえ、ロードの時は、ソースコードが大きくなると、1行分読み込んで、次の入力を受け付けることができる様になる前に、テープからは次の行のデータが来てしまいロードエラーになるしまつ。仕方ないので、「ピー、ヒョロヒョロ」の音を聴きながら、テープレコーダーのポーズボタンを押して、行の切れ目と思われる部分で、1~2秒くらい止めたりしてましたね(笑)。
レベル2は、リレーがついていてテープを止めることが自動でできました(大進歩!)。初代も、PCBにはリレー用のパターンがありましたが、実装されていませんでした。
もっとも、そのうち友人が、中間言語のバイナリのままテープに落とす方法を、秋葉のラジ館にあった日立のショールーム(「マイコンスペース」だっけ?)の兄ちゃんから教わってきて、その後はもっぱらその方法でしたが・・・

(あらら、インデントがぼろぼろ、後で直します)
module isolater(
    output reg `ANALOG a_o ,
    input d_i
) ;
    always@ * begin
 if( d_i === 1'bz ) begin
     a_o = {64{1'bz}} ;
 end // if
 else if ( d_i == 1'b1 ) begin
     a_o = $realtobits( 5.0 ) ;
 end // else if
 else begin
     a_o = $realtobits( 0.0 ) ;
 end // else
    end // always

endmodule // isolater



PICを作ろう、コンパレータ・モジュール

コンパレータモジュールのデバッグだが、コンパレータの動作を確認するためには、2つのアナログの電圧が必要だ。vrefモジュールもこの目的に使えないわけではないが、1つしかないので、D/Aコンバータをビヘイビアモデルで作った。実機にするつもりがなければ、こんなに簡単である(笑)。これを2つインスタンスして、入力はPORTB0-3,PORTB4-7へ接続。出力は、AN0とAN3へ接続する。
で、CMCONのCMフィールドが'b100の場合を確認。C1INVフィールドの設定で、反転も確認する。
さて、残りをどうするかな・・・
----
本日の御託
昼飯のあと、家内と近所を散歩する。旧東海道が近くにあるので、これに沿って少し歩く。途中、銘菓の最中を売っている和菓子屋で、最中と饅頭を一個づつ買って帰宅。約1時間ほどだったが、少し汗をかいた。最中と饅頭はおやつにおいしくいただく。帰ってから、栗蒸し羊羹にすればよかったと思うがあとの祭り。次回はそうしよう・・・

module dac(
    output `ANALOG a_o ,
    input [3:0] d_i
) ;
    real real_val ;

    always@ * begin
 real_val = d_i/15.0 * 5.0 ;
    end // always
    assign a_o = $realtobits( real_val ) ;
endmodule // dac



PICをつくろう、vrefモジュール

コンパレータはちょっとおいておいて、先にvrefモジュールのテストを行った。vrefモジュールは、D/Aコンバータと考えることもできる。そこで、鋸歯状波を発生してみた。昨日のアナログプローブのモジュールも併せて使う。
ちゃんとしたチェックには、これをA/D変換してとかだが、実際にアナログ回路ではないわけだから、そこまでやる意味があるかは微妙。第一面倒くさいので、とりあえず、これでチェックはよしとする。

Vrefモジュールの出力
----
本日の御託
某商社と某官庁の元次官の過去の不適切な関係が連日不適切なマスコミをにぎわせている。商社にとって、飛行機は「オイシイ」商材らしく、航空機部門の社員は普通のサラリーマンには理解不能なところがあるようだ(私は、商社務めの経験もある)。まあ、役人や政治家相手では単に理解不能ですまされないわけで、ロッキード事件の教訓みたいなものはまるでないということか。
でも、某商社のお家騒動や、元次官の娘まで接待を受けてた疑惑もあり、野次馬的には面白いことこのうえない。



Verilogでアナログ量を扱う (9)

Verilog自体は、ディジタルシミュレーションの環境だから、直接はアナログ量を扱うことはできない。もっともVerilog-Aなんてのもあるのだが、私は使ったことはないし、だいたいシロウトが使えるような環境もないはずである。論理合成はできないにしろ、いわゆるビヘイビアモデルでは、実数(real)型を使うことができるので、これを使えばとりあえず、アナログ量を扱うまねごとはできる。
ただし、Verilogのreal型は、regとほぼ同様で、wireに相当する機能がない。言い換えれば、alwaysやinitialブロックの中でしか左辺式にはつかえないのである。ということは、moduleの入力ポートや双方向ポートにはこのままでは使えない。で、どうするかというと、realは、Verilogの内部表現として、64ビットのregと同様になる(追記)ので、64ビットwireを介してモジュール間ではやりとりをする。スマートではないが、しかたない。このための変換用のシステム関数があって、64ビットのwire→realには、$bitstoreal,real→64ビットwireには、$realtobitsをそれぞれ使う。
たとえば、

 input [63:0] aaa ;
   :
   :
 real real_val;

   always@ * begin
       real_val = $bitstoreal( aaa) ;
   end // alaways

のように使う。直接代入するのは、多ビットのwireは暗黙的に、(符号なし)整数と解釈され、それがさらにreal型に変換されてしまうので、ダメだ。$bitstorealや$realtobitsは、実際にはこのような変換を回避する、castのようなものだとも考えられる。
今回のPICのVerilogモデルの中では、
`define ANALOG [63:0]
と定義して用いている。
ちなみに、Verilogでの整数型(integer)も同様の扱いで、モジュールポートにする。こちらは、内部的には32ビットregと同様である。
(追記、たっくさんから、指摘があったように、正確ではないところがあったので、追記しました。2007/10/20)

と、ここまでは、Verilogの話で、ここからは、Veritak(というか、Veritakの波形ビューア)の話。real型で宣言したものも、64bitのwireも波形ビューア上では、[63:0}となるが、値の表示が異なる。realはあくまでreal型での表現になり、64ビットwireは64ビットのビット列として扱われるようである。これはこれで、妥当な仕様と思うが、上記のようにreal型をモジュール・ポートを通じて伝播させるときは、ちょっと不便だ。そこで、プローブ用のモジュールを作った。radixとして、realをサポートしてくれればよいのだが・・・
----
本日の御託
赤福が、拙いことになっている。家内は子供のころ伊勢に住んでいたことがあって、
「こうなったら、へんば餅に頑張ってもらうしかないな」とことである。でも、どこで売ってんだ?

     1  `include "analog.h"
     2  //
     3  //  This is purely behavior module to view analog value
     4  // (c) 2007 BakaOyaji
     5  module analog_probe(
     6      input `ANALOG in
     7  ) ;
     8      parameter mag = 1000.0 ;
     9      real    real_val ;
    10  //    integer int_val ;
    11 
    12      always@ * begin
    13          real_val = $bitstoreal(in) ;
    14      end // always
    15  endmodule // analog_probe
    16  // EOF analog_probe.v



PICを作ろう、CCPのデバッグ

今日はCCP(キャプチャ、コンペア、パルス・ワイズ・モジュレータ)のデバッグをやった。TIMER1、TIMER2モジュールとも絡むので面倒くさいことこの上ない。
PWMは、本当のPIC16F648Aでは、Toscがレゾリューションになるのだが、今回は、クロックを4分の1にして単相にしているため、どうしても非互換部分が出てきてしまう。具体的には、timer2のプリスケーラを1:1に設定できないのだ。まあ、クロックを4倍の速度にすることで、ごまかすしかない。
残っているコンパレータ関係だが、そのまえに、Veritakのアナログ表示の機能をちっと勉強せねば。
----
本日の御託
ハワイ旅行の写真をDVDにするのに、PowerProducer(DVD-Rドライブのおまけ)をインストールしたが、スプラッシュで出てくる白人の女の人の目が緑なのは、毎回ちょっとぎょっとする。

PICを作ろう、Timer2のデバッグ

Timer2モジュールのデバッグが終了。やっぱり、プリスケーラではまる(笑)。テキトーに直したが、CCPモジュールでも使われているはずで、あとで再度見直しが必要かも。
次はCCPモジュールのデバッグ。
----
本日の御託。
24シーズン5(6ではない)を見た。本編はともかく、「シーズン6」、「プリズンブレーク2」のCMは笑かしてくれる。

PICを作ろう、Timer1デバッグ

文字数制限に引っかかってしまったので、後半部分を分けました。

    68      // FSM in distination side
    69      always@( posedge dst_clk_i) begin
    70          if( dst_por_i ) begin
    71              s2d <= 2'b0 ;
    72              dst_fsm <= DST_IDLE ;
    73          end // if
    74          else begin
    75              s2d <= { s2d[0], a_s2d } ;
    76              (* parallel_case *)
    77              casex( dst_fsm )
    78                  DST_IDLE : begin
    79                      if( s_s2d ) begin
    80                          dst_fsm <= DST_WAITFOR_READY ; // start fsm
    81                      end
    82                      // else stay
    83                  end
    84                  DST_WAITFOR_READY : begin
    85                      if( dst_ready_i ) begin
    86                          dst_fsm <= DST_WAITFOR0 ;
    87                      end
    88                      // else stay
    89                  end
    90                  DST_WAITFOR0 : begin
    91                      if( ~s_s2d ) begin
    92                          dst_fsm <= DST_IDLE ;
    93                      end
    94                      // else stay
    95                  end
    96                  default :
    97                      dst_fsm <= DST_IDLE ;
    98              endcase
    99          end // else
   100      end // always
   101      assign a_d2s = (dst_fsm == DST_WAITFOR0 ) ? 1'b1 : 1'b0 ;
   102      assign dst_we_o = (dst_fsm == DST_WAITFOR_READY) ? dst_ready_i : 1'b0 ;
   103      assign s_s2d = s2d[1] ; // for debug use only
   104 
   105  endmodule // common_cdc



PICを作ろう、 Timer1デバッグ

 とりあえず、Timer1モジュールのデバッグは終了。CCPモジュールがらみの部分があるが、これはまたあとで。
プリスケーラの制御ではまりまくって、何度か書き直しが必要だった。
 Timer1モジュールの非同期モードはとりあえず、実装しないことにしたが、2つのクロックの間で正しく、データのやり取りができるモジュールを考えてみた(ソースコードは最後)。簡単にデバッグもして、問題なく動作しているようだが、スループットがあまりよいとはいえないな・・・
----
本日の御託
家内に「おっぱっぴ~」だと、言われた。なんかへこむ。
「でもそんなのかんけいねぇ!」(笑)


     1  //
     2  // common clock domain cross module
     3  // (c)2007 BakaOyaji
     4 
     5  module common_cdc(
     6      input src_clk_i,
     7      input src_por_i,
     8      input src_ready_i,
     9      output src_ack_o,
    10 
    11      input dst_clk_i,
    12      input dst_por_i,
    13      input dst_ready_i,
    14      output dst_we_o
    15  ) ;
    16 
    17      parameter SRC_IDLE = 2'b00, SRC_WAITFOR1 = 2'b01 , SRC_WAITFOR0 = 2'b10;
    18      parameter DST_IDLE = 2'b00, DST_WAITFOR_READY = 2'b01,
    19                DST_WAITFOR0 = 2'b10 ;
    20 
    21      reg [1:0] src_fsm , dst_fsm ;
    22      reg [1:0] s2d, d2s ; // synchronizer to remove meta-stability
    23      wire a_s2d, a_d2s ; // asynchronous signals between 2 clock domains
    24      wire s_s2d, s_d2s ; // synchronous version
    25 
    26      // FSM in source side
    27      always@( posedge src_clk_i) begin
    28          if( src_por_i ) begin
    29              d2s <= 2'b0 ;
    30              src_fsm <= SRC_IDLE ;
    31          end // if
    32          else begin
    33              d2s <= { d2s[0], a_d2s } ;
    34              (* parallel_case *)
    35              casex( src_fsm )
    36                  SRC_IDLE : begin
    37                      if( src_ready_i ) begin
    38                          src_fsm <= SRC_WAITFOR1 ; // start fsm
    39                      end
    40                      // else stay
    41                  end
    42                  SRC_WAITFOR1 : begin
    43                      if( s_d2s ) begin
    44                          src_fsm <= SRC_WAITFOR0 ;
    45                      end
    46                      // else stay
    47                  end
    48                  SRC_WAITFOR0 : begin
    49                      if( ~s_d2s ) begin
    50                          if( src_ready_i ) begin
    51                              src_fsm <= SRC_WAITFOR1 ; // start fsm Short cut!
    52                          end // if
    53                          else begin
    54                              src_fsm <= SRC_IDLE ;
    55                          end // if
    56                      end // else
    57                      // else stay
    58                  end
    59                  default :
    60                      src_fsm <= SRC_IDLE ;
    61              endcase
    62          end // else
    63      end // always
    64      assign a_s2d = (src_fsm == SRC_WAITFOR1 ) ? 1'b1 : 1'b0 ;
    65      assign src_ack_o = ( src_fsm == SRC_WAITFOR1) ? d2s[1] : 1'b0 ;
    66      assign s_d2s = d2s[1] ; // for debug use only
    67  
   



FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。