2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
全13件 (13件中 1-13件目)
1
コンパレータモジュールのチェックは一通り終了したので、Lintチェックを念のためかけている。大きな問題はないが、時間と手間のかかる作業ではある。ところで、PICのVerilogモデル(一応論理合成可)って、だれか欲しいひといますかね?----本日の御託「いや~、俺はいやだったんだけど、加藤さんがどうしてもって言うから…」とか男らしくない言い訳しながらカラオケへ行き、帰宅が遅くなって家内をごまかすが、喉は痛い…
2007.10.27
コメント(6)
相変わらずコンパレータモジュールのデバッグをしている。CMCONのCMフィールドによる入力のマルチプレクサのモードが面倒くさい。思ったとおり、バグってるのを直して、とりあえず、CMCON.CM= b'010'まで終了。あと少し。Lintチェックもしなければ・・・----本日の御託今日、ちょっと(ホントはかなり)職場で凹む事があった。泣いちゃおうかな…
2007.10.25
コメント(0)
コンパレータモジュールの残りのテストだが、動作モードによって、合計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 // alwaysendmodule // isolater
2007.10.23
コメント(0)
コンパレータモジュールのデバッグだが、コンパレータの動作を確認するためには、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
2007.10.20
コメント(0)

コンパレータはちょっとおいておいて、先にvrefモジュールのテストを行った。vrefモジュールは、D/Aコンバータと考えることもできる。そこで、鋸歯状波を発生してみた。昨日のアナログプローブのモジュールも併せて使う。ちゃんとしたチェックには、これをA/D変換してとかだが、実際にアナログ回路ではないわけだから、そこまでやる意味があるかは微妙。第一面倒くさいので、とりあえず、これでチェックはよしとする。----本日の御託某商社と某官庁の元次官の過去の不適切な関係が連日不適切なマスコミをにぎわせている。商社にとって、飛行機は「オイシイ」商材らしく、航空機部門の社員は普通のサラリーマンには理解不能なところがあるようだ(私は、商社務めの経験もある)。まあ、役人や政治家相手では単に理解不能ですまされないわけで、ロッキード事件の教訓みたいなものはまるでないということか。でも、某商社のお家騒動や、元次官の娘まで接待を受けてた疑惑もあり、野次馬的には面白いことこのうえない。
2007.10.20
コメント(0)
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
2007.10.19
コメント(9)
今日はCCP(キャプチャ、コンペア、パルス・ワイズ・モジュレータ)のデバッグをやった。TIMER1、TIMER2モジュールとも絡むので面倒くさいことこの上ない。PWMは、本当のPIC16F648Aでは、Toscがレゾリューションになるのだが、今回は、クロックを4分の1にして単相にしているため、どうしても非互換部分が出てきてしまう。具体的には、timer2のプリスケーラを1:1に設定できないのだ。まあ、クロックを4倍の速度にすることで、ごまかすしかない。残っているコンパレータ関係だが、そのまえに、Veritakのアナログ表示の機能をちっと勉強せねば。----本日の御託ハワイ旅行の写真をDVDにするのに、PowerProducer(DVD-Rドライブのおまけ)をインストールしたが、スプラッシュで出てくる白人の女の人の目が緑なのは、毎回ちょっとぎょっとする。
2007.10.15
コメント(0)
Timer2モジュールのデバッグが終了。やっぱり、プリスケーラではまる(笑)。テキトーに直したが、CCPモジュールでも使われているはずで、あとで再度見直しが必要かも。次はCCPモジュールのデバッグ。----本日の御託。24シーズン5(6ではない)を見た。本編はともかく、「シーズン6」、「プリズンブレーク2」のCMは笑かしてくれる。
2007.10.14
コメント(0)
文字数制限に引っかかってしまったので、後半部分を分けました。 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
2007.10.14
コメント(0)
とりあえず、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
2007.10.14
コメント(0)
暫く更新をしてなかったが、少しずつ進めてはいる。16F648は前にも書いたけど、ペリフェラルがてんこ盛りで、I/Oはマルチプレックスされていて、面倒くさいことこの上ない。やっと、シンタクスエラーとかがとれて、PORTA、PORTB、Timer0のヴェリフィケーションが(概ね)終了。Timer1のデバッグ中。プリスケーラのロジックがおかしかったのを修正して、ポーリングでの動作までは確認した。 ちょっと飽きてきたので、とりあえず端折った、USARTを考えている。受信バッファにFIFOがあるので、サブモジュールとして作ってみる。ていうか、Synchronous(同期式)FIFOだったら、webを探せば、何かあるだろうと思い、サーチしてみた。こんなのが見つかった。手堅い実装だが、論理合成することを考えるとイマイチな気がするので、少し考えてみた(例によってソースコードは最後に)。ちょっとだけ、工夫をしたのは、リード/ライトが同時に起きる場合。FIFOがFULLな状態でも、リード/ライトが同時に起きる場合は、ライトができてしかるべきである。一応、単体で検証してみるが、問題ないようである。リード/ライトをランダムに起こすようにして、いわゆるランダム検証っぽくしてみたりして(笑)。---本日の御託 いわゆる「帰るコール」をしたら、家内が沈みがちので、帰る途中のショッピングモールに出ていた、「はまコロ」なる、コロッケを土産に買ってみた。小ぶりながら、税込み105円とちょっとお高めだった。ただのビーフ・ポテトコロッケだが、確かに旨かった。家内も「プチ・ハッピ~」。(お手軽すぎ。笑) 1 // 2 // Synchronous FIFO 3 // (c)2007 BakaOyaji 4 5 // SFIFO_ADDR_WIDTH is for the width of internal memory 6 // i.e. 4 makes 16 deep fifo 7 // and it must be >= 1 8 `define SFIFO_ADDR_WIDTH 1 9 10 `define SFIFO_WIDTH 9 11 12 module sfifo( 13 input clk_i, 14 input por_i, 15 input we_i, 16 input [(`SFIFO_WIDTH-1):0] data_i, 17 output full_o, 18 19 input re_i, 20 output [(`SFIFO_WIDTH-1):0] data_o, 21 output empty_o 22 ); 23 24 reg [`SFIFO_ADDR_WIDTH :0] wr_ptr, rd_ptr; 25 reg [(`SFIFO_WIDTH-1):0] mem [0: (1<<`SFIFO_ADDR_WIDTH)-1] ; 26 27 assign data_o = mem[rd_ptr[(`SFIFO_ADDR_WIDTH -1):0]] ; 28 always@( posedge clk_i) begin 29 if( por_i) begin 30 rd_ptr <= 0 ; 31 end 32 else if( re_i ) begin 33 if( ~empty_o) begin 34 rd_ptr <= rd_ptr + 1; 35 end 36 // synopsys translate_off 37 else begin 38 $display("Error : read on empty") ; 39 $stop ; 40 end // else 41 // synopsys translate_on 42 end // else if 43 end // always 44 45 always@( posedge clk_i) begin 46 if( por_i) begin 47 wr_ptr <= 0 ; 48 end 49 else if ( we_i ) begin 50 if( ~full_o) begin 51 mem[wr_ptr[(`SFIFO_ADDR_WIDTH -1):0]] <= data_i ; 52 wr_ptr <= wr_ptr + 1; 53 end 54 // synopsys translate_off 55 else begin 56 $display("Error : write on full ") ; 57 $stop ; 58 end // else 59 // synopsys translate_on 60 end // else if 61 end // always 62 63 assign empty_o = (wr_ptr == rd_ptr ) ? 1: 0 ; 64 assign full_o = (wr_ptr == 65 {~rd_ptr[`SFIFO_ADDR_WIDTH ], rd_ptr[(`SFIFO_ADDR_WIDTH -1):0]} ) 66 ? ~re_i : 0 ; 67 68 // synopsys translate_off 69 // debug purpose only 70 assign old_full = (wr_ptr == 71 {~rd_ptr[`SFIFO_ADDR_WIDTH ], rd_ptr[(`SFIFO_ADDR_WIDTH -1):0]} ) 72 ? 1 : 0 ; 73 assign both_full = re_i & we_i & old_full ; 74 // synopsys translate_on 75 endmodule // sfifo 76 // EOF sfifo.v
2007.10.12
コメント(0)

HI-TECH SoftwareのPIC用cコンパイラのフリー版(以下、PICC-Lite)の新しい版v9.60PL1がリリースされていたので、拾ってきた。Vista対応になったそうである。インストールして、マニュアルをナナメ読みしてみて、面白そうなので、ちょっと実験。もとのソフトは、以前使った、MicroChipのWebページに掲載されているプログラムhttp://www.microchip.co.jp/seminar/200203/jisshuu.pdf。これを適当にcで書き直したもの(最後に載せました)。もとのアセンブラのプログラムが130行程度ですが、こちらは80行にも満たない量です。それより、読みやすいですねー、やっぱり。PIC16F84互換プロセッサでのシミュレーション実行結果はこんな感じ。54行目で、ループの待ち時間をオリジナルより短くしているので、アセンブラ版http://plaza.rakuten.co.jp/pressgreenbutton/diary/200709150000/より、LED(PORTB)の点滅は速くなっています。オリジナルのアセンブラのプログラムに似せて、変数flagは構造体にして、bitを扱っています。それにしても、cを使うのは実に13年半ぶり。そのころは、MS-CでMS-DOS用のプログラムだったので、volatile修飾子とか使うのは初めてです。変数flagの初期化もオリジナルのアセンブラのプログラムに似せて、むりむりcastしてます(44行目)が、こういうcastの書き方もやり方をほとんど忘れてしまっていて、思い出すのにちょっと苦労してしまいました。トシはとりたくないものです(笑)。----本日の御託急に涼しくなって、体調を崩しかけていたので、アルコール消毒を実施(早い話、呑みに行ったのだ)したが、効果なし。かえって調子悪し…1 //2 // (c) 2007 Bakaoyaji3 // The original version is from microchip4 // http://www.microchip.co.jp/seminar/200203/jisshuu.pdf5 6 #include "pic.h"7 8 #define PORTB_INIT (0x01)9 // #define DEB_INIT (200)10 #define DEB_INIT (3)11 12 unsigned char portb_out, deb_cnt, cnt0, cnt1 ;13 volatile struct {14 unsigned shift : 1 ;15 unsigned hit : 1 ;16 } flag ;17 18 void ioport(void) ;19 void delay( unsigned char ) ;20 21 static void interrupt isr(void) {22 if(T0IF) {23 T0IF = 0 ;24 if( !(PORTA & 0x01 )) { // key press25 if( !flag.hit ) {26 if( --deb_cnt == 0 ) {27 flag.hit = 1 ;28 flag.shift = flag.shift ^ 1 ;29 }30 }31 } else { // key release32 flag.hit = 0 ;33 deb_cnt = DEB_INIT ;34 } // else35 }36 } // isr 37 38 void main(void) {39 portb_out = 0 ;40 ioport() ;41 OPTION = 0xd0 ; // bank142 // flag.shift = 0 ;43 // flag.hit = 0 ;44 *( (unsigned char * ) &flag ) = 0x00 ;45 deb_cnt = DEB_INIT ;46 portb_out = PORTB_INIT ;47 TMR0 = 0 ;48 INTCON = 0xa0 ;49 while (1) {50 CLRWDT() ;51 ioport() ;52 delay( 40) ; // delay( 150) ;53 if( !flag.shift ) {54 continue ;55 }56 portb_out <<= 1 ;57 if( portb_out == 0 ) {58 portb_out = PORTB_INIT ;59 }60 } // while61 } // main()62 63 void ioport(void) {64 PORTA = 0 ;65 PORTB = portb_out ;66 TRISA = 0x01 ; // bank167 TRISB = 0x00 ; // bank168 } // ioprt()69 70 void delay( unsigned char d) {71 cnt0 = d ;72 do { 73 cnt1 = 0 ;74 do {75 asm("nop") ;76 } while ( --cnt1!=0 ) ;77 } while( --cnt0 !=0 ) ;78 } // delay()
2007.10.03
コメント(3)
皆さん、ハワイのネタ好きですネ。アクセスが一気に増えた(笑)閑話休題。少しお休みだったPICの話の続きです。私の使っているVerilogシミュレータVeritakには簡易lintの機能があるのでせっかくなので使って見ました。けっこう気をつけてコーティングしているつもりでもワーニングは出るものだ。でも、ちょっと気になることもあるので、菅原システムさんに問い合わせ中。勘違いでした----本日の御託酒、呑みてぇ!
2007.10.01
コメント(0)
全13件 (13件中 1-13件目)
1


