FC2カウンター FPGAの部屋 2006年02月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Verilog-HDLで書いてみた

VHDLで書いてあるものをVerilog-HDLで書き直している。
VHDLではこう書いてある。


type sftd_2dvec IS ARRAY (3 downto 0) of std_logic_vector(7 downto 0);
type shiftin is array (3 downto 0) of std_logic;
signal sreg_out : sftd_2dvec;
signal shtin : shiftin;


GSREG : for K in 3 downto 0 generate
 process(reset, clk) begin
  if reset='1' then
   sreg_out(k) <= (others => '0');
  elsif clk'event and clk='1' then
   if sreg_ena = '1' then
    if all_sreg_load='1' then -- Load
     sreg_out(k) <= sreg_in(k);
    else -- shift
     sreg_out(k)(7 downto 1) <= sreg_out(k)(6 downto 0);
     sreg_out(k)(0) <= shtin(k);
    end if;
   end if;
  end if;
 end process;
end generate GSREG;


これをVerilog-HDLでこう書いたらエラー。

reg [7:0] sreg_out [3:0];
reg [3:0] shtin;


always @(posedge clk or posedge reset) // shift register
 for(i=0; i<4; i=i+1)
  if(reset)
   sreg_out[i] <= 8'h0;
  else if(clk)
   if(sreg_ena)
    if(all_sreg_load)
     sreg_out[i] <= sreg_in[i];
    else begin
     sreg_out[i][7:1] <= sreg_out[i][6:0];
     sreg_out[i][0] <= shtin[1];
    end


改定 入門Verilog HDL記述の61ページに”レジスタ配列ではビット選択や部分選択はおこなえない”と書いてあった。なんと不便な!!
ちょっとむっとしたが回避策を取る。
wire [7:0] temp0, temp1, temp2, temp3;を宣言して、

assign temp0 = sreg_out[0];
assign temp1 = sreg_out[1];
assign temp2 = sreg_out[2];
assign temp3 = sreg_out[3];

always @(posedge clk or posedge reset) // shift register
 for(i=0; i<4; i=i+1)
  if(reset)
   sreg_out[i] <= 8'h0;
  else if(clk)
   if(sreg_ena)
    if(all_sreg_load)
     sreg_out[i] <= sreg_in[i];
    else begin
     case(i)
      0: sreg_out[i] <= {temp0[6:0], shftin[1]};
      1: sreg_out[i] <= {temp1[6:0], shftin[1]};
      2: sreg_out[i] <= {temp2[6:0], shftin[1]};
      default: sreg_out[i] <= {temp3[6:0], shftin[1]};
     endcase
    end


こう書いた。これでいいのだろうか?とりあえずエラーはなくなったが。。。
どうなんだろうか?あまりレジスタ配列は使わない方がいい?
レジスタ配列でのビット選択や部分選択はVerilog 2001ではOKと本には書いてあるが、XSTが対応していないのだろうか?
ぜひ対応してもらいたい。

  1. 2006年02月28日 11:58 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

ISE8.1のXST

ISE8.1で論理合成しようとしているがどうもおかしいようだ。
前にもおかしいということを書いたが、ISE6.1とISE7.1のXSTで論理合成してエラーが出ていないがISE8.1で論理合成しようとするとエラーが出てしまう。

library ieee;
use ieee.std_logic_1164.all;
library work;
use work.lpm_pack.all;
use work.pipe_reg_pack.all;

entity id_ex_reg is
 generic(
  depth : integer := 13;
  width : integer := 8);
 port(
  data : in std_2dvec_idex;
  clk : in std_logic;
  enable : in std_logic := '1';
  aclr, aset : in std_logic := '0';
  shift_reg : in std_logic := '0';
  shift : in std_logic := '0';
  shift_in : in std_logic_vector(width-1 downto 0);
  sclr : in std_logic := '0';
  q : out std_2dvec_idex;
  shift_out : out std_logic_vector(width-1 downto 0));
end id_ex_reg;

というようなentityの部分なのだがwidthにgenericのところで8を入れられているはずなのだが、
has two possible definitions in this scope.
というエラーが出てしまう。ここに2つの定義があるというような意味だろうと思うが、これではだめなのか?
width-1の部分を7にするとエラーが無くなる。
なんか、ISE8.1のXSTは相当変更があるような感じである。ずっとこうなるんだったらVHDLの書き方を変えなければならないかな???

----------------
家のパソコンでは上のようにだめだったが、職場の購入ISE8.1でプロジェクト変換しコンパイルしたら正常に論理合成できた。家に帰ったら原因を調査してみる。

大変失礼しました。ガセビアになってしまいました。
家のプロジェクトにはlpm_pack.vhdが入ってませんでした。
入れたら正常にに論理合成できました。お騒がせしてすみません。
たーぼさんこれに懲りずにまたコメントお願いします。

2/28
寝るのに布団に入ってから、どうもおかしいのに気が付いた。
lpm_pack.vhdはアルテラを使っていた名残でLPMをVHDLで作って使っていた時のもの。dffenaやshiftreg等のcomponent宣言しか入っていないはず。それなのにエラーが出るのはおかしい。
正常に論理合成できるプロジェクトのuse work.lpm_pack.all;をコメントアウトしてやってみたが、思い通りに論理合成できた。何か他にもどこかおかしかったようだ。これ以上の原因追求は前のプロジェクトを捨ててしまったので終わりとする。
  1. 2006年02月26日 12:35 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

エーデルワイス・スキー場に行ってきました

今日はエーデルワイス・スキー場に行ってきました。
今日はとてもいい天気。スキー日和だった。
が、とてもいい天気なので暖かかった。という訳で人工スキー場でもあるので、日陰はアイスバーン、日向は腐れ雪、木陰はザラメだった。日向に行くと抵抗が大きくなるので前につんのめりそうになる。(これもしかして方言?)
上級者コースのこぶバーンに行ったが、やはり子供がだめでスキー板を脱がして、オシリすべり、親は横滑りになってしまった。やはり小1ではまだだめだ。でも中一のおねえちゃんは下まで滑っていった。いつの間にうまくなったの??
帰りは鬼怒川温泉の岩風呂に入って帰ってきた。
ski_060225.jpg

  1. 2006年02月25日 22:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ソーテックのデスクトップパソコン

ソーテックのデスクトップパソコンが来たので昨日セットアップした。
まずはキーボードを取り出す。黒いキーボードでなかなかかっこいい。キータッチも軽くて、まるで昔の富士通のキーボードのようで好きだ。キーボードだけ私もほしい。
sotec_1_060224.jpg

本体は銀色と黒でかっこいい。白のパソコンしかかったこと無かったので新鮮だ。
まずはノーマル状態でセットして電源を入れてみる。お決まりのプレインストールWindowsの手続きをしてWindowsが起動。
なんじゃこれ、ISPのアイコンだらけ。やれNiftyやDIONやNTTや。。。がっかり何もアイコンないと思っていたのに。これをまずはアンインストール。これが大変。
アンインストールしてもデスクトップにアイコンがまだ張り付いている。しつこい!!
ISPのアイコンをゴミ箱に入れた。
とりあえずこれでパソコンを開けてハードウェアの増設。
中を開けると案外すっきり。IDEコネクタとDVDドライブ、HDDの位置がいいのでケーブルが這い回らない。DIYパソコンとは違う?ソーテックをここで少し見直す。マザーもどこのメーカーかは確認しなかったがしっかり作ってありそう。
メモリが256MByteしかないので、333MHzだが後256MByte増設。400MHzと333MHzなので333MHzになるが、少ないよりは良いだろう。
ディスプレイがDVI入力なのでDVI出力のグラフィックカードをAGPソケットに追加する。ブランクブラケットではなく、きりかけるようなただの鉄板なのでねじが付いていない。ねじは手持ちので止める。
これでふたを閉め、電源ON。今度は拡張グラボからアナログディスプレイに接続。DVI出力はドライバをインストールしていない状態ではでなかった。
グラボのドライバをインストール、再起動、DVI入力ディスプレイも使えるようになる。
次にソフトのインストール。
いつもお世話になっているPixiaをインストール。
順次、OpenOffice.org, FireFox, avast4, spybot, 娘はタブレット持っているのでワコムの関連ソフトをインストール。
大体終了。自分のPen4 1.7GHzよりだいぶ早い模様。39,990円とはだいぶパソコンも安くなったもんだ。壊れたDELLパソコンは30万円以上したっけ。
最後に前のカバーを開けてみたら、USBコネクタとマイク、ヘッドフォン端子があった。これで前からヘッドセットつなげる。便利だ。
sotec_2_060224.jpg

  1. 2006年02月24日 06:47 |
  2. パソコン関連
  3. | トラックバック:2
  4. | コメント:2

ISE6.3iからISE8.1iへの移行

ISE6.3iからISE8.1iへの移行しようとしているが、どうもおかしい。
プロジェクトをISE8.1iに変換して論理合成すると途中で何のワーニング、エラー、コメントも出ずにISEが止まってしまう。
パソコンは正常なのだが、そのプロジェクトが論理合成できない。その他のプロジェクトは正常に論理合成、インプリメント、基板にダウンロード正常動作できるのもある。
やはり、日本語のコメントを大量に使っているせいか?
6月に出るというISE8.2iを待つことにする。

---------------------------------
2月27日
日本語をすべて削除してやってみたが結果は同じだった。
TopのVHDLファイルをCheck Syntaxすると正常終了しチェックがつくが論理合成させようとすると途中で止まる。
  1. 2006年02月23日 17:50 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

パソコンを買いました。

この前古いパソコンが壊れた話をしたが無いと困るのでYahooショッピングで一番安いソーテックのパソコンを買った。
http://store.yahoo.co.jp/sotec/4510884141493.html
今日届くと連絡があったが届かない。やはりソーテックなのか?
ネットを検索するとサポートの悪さを書いたサイトが良くある。
ちょっと心配だが、サポートは余り使わずに部品はあるので交換することにしようと思っている。そのためにというか安いからだからAGP、パラレルATAのパソコンだ。過去のディスクやグラフィックボードが入れられる。
明日は来ることを期待しよう。
仕事は相変わらず回路図フィックスが終わらない。RocketIOは基板の層数が多く、値段が高いのでLVDSチップに変更になってしまった。ちょっと残念ではあるがしょうがない。でもこれで前の回路の改造が少なくて済むのでより早く動作する様になることであろう。

パソコン来ました。10時頃。箱あけただけでセットアップは明日ですね。一部仕様と違ってDDR400だと思ったらYahooショッピングの表示が間違っていますね。
256MB PC3200 DDR SDRAM 333MHz 184pin DIMM
PC3200はDDR SDRAM 400MHzですね。良いほうに間違っているので良しとします。
  1. 2006年02月22日 21:40 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:2

ISE8.1iのエディタで日本語を表示する方法

あるところでISE8.1iのエディタで日本語を表示する方法を教えてもらいました。
Xilinxのアンサー#22843です。
http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&iCountryID=1&getPagePath=22843
手順はこれです。

1.これを読んでunicode.zipをダウンロードする。
2.中に入っているlibSciEdit.dllとlibSed_Tqui.dllをISEのインストールディレクトリのbin\nt\の同じDLLと入れ替える。
3.次にISEを起動すると日本語がISEエディタで見える。

これで一段と使いやすくなったが、日本語コメント入っていていつでもちゃんと論理合成出来るかが不安だ。
  1. 2006年02月20日 23:00 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

パソコンが壊れた

今日はパソコンのお掃除をしてたら、娘のパソコンが壊れてしまった。
娘のパソコンは440BXチップセット、SDRAM100MHz、ペンティアム2スロット1の古いパソコンだが、CPUソケットが付いているアダプタ基板を入れてセレロン800MHzを入れてあって、そこそこ使えてたのだが、掃除をしていたら壊れてしまった。
考えるにCPUファンの下のフィンのところにゴミが溜まっていたため、楊枝で掃除していたが、電圧を設定する設定ピンを浮かせてしまったようだ。途中で止まって知ったので、あけて見たら熱くなっていてお亡くなりになったようだ。ちゃんと動いていたのに残念でならない。
パソコンショップに行ってみたらFSB100MHzのプロセッサはあるはずもない。残念ながら廃棄だ。
もったいない、掃除しなければ良かった。
いま、前についていたペンティアム2に付け替えてもブートしなかったのでマザーもどこかおかしいらしい。
今日一日無駄にしてしまい非常に悔しい思いをしてしまった。
  1. 2006年02月19日 20:55 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:0

シリアルインターフェース(RS-232C)の説明

人知れずにあった私のホームページの内容を移しています。
今度はシリアルインターフェース(RS-232C)の説明です。本当はHDLコードを示して説明しようと思っていたのですが、そのためには書き直さないといけないようなので、とりあえずあきらめました。

シリアルインターフェースの(RS-232C)説明をします。パソコンについているシリアルインターフェースの規格はRS-232Cという規格で、調歩同期方式になっています。調歩同期はスタートビット、データビット、ストップビットを持っています。ここでは、データ8ビット、1ストップビットの場合について説明します。この後、シリアルインターフェースはRS- 232C用のシリアルインターフェースの規格とします。
 RS-232Cの信号規格はTTLレベルではありません。そこで、レベル変換のICが必要になります。評価基板ではSP3222EHがレベル変換のIC です。レベル変換ICはTTLレベルをRS-232Cの信号レベルに相互変換します。図1がTTLレベルでのシリアルインターフェースの信号です。

serial_signal1_060218.jpg

図1 シリアルインターフェースの信号

1ビット分の長さは、ビットレートによって変わります。スタートビットの長さ(1ビットの長さ)は、(1/ビットレート)になります。例えば9600bps(bit par second)の1ビット分の長さは、約104usecです。データ8ビットを送信する場合は、スタート1ビット、データ8ビット、ストップ1ビットの合計10ビットなので、1ビットが約104usecとすると、約 1.04ms必要です。つまり、2ビット分(スタート、ストップビット)が余計に必要なので、実際のスループットは最大9600X0.8=7680 (bps)になります。これらのオーバヘッドは、大体の通信手順にはつき物です。カタログ値と実際の値のようなもので、通信スピードを比べるときには、オーバーヘッドを除いた値を比べなくては正確ではありません。
図1を元にシリアルインターフェースの通信手順を説明します。通常の状態では信号は1に固定されています。データを送信する場合に、送信側が1から0にドライブし、スタートビットを送出します。スタートビットの長さは1ビット分の長さ(1/ビットレート、9600bpsだと104usec)です。その後にデータビットが続きます。データビットは下位桁から送出します。例えばAというキャラクタはアスキーコードで0x41です。ビット列にすると01000001になります。このビット列を下位桁から送出するので、送り出す順番は10000010になります。(図1参照)当然、1ビット分の長さは、9600bpsですと 104usecです。その後に、1ビット分のストップビットを送出します。ストップビットは1ビット分の1の信号です。これで1つのデータ単位の出力が終わりました。もっと、送り出すデータがある場合には、ストップビットの次に次のデータのスタートビットが来ても大丈夫です。

それでは、同期するクロックがない状態で、どのようにデータをサンプルするのでしょうか?
それは、ビットレートの何倍かのクロックでデータをサンプリングします。大体の場合は、16倍とか8倍とかでしょうか。64倍という場合もあります。何倍かによって、受信データのビットレートの狂いにどのくらい耐えられるかが決まります。

serial_signal2_060218.jpg

図2 シリアルインターフェースの信号(スタートビット、データビット1ビット目拡大図)

図2は8倍のクロックを使用したシリアルインターフェース受信回路の例です。シリアルインターフェース受信回路はデータラインが0になるのを監視しています。0になったのを検出してから、3クロック分カウントしたところで、もう一度0になっているかどうかを確認します。この動作で、ひげ状のノイズでの誤動作を防ぐことが出来ます。ここで0のままであれば、スタートビットが来たと認識し、データの受信がスタートします。スタートビットを確認した位置から8クロックを数えた所がデータビットの1ビット目をサンプルするタイミングです。サンプリングしたデータラインが1か0かで、データビット1ビット目の値が決まります。その後、また8クロック数えて2ビット目のデータをサンプリングします。
というように、8ビット目まで、データをサンプリングします。その次が、ストップビットですが、同様にデータビットの8ビット目から8クロック数えてサンプルした値がストップビットの値になります。そのサンプルしたストップビットの値が0の時は、フレーミングエラーになります。これは、ストップビットであるべきところがストップビットでなかったということです。
また、データビットの後にパリティビットがあることがあります。その場合は、データのパリティを計算して、パリティビットの値と合わない場合はエラーとなります。
私の設計したシリアルインターフェースモジュールは、フレーミングエラーとパリティエラーは実装してありません。

以上が受信の場合ですが、送信の場合は、8倍のクロックを使用している場合は、8クロックごとにスタートビット、データビット、ストップビットの順でデータを出していけばOKです。後は受信側が今まで説明したように受信してくれます。
  1. 2006年02月18日 09:50 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

回路図入力大詰め

新しい基板の回路図入力が大詰めに来ている。
現在も家にいるが、OrCADを使っている研究室の院生とSkypeでやり取りして回路をつめている。もう少しで入力が終わりそうだが、DRCでだいぶエラーが出るだろう。コンデンサなどのシンボルもいい加減にやっているので、種類別にしなくては。。。
設定ピンもどっちのレベルにしていいか迷うのは、設定ピンか0オーム抵抗をつけておくことにする。
0オーム抵抗も1005では変更大変なので1608にしようと思う。どっちもゴミだが、まだましだ。
まだ部品が手配できていないのもあるし、特に32ビット、512Mbitの2.5V動作SDR SDRAMを手に入れるのが大変そうだ。
  1. 2006年02月16日 22:49 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:0

漫画

もう4捨5入すると50歳だが、昨日はやっとチュートリアルが終わったので、気分転換に漫画を買った。古本屋で一冊150円だったので、前から買おうと思っていたヒカルの碁を7巻まで買った。
結構面白かったので夢中で読んでしまった。多分そのうち全巻買ってしまうだろう。
最近の漫画は面白いのが少ないが、(年のせい)好きな漫画もある。
シリーズで持っているのは頭文字D、太郎、風の大地、ガッデム、バリバリ伝説などである。これらはシリーズで全部ある。
好きな漫画家は今は持っていないが村上もとかだった。赤いペガサスは全巻持っていたが、なくなってしまった。
  1. 2006年02月13日 22:28 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

チュートリアル終了

今回の土日はずーとチュートリアル書いていた。途中で投げ出したくなったが、終わらないと気ががすまない気持ちになって一気に書いてしまった。
今度からは自分が書きたいままを書こうと思った。
今度のチュートリアルもアルテラしかやったことの無い人には良いかもしれない。ブログだと順序が逆になるので、ホームページに後でまとめておくことにする。

前にもアナウスしたが技術発表会を行うので、近くの方でこられる方ぜひどうぞ。
ロボットスーツ HALで有名な山海教授が特別講演を行うので、これだけでも価値はあると思う。ただし、FPGA関連の発表は私しかいない。いろんな分野があるので自分の分野でなければわからないかもしれない。
私もポスターを作らなければ。(たいしたもんじゃないけど)
http://www.tech.tsukuba.ac.jp/2005/index.html
  1. 2006年02月13日 06:47 |
  2. 日記
  3. | トラックバック:1
  4. | コメント:0

スパルタン3スタータキットでのISE8.1iのチュートリアル8(コンフィギュレーション編続き)

さてやっと最後のコンフィグROMへのコンフィギュレーション編だ。
右上のFlowsペインでPROM File Formatt...をダブルクリックするとiMPACT - Prepare PROM Filesウインドウが開く。I want to target aをXilinx PROM、PROM File FormatをMCSにラジオボタンをクリックする。これはディフォルトなのでいじらなくても大丈夫。PROM File Name:をledtestと入力する。Next>ボタンをクリック。
ISE81i_54_060211.png


iMPACT - Specify Xilinx PROM Deviceウインドウが開く。Select a PROMにxcf02sを選択して、Addボタンをクリックする。そうすると下の箱にxcf02sが表示される。Next>ボタンをクリックする。
ISE81i_55_060211.png


iMPACT - File Generation Summaryウインドウが開く。ここではFinishボタンをクリックする。
ISE81i_56_060211.png


Add Deviceダイアログが出てくるのでOKボタンをクリックする。
ISE81i_57_060211.png


Add Deviecダイアログが出てくるのでxcf20sに格納するコンフィギュレーションファイル(.bit)を選択する。ledtest.bitを選択して”開く”ボタンをクリックする。
ISE81i_58_060211.png


他のデバイスのファイルを入れるかどうか聞いてくるのでNOボタンをクリックする。
ISE81i_59_060211.png


これで終了なのでダイアログのOKをクリックする。
ISE81i_60_060211.png


左のiMPACT ProcessesペインのAvailable Operations are:の→Generate FileをダブルクリックするとMCSファイルが生成される。
ISE81i_63_060211.png


今度は生成したMCSファイルをxcf02sへ書き込んでみよう。
FlowsペインのBoundary Scanをクリックする。そうするとxc3s200とxcf02sの絵が出てくる画面に戻るので、xcf02sを右クリックする。メニューが出てくるのでメニューの一番下、Assign New Configuration FIle...を選択する。Assgin New Configuration Fileダイアログが出るのでledtest.mcsを選択する。
ISE81i_64_060211.png


xcf02sにledtest.mcsファイルが表示される。
ISE81i_65_060211.png


xcf02sを選択し、左のiMPACT ProcessesペインのAvailable Operations are:の→Programをダブルクリックする。
ISE81i_66_060211.png


Programming Propertiesダイアログが開く。VerifyとErase Before Programmingにチェックが入っているはずだ。そのままにしてOKボタンをクリックする。
ISE81i_67_060211.png


Progress Dialogが表示され、コンフィギュレーションが始まる。
ISE81i_68_060211.png


成功すると、Program Succeededが表示される。
ISE81i_69_060211.png


これでコンフィギュROMのコンフィギュレーションが出来たので基板のMO,M1,M2を全てショートするとコンフィギュROMのコンフィギュレーションデータがブートの時にFPGAにロードされて、ゲーム?が立ち上がる。

どうだったろうかわかりやすかっただろうか? ためになっただろうか?
これにてチュートリアルは終了とする。疲れた!!!
  1. 2006年02月12日 11:30 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

スパルタン3スタータキットでのISE8.1iのチュートリアル7(コンフィギュレーション編)

今度はデバイスのコンフィギュレーションだ。JTAGからのコンフィギュレーションとXilinxのXCF02、コンフィグROMへ書き込み方法の2回になると思う。
まずは皆さんスパルタン3スタータキットのMO,M1,M2の設定ピンは全てショートしているのであろうか?全てショートしている場合はコンフィグROMからブートである。M0オープン、M1ショート、M2オープンがJTAGからのコンフィギュレーションだ。MO,M1,M2の設定ピンは全てショートしている状態でもJTAGからコンフィギュレーションすることが出来る。

さて最初にProcessesペインからConfigure Device(iMPACT)をダブルクリックする。
ISE81i_46_060211.png


iMPACTウインドウが開く。JTAGのラジオボタンがチャックされているので、そのままFinishボタンをクリックするとバウンダリスキャンできるFPGAやXilinx ROMを検索してくれる。
ISE81i_47_060211.png


xc3s200(スパルタン3)とxcf02s(コンフィギュROM)が見つかる。Assign New Configuration Fileウインドウが開く。最初はxc3s200へコンフィギュレーションするファイルを選ぶのでledtest.bitを選択しOpenボタンを押す。
ISE81i_48_060211.png


次にスタートアップクロックがJTAGクロックじゃないとワーニングが出るが、そのままOKをクリックする。
ISE81i_49_060211.png


次にxcf02sのコンフィギュレーションファイルを選ぶがこれはまだ作ってい以内のでBypassをクリックする。そうすると下の図のようになる。
ISE81i_50_060211.png


ここはISE8以前とだいぶ違うが、xc3s200をクリックして、右下のiMPACT Processesペインの→ProgramをダブルクリックするとProgramming Propertiesウインドウが開く。
ISE81i_51_060211.png


OKボタンをクリックするとスパルタン3のコンフィギュレーションが始まる。
ISE81i_52_060211.png


プログレスバーが100%になるまで待ち、成功すると下図のような画面が出る。
ISE81i_53_060211.png


これでコンフィギュレーション終了。
この状態では全てのLEDは0を表示しているはずだ。
btn0を押している間に8.が移動して離すと止まるはずだ。
下の写真はbtn0を押している所だ。
ISE81i_tut_1_060211.jpg


btn0を離すと8.が任意の位置で止まる。
ISE81i_tut_2_060211.jpg


最後におまけ。スパルタン3スタータキットはこのようなアタッシュケースに入っている。これはケコムのDS用ケースを加工してぴったり入るようにしてあるのだ。
ISE81i_tut_3_060211.jpg

  1. 2006年02月11日 17:42 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

スパルタン3スタータキットでのISE8.1iのチュートリアル6(インプリメンテーション編続き)

次回はコンフィギュレーション編だがその前のインプリメンテーションのチップスを1つ。
UCFファイルで指定した動作周波数を確保できない時はどうするか?
HDLを見直すのが良いが、ISEに頑張ってもらう時はどうするかを説明しようと思う。
まずはProcessesペインのSynthsize - XSTを右クリックしてメニューのProperties...を選択する。
ISE81i_42_060211.png


Process Propertiesウインドウが開く。まずは右下のProperty display level:をStandardからAdvancedに変更してください。Optimization EffortがNormalになっているのでこれをHighにする。これをHighにすると論理合成に時間がかかるようになります。
ISE81i_43_060211.png


Implement Designをを右クリックしてメニューのProperties...を選択する。Process Propertiesウインドウが開く。まずは右下のProperty display level:をStandardからAdvancedに変更してください。CategoryペインのMap Propertiesを選択し、右側のOptimization Strategy(Cover Mode)をAreaからSpeedに変更する。これにするとFPGAのリソースを余計に消費するようになる。
ISE81i_44_060211.png


今度はCategoryペインのPlace & Route Propertiesを選択して、右側のPlace & Route Effort Level (Overall)をStandardからHighにする。こうするとPlace & Routeに時間がかかるようになるが一般的に結果が良くなる。
ISE81i_45_060211.png


今回の回路ではこのような設定をする必要がまったくないが、複雑な回路で動作周波数が高い場合には必要になる場合がある。
  1. 2006年02月11日 09:03 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:1

スパルタン3スタータキットでのISE8.1iのチュートリアル5(インプリメンテーション編)

今度はインプリメンテーション編だ。
まずはSourcesペインのSources for:のプルダウンメニューをSynthesis/Implementに戻そう。
最初にSynthesisをしよう。
1.SourcesペインでトップのLedTestをクリックする。
2.ProcessesペインのSynthesize - XSTをダブルクリックする。
ISE81i_30_060209.png


ProcessesペインのSynthesize - XSTを展開する。View RTL Schematicをダブルクリックして論理合成後の回路を見てみよう。ここで意図した回路になっていなければ、どこかがおかしいはずである。
ISE81i_31_060209.png


箱をダブルクリックすると下の階層が開いていく。SourcesのLedTestを展開して下位モジュールをクリックすると右の回路図で該当の回路モジュールが赤で示される。これで目的の回路になっているかどうかを確認する。
ISE81i_32_060209.png


目的の回路が出来ていれば、回路図ファイルを閉じて元に戻そう。今度はUCFを作成する。初めにタイミング制約を作ろう。
スパルタン3スタータキットの水晶発信器は50MHzなので周期は20nsになる。このクロック周期で動作するように制約を書ける。タイミング制約はProcessesペインのUser Constraintsを展開してCreate Timing Constrainsをダブルクリックする。
UCFを作ってプロジェクトに入れるというダイアログが出るからYesボタンをクリックする。
ISE81i_33_060209.png


Constraints Editorが起動する。真ん中のペインのclkの行のPeriod内をダブルクリックする。Clock Periodを入力するダイアログが開く。クロックは50MHz, 20nsなのでSpecify TimeのTime:に20 nsを入力。デューテー比は50%なのでTime HIGH:を50%にする。OKボタンをクリックする。
ISE81i_35_060210.png


Periodフィールドに”"20ns HIGH 50%"の制約が入る。
ISE81i_34_060209.png


Constraint EditorでFileメニューからSaveを選んででセーブ。そうするとSourcesペインの一番下にLedTest.ucfファイルがいるのがわかると思う。
ISE81i_36_060210.png


出来上がったLedTest.ucfを見てみよう。ProcessesペインのUser Constraintsの下のEdit Constraints (Text)をダブルクリックすると右にテキストのUCFファイルが表示される。それは下のようなものだ。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;


ISE81i_37_060210.png


今度はPACEでピンをアサインしよう。とりあえず作らなければいけないUCFを下に示す。上の2行はすでにConstraint Editorで作成済みだ。
UCFはピンの配置や動作周波数の指定、遅延の指定など制約を記述するファイルでXilinxのFPGAを使う際には必須のファイルだ。Constraint EditorもPACEもUCFを作成できるグラフィカルなツールである。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;

#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "btn<3>" LOC = "L14" ;
NET "btn<0>" LOC = "M13";
NET "clk" LOC = "T9" ;
NET "AN_n<3>" LOC = "E13";
NET "AN_n<2>" LOC = "F14";
NET "AN_n<1>" LOC = "G14";
NET "AN_n<0>" LOC = "D14";
NET "DP_n" LOC = "P16";
NET "G_n" LOC = "N16";
NET "F_n" LOC = "F13";
NET "E_n" LOC = "R16";
NET "D_n" LOC = "P15";
NET "C_n" LOC = "N15";
NET "B_n" LOC = "G13";
NET "A_n" LOC = "E14";


最初が#で始まる行はコメントになる。
最初の”NET "clk" TNM_NET = "clk"; TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;”はclkにPERIOD制約をかけていて、最大遅延20nsにしろということである。
次からの”NET "btn<3>" LOC = "L14" ;”はbtn<3>という信号をスパルタン3FPGAのL14番ピンにマップしろということである。これをそのままコピペしても良いのだが、PACEで作ってみる。途中までPACEでやってみて、あきたら残りをLedTest.ucfにコピペでも良い。
それではPACEを立ち上げてみよう。ProcessesペインのUser Constraintsの下のAssign Package Pinsをダブルクリックする。
ISE81i_38_060210.png


右側のウインドウの下のPackage Viewタブをクリックする。パッケージが表示される。左側のDesign Object List - I/O Pinsウインドウの一番左の青四角を右側のウインドウのパッケージの指定されたピンにドラックアンドドロップする。例えば上の表で言うとbtn<3>はL14ピンである。L14にドラックアンドドロップするとそのピンの色が青に変わる。
ISE81i_39_060210.png


この色も変えることが出来る。詳しくは”PACEの使い方2”を見てほしい。
FileメニューからSaveすると最初にBus Delimiterを聞いてくるのでXSTだったら最初のXST Default: <>ラジオボタンをクリックして、OKボタンをクリックする。
ISE81i_40_060210.png


ぜんぷピン番号を入れてセーブすると上の表のようなUCFが出来る。これは間違えないようにしてほしい。ボードが壊れる可能性もあると思う。(私は良くやっているがまだ壊れたことはない)出来たらPACEを終了する。
注意としては、btnは3~0までVHDLファイルではあるが、実際使っているのは3と0だけなので、2と1をPACEでアサインするとエラーになる。
これで準備は出来たので、インプリメンテーションを全部してみよう。
ProcessesペインのGenerate Programming Fileをダブルクリックすると、デザインをインプリメントしてスパルタン3にダウンロードするコンフィギュレーションデータまで作ってくれる。
真ん中のペインのDesign Overviewを見るといろんな情報が一覧できるようだ。これはISE7までには無かった便利な機能だ。例えばTiming Constraintsをクリックすると、20nsの制約に対して実際は5.864nsの最大遅延のようだ。これは約170MHzで動作できることになる。
ISE81i_41_060210.png


これでインプリメンテーション編を終わりにします。次はFPGAへのコンフィギュレーション編だ。
再三言っているがどんなことでも良いからコメントをよろしくお願いします。
何か一人相撲のような気がしてきた。
  1. 2006年02月09日 19:18 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:1

スパルタン3スタータキットでのISE8.1iのチュートリアル4(シミュレーション編)

やっと今度はシミュレーションだ。
シミュレーションのやり方を説明する前に私の取って置きのシミュレーションしやすいVHDLの書き方を説明しよう。(私のほうがうまくやっていると方ぜひ私に教えてほしい。私はそういう情報を求めている)
まずは、FPGAの動作周波数は50MHzとかだが、シリアルインターフェースやダイナミック点灯、スイッチ入力のようにKHzやHzオーダの入出力をシミュレーションする時に面倒くさい思いをしたことが無いだろうか?
例えば私の回路でのスイッチのサンプリング間隔は5ms、200Hzだが、これは水晶発信器の周波数50MHzの250万倍である。クロック1周期を250万回シミュレーションしないと1つスイッチイネーブルが出ないことになる。これでは気が長いし、ModelSimがメモリを食い尽くしてしまうかもしれない。
そこで、シミュレーションの時のみカウンタの分周比を変えてシミュレーションすると思うが、いちいちVHDLを書き換えるのが面倒である。そこでシミュレーションの時のみVHDLファイルを書き換えないで、小さい分周比に出来ると便利である。
私はそれをpragmaで実現している。
LedTest.vhdの152行目から155行目までの

-- pragma translate_off
generic map(
clk_frequency => 1)
-- pragma translate_on


と165行目から168行目までの

-- pragma translate_off
generic map(
clk_frequency => 4)
-- pragma translate_on


を見てほしい。
-- pragma translate_offでここから論理合成ツールの解釈を停止して、-- pragma translate_onで論理合成ツールの解釈を開始する。つまりその間はシミュレーションツールのみVHDL文を解釈する。
シミュレーションの時はclk_frequencyに1又は4が入るが、インプリメンテーション時はそれが無視されてディフォルトの50000が入る。
という訳で同じファイルでシミュレーションの時とインプリメンテーションの時の分周比を変えることが出来る。それを頭に置いてシミュレーションの結果を見てほしい。

それではProcessesウインドウのModelSim Simulatorを展開してSimulate Behavioral Modelをダブルクリックする。
ISE81i_23_060208.png


ModelSimが立ち上がりコンパイル、シミュレーションしてwaveウインドウで結果を表示する。btnを展開し、Zoom Fullアイコンをクリックしてシミュレーション全体をwaveウインドウに表示してみよう。
ISE81i_24_060208.png


今のままでは一番上のLedTest.vhdのentityでport宣言した信号しか見えない。信号を入れてみよう。Workspace(stracture)ペインでuutをクリックする。そうするとLedTest.vhdでsignal宣言した信号がすべてObjects(Signals)ペインに表示される。そこでcsを選んでみよう。これはステートマシンのcurrent stateだ。これをwaveペインの空いている所にドラックアンドドロップする。sw_enaも同様に入れてみよう。
次にWorkspace(stracture)ペインでssegdispiを展開してfreqdviをクリック。Objects(Signals)ペインからlighting_enaを同様にwaveペインの空いている所にドラックアンドドロップする。
ISE81i_26_060208.png


ピンク〇で囲んだRestartアイコンをクリックするとRestartウインドウが開くのでRestartボタンをクリックするとリスタートする。
ISE81i_27_060208.png


ピンク〇で囲んだRun -Allアイコンをクリックするとシュミレーションを行う。waveタブを押して波形を見ると追加した信号も波形が見える。
ISE81i_28_060208.png


このwaveペインで現在表示している信号をセーブしてみよう。FileメニューからSaveを選ぶと、Save Formatウインドウが開く。ディフォルトのwave.doという名前でセーブしてみよう。OKボタンをクリックする。
ISE81i_29_060208.png


これでwaveに表示する信号名がwave.doファイルにセーブされた。
次に、ModelSimの一番下のTranscriptペインを一番前にしてみるとdo ledtest_tb.fdoと書かれていてledtest_tb.fdoというスクリプトファイルを実行しているのがわかる。
ISE81i_25_060208.png


何らかのエディタでledtest_tb.fdoを見ると

## NOTE: Do not edit this file.
## Autogenerated by ProjNav (creatfdo.tcl) on Wed Feb 08 19:54:12 東京 (標準時) 2006
##
vlib work
vcom -explicit -93 "freqdiv.vhd"
vcom -explicit -93 "b27segdec.vhd"
vcom -explicit -93 "swdiv.vhd"
vcom -explicit -93 "ssegdisp.vhd"
vcom -explicit -93 "LedTest.vhd"
vcom -explicit -93 "ledtest_tb.vhw"
vsim -t 1ps -lib work ledtest_tb
do {ledtest_tb.udo}
view wave
add wave *
view structure
view signals
run -all


こんな感じだ。
vlibでライブラリをつくり、vcomでコンパイル、vsimでシミュレーション開始、viewでwaveウインドウを開けて、add waveでwaveウインドウに信号名を追加、structure、signalsウインドウを開けて、runでシミュレーション開始、という具合である。詳しいことはModelSimのマニュアルを見てほしい。
ledtest_tb.fdoの中のadd wave *do {wave.do}に変更して、名前をledtest_tb.doに変更してセーブしよう。
ModelSimの一番下のTranscriptペインのコマンドラインから"do ledtest_tb.do"とコマンド入力してみよう。
そうすると、もう一度コンパイル、シミュレーションしてくれる。終了したらVHDLソースが右側に表示されているので、waveのタブをクリックしてwaveペインにフォーカスするともう一度シミュレーション波形が見えるはずだ。これはISEでVHDLソースを変更してもその変更がシミュレーションに反映される。
かくして、お手軽にModelSim単体で使用することが出来る。
更にwaveペインの右上の×の隣の○→アイコンをクリックするとundockしてwaveウインドウになるので見るにはそっちが良いだろう。

どうだっただろうか、ためになっただろうか。いろんなコメントをどしどしください。何かもっといい方法があったらぜひ教えてください。皆さんとお話しするのにブログを書いているようなものなのである。
更に書きたいやり方もあるがもう大変になったのでここらでシュミレーション編は終了とする。気力が充実したらインプリメンテーション編を書くことにする。何しろまだこのままではスパルタン3スタータボードで動作しない。
  1. 2006年02月08日 19:06 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:2

スパルタン3スタータキットでのISE8.1iのチュートリアル3(シミュレーション準備編)

スパルタン3スタータキットでのISE8.1iのチュートリアル3はシミュレーション準備編になってしまった。なかなかシミュレーションまで到達しない。尚、このチュートリアルではVHDLの説明は省いている。
スパルタン3スタータキットでのISE8.1iのチュートリアル1(導入編)を見てVHDLを書いても良いが、ソースをここに置いておくので参考にしてください。
これからはそのソースを使うものとして説明する。
まずは5つのVHDLソースファイルをledtestフォルダにコピーする。せっかく作ったLedTest.vhdがもったいない方は、書いていない部分だけコピーしてください。
LedTest.vhdはすでにプロジェクトに登録されているので、その他の4つのVHDLファイルをプロジェクトに登録しよう。
PorjectメニューからAdd Source...を選択する。
ISE81i_12_060207.png


LedTest.vhdを除く、b27segdec.vhd, freqdiv.vhd, ssegdisp.vhd, swdiv.vhdを選択し”開く”ボタンをクリック。
ISE81i_13_060207.png


Adding Source Files...ダイアログが開くのでOKボタンをクリック。
ISE81i_14_060207.png


これで全部のVHDLファイルが入った。LedTest.vhdの最初に日本語のコメントがあるとうまく階層がISEに認識されないことがあるようだ。
ISE81i_15_060207.png


ProjectメニューからNew Source...を選択。New Source Wizard - Select Source TypeウインドウからTest Bench WaveFormを選択してFile name:にledtest_tbと入力し、Next>ボタンをクリック。
ISE81i_16_060207.png


New Source Wizard - Associate Sourceウインドウが開く。今から作るテストベンチledtest_tbをどのVHDLファイルに関連付けるかを指定してNext>ボタンをクリック。
ISE81i_17_060207.png


New Source Wizard - Summaryウインドウが開くのでFinishボタンをクリック。
ISE81i_18_060207.png


Initial Timing and Clock Wizard - Initialize Timingウインドウが開く。スターターキットの水晶発振器は周波数50MHz、周期20nsなので、Clock High Timeを10ns, Clock Low Timeを10ns, Input Setup Timeを7ns, Output Valid Delayを7nsにする。後はディフォルトのままFinishボタンをクリック。
ISE81i_19_060207.png


ISEにledtest_tbのテストベンチをタイミングチャートで設定するウインドウが開く。Zoom Inアイコンをクリックして拡大し、四角に+マークをクリックしてbtn[3:0]を展開する。
btn3がリセットなので最初に1にしてその後2?nsで0にしよう。波形の最初のところでクリックすると1になり、その次の青いフィールドでクリックすると0に戻る。
ISE81i_20_060207.png


次にbtn0を200ns位で1にして、600ns位で0にもどそう。これはそんなに厳密でなくてもいい。
ISE81i_21_060207.png


FileメニューからSaveする。SourcesペインのSources forのプルダウンメニューをBehavioral Simulationに切り替えて展開するとテストベンチのledtest_tbを頂点とした階層が見える。これでシミュレーションの準備は出来た。
ISE81i_22_060207.png


なかなかシミュレーションになれないが次回は書けると思う。
しかし、こう画像をキャプチャして書いていると大変。どうせならC○出版あたりで本にしてくれないかな。。。
冗談はさておき、今度のISE8.1iからはシミュレーションファイルをAdd SourceしてもSynthesys/Implementのペインには表示しないですっきりしているようだ。今までシミュレーション用のファイルはISEに入れていたことがないが、今回からは入れておいても良いかもしれないと思っている。

注意:今のledtestプロジェクトをインプリメントしてスパルタン3スタータキットにダウンロードすると動作しません。それはUCFファイルを書いていないのでピンの情報がないからです。スパルタン3スタータキットを壊す恐れがあるので絶対にやらないでください。実行して壊れたとしても責任はもてません。
  1. 2006年02月07日 20:56 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

スパルタン3スタータキットでのISE8.1iのチュートリアル2(プロジェクト作成)

今度はISE8.1iを立ち上げてプロジェクトを作るまでを説明しようと思う。
まずはISE8.1iを立ち上げる。FileメニューからNew Project...を選択する。
ISE81i_1_060206.png


New Project Wizard - Create New Projectウインドウが開くので、Project LocationでProjectを作るディレクトリを指定し、Project Name:をledtestと入力する。Top-Level Source TypeはトップのファイルがVHDLなのでHDLのままにする。Next>ボタンをクリック。
ISE81i_2_060206.png


New Project Wizard - Device Propertiesウインドウが開くのでFamily, Device, Package, Speed, Simulatorの部分を入力する。Next>ボタンをクリック。
ISE81i_3_060206.png


New Project Wizard - Create New Sourceウインドウが開く。トップファイルLedTest.vhdを作るためにNew Source...ボタンをクリックする。
ISE81i_4_060206.png


New Project Wizard - Select Source Typeウインドウが開く。VHDL Moduleを選択し、File Name:にファイル名LedTest.vhdを入力する。Add to Projectのチェックボックスがチェックされていることを確認。Next>ボタンをクリック。
ISE81i_5_060206.png


Entity Nameはledtestが入っているのでそのままに、Architecture Nameはどうでもいいが、とりあえずRTLにしておく。Port Name, Direction, Bus, MSB, LSBを図のように入力する。Next>ボタンをクリック。
ISE81i_6_060206.png


New Project Wizard - Summaryウインドウが出るので確認して、Finishボタンをクリック。
ISE81i_7_060206.png


New Project Wizard - Create New Sourceウインドウが再び開く。プロジェクトを作成する時に作れるHDLは1つだけだそうだ。Next>ボタンをクリック。
ISE81i_8_060206.png


New Project Wizard - Add Existing Sourcesウインドウが開く。とりあえずここは無視してNext>ボタンをクリック。
ISE81i_9_060206.png


New Project Wizard - Project Summaryウインドウが開く。これでよければFinishをクリック。
ISE81i_10_060206.png


そうするとプロジェクトが作られて、LedTest.vhdのライブラリ宣言やentityのport部分が作られて表示される。
ISE81i_11_060206.png


結構最初から書くとすると大変だ。どうだろうか簡単すぎる?コメントをどんどん寄せてほしい。おだてられるといろいろ無料でノウハウを開示してしまうかも?(そんなにあるのかという疑問はあるが。。。)
次はファイルを追加してシミュレーションしたい。通常のISEのスクリプトを使い、それを編集して便利に使うというところかな?
通常はModelSim単体でスクリプトを書いて使っているが、ISEから立ち上げてお手軽にスクリプトを自分で編集してみたい。
  1. 2006年02月06日 23:04 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:2

給湯風呂沸かし機が壊れたと思ったら。。。

今日は朝起きてみたらお湯が出ない。なぜ?と思って外の給湯風呂沸かし機を見てみると、下にツララが出来て下に氷がはっていた。
これは給湯風呂沸かし機だめだと思った。メーカーサポートに電話しても一向に電話が込み合っていてつながらない。今朝はこの冬一番の寒さということで皆だめになったのだろう。
しょうがないからメールで修理を依頼。
新しい給湯風呂沸かし機をネットで検索。今度は電気のヒートポンプ式が良いかしら?
リースも発見。これも良い?
そうしているうちに12時近くになったらお湯が出た。。。パンクしたわけでなく、凍っていただけ?
なんにせよ良かった。午後から設備に詳しい友達も来てくれてふたを開けてみてみたら、配管のねじが緩んでいた。一応閉めてもらった。ありがとう。
サービスには点検を頼まなくては。お金が大幅に飛ばなくて良かった。でももう12年使っているので次を考えておかないと。。。
  1. 2006年02月05日 22:20 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

スパルタン3スタータキットでのISE8.1iのチュートリアル1(導入編)

なぜかダイナミック点灯やISE8.1iでの検索が多いようなのでチュートリアルを書こうと思う。出来るだけ初心者のレベルで書こうと思う。
初めは導入編で回路の説明だ。ダイナミック点灯やスイッチのチャタリングの除去方法など。以前自分のホームページに載せていたものの焼き直しだ。

*  LEDテスト回路

 LEDテスト回路は、評価基板の4つの7セグメントLED(以下、LEDとします)をテストするためのゲームです。初期状態では、すべてのLEDが0になります。BTN0を押すと左端の7セグメントLED(D1)が8になり、BTN0を押している間、8が右のLEDに移動し続けます。一番、右端のLED(D4)まできたら、左端のLEDに戻ります。そしてBTN0を離すと、8の移動が停止して4 つのLEDの内の1つに停止します。もう一度、SW5を押すと、前に停止した8の位置からスタートします。BTN3はリセットで、これを押すと初期状態に戻ります。
 このようにどこに止まるかわからないルーレットの様なゲームになっています。

*  回路構成の説明
o LED駆動方式

  LEDの点灯方法としては、スタティク点灯とダイナミック点灯に分けられまが、評価基板はダイナミック点灯方式でLEDを点灯します。ダイナミック点灯方式は、すべてのLEDのセグメントの入力を共通バスで結んで、個数分のデータを時分割で出力ます。そして、対応するセグメントのデータが出力される時間だけイネーブル(OE)をアクティブにする点灯方式です。下の図参照
eval_board_html_m33f.gif

図1 ダイナミック点灯方式のタイミングチャート

 ダイナミック点灯方式はスタティク点灯方式に比べて、線の数は少なくなりますが、駆動するLEDの数が増えると暗くなります。また、スタティク点灯に比べて、駆動回路が複雑になります。
 図2は評価基板のLED駆動回路のブロック図です。50MHzクロックを分周してダイナミック点灯の駆動回路の基準クロックを作っています。これは、 LEDのデータやOEを切り替えるタイミングを取るのに使用しています。CRTのリフレッシュと同一です。周波数は違いますが。。。この周波数はあまり気にする必要は無いかもしれませんが、一応1KHzに設定しています。
dynamic_led_circuit_060204.png

図2 LED駆動回路(ssegdisp.vhd)ブロック図

* スイッチ回路

 スイッチは、押した時や離したときにチャタリングと言う波形の乱れが発生します。これは、スイッチの接点と接点がついたり、離れたりした時に、接点同士のバウンドによって信号が乱れる現象です。普通、数100uSから数msくらい続きます。
sw_circuit.jpg

図3 スイッチ回路

 図3のスイッチ回路で、OUTPUTをディジタルオシロスコープで見た波形を下に示します。尚、このスイッチ回路の波形は評価基板のものではありません。スイッチはトグルスイッチです。
chatting_of_fall.jpg

これがVCCからGNDへOUTPUTが変化する時の波形です。600usec程度波形が乱れているのが見えると思います。それがチャタリングです。これを直接、ステートマシンの入力などに入れると、ステートマシンのレジスタのセットアップタイム、ホールドタイム違反などで不正ステートに行ってしまうことがあります。また、GNDからVCCへOUTPUTが変化する場合にも、数は少ないですが、チャタリングは起こります。
それではチャタリングを直接、評価基板で見てみましょう。
BTN0の出力を16ビットバイナリカウンタのクロック入力に入れて、バイナリカウンタの出力を4ビット単位でLED駆動回路に入力してみます。BTN0を押したときに、カウントが+1されるはずですが、チャタリングのため複数カウントが進むと思います。BTN3がリセットです。
私のブログの記事”スイッチのチャタリング”を参照ください。(この回路のバイナリカウンタはクロックがスイッチから入力されていて、非同期回路となっています。通常、非同期回路はFPGAの回路方式としては、あまり良くないので、実用回路を作る場合は、なるべく完全同期回路で回路を作ってください。)

 次に、チャタリングを防止する方法ですが、積分回路でチャタリングを除去してシュミットトリガのゲートを通して波形整形する方法、RSフリップフロップを使用する方法、Dフリップフロップでチャタリング持続時間以上のサンプル周期でサンプルする方法の3つが通常使われる方法です。このページで使用しているのは3番目のサンプルする方法です。チャタリング持続時間以上のサンプル周期でサンプルすれば、1回目でチャタリングが出ていても、2回目には収束しているので、チャタリングが除去できます。回路を図4に示します。
sw_circuit_wo_chatti.jpg

図4 スイッチのチャタリング除去回路

 サンプリング周期は5msecです。このくらいのサンプリング時間をとるとチャタリングは除去できるでしょう。もし、チャタリングが原因で動作がおかしくなるようだったら、もう少しサンプリング時間を長くします。
サンプリング除去回路を入れた後の回路はここに置いておきますので、試してみてください。今度はスイッチを押した時だけ、1増えると思います。(私のブログの記事”スイッチのチャタリング”を参照ください。)
図4では、クロックに200Hzを入力していますが、実際のFPGAのデザインではDフリップフロップのクロックにボードのクロック50MHzを入力し、イネーブル端子に200Hzごとに1になるイネーブル信号を入れてチャタリングを除去しています。
(ちなみにリレーでも同じです、機械接点を持っているものはチャタリングが出ると思います。昔に、水銀リレーと言うのを扱ったことがあるのですが、チャタリングが出ないのはそれくらいみたいです。水銀リレーは水銀が接点なので傾けると動かないし、ひどく扱いが難しかったです。)

* LEDテスト回路トップ

 LEDテスト回路のトップファイルは、今までの回路を統合してインスタンスを作製しています。スイッチを押している間だけ、図2のバイナリ0から3に8を順番に入れていくステートマシンをつければ、LEDテスト回路は完成です。ステートマシンの図を図5に示します。
state_machine.jpg

図5 LEDテスト回路ステートマシン

 図5でSW_ONは前のスイッチのチャタリング除去回路で、チャタリングを除いたスイッチ入力です。SW_ENAは200Hzごとのスイッチのサンプリング信号です。なぜ、SW_ONだけでステートを遷移してはいけないかと言うと、 SW_ONだけで遷移すると、遷移が早すぎてLEDの表示が追いつかないからです。SW_ENAがステート遷移に入っていると、スイッチを押している間は、すべてのLEDが8に見えますが、入っていないとすべて0のままです。ステートマシンにチャタリングを除いていないスイッチの波形を入れるたらどうなるかは下の注意をご覧ください。

* ファイルの構成

 ledtest.vhg --- swdiv.vhd
          |- ssegdisp.vhd --- b27segdec.vhd
                     |- freqdiv.vhd

 ledtest.vhd : トップファイル。バイナリ3~0をLED駆動回路に入力します。バイナリ3~0は通常は0ですが、スイッチが押されいている間、順番に8になります。
swdiv.vhd : スイッチのチャタリングを取り除くために5msごとにイネーブル信号を出力する回路
 ssegdisp.vhd : LEDの駆動回路(図2参照)
 freqdiv.vhd : 33MHzのマスタークロックから1kHzのLED表示イネーブルを出力する(図2の分周器)
 B27segdec.vhd : バイナリデータからLED表示用のデータを作るデコーダ(図2の7セグメントLEDデコーダ)

ISEのプロジェクトは今スパルタン3スタータキットが手元に無いので確認してから出します。次はISEプロジェクトの作り方から。
  1. 2006年02月04日 16:55 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:1

私流のVHDLの書き方1

このごろは回路図フィックスに忙しいのでこれといったねたは無い。いろいろ考えていることはあるのだがそのうちに。
今日は定数をconstant文を使った文字列で置き換える書き方を紹介しようと思う。
例えば内部のモジュール間のやり取りに使われる内部コマンドのビット幅が足りなくなったので拡張するとしよう。
各モジュールで定義されているビット幅を全部書き換えるのは大変だ。直し忘れも出るかもしれない。そういうことがあるので私は定数を文字列で置き換えている。ちょうどC言語でdefineで置き換えるようなものである。
constant GLOBAL_CMD_WIDTH : integer := 29;
このコンスタント文はentityのport宣言文のところでも使用したいので、packageにまとめておいて、VHDLファイルのentityの前でUSEしている。
私はpackageとpackage bodyは1つのVHDLファイルにしている。それは以下のようなものである。

library ieee;
use ieee.std_logic_1164.all;

package cmd_global_def_pack is
 constant GLOBAL_CMD_WIDTH : integer := 29;
 constant MAX_LOCAL_CMD_WIDTH : integer := 32; -- ローカルコマンドの最大幅
 constant NETWORK_BUFFER : std_logic_vector := "001";
.......
 function ExtractDevId( global_cmd : std_logic_vector
  ) return std_logic_vector;
.......
end package cmd_global_def_pack;
package body cmd_global_def_pack is
 -- global commandの各パートを抽出する
 function ExtractDevId( global_cmd : std_logic_vector
  ) return std_logic_vector is
   variable dev_id : std_logic_vector(DEVICE_ID_WIDTH-1 downto 0);
 begin
  dev_id := global_cmd(DEVICE_ID_HIGH downto DEVICE_ID_LOW);
  return dev_id;
 end ExtractDevId;
.....
end cmd_global_def_pack;

これを別のVHDLファイルでUSEする。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

library work;
use work.cmd_global_def_pack.all;
use work.cmd_lcon_def_pack.all;

entity lcon_write is
 port(
  clk, reset : in std_logic;

  global_cmd : in std_logic_vector(GLOBAL_CMD_WIDTH-1 downto 0); -- グローバルコマンド領域
  local_cmd : in std_logic_vector(LCNT_LOCAL_CMD_WIDTH-1 downto 0); -- ローカルコマンド領域
.....
end lcon_write;
architecture RTL of lcon_write is
.....
begin
 nb_write_hit <= '1' when cmd = '1' and (ExtractDevID(global_cmd)=NETWORK_BUFFER else '0';
.............
end RTL

上のnb_write_hitの文の意味はcmd='1'(コマンドが発行)されてExtractDevID(global_cmd)(global_cmdのDevIDフィールドを抽出したら)= NETWORK_BUFFER("001")だったらnb_write_hitを1にする。

なるべく後で変更しやすいようにVHDLを書いている。もっと過激にconstant文で回路構造を変えるように書いたこともあるが、それは次回にする。
  1. 2006年02月02日 23:09 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0