FPGA活用回路&サンプル記述集(1) ―― アナログ信号入出力回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年2月23日
近年,ジャイロ・センサや加速度センサがゲーム機のコントローラやディジタル・スチル・カメラなどに搭載されるようになりました.これらは数mV~数百mVのアナログ信号をセンサ情報として出力します.しかしほとんどのFPGAは,アナログ信号を直接入出力できません.そこで今回は,アナログ信号をFPGAで取り込む方法や,複数のアナログ信号を選択して取り込む方法などを紹介します.(編集部)
- 事例1.A-Dコンバータを利用したアナログ入出力回路
【Keyword】A-Dコンバータ,アナログ・マルチプレクサ - 事例2.D-Aコンバータを利用してアナログ波形を生成する回路
【Keyword】D-Aコンバータ,アナログ波形の生成 - 事例3.発振周波数を任意に設定できる数値制御型発振器
【Keyword】D-Aコンバータ
事例1.A-Dコンバータを利用したアナログ入力回路
外部回路- 回路図:図1-1,図1-3
- 主要部品:A-Dコンバータ,マルチプレクサ
- 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
● A-Dコンバータを制御する
図1-1にA-Dコンバータによるアナログ入力回路を示します.米国Analog Devices社の「AD7680」は,16ビット精度で1チャネルの入力を持っている逐次比較型A-Dコンバータです.このA-Dコンバータは,電源電圧が2.5V~5.5Vで動作するため,FPGAのI/Oが3.3Vの場合,直接制御可能です.
出力はシリアル・インターフェースです.動作タイミングを図1-2に示します.CSを"L"にしたあと,SCLK(転送クロック)に合わせてデータ変換を開始します.最初の4ビットの'0'データのあと,上位ビット(ビット15)から16ビットの変換データを出力します.リスト1-1にA-Dコンバータから変換データを読み出す例を示します.
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;A-Dコンバータ変換データ格納(シリアル-パラレル変換)
※2;A-Dコンバータの変換が完了した時点で結果を出力(data)に反映
tag: FPGA