PICのADDWF命令のメモリアクセスについて

このQ&Aのポイント
  • PICの命令ADDWF f,dについて、f1のメモリにアクセスしてW+f1を行うための命令です。
  • ADDWF f1,fの実行には1命令サイクルで2度メモリアクセスが必要です。
  • MOVWF fは1命令サイクルで実行されますが、メモリに一度だけアクセスします。
回答を見る
  • ベストアンサー

PICの命令 ADDWF f,d のメモリアクセス

ファイルレジスタf1が定義されていて ADDWF f1,f ;f1=W+f1(=は代入演算子)を実行するとき, (1) W+f1を行なうには,f1のメモリにアクセスする必要があります。 (2)f1=W+f1を行なうには,再度f1のメモリにアクセスする必要があると思いますが, この命令は1命令サイクルで実行されます。 ところで, MOVWF f ; W->f も1命令サイクルで実行されます。 しかし,この命令はメモリに一度アクセスするだけです。 ADDWF f1,f は1命令サイクルで本当に2度メモリアクセスしているのでしょうか? それとも,また違った方法で実行されているのでしょうか? (出典付き,でお教えていただけるとありがたいですが)

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.3

PIC16F193Xのデーターシートで説明します http://www.microchip.jp/docs/41364B_JP.pdf 「26.1 Read-Modify-Write 操作」で説明されていますが、ADDWF Freg ,d (F or W)格納先指定により演算結果をF=ファイルレジスタかW=Wレジスタに格納するかの違いです 「図 1-1: PIC16F193X/LF193X のブロック図」により演算はALUで行われWregとFreg(RAM)は同じバス上にあり同じ扱いです、(ALUからFregへデータを直接転送可能) PICはシステムクロックの1/4が命令実行サイクスになります。 (20MHz動作時は命令サイクル5MHz,1命令実行時間200nS)

masterfour
質問者

お礼

ありがとうございます。 read-modify-writeを読んだ記憶だけありましたが理解せずにおりました。 今回,意味がわかりました。 回答No.2 さんで気付いたのですが,回答No.3さんで,よりはっきりしました。

その他の回答 (2)

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.2

http://www.piclist.com/images/www/hobby_elec/pic.htm http://www.piclist.com/images/www/hobby_elec/pic3_2.htm#addlw f1(f)はファイルレジスタ:0-127とされていますが、他のCPUのメインメモリ相当では無く、レジスタ相当となっています。 レジスタ数が8,16,32等のCPUがありますが、それが128個まで増やされており、CPU内蔵で1クロックアクセス(リード、ライト同時アクセス)が可能な構成になっていると考える事が出来ます。 レジスタ、或はフリップフロップは読み出しパスと書き込みパスが別々に設けられており、命令クロックの立ち上がりサイクルでそれまでのデータを読み出しが行われ、1クロックの間その値を読み出し続けます。 一方同一サイクル内の先頭のクロック立ち上がり時点で、(前サイクルのCPU演算結果の)書き込みパスのデータ取り込みもパラに可能です。 但し、書き込まれたデータが安定して読みだされるまでには時間が掛かるので、書き込まれたデータを次のサイクルで使用しようとした場合には、CPU内部でチェックしてダミーサイクルの挿入が行われます。 (最近のインテルCPU等では、このような場合もダミーサイクル無しで実行出来るようにCPU内蔵のテンポラリレジスタが追加される等の強化が行われているようです) 前サイクルでの書き込みfレジスタ番号と、次のサイクルの読み出しfレジスタ番号が別番号の場合には、1命令1サイクルで命令の実行が続けられます。 http://www.microchip.jp/docs/DS39703A_JP.pdf 第2章CPU 2.11.1 書き込み後読み取り従属関係ルール 一方通常のメインメモリでは読み出しパスと書き込みパスとして同一のパスが使われており、メインメモリに同一サイクルで読み出しと書き込みをパラに実行する事は不可能で、ロード関係命令とストア命令とは別サイクルで実行されます。

masterfour
質問者

お礼

ありがとうございます。 read-modify-writeを読んだ記憶だけありましたが,今回,わかりました。

  • iruiru298
  • ベストアンサー率32% (13/40)
回答No.1

調べていませんが、 PCIではパイプライン処理してませんか? 次の命令実行中に、2度目のメモリアクセスをしているのだと思いますよ。

関連するQ&A

  • PIC/SWAP命令でWregをrestore?

    先日こちらで「SWAPF命令」についてご教示いただきました。ありがとうございました。 その後、いつも学習させてもらっている下記のページにある「割り込み例」の記述で、わからないところがあって、再度お世話になります。超初学者の質問です、どうぞよろしくお願いいたします。 -----ここから引用(ただし各行先頭の番号と:は行数指示のため追加)---------------- 01:【例】WレジスタとSTATUSレジスタの待避と復旧 02: 03:(0004)番地 04:    GOTO   PUSH    ;割込みジャンプ 05:    | 06:    | 07:PUSH  MOVWF  W_TEMP    ;Wレジスタ待避 08:    SWAPF  STATUS,W  ;STATUS取り出し 09:    MOVWF  ST_TEMP   ;STATUS待避 10:    | 11:    |(割込み処理) 12:     | 13:    SWAPF  ST_TEMP,W  ;STATUSを戻す 14:    MOVWF  STATUS   ; 15:    SWAPF  W_TEMP,F  ;Wレジスタを戻す 16:    SWAPF  W_TEMP,W 17:    RETFIE       ;割込み許可リターン -----ここまで引用---------------- (http://www.picfun.com/pic08.html) 基礎知識の確認事項: PIC特有の問題として、 1:PICにはステータスレジスタを直接退避する命令が無く、一旦WREGにステータスレジスタの値を転送してからメモリに退避する必要が有る。 2:MOV命令でステータスレジスタをWREGに転送すると、ステータスレジスタの値が変化してしまう。 3:これらの理由でステータスをWREGに転送する際は、ステータスが変化しないSWAPF命令を使用する。 4:ところがSWAPF命令を使うと、移動しようとするデータの上位4ビットと下位4ビットが入れ替わってしまういわば「副作用」が現れる。 4:それで復帰する時にもSWAPF命令を使用して上下4ビットを元へ戻す。 (前回ご教示いただいたことをまとめると上記のようになりますね。) 質問1: 引用した記述で7行目の「PUSH」は単にラベルとして使用しているだけで、命令としてはPICには無いものですね?PUSH~POPは単語の意味として、AVRに限らず使用できる一般的な意味のある単語なのでしょうか? (補足) AVR命令セットのPDFがアップされています。 http://www.atmel.com/images/doc0856.pdf こちらの13ページををみますと、表の下から2~1段目にPUSH~POPがあります。 しかしPICではPUSH~POPが命令セットに見あたりません。 それでPUSH~POPがAVR専用の命令語だとわかりました。 でも引用したページでは「POP」を使っています。 質問2: 引用した記述の7行目でMOVWF命令を使ってWレジスタをsaveしています。 ところが15行目、16行目では1回ずつSWAPFを使い、合計2回のSWAPFを使っています。7行目でWレジスタをW_TEMPにsaveするときはSWAPFを使わないのに、どうしてrestoreするときはSWAPFを2回も使用するのでしょうか? (補足) 「合計2回のSWAPFを使う部分の機能」が上位~下位反転してしまったピットを戻す機能であることはわかります。 しかし、それであれば7行目でWレジスタをW_TEMPにsaveするときはSWAPFを使えば良いように考えたのですが、、、 それでrestoreするときにSWAPFを再び使用したら良いのでは?と、、、 基礎知識の確認事項2で「MOV命令でステータスレジスタをWREGに転送すると、ステータスレジスタの値が変化してしまう。」としました。 7行目で移動するのは割り込み直前の「Wreg」で「status register」ではないのに、それでも移動すると値が変化してしまうということでしょうか? 初学者の質問で馬鹿らしいかもしれません。 ご解答が面倒で無い方がいらしたら、どうぞご教示よろしくお願いいたします。

  • CPUがメモリ上に書かれている命令を実行した後

    CPUがメモリ上に書かれている命令を実行した後の流れについての質問です。 たとえばメモリ上に「Wordを開く」などの命令があるとき, CPUはその命令を実行すると思いますが,命令を実行とは CPUは, ① ストレージにあるWordのファイルにアクセスする(CPUが直接) それとも ② Wordを開くという演算結果をメモリに返し,その結果,Wordが起動する(CPUの演算結果がメモリを経由) ①と②のどちらでしょうか?

  • CPUがメモリ上の命令を実行する流れについての質問

    CPUがメモリ上の命令を実行する流れについての質問です。 CPUがメモリ上の命令を実行流れについてなのですが たとえば,「Wordが起動する」までの流れがあるとして ① 「Wordを起動する」という命令がメモリ上にある ② CPUがその命令を読み取り,Wordを起動し,その演算結果をメモリに返す ③ メモリ上に「Wordが起動されている」結果が一時的に保存されている おおまかな流れはこうではないのでしょうか?

  • 計算機工学のプロセッサについて教えて下い

    あるプロセッサにおいて各命令タイプの命令実行の各ステップにおける所要時間は画像の通りとする。 1 以下の2種類のプロセッサ構成方式を採った場合のクロックサイクル時間(最小値単位はns)、各命令タイプの実行所要時間(単位はns)および実行所要クロックサイクル数を求めよ   ・シングルサイクル・データパス   ・マルチサイクル・データパス   ・命令パイプライン処理 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー といった問題です 自分で解いてみたのですが解答がないため、答えが合っているのかが知りたいです ・シングルサイクル 実行時間: ロード命令   1.1+0.4+0.7+1.1+0.4=3.7ns ストア命令   1.1+0.4+0.7+1.1=3.3ns 演算命   1.1+0.4+0.7+0.4=2.6ns 分岐命令   1.1+0.4+0.8=2.3ns よってクロックサイクル時間=3.7ns ・クロックサイクル数: 実行時間=クロックサイクル数*クロックサイクル時間より ロード命令:3.7/3.7 ストア命令:3.3/3.7 演算命令:2.6/3.7 分岐命令:2.3/3.7 ・マルチサイクル 実行時間: ロード命令   (1.1*4)+(0.4*4)+(0.7*3+0.8)+(1.1*2)+0.4=11.5ns ストア命令   (1.1*4)+(0.4*4)+(0.7*3+0.8)+(1.1*2)=11.1ns 演算命令   (1.1*4)+(0.4*4)+(0.7*3+0.8)+(1.1*2)+0.4=11.5ns 分岐命令   (1.1*4)+(0.4*4)+(0.7*3+0.8)=8.9ns クロックサイクル時間は命令フェッチに合わせた4.4ns クロックサイクル数 ロード命令:5 ストア命令:4 演算命令:4 分岐命令:3 ・パイプライン 実行時間 ロード命令   1.1+0.4+0.4+0.7+1.1+0.4=4.1ns ストア命令   1.1+4.1=5.2ns 演算命令   1.1+5.2=6.3ns 分岐命令   1.1+6.3=7.4ns というのが私の考えです 全体的に自信がありません どなたかお分かりになるのでしたら教えていただけませんか 一応画像のものを手書きしておきます         命令フェッチ  レジスタ読み出し ALU演算 データアクセス レジスタ書き込み ロード命令   1100ps      400ps       700ps    1100ps        400ps ストア命令   1100ps      400ps       700ps    1100ps 演算命令    1100ps      400ps       700ps                 400ps 分岐命令    1100ps      400ps       800ps

  • PICのSleepからの復帰に関して

    INTピンを使ってsleepから割り込み復帰したいのですが、 思ったとおり動いてくれません。 メインをSLEEPにし、割り込みが入ると割り込み側の プログラムを実行し、終わるとメインのSLEEPに もどってINTの割り込みに備えるようにしたいのです。 現段階では割り込みをするとSLEEPから割り込み には行くのですが、そのまま割り込み側のプログラムを 永遠に繰り返してしまいます。 list p=12f629 include p12f629.inc RELOOP1 equ 0x20 CT_DELAYNMS equ 0x21 PCLATH_TEMP equ 0x2a W_TEMP equ 0x2b STATUS_TEMP equ 0x2c stu equ 0x2d org 0x0 goto start org 0x4 ;レジスタの退避 movwf W_TEMP swapf STATUS,W clrf STATUS movwf STATUS_TEMP movf PCLATH,W movwf PCLATH_TEMP clrf PCLATH ;割り込み要因のチェック btfss INTCON, INTF goto INT_NEXT1 ;ここから割り込みプログラム 省略 INT_NEXT1 ;レジスタの復帰 movf PCLATH_TEMP,w movwf PCLATH swapf STATUS_TEMP,W movwf STATUS swapf W_TEMP,F swapf W_TEMP,W retfie ;初期設定 start: ;aLED単独の輝度 bcf STATUS, RP0 clrf INTCON clrf GPIO bsf STATUS, RP0 clrf OSCCAL clrf TRISIO bsf TRISIO,2 movlw B'01000101' movwf OPTION_REG bcf STATUS, RP0 ;割り込み許可する movlw B'11010000' movwf INTCON nop sleep nop goto $-3 end こんな感じのプログラムなのですが、INTピンからの割り込みと いうことでプリスケーラなどは使っていません。 データシートも読んだのですが今市理解ができていない状況です。 お願いします。

  • PICの「SWAPF」の意味について

    PICを学びはじめたばかりの初学者です。混乱してしまい、バイト命令「SWAPF」の意味がわかりません。 質問1: 「SWAPF」という命令は「ファイルレジスタfの上位4ビットと下位4ビットを入替えた結果を(d)に入れる」と出ています。 http://homepage3.nifty.com/mitt/pic/pic42_1.html この「上位4ビットと下位4ビットを入替え」というのは例えば次のようにすることを言うのですか? ----------- (SWAPF前) 上位4ビット 下位4ビット △△△△   □□□□ (SWAPF後) 上位4ビット 下位4ビット □□□□   △△△△ ----------- 質問2: 質問1が正しいとしたら、次の記述の訳はどのようなことなのですか? こちらのページを拝見しますと、下記引用のようになっています。 http://www.picfun.com/arch09.html ----ここから引用-------------------- 【スワップ命令の使い方】 SWAP命令を有効に使う例は、下記のような場合です。 例1 割り込み時のレジスタの待避、復帰     SWAP命令がSTATUSに影響しないことを利用しています。 PUSH  MOVWF  W_TEMP    ;Wレジスタ待避     SWAPF  STATUS,W  ;STATUS取り出し     MOVWF  ST_TEMP   ;STATUS待避 ----ここまで引用-------------------- ↑この中の「;STATUS取り出し」のところですが、「SWAPF」を使って「上位4ビットと下位4ビットを入替え」てからでないとSTATUSのHとLを取り出すことが出来ないのでしょうか? 質問3: もし、 「SWAPF」を使って「上位4ビットと下位4ビットを入替え」てからでないとSTATUSのHとLを取り出すことが出来ない、 のだとしたら、それはPICの仕組み上のことなのでしょうか? 初学者の質問で馬鹿らしいかもしれません。ご解答が面倒で無い方がいらしたら、どうぞご教示よろしくお願いいたします。

  • 下記の問いの解き方を教えて下さい。

     基本動作時間(クロック時間)が 3 ナノ秒の処理装置で,命令の実行に必要 なクロック数とその命令の出現比率が表に示す値である場合、この処理装置の性 能は平均約何 MIPS か。 ┌───―───────┬――――――――─────┬──────┐ │  命令の種別    │命令実行に必要なクロック数│ 出現比率 │ ├────―──────┼―――――――――────┼──────┤ │レジスタ間演算    │       4      │  40%  │ ├─────―─────┼──―――――――――――┼──────┤ │メモリ・レジスタ間演算│       8      │  50%  │ ├─────────―─┼──――――――――――─┼──────┤ |無条件分岐      |      10      |  10%  | └─────────―─┴─―――――――――───┴──────┘

  • 命令

    lw r1,0(r4) 上記のような命令を実行したとします。レジスタ群r4には32ビット00000000000000000000000000100100が入っています。これは10進数にすると36なので0(r4)=0+36=36になります。 そしてメインメモリのアドレス36番地には10000001111111111111111111111111が入っていてこれをレジスタ群r1に移動します。 けれどもレジスタ群r1には00000000000000000000000000011000が最初から入っています。 ここで質問なんですがこの場合アドレス36番地の値と最初から入っていたレジスタ群r1の値は足さなければならないのですか? それともアドレス36番地の値をそのままレジスタ群r1につっこんでもいいのでしょうか?

  • アセンブラの命令について

    データ転送命令MOV ds と制御命令MOV addを実行するに必要なメモリアクセス回数は最大何回になりますか。 よろしくお願いいたします。

  • PIC16F193X割り込み時の退避・復帰処理方法

    ICマイコンでの割り込み処理について、16F193Xの型番では割り込み発生時における退避・復帰が自動的に行われると認識しているのですが、下記型番では以前の様に wレジスタ、status,PCLATh等のレジスタを退避・復帰をプログラムで保存しておく必要がなくなったということでしょうか? 使う割り込みはタイマー割り込み(timer0)とし、割り込処理中の割り込みは禁止とした場合 因みに割り込みは以下の様に発生させ ////////////////////////// org   0 goto start org 4 goto INTLAP ////////////////////////// INTLAP BCF INTCON,2 INCF TES_CNT,1 RETFIE 割り込み処理中にTES_CONのレジスタ内容をPORTAの出力pinをオシロスコープで観察できる簡単なプログラムで走らせると動作していることが確認できましたが、退避・復帰が行われているかは不明です。 他に自動退避・復帰を確実に実行するためのプログラム等の操作を怠っていないでしょうか? 初心者で認識が誤っていないのか判断が出来ません。 対象型番 PIC16F1933 ? PIC16F1934? PIC16F1936 ? PIC16F1937? PIC16F1938 ? IC16F1939 PIC16F193X/LF193Xデータシート記述より(P71,72) 〇「このデータシートに記載されているデバイスRETFIE 命令では、割り込み前に実行していたアドレスをスタックから取得し、シャドウ レジスタから保存した内容を回復し、GIE ビットをセットすることによって、ISR から通常動作に復帰します。」 内容保存機能 〇「割り込み動作に遷移する際、復帰時の PC アドレス値がスタックに保存されます。また、次に示すレジスタ値も自動的にシャドウ レジスタに保存されます。 ・W レジスタ ・ ステータス レジスタ (TO および PD を除く) ・BSR レジスタ ・FSR レジスタ ・ PCLATH レジスタ 割り込みサービス ルーチンから通常動作に戻るとき、自動的にこれらのレジスタ値が回復されます。 とあります。