今月号の特集は「作りながら学ぶマイクロコンピュータ」ということで、ALTERAのCPLD上でPIC12F508を実現してしまうという企画です。xilinx派の私としては、ALTERAには手を出さんとか思っていたのですが、おもしろそうなので、ついついボードを買ってしまいました(共同購入の世話役をされたhamayanさん、ありがとうございます)。とか言いつつ、以前1chip MSXを買っていたので2台目です。
運の悪いことに、ちょうどALTERAが論理合成ツールQuartusのバージョンをあげたばかりなので、誌面で説明しているのと多少食い違いができています。新しい8.1では、8.0以前に必要だったライセンスファイルが不要になっています。
RTLはトラ技のページからダウンロードできます。プロジェクトごと入っているので、適当なフォルダーにコピーするだけで合成したり、ダウンロードしたりできます。まだ全部試したわけじゃないですが、モノによって7.0のプロジェクトだったり、8.0のプロジェクトだったりとバージョンの違うプロジェクトが混ざっています。7.0のものは互換性がないらしく、変換するというダイアログがでます。
Releaseというフォルダーにはいっているプロジェクトは7.0のものです。508Emu.map.summaryというファイルを覗いてみるとLEの数は1023になっています。8.1で論理合成しなおすと1070と47LEだけ増えています。
いつものVeritakでシミュレーションしてみました。ModelSimというフォルダーにはいっているのが、シミュレーション用で、MAXII固有の機能を使っていません。テストベンチもはいっています(tb_M508Emu.v)。
一箇所だけエラーが出ました。508Emu.vの47行の
mTimer0 tmr0(reset,fosc,Q,opt[3:0],wr_tmr,db_out,tim_out);
です。ポート数が一致しませんというエラーです。一つ足りないみたいなので、最後に「,」をつけてエラーを取りました。
mTimer0 tmr0(reset,fosc,Q,opt[3:0],wr_tmr,db_out,tim_out,);
修正後はtim_outの後に「,」がついています。出力ポートに何も書かないと単に出力先がなくなるだけです。ModelSimではエラーにならないのでしょうか?
きれいに1クロック1命令になっていて清清しいです。
とりあえず書いてみたLEDチカチカです(<が全角になってます)。
Quartusって、`defaultnettypeが書けないのでしょうか。エラーが出ます。
11/28追記 エラーが出て当たり前です。正しくは`default_nettypeです。間に「_」が入ります。
やってみたいのは、Xilinx系への移植です。といってもVeritakでシミュレーションできたから、余裕でできそうです。
やっぱり、Verilog好きです。
来月号の特集は「ディジ/アナ混載IC活用研究」というタイトルで、PSoCの特集です。
500kHzサンプリングUSBオシロスコープの製作というのもおもしろそうです。最大8個のAVRを2μsずつずらして動作させる、と書いてあります。
って、CPLDの記事以外、全然見てません。
- PSpice活用ワンランク・アップ!が最終回です。
- 後閑さんのMP3プレーヤ作成記事が出てます。VS1011eを使っています。
昨日、トラ技を買ってきたのに、遊ぶのに手一杯で、書くのは今日になってしまいまた。
運の悪いことに、ちょうどALTERAが論理合成ツールQuartusのバージョンをあげたばかりなので、誌面で説明しているのと多少食い違いができています。新しい8.1では、8.0以前に必要だったライセンスファイルが不要になっています。
RTLはトラ技のページからダウンロードできます。プロジェクトごと入っているので、適当なフォルダーにコピーするだけで合成したり、ダウンロードしたりできます。まだ全部試したわけじゃないですが、モノによって7.0のプロジェクトだったり、8.0のプロジェクトだったりとバージョンの違うプロジェクトが混ざっています。7.0のものは互換性がないらしく、変換するというダイアログがでます。
Releaseというフォルダーにはいっているプロジェクトは7.0のものです。508Emu.map.summaryというファイルを覗いてみるとLEの数は1023になっています。8.1で論理合成しなおすと1070と47LEだけ増えています。
いつものVeritakでシミュレーションしてみました。ModelSimというフォルダーにはいっているのが、シミュレーション用で、MAXII固有の機能を使っていません。テストベンチもはいっています(tb_M508Emu.v)。
一箇所だけエラーが出ました。508Emu.vの47行の
mTimer0 tmr0(reset,fosc,Q,opt[3:0],wr_tmr,db_out,tim_out);
です。ポート数が一致しませんというエラーです。一つ足りないみたいなので、最後に「,」をつけてエラーを取りました。
mTimer0 tmr0(reset,fosc,Q,opt[3:0],wr_tmr,db_out,tim_out,);
修正後はtim_outの後に「,」がついています。出力ポートに何も書かないと単に出力先がなくなるだけです。ModelSimではエラーにならないのでしょうか?
きれいに1クロック1命令になっていて清清しいです。
とりあえず書いてみたLEDチカチカです(<が全角になってます)。
//`defaultnettype none module main( output reg [7:0] led = 8'h00, input clk); reg [20:0] ctr = 0; wire ctr_en = ctr == 0; always @(posedge clk) ctr <= ctr + 21'h1; always @(posedge clk) if(ctr_en) led <= led + 8'h1; endmodule
Quartusって、`defaultnettypeが書けないのでしょうか。エラーが出ます。
11/28追記 エラーが出て当たり前です。正しくは`default_nettypeです。間に「_」が入ります。
やってみたいのは、Xilinx系への移植です。といってもVeritakでシミュレーションできたから、余裕でできそうです。
やっぱり、Verilog好きです。
来月号の特集は「ディジ/アナ混載IC活用研究」というタイトルで、PSoCの特集です。
500kHzサンプリングUSBオシロスコープの製作というのもおもしろそうです。最大8個のAVRを2μsずつずらして動作させる、と書いてあります。
って、CPLDの記事以外、全然見てません。
- PSpice活用ワンランク・アップ!が最終回です。
- 後閑さんのMP3プレーヤ作成記事が出てます。VS1011eを使っています。
昨日、トラ技を買ってきたのに、遊ぶのに手一杯で、書くのは今日になってしまいまた。
氷解されたようでよかったです。
今回のPWMモジュールは、好きな機能を拡張できるというFPGA/CPLDならではの例題になっていると思います。ぜひとも、かっこいいスーパーPICを作ってください。
そういえばET2008で作者の方のお話を聞く機会がありました。PIC16F84Aも作られたそうなので、そのくらいならMMKにはいるみたいです。
それでは、よいCPLDライフを。
PIC側のプログラムはのこぎり波を出すために1周期毎にカウントアップしているので、待ち合わせはその都合だと思います。
PWMモジュールのCPUとのインタフェースは別の実装も色々考えられると思います。ready信号にすればループが一つ減りますね。どうせならCPUの負荷が少なそうなのがよさそうです。
お二人の返信を読んで、もう一度よく考えたら理解できるようになりました。
今まで一番分からなかったのが、GPIOの双方向入出力の所だったのですが、エミュレータのGPIOはそれぞれ入力と出力の2系統を持っていることをすっかり忘れていて、エミュレータもPIC12F508のように双方向の入出力1系統で考えていたので理解できなかった訳です。
このことを理解したので、Simさん、のりたんさんの解説も納得でき、やっと理解できるようになりました。
ありがとうございました。
これですっきりしたので、もう一度トラ技を復習しながら、シミュレーション及びMMKでの実機確認して行きたいと思います。
あと、トラ技の内容を終えたら何か別のオリジナルソースコード(複雑なコードにならない程度で高速PICの特性を生かしたものを考え中!何かいい案がありましたら教えてください!)を試したり、PIC16F84Aへの拡張(果たして自力でできるか?今回のトラ技の理解度が試されそう!)、Simさんもやられているように「CPUの創り方」のTD4でラーメンタイマーなんかもやってみたいですね!
追伸
投稿がうまくできなかった理由は、ソースコードを記載する際に行の最初にTABキーが入力されていたためのようです。
何度も変な投稿をしてしまい、すいませんでした。
datin の値の更新周期は、PWMの周期に関わらず、別のタイマで時間管理を行うべきじゃないのかな。
やっぱり、はずしてましたね^^
GPIOですが、双方向になっています。p.171の508Emu.vですが、他の508Emu.vと違って、gp_inがkeyやGPIOからくるのではなく、mPWMからきています。元々、内部的にはgp_inが入力、gp_outが出力で、tris_outに従って入出力が切り替わるようなコードになっていたのですが、ハードウェアpwm用のエミュレータは特別仕様になっています。
p.170のmPWM.vのdatinにgp_out、cntoutにgp_inがつながっているので、GPIOに書き込むとdatinにデータを設定したことになり、GPIOを読むとcntoutの値が読めることになります。cntoutの実体はcntですが、00からffまでひたすらインクリメントするだけのレジスタです。cntが00~7fのときはGPIOの7bit目は0が読めて、80~ffのときは、1が読めます。datinはcntendのときにしか読み込まないのでGPIOの7ビット目が1(cntが80)になったときに次の値を設定しています。
トラ技の特集も、このあたりの話をおもいっきり、はしょってますね。おかげさまで理解が深まりました。
PWM.asmの方です。SawWave.asmの方はSimさんの解釈の通り私も理解しました。
以下、PWM.asmより一部抜粋
;====== PWMOUT =================
;PWMを設定して、次のステートに入るまで待ってから、リターン
PwmOut
;書き込み可能(GPIO[7]=1)になるまで待つ
Pwm1
BTFSS GPIO,7
GOTO Pwm1
MOVF VAL,W
MOVWF GPIO
INCF VAL,F
;次のステート(GPIO[7]=0)になるまで待つ
Pwm2
BTFSC GPIO,7
GOTO Pwm2
RETLW 0
トラ技によるとGPIOにPWMで出力する値を書き込むだけでハードウェアPWM制御ができると書いてあるので、インクリメントしたVALの値をGPIOに随時書き込むだけのアセンブリコードだと思うのですが・・・
MOVWF GPIO でインクリメントした値を書き込んでいますが、GPIOはGPIO[7]で状態判別もしているようです。つまりGPIOは入力になったり出力になったりしているように感じます。つまり双方向入出力のようですが、この辺がいまいち理解できません。
わかりますか?
おほめいただきありがとうございますm(_ _)m
すみません、うまく投稿できないのはよく分からないです><。
わーい、mmkの仲間が増えたー
あう、せっかくほめてもらったのにPICのアセンブラ、よく分かってないです。
えっと、PWM.asmというと、ダウンロードしたzipファイルの中に入っているものですね。データシート片手に解読してみると、パルスが入力されるたびにVALというファイルレジスタの内容が1ずつ増えるという内容みたいです。って、実機のPIC12F508にはGPIOの7bit目なんてないですよね。Emu508でしか動かないテストプログラムみたいなものだと思います。
なんか変なのでトラ技を見返してみました。p.169を見るとSawWave.asmが載っていて、なんか紛らわしい名前です。もしかすると、SawWave.asmの方ですか?
SawWave.asmの方はGPIO0に1を出力してからVAL+1回空ループして、0を出力してから256-VAL(= NVAL)回空ループするというPwmOutをVALを1ずつ増やしながら呼び出すのを無限ループで繰り返すプログラムみたいです。このままだと幅の変わる矩形波が連続して出力されるだけなので、p.168の図1の積分回路を通してのこぎり波出力にしています。
質問内容を勝手に想像して、勝手に答えてしまったのですが、思いっきりはずしてたら、ごめんなさい。
投稿がうまくできません。
●GPIOは双方向で使われているっぽいですが、その辺りがよく分かりません。
質問する場所もなく、周りに詳しい人もいませんので、何卒よろしくお願いします。
こちらのサイトではいつも有益な情報を得させてもらい、大変ありがたく思っています。ありがとうございます。
さて、私はハードウェア記述言語初心者ですが、トラ技12月号、MMKを購入し、勉強しています。トラ技をひと通りざあっと読み(実機・シミュレーション確認はまだです)7割位理解できましたが、ハードウェアPWMモジュールのアセンブルコード(PWM.asm)がよく分かりません。GPIOの使い方が意味不明です。
<疑問>
●GPIO[7]で状態を判別しているが、そもそもGPIOはcntoutなのか?
●MOVWF GPIO の辺が Val<=datin に関係しているっぽいが・・・
●GPIOは双方向で使われてるっぽいのですが、その辺がよく分かりません。
Simさんはじめ皆様の中でこの所を理解されている方がいらっしゃれば、分かりやすくご教示頂けないかと思う所存です。
他に質問する場所もなく、詳しい人も周りにいないため何卒よろしくお願いします。
<参考>PWM.asm
;=======================================================================
; Test Program for PIC16F508 Emulator
; PWM Module
;=======================================================================
list p=12F508
#include <p12F508.inc>
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
;====== Variables ======================================================
VAL EQU 0x08
;====== Program start ===================================================
ORG 0x000 ; Start Address
GOTO start
;====== Initialize =====================================================
init
CLRF GPIO
CLRF VAL
RETLW 0
;====== PWMOUT =======================================================
;PWMを設定して、次のステートに入るまで待ってから、リターン
PwmOut
;書き込み可能(GPIO[7]=1)になるまで待つ
Pwm1
BTFSS GPIO,7
GOTO Pwm1
MOVF VAL,W
MOVWF GPIO
INCF VAL,F
;次のステート(GPIO[7]=0)になるまで待つ
Pwm2
BTFSC GPIO,7
GOTO Pwm2
RETLW 0
;====== Main Program ===================================================
start
CALL init
main_1
CALL PwmOut
GOTO main_1
END
以上、長文失礼しました。
おかげさまで、少しだけ雰囲気は分かりました。これはかなりつらい作業ですね。試行錯誤の末、とりあえず、カスタムのテンプレートを選択してから、本文の文字色を黒にできました。
本文の文字色は、 CSS の ".et何たら" という所に書いてあります。例えば、344行目からの ".etBody" の color 属性をコメント・アウトすると、このページのデフォルトの文字色である「青」が使われます。
/* エントリー本文 */
.etBody {
background-image: url();
background-repeat: ;
background-position: ;
/* color: #888888; */
font-size: 14px;
line-height: 160%;
text-align: left;
}
コメント関連の表示が ".cm何たら" トラックバック関連の表示が ".tb何たら" で定義されていますので、他の部分も試してみてください。
このテンプレートでは、上記の "background-repeat" のように値の入っていない属性がたくさんあります。このため、山ほどエラーが出てきますので、不要なものはコメント・アウトするか、削除してしまいましょう。こんなにエラーが出る状態では、肝心の部分のデバッグができません。エラーコンソールは、 Firefox では "Tools" メニューから呼び出せます。IE では、出せるのかな?
Firefox で CSS を試しに編集するためには、 "Web Developer" Add-in が便利です。また、 CSS の文法書は、以下の場所にあります。
http://www.w3.org/Style/CSS/
読んでも意味がわからないところは、カット・アンド・トライですね。
gooはカスタマイズできるテンプレートとそうでないのがあるみたいです。シンプルというのとカスタムというのがカスタマイズできるそうです。
CSSというのは、はじめて見ました。テンプレートによっては、右側が切れるのもあったりします。
カスタムに変更して、教えてもらったリンク先のをコピペしてみたんですが、ぐちゃぐちゃになりました。カスタムのうち、今までのに一番似ているのにしてみます。よろしければ変更箇所を教えていただけないでしょうか?
Sim さんの BLOG の場合には、ユーザ共通と思われる CSS ファイル http://blog.goo.ne.jp/tpl_master/css/cd0210a890c224f9f3048b89e6838d4b.css が使われています。
これは、すべてのユーザに共通なテンプレートなので、編集は出来ないと思われます。そのため、このテンプレートを自分用にコピーしてから書き換えるという手順になると思います。具体的には… goo を使ったことが無いので私にはわかりません。
書き換えるべき箇所は、すでに確認しましたので、まずは自分用のテンプレートを作る所からはじめましょう。
そうなんです。お恥ずかしい話なんですが、よく分からないので最初の設定のままなんです。もし、お分かりになるようならやり方を教えていただけませんか?
編集のメニューにはデザインメニューというのがあって、テンプレートの選択とテンプレートの編集というのが選べます。編集の方を選ぶと編集できませんというメッセージが出ます。選択の方はお正月テンプレートとか、そういうのが選べるみたいです。文字の色を変えたりするのはどうすればいいんでしょうね><
おかげさまで、楽しませていただいております。
これから状況は変わるかもしれませんが、VerilogはSystem Verilogという後継にも恵まれて先行き明るいという感じです。VHDLの方はSystem Verilogの機能を取り込んで新たなISOを作ろうとしているそうです。今の所、VHDLの革新が立ち遅れている感じです。
個人的にはverilogの方が好きです。VHDLは、いっぱいソースを書かないといけないという程度の理由です。generateとかVHDLにしかなかったものも、どんどんverilogに取り入れられはじめています。シミュレータや論理合成ツールも両方受け付けたり、一部verilog、一部VHDLなんてのもありみたいです。その意味では、どちらでも大差はなくて、やってみて気に入った方にしても、そんなに困りません。
verilogを使っているもう一つの理由は、veritak winという優れたシミュレータが安価で手に入るからです。
verilogは、一見Cに似ています。VHDLのソースは英字が多い感じですが、verilogのソースはスカスカです。
私は電子工作暦よりverilog暦の方が長いです。たぶん6~7年くらい前からです。電子工作はもうそろそろ2年になるくらいです。トラ技2007年1月号の付録基板用のボードをhamayanさんから購入したのが電子工作をはじめたきっかけでした。
長くやってれば私でも身についたので、辛抱ですね。
トラ技の方はverilogで書かれています。私のは、一部verilog 2001がまざってます。ANSI C風の宣言はverilog 2001から使えるようになりました。それ以前のだと
module main(led, clk);
output [7:0] led;
input clk;
reg [7:0] led;
wire clk;
みたいな書き方でした。
しばらく読んでいると、目がとても疲れるのでどしてだろうと思ったら、フォントの色がグレーなんですね。
黒にしていただけると、とてもありがたいのですが....。
Verilogを勉強しようか、VHDLにしようか、はてまた過去の遺物のAHDLにしようか悩んで触ってもいません。
見習わなければ。
あれは、ALTERA+VHDLだったのですが、
えらく印象が違いますね。
というほど勉強してませんが。
自分のブログにも書きましたが、
トラ技をパラパラ見ただけで、めげてしまいました。
xilinx基板の後遺症もあるかも。
すいすいこなしてしまう人を見るとうらやましい。
もちろん、今までの蓄積があるのでしょうが。
私の知っている文法とずいぶん違っているようです。
定期購読のトラ技は、諸般の事情から封印したままなので、まずは読んでみなきゃ。