FIFOの仕組みについて

このQ&Aのポイント
  • FIFO(First-In,First-Out)を使用したいと考えています。メモリ上に保持されずに消えてしまうのか、他のRAMと同様に保持されるのか理解できません。
  • FIFO(First-In,First-Out)とは、最初に入ったデータが最初に出力される仕組みです。しかし、FIFOで出力されたデータはメモリ上に保持されず、他のRAMと同様に保持されるわけではありません。
  • FIFO(First-In,First-Out)はデータの入力順序と出力順序が一致するデータ構造です。ただし、FIFOで出力されるデータはメモリ上に保持されず、他のRAMと同様に保持されることはありません。
回答を見る
  • 締切済み

FIFOの仕組みについて

FIFO(First-In,First-Out)を使用したいと考えています.そこで,1度outputしたデータは,メモリ上には保持されず,押し出されるように消えてしまうのでしょうか.それとも他のRAMと同様,読み出してもデータは保持されるのでしょうか.その辺がいまいち理解できません. 宜しくお願い致します.

noname#230358
noname#230358

みんなの回答

noname#230359
noname#230359
回答No.3

こんにちは。 CY7Cシリーズのデーダシートが見つからないのではっきりした事が言えなくて申し訳ありませんが、FIFOはデータの非同期インターフェスに使用されるのでアドレスポインタをリセットする端子があると思います。 この端子がREADとWRITEで別になっていると都合が良いのです。 私は以前IDT社、沖あたりのを使ったことがある程度ですが、最近はほとんどSDRAMを使用する場合が多い(便利)と聞いています。 英文のデータシートも読み切る癖をつけておかないといずれプロセッサーやFPGA、DSP等の時大量の英文ドキュメントの為に、自力で開発や設計、トラブルシューティングが出来なくなりますので今からがんばってみてください。

noname#230358
質問者

お礼

korusamuさん,再度のご回答ありがとうございます. 自分自身も英語力の必要性を痛感しており,今後努力していきたいと思います.

noname#230359
noname#230359
回答No.2

CY7Cシリーズなら、そのものズバリかは分かりませんが CQ出版の「メモリICの実践活用法」と言う本の P170から記事があります。 FIFOは使ったことがないので何とも言えないのですが リードするとリードポインタは当然1つ進みますよね。 それを戻せたら再度同じデータをリード出来ますが リードポインタを戻す方法があるのでしょうか? 無いように思うのですが・・・

noname#230358
質問者

お礼

plusさん,貴重な情報ありがとうございます. 機会を見つけて,記事を見るようにします.

noname#230359
noname#230359
回答No.1

こんにちは。 押し出されてしまうタイプはシフトレジスタ(タイプ)のメモリで確かにFIFOと言えば言えなくもありません。このタイプは可変長タイプが普通です。 容量はそう大きくはなくスピードもやや遅いのが一般的です。 一般的にFIFOと言えばSRAMにマルチプレクサが付いていて、インクリメント(又はデクリメント)のアドレス・カウウンターで順次アドレスをカウントアップ(ダウン)させそのカウンター値のデータをマルチプレクサで出力させるものだと思います。(READ時) カウンターのインクリメントはREADパルス毎に行ないます。これらのアドレスカウンターをポインターと呼びます。 ポインターはREAD(読込み)とWRITE(書込み)の両方が有り、互いに非同期で行なわれますが、衝突時のデータには注意しなければなりません。 詳細はデバイス(意図された用途によっても異なる)によって異なります。 最後になりましたが、ご質問の件についてはそのデバイスがREADポインターとWRITEポインターが別のものなら通常データは保持されていると思います。 最終的にはデバイスのデータシートで確認してください。 デバイス名を特定していただければ、もう少し確定したことをもうしあげられるのですが。

noname#230358
質問者

補足

korusamuさん,早速のご回答有難うございます.現在cypress社のCY7Cシリーズを考えています.データシートにはリードポインタとライトポインタが別々になっていますので,おそらく保持される形式だと思われます.データシートが英語ということも有り,いまいち理解できなかったのですが,おかげで概念が理解できた気がします.

関連するQ&A

  • FIFOについて

    最近マイコンプログラム等の勉強をしております。 マイコンと通信させるチップのデータシートにFIFOという言葉が出てきます。データの送受信に使う一時的なメモリとしてFIFOがあるようで、他の様々なチップにおいても何らかの形でFIFOが使われていることが多いようなのですが、よくわからないことが何点かあります。 [質問] (1)ICチップのデータシートに出てくるデジタル回路の用語FIFOと 情報処理の参考書に出てくるFIFO(First In, First Out)とは別物なのでしょうか?関係があるのでしょうか? (2)(1)で関係がある場合、FIFOの他にもLIFO(Last In, First Out)があると思いますが、圧倒的にFIFOが使われるケースが多いのはなぜでしょうか?

  • FIFOやLRUの改善

    FIFOやLRUの多くでは頻繁に使用しているページを置き換えてしまう可能性がある。 現実のオペレーティングシステムではどのように対処しているか説明せよ。 という問題ですが ループしてアクセスしているパターンを検出して、適した置換アルゴリズム(たとえば、MRU(Most Recently Used)に切り替える。MRUとは最近最も使われたデータを最初に捨てるルゴリズムでアクセスに局所性を想定できず、LRUの実装が複雑すぎる場合に使われる。 という解答を導きましたがどうでしょうか? ご確認お願い致します。

  • LILO の発音について

    Linux の LILO って、どう発音するのが正しいのでしょう? 私は、昔から FIFO(First In First Out)を「ファイフォ」と発音 しているので、そこからの連想で「ライロ」と発音していたんですが、 周囲の人を見ていると、「リロ」と発音する人の方が多いようです。 個人的には、どうも「リロ」というのはしっくりこないんですが、 (綴りが LILLO なら納得できるんですが…) 皆さんは、何と発音されていますでしょうか?

  • このACアダプターで大丈夫

    私はシンクパッドのACアダプター IN 100-240V~1.6-0.8A OUT 16V-4.5V というのを使っています もし、これを同じIBMの INPUT:100-240V~1.2A-0.7A 50/60Hz OUTPUT:16V===3.36A や INPUT:100-240V~1.1A-0.55A 50/60Hz OUTPUT:16V-10v 2.2-3.2A を使って大丈夫なのでしょうか? またどの辺を気をつければ他のものでも大丈夫なのでしょうか? 違うモノをつかうと壊れてしまうのでしょうか?

  • MRTG(Win)の拡張方法について

    お世話になります。 MRTGをWin2kProへインストールし、利用しているものです。 あるHomepageを参考に、MRTGをインストールし、IN/OUTのTraffic量を見れるようになりました。 現在、EtherのIN/OUTのTrafic量となっておりますが、RouterのCPE使用率やサーバのメモリ使用率(標準MIBのもの)等を表示する場合、どのようにすれば良いか、ご教授頂けませんでしょうか? また、MRTGの構築設定の中で「perl cfgmaker public@192.168.1.109 --globel "WorkDir: c:\www\mrtg" --output mrtg.cfg」とありますが、EtherのIN/OUTのTraffic量は、どの部分で設定されているのでしょうか? 以上、宜しくお願い致します。

  • XSLTを使用したXML->XML変換で...

    XSLTを使用したXMLからXMLへの変換で、やり方が分からないのでどなたかお教え願います。 以下にXMLを記述します。 ----[入力側]----- <INPUT> <IN1> <old>100</old> <new>100</new> </IN1> <IN2> <IN21> <old>200</old> <new>200</new> </IN21> <IN22> <old>300</old> <new>300</new> </IN22> </IN2> </INPUT> ----[出力側]----- <OUTPUT> <OUT1> <OUT11> <old>100</old> <new>100</new> </OUT11> <OUT12> <OUT121> <old>200</old> <new>200</new> </OUT121> <OUT122> <old>300</old> <new>300</new> </OUT122> </OUT12> </OUT1> </OUTPUT> 【質問内容】  集団項目でないタグ(入力側のIN1およびIN2)を集団項目として出力したい

    • ベストアンサー
    • XML
  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • RAMディスク

    RAMディスクソフトを使用している環境にメモリ管理プログラムを追加した程度、考えられる不具合としてメモリ管理プログラムがRAMディスク内のデータを誤って削除してしまう可能性以外で、他にどのようなものがあるのかおわかりになる方いらっしゃいますでしょうか。 ※ちなみに当方では、RAMディスクソフト(RamPhantom2)、メモリ管理プログラム(RAM Idle Professional)を使用しています。

  • 正規表現について2

    すみません、前回「正規表現について」でお世話になりました者です。 前回の分は解決したのですが、それに関連してもう少し教えてください。 data.txt---------------------------------------- aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ test.pl----------------------------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); my $line=0; open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ if ($line++==0){ $output1="$1" if/aaa(.*?)ccc/;} s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); print $output1; ------------------------------------------------ とすることで、得られたい結果である、 output.txt-------------------------------------- bbb aaadddccc aaaeeeccc ------------------------------------------------ IEでの表示-------------------------------------- bbb ------------------------------------------------ となりました。そこで今回教えていただきたいのは、 data.txt---------------------------------------- <空行> aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ というようにdata.txtのはじめが空行の場合にも、 上記と同じような結果を得たいです。output.txtの はじめは空行になっても構いません。得られる文字として、上と同じ結果がほしいです。どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • PICでのプログラミングについて教えて下さい。

    現在電圧計を製作していて4桁の7セグダイナミック点灯で行き詰っております(超初心者です)。 PICは16F873Aを使用、コンパイラはCCS、書き込みはピックライタ、あとシリアルデバッカを使用しています。 外部から電圧をかけそれをAD変換し、AD変換結果(0~5V)を7セグに表示させようとしています。 一応今の状態でも電圧表示はできていることはできているのですが一桁目から4桁目まで目で追えるくらい遅いスピードでこれを改善したいです。ソースは下記のソースを製作しました。この状態で3日間悩んでおります...知恵をお貸しいただけないでしょうか。 よろしくお願いします。 #include <16F873a.h> #device ADC=10 //A/D変換10bitモード #use fast_io(A) /* TRISレジスタの設定が必要 */ #use fast_io(B) #use fast_io(C) #use delay (clock=10000000) //10MHz #use RS232( BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7, PARITY = N, BITS = 8 ) #fuses HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP #define VOLTAGE PIN_A0 // (in) #define CORRENT PIN_A1 // (in) #define VREF1 PIN_A2 // (in) #define VREF2 PIN_A3 // (in) #define RESERVE1 PIN_A4 // (out) #define RESERVE2 PIN_A5 // (out) #define LED_DP PIN_B0 // (out) #define LED_A PIN_B1 // (out) #define LED_B PIN_B2 // (out) #define LED_C PIN_B3 // (out) #define LED_D PIN_B4 // (out) #define LED_E PIN_B5 // (out) #define LED_F PIN_B6 // (out) #define LED_G PIN_B7 // (out) #define DIG_0 PIN_C0 // (out) #define DIG_1 PIN_C1 // (out) #define DIG_2 PIN_C2 // (out) #define DIG_3 PIN_C3 // (out) #define INI_TRIS_A_VAL 0x0F // 7:x 6:x 5:out 4:out 3in 2:in 1:in 0:in #define INI_TRIS_B_VAL 0x00 // 7:out 6:out 5:out 4:out 3out 2:out 1:out 0:out #define INI_TRIS_C_VAL 0x80 // 7:in 6:out 5:out 4:out 3:out 2:out 1:out 0:out int ct;//数字の更新間隔 long val;//表示する数字 int digit;//表示する桁 //表示パターン int segment_data[]={0x81,0xF3,0x49,0x61,0x33,0x25,0x05,0xF1,0x01,0x31}; char st[4]; void main() { float ata1,data2,data3,data4; long data5; long val; SET_TRIS_A( INI_TRIS_A_VAL ); SET_TRIS_B( INI_TRIS_B_VAL ); SET_TRIS_C( INI_TRIS_C_VAL ); setup_adc_ports(AN0_AN1_VSS_VREF); setup_adc(ADC_CLOCK_DIV_32); //Fosc/32 最高速度 digit=0; ct=1;//数字を更新する周期 val=0;//表示する値 while(1) { output_low(RESERVE2); //動作ランプ //////////////////////電圧測定///////////////////////////////// set_adc_channel(0); delay_us(50); //アクイジションタイム待ち(マイクロ秒) data1 = read_adc(); //AD変換結果読み込み printf("ADC V %9.3f \r\n", data1 ); //AD変換データ表示 data2 = (data1 * 4.959695) / 1024; //BCDに変換 printf("Volt %6.3f \r\n", data2 ); //変換データ表示 data5 = data2 * 1000 ; //data2を整数に変換 val = data5 ; printf("val %ld \r\n", val); //整数にし表示 /////////////////////7SEG表示////////////////////////////////// ct --; if(ct == 0){//数字の更新 st[3]=val/1000; //4桁目数値取り出し st[2]=val/100-st[3]*10;//3桁目数値取り出し st[1]=val/10-((st[3]*100)+(st[2]*10));//2桁目数値取り出し st[0]=val%10;//あまり val++; if(val==1000) val=0; ct=20; } if(digit== 3){//第4桁の表示 output_b( segment_data[st[3]]); output_bit(DIG_0,1);  //4桁表示開始 output_low(LED_DP);  //小数点表示  delay_us (5); //表示期間(ミリ秒) output_bit(DIG_0,0); //表示を消す output_high(LED_DP); //小数点を消す delay_us(50); //待ち(マイクロ秒) } if(digit== 2){ output_b( segment_data[st[2]]); output_bit(DIG_1,1); delay_ms (5); output_bit(DIG_1,0); delay_us(50); } if(digit== 1){ output_b( segment_data[st[1]]); output_bit(DIG_2,1); delay_ms (5); output_bit(DIG_2,0); delay_us(50); } if(digit == 0){ output_b( segment_data[st[0]]); output_bit(DIG_3,1); delay_ms (5); output_bit(DIG_3,0); delay_us(50); } digit ++;//表示桁を変更 if(digit ==4 ) digit=0; } }