[IP][Avalon] I2C master controller wrapper

2010/05/19FPGA::IPimport

はじめに

自作部分はAvalon SlaveにWISHBONEモジュールをぶら下げるためのBridgeのみなので、ほかのモジュールにも転用できるかと思います。

【注意】本記事は、16ヶ月ほど前のコードと資料を元に作成しており、i2c_masterもversionがあがっております.WISHBONEおよびI2Cインタフェース部分にも修正が入っているようなので、最新版での動作保障はありません.現状、環境がないので確認できません…

自製部分のみ、_IP_I2C_v000.zipとして置いておきます。tclも入れておきますが、FatFSのときのように動作確認をしていませんので、ご了承いただきたく。実際に使ったサンプルコードも置いておきます(avalon_i2c.zip)。\いまさらですが、writeしか使ってない模様…。WM8731へは書きっぱなしでよかったのかな... 記憶があいまいデスすみません.

概要

I2C MasterとなるIPです.\本IPは,opencores.orgで開示されている,以下のものをベースとしました.

http://www.opencores.org/
  "I2C controller core"
  Category :: Communication controller
  Name: i2c
  Created: 25-Sep-2001 10:15:03
  Updated: 03-Nov-2008 14:55:35

  Category :: Communication controller
  Language :: Verilog
  Language :: VHDL
  Phaze :: ASIC proven
  Phaze :: Design done
  Phaze :: FPGA proven
  Standard :: Wishbone compliant core
  Development status :: Production/Stable



Rev. 0.9  Release data: 03/07/03
i2c_specs.pdf

収録ファイルと個々の概要説明

  • avalonif_i2c.txt

このファイル.IPの簡単な説明等を記載する

  • avalonif_i2c_hw.tcl

SOPC builderが食うファイル. Avalon-MM I/Fの仕様や追加すべきファイル,パラメータ初期値などの情報が入っている.

  • avalonif_i2c.v

Avalon I/Fを含む本モジュールのtopレベルモジュールを記述したファイル. "i2c_master_top.v"と同等の機能を有す.(moduleとSystem BUSの仲介だけ)

以下、i2cオリジナルに含まれるものです。

  • timescale.v
  • i2c_master_defines.v
  • i2c_master_byte_ctrl.v
  • i2c_master_bit_ctrl.v
  • i2c_master_top.v

実装時の注意事項

I2Cバスの信号である,SDA/SCKは外部Pull Upになり,master/slaveはopen drainで駆動します.本IPも,各信号をLowに落とすときだけ,Padのenable信号を出すように作られています.tope level moduleには,以下の信号が出ています.

  sda_padoen_o
  sda_pad_o
  sda_pad_i
  scl_padoen_o
  scl_pad_o
  scl_pad_i

PADの出力値は,sda_pad_o(scl_pad_o)に出てきます.ただし常にLowでGND接続になります.\PADからの入力は,sda_pad_i(scl_pad_i)を通して行います.\最後に,PADの出力制御は,sda_padoen_o(scl_padoen_o)を用い,active lowです.\highのときは,PADはドライブせず,Hi-Z状態としてください.\※詳細はオリジナルのドキュメントを参照していただきたく.

Verilog-HDLでの記述例を示します.\NEEKなど,シングルマスタを想定してプルアップしていない回路では,コメントアウトしたほうを用いてください.ただしデータに関しては双方向と成るため,Pull Upは必須と成ります.\# I2Cとした時点で,CLK/DAT双方ともPullUpすべきだと思うのですが...

module xxx (
  inout HC_I2C_SDAT,
  HC_I2C_SCLK,
  ...
 ) ;


assign sda_pad_i = HC_I2C_SDAT ;
assign HC_I2C_SDAT = (sda_padoen_o==1'b0 ? sda_pad_o : 1'bz) ;
assign scl_pad_i = HC_I2C_SCLK ;
assign HC_I2C_SCLK = (scl_padoen_o==1'b0 ? scl_pad_o : 1'bz) ;
// assign HC_I2C_SCLK = scl_padoen_o ; // if Single Master and No-Pull Up(for NEEK)


slave address = 7'b0011010 @ CSB = Low at NEEK


ハードウェア仕様

モジュールのアドレス空間

offset symbol description
0Status / RxData
1Command Register
2Control / TxData
3preI2C clock prescaler

"Command"

7STASTART condition
6STOSTOP condition
5RDRead Data
4WRWrite Data
3ACKwhen receiver(1:ACK/0:NACK)
2-
1-
0IACK1書き込みで要因クリア

"Control / TxData"

31ENEnable I2C core
30IENinterrupt enable
29-24-reserved
23-8-reserved
7-0txdataTransmit data. slaveアドレス送信時はLSBがdirection(1:R/0:W)を示す

"Status"

31-16-reserved
15RxACKスレーブからのACK受領ステータス.0で受信,1で未受信
14Busy1:STArt detected, 0:STOp detected
13ALArbitration Lost
12-10reserved
9TIP1: 転送中, 0:転送完了
8IF割込みフラグ.転送完了もしくはArbitration Lostでたつ
7-0rxdata

プリスケーラの値は,下記の算出式により得ることができます.

(document 3.2.1参照)
IPの動作クロックを f_clk[Hz],SCLKの周波数を f_sclk[Hz]とします
  value of pre-scaler = f_clk / (5 * f_sclk) - 1

ex.)
  f_clk  = 18.432MHz
  f_sclk = 500kHz

  value of pre-scaler = 18432 / (5 * 500) - 1  = 6.3728 => 7 

[MAVA] Avalon-ST interface仕様概要

2009/01/08FPGA::QuartusIIimport

[Altera][MAVA] Avalon-ST interface仕様概要

waveformは参照資料を見てください.WEBだけに頼るのは危険です:)

参照資料

"Avalon Interface Specifications" "Document Version: 1.1", "Document Date: October 2008", file:(mnl_avalon_spec.pdf) "6. Avalon Streaming Interfaces"

語彙

Avalon Streaming System

Avalon Streaming Systemは,1つ以上のAvalon-STコネクションを含むシステムです.Avalon-STコネクションは,sourceインタフェースから,sinkインタフェースへとデータを転送するものです.


Avalon Streaming Components

Avalon-STインタフェースを使う基本的なシステムは,コンポーネントと呼ばれる複数の機能モジュールを含みます.システムデザイナは,システムを実装するために,コンポーネントを設定・互いに接続します.

Source and Sink Interfaces and Connections

2つのコンポーネントを接続するとき,データはsource interfaceからsink interfaceに流れます.sinkインタフェースに接続されたsourceインタフェースの組み合わせは,接続(connection)として参照されます.

Backpressure

Backpressureは,sinkがsourceにデータ送信を停止するために通知できるようなメカニズムです.sinkは,基本的には,sinkのFIFOフルのときやsinkの出力ポートが停滞したときにデータの流れを止めるためにbackpressureを使います.
※backpressureはオプションです.

Transfers and Ready Cycles

転送(transfer)は,sourceインタフェースからsinkインタフェースへ伝播されるデータと制御のオペレーションです.データインタフェースでは,"ready cycle"は,sinkが転送可能な間のサイクルです.

Symbol

シンボルは,データの分割できない最小単位です.ほとんどのパケットインタフェースでは,シンボルはByte(バイトサイズ)です.1つ以上のシンボルが,1サイクル中に転送されるデータの1単位を構成します.

Channel

チャネル(channel)は,情報が2つのポート間を行き交うような,物理的または論理的なパスやリンクです.

Packet

パケット(packet)は,互いに転送されるデータと制御信号の集合です.パケットは,ルータを助けるためにヘッダを含むかもしれません.そして,他のネットワークデバイスは,正しい受けてにパケットを向けます(流します).パケットフォーマットは,アプリケーションにより定義されます.この仕様で定義されません.Avalon-STパケットは,可変長に定義できたり,コネクション間でインタリーブさせることもできます.Avalon-STインタフェースでは,パケットの使用はオプションです.



Signals~インタフェース信号("6.2.Avalon-ST Interface Signals")

Signal Type width DIR description
ready1sink->sourceHighでsinkがデータを受け取れることを示します.\サイクルN時にアサートした場合,"N+readyLatency"サイクルにsourceからdataを乗せてvalid信号が振ってくるでしょう.\backpressureを使うときは必須.readyの無いモジュールはbackpressure非対応(フロー制御なし)
valid1source->sinksourceがassertした場合,そのサイクルでデータが有効であることを示す.\valid信号が無ければ,毎サイクルごとのデータは有効である.
data1-256source->sinkバルクデータ.値の意味はアプリケーションに依存する
channel0-8source->sinkカレントサイクルの送信先チャネル番号を乗せる
error1-255source->sinkパラメタerrorDescriptorで定義するエラー情報

Packet Transfer Signals

startofpacket1source->sinkパケット転送の開始時に1クロックだけアサートされる
endofpacket1source->sinkパケット転送の最終クロックにアサートされる
empty0-8source->sinkEndOfpacketサイクル時に,無効なシンボル数を通知する.\1beatで1シンボル転送の場合は,使用されない.EOFサイクル以外は解釈しない(無効です)

Avalon-ST Interface Properties(6.3)

Namedefault value 有効範囲 description
dataBitsPerSymbol81-512シンボルあたりのビット数を定義する.Byte単位であれば8bitとなる
readyLatency00-8ready信号のassertion/deassertion間の関係を定義する
maxChannel00-255データインタフェースがサポート可能な最大チャネル数
errorDescriptor0list of string..error信号の各ビットに付随するエラーを示す語のリストです.\語数はエラー信号のビット数と同じでなければなりません.並び順に上位ビットに適用されます.\例えば,"crc,overflow"と記述した場合,bit[1]がCRC errorを,bit[0]がoverflow errorを示します.

6.4.Typical Data Transfers

6.5.Data Transfer without Backpressure

6.6.Data Transfer with Backpressure

ハンドシェーク方法(with "Backpressure")データ受信側が,ready(sink->source)をドライブする.アサートされていればデータを受け取れる状態にある.吐き出し側がデータを有し,受け側がreadyをアサートしていれば,チャネル番号,データ,エラー信号を乗せて,valid(source->sink)をアサートする.
アサートされていないときは,固定サイクルのレイテンシ待ちを入れるみたい??

同じ土管で,チャネル番号を設けることができるが,使用方法はアプリケーション依存である.

  • 例1:ポートナンバーとして使う
  • 例2:ページナンバーとして使う
  • 例3:timeslotインジケータとして使う

チャネル信号を使う場合は,各有効なサイクルにおけるデータ転送の全てが同じチャネルに属する.source(吐き出し側)は,成功した有効なサイクルで,異なるチャネルに変えるかもしれません.

"Backpressure"未使用のときは,souce側は"ready"信号をチェックしない.


6.7.Packet Data Transfers

前述のAvalon-STに加えて,下記の信号を要します."startofpacket","endofpacket","empty"信号が追加されます.いずれも source->sink です.

  • startofpacket
    パケット転送の開始タイミングを示します.
  • endofpacket
    パケット転送の終了タイミングを示します.
  • empty\endofpacketがアサートされたサイクルで参照する.複数シンボルを転送し,残りカスの数をのせる.(Specの絵を見たほうがわかりよいでしょう)



注意事項

英語力の弱い人が適当に訳して抜粋,補強しています.
あやしいな,と思ったらご指摘いただけますと幸いです.
なお,オリジナルの英文を参照されることを強く推奨いたします.

[Altera][Q2HB] Quartus II Integrated Synthesis

2009/01/06FPGA::QuartusIIimport

[Altera][Q2HB] Quartus II Integrated Synthesis

参照資料

"Quartus II Handbook Version 8.1", "Volume 1: Design and Synthesis", "Section III. Synthesis"

Synthesis Options

Optionの設定方法

Synthesis Attributes
  • Synthesis Attributes in Verilog-1995 (Example 8–21.)
    // synthesis <attribute> [ = <value> ]
    または
    /* synthesis <attribute> [ = <value> ] */
    

※ALTERA IP CORE や SOPC Builderの自動生成は,Verilogの場合コレになる.

  • Synthesis Attributes in Verilog-2001 and SystemVerilog
    (* <attribute> [ = <value> ] *)
    
Synthesis Directives
// synthesis <directive> [ <value> ]
または
/* synthesis <directive> [ <value> ] */

また,注意書きとして,以下のように記述されているので注意されたい.

Verilog HDL is case-sensitive; therefore, all synthesis directives are also case-sensitive.


オプション

Ignore translate_off and synthesis_off Directives

//synthesis translate_off この区間の記述はシミュレーションのみに影響を与える.//synthesis translate_on

Read Comments as HDL

//synthesis read_comments_as_HDL on // この区間のコメントにある記述は,synthesis時のみに有効となる.// Quartus IIのみか?(ModelSimは無視しているし.目的はシミュレーション記述とビヘイビア?とを混在させるため.)//synthesis read_comments_as_HDL off



注意事項

英語力の弱い人が適当に訳しています.自分では意味がわかるようにとれたものと,そうでないものとがあります.概要理解の参考にしていただければ幸いですが,オリジナルの英文を参照されることを強く推奨いたします.

[Q2HB] SPI Core

[Altera][Q2HB][IP] SPI Core

refer to:"Volume 5: Embedded Peripherals","Section I. Off-Chip Interface Peripherals","7. SPI Core"

Core Overview

(略)SPIインタフェースは,よう使われている.SPI core with Avalon-interfaceは,SPIプロトコルを実装し,バックエンドでAvalon-MMインタフェースを提供する.

SPI coreは,SPIマスタかSPIスレーブのどちらかを実装できる.マスタとして設定したときは,SPI coreは32個までの独立したSPIスレーブを制御できる.送受信のレジスタ幅は,1~32ビットの間で設定可能です.より長い転送長はソフトルーチンでサポートされます.SPI coreは,転送が完了するごとにフラグする割込み出力を提供します.



Functional Description

SPI coreは以下の信号で同期通信を行います(SPIプロトコル)

Signal symbol description
Master Out Slave Inmosiマスタからのデータ出力,スレーブへのデータ入力
Master In Slave Outmisoスレーブからのデータ出力,マスタへのデータ入力
Serial Clocksclkマスタに駆動される,スレーブへのクロック.データビットの同期に使う
Slave Selectss_nマスタに駆動される,個別のスレーブへのSelect信号(active Low).対象となるスレーブを選択するのに使う

このコアには,ユーザに見える柿のリソースがあります.

  • MemoryMapped register\rxdata, txdata,status, control, slaveselect
  • 4つのSPIインタフェースポート\sclk, ss_n, mosi, and miso

Instantiating the SPI Core in SOPC Builder

(なんともはやふつー過ぎて省略)


Software Programming Model

alt_avalon_spi_command()

int alt_avalon_spi_command(
	alt_u32 base, alt_u32 slave,
	alt_u32 write_length,
	const alt_u8* wdata,
	alt_u32 read_length,
	alt_u8* read_data,
	alt_u32 flags)

データ長8bit以下のSPIマスタ向けに設計されている.現状,データ長8bit以上のハードには対応していない.
この関数を一度呼ぶと,MOSIからデータを吐いて,MISOからデータを受け取ります.

  1. slaveの指定されたslave chipselect信号をアサートします.IDはゼロオリジンです.
  2. write_lengthバイトだけwdataから読み出して出力します.MISOからのデータは捨てます.
  3. read_lengthバイトだけ,read_dataへデータを格納します.MOSIにはゼロを吐き続けます.
  4. スレーブのselect信号をデアサートします.

コードは,以下のファイルを見ると把握できます.リード時の吐き捨てがマスタ出力ゼロで決めうちですね.
C:\altera\81\ip\altera\sopc_builder_ip\altera_avalon_spi\HAL\src\altera_avalon_spi.c

※SDカードへのアクセスの際には,1'b1での出力が必要と思う(ELMより...SD Spec.見たほうがいいか?)



問題点

SPIマスタのとき,動作クロックをWizardで定義することになるが,動的な変更が効かない
(ELM) MMCの使い方 より,

SPIモードの場合は、速度を制限する状態(OD駆動)が無いので、クロック切り替えなしで最初から20/25MHzでもOKです。

20MHz固定でもいいか...


SDカードをSPIモードで使うときの結論

IPコアは流用できるが,HAL・ドライバは使用できない.自前で制御レジスタをたたくべし.ソースコードの流用はできるだろう(あまりおいしく無いけれど)
→ よそのIPを拾ってこよう….