FPGA活用回路&サンプル記述集(1) ―― アナログ信号入出力回路

石谷 真

 近年,ジャイロ・センサや加速度センサがゲーム機のコントローラやディジタル・スチル・カメラなどに搭載されるようになりました.これらは数mV~数百mVのアナログ信号をセンサ情報として出力します.しかしほとんどのFPGAは,アナログ信号を直接入出力できません.そこで今回は,アナログ信号をFPGAで取り込む方法や,複数のアナログ信号を選択して取り込む方法などを紹介します.(編集部)

事例1.A-Dコンバータを利用したアナログ入力回路

外部回路
  • 回路図:図1-1図1-3
  • 主要部品:A-Dコンバータ,マルチプレクサ
HDL記述
  • Verilog HDL記述:リスト1-1リスト1-2
  • 外部入力:sdata
  • 外部出力:sclk,cs_n,adrs[2:0]
  • 内部入力:ck,res,trg
  • 内部出力:data[15:0],busy
  • パラメータ:なし
評価環境
  • Quartus II Web Edition 6.1,Cyclone
 FPGAではA-Dコンバータを内蔵する製品はあまりありません.そのためアナログ信号を扱うためには外部にA-Dコンバータを配置し,制御する必要があります.

● A-Dコンバータを制御する

 図1-1にA-Dコンバータによるアナログ入力回路を示します.米国Analog Devices社の「AD7680」は,16ビット精度で1チャネルの入力を持っている逐次比較型A-Dコンバータです.このA-Dコンバータは,電源電圧が2.5V~5.5Vで動作するため,FPGAのI/Oが3.3Vの場合,直接制御可能です.

zu01_01.gif
図1-1 A-Dコンバータを利用したアナログ信号の入力回路

 出力はシリアル・インターフェースです.動作タイミングを図1-2に示します.CSを"L"にしたあと,SCLK(転送クロック)に合わせてデータ変換を開始します.最初の4ビットの'0'データのあと,上位ビット(ビット15)から16ビットの変換データを出力します.リスト1-1にA-Dコンバータから変換データを読み出す例を示します.

zu01_02.gif
図1-2 シリアル・インターフェースのタイミング
CSを"L"にすることで変換が始まる.先行する4ビットのあと,上位ビットからA-D変換結果が出力される.

module ad7680spi(ck,res,trg,busy,sclk,cs_n,sdata,data);
input ck;      //2MHz
input res;      //Reset Signal(Sync)
input trg;      //AD Covert Start Trigger
input sdata;      //AD Data from AD7680A
output busy;      //Convert Busy Signal
output sclk;      //SPI I/F Clock
output cs_n;      //Convert Enable
output [15:0] data;
reg [4:0]cnt;
reg busy;
reg cs;
reg [15:0]buff;
reg [15:0]data;
wire adend;
assign sclk = ck;
assign adend = (cnt==5'd20); ←変換完了(abend)生成
always @(posedge ck) begin
    if (res)    busy <= 1'b0; ←A-D変換動作中ビジー信号"H"
    else if (adend)    busy <= 1'b0;
    else if (trg)    busy <= 1'b1;
end
always @(negedge ck) begin
    if (res) cnt <= 5'b0;
    else if (~cs) cnt <= 5'b0;
    else cnt <= cnt + 5'b1; ←変換サイクル数カウント
end
//cs (cs_n)
assign cs_n = ~cs;
always @(posedge ck) begin
    if (res)      cs <= 1'b0;
    else if (adend)   cs <= 1'b0; ←CS信号生成
    else if (busy)    cs <= 1'b1;
  end
//buff
always @( posedge ck ) begin
    if (res)  buff <= 16'b0;
    else if (~busy)  buff <= 16'b0;
    else if (cnt < 5'd20) buff <= {buff[14:0],sdata}; ←※1
end
//data
always @(negedge ck) begin
    if (res)         data <= 16'b0;
    else if (cnt == 5'd19)  data <= buff; ←※2
end
endmodule

リスト1-1 A-Dコンバータのデータを読み出すVerilog HDL記述

※1;A-Dコンバータ変換データ格納(シリアル-パラレル変換)
※2;A-Dコンバータの変換が完了した時点で結果を出力(data)に反映

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日