I2Cデバイスを手で動かしてみる
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[FpgaI2c]]
* 概要 [#se990e91]
- Nexys 4 付属のI2C温度計の SDA, SCL 信号線を直接スイッチ...
-- 参考: Nesys4 のマニュアル
--- https://reference.digilentinc.com/_media/nexys:nexys4...
-- このマニュアルを確認しながら設定を行うと良いと思います。
- Nexys 4 付属の温度計, Analog Devices の ADT7420
-- 詳しい情報は以下の pdf に載っています。
--- http://www.analog.com/media/jp/technical-documentatio...
-- ADT7420 をNexys 4 で使うとき、
--- Vivadoのxdcファイルの場合は、sclの PACKAGE_PIN は "F1...
##Temperature Sensor
##Bank = 15, Pin name = IO_L14N_T2_SRCC_15, Sch name...
set_property PACKAGE_PIN F16 [get_ports scl]
set_property IOSTANDARD LVCMOS33 [get_ports scl]
##Bank = 15, Pin name = IO_L13N_T2_MRCC_15, Sch name...
set_property PACKAGE_PIN G16 [get_ports sda]
set_property IOSTANDARD LVCMOS33 [get_ports sda]
--- ISEのUCFの場合は、sclの LOCは "F16", sdaの LOCは "G1...
NET "scl" LOC = "F16" | IOSTANDARD = "LVCMOS33"; #Ban...
NET "sda" LOC = "G16" | IOSTANDARD = "LVCMOS33"; #Ban...
-- ADT7420 の(slave)device addressは、0x4b (=1001011) で...
-- 温度データを取り出すには、以下の手順を実行します。
--- Master がStart 信号を送信。... scl=1, sda=1の状態から...
--- これ以降、通信を終了するまで、Master またはdeviceが s...
--- Master がdevice(ADT7420)のアドレス(0x4b)と、Masterか...
--- device が ack 信号(成功していれば、0)を出力。 Master...
--- Master がレジスタを表す 8bitのデータ(0000 0000)を出力。
--- device が ack 信号 0 を出力
--- Master がrestart 信号を送信(start と同じ)
--- Master が device address (0x4b)と、入力を表す 1を出力。
--- device が ack 信号 0 を出力
--- device が 最初の 8 bit を出力... この時のbit 列を Mas...
--- Master が ack 0 を出力。
--- device が次の8 bit を出力 ... この時の bit 列を Maste...
--- Master が nack 1 を出力。
--- 通信終了手順を行う。 ... sclを 1 にして、その間に sda...
* 回路の概要 [#j9728216]
- sw[7:0]と up button, left button, center button, right ...
- sw[0]をチャタリング防止回路を通して(swx[o]), sda に接続...
- center button をチャタリング防止回路を通して(BCx), scl...
- down button をリセット信号とします。
- sda を led[8] に接続します。scl が 0->1 に変化するたび...
- 1つのポートで入出力を行う為、scl, sda は verilog の in...
- data[7:0]の値を16進法4桁でLEDマトリックスの左側4個に出...
- sw[7:0]をled[7:0]に接続します。
- sw[7:0]を16進法4桁でLEDマトリックスの右側4個に出力する...
- 回路図
-- &ref(I2Cデバイスを手で動かしてみる/i2c-1-circuit.jpg,7...
* Verilog と xdc または ucf [#c4fc3ca8]
- ソース: [[i2c-thermo-verilog-xdc]]
- Vivadoの画面の例 (ISEの場合は[[isc-thermo-ise]])
-- 入力終了後の状態(上のverilog のコピペで良いです)
--- &ref(I2Cデバイスを手で動かしてみる/i2c_thermo-1.png,5...
* verilog のコンパイルと bit ファイルの作成 [#kdebad86]
- Run systhesis をクリック
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-run-syn...
- Run Implementation ... ポップアップウィンドウで指定, ...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-therm-synthesi...
- bitファイルの生成,Generate bit stream
--- &ref(I2Cデバイスを手で動かしてみる/i2c_thermo-generat...
* Nexys4とパソコンの接続, bit ファイルのダウンロード [#m2...
- bitファイル生成後, ポップアップウィンドウが開きます. Op...
--&ref(I2Cデバイスを手で動かしてみる/i2c-thermo-open-hw-m...
- パソコンとNexys4を接続します.
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-7-s.jpg,30%);
- ポップアップウィンドウのOKをクリックします.
-- Hardware Managerの Open Tagert が click 可能になります。
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-open-ma...
- Open Taget を click し, auto connect をクリックします。
--- &ref(I2Cデバイスを手で動かしてみる/i2c-therm-hw-manag...
- Program Device をクリックします。
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-hw-mana...
- プログラム可能なデバイス名(xc7a100t)が表示されます。こ...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-hw-mana...
- プログラム(download)するbitファイルの候補が表示されるの...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-hw-mana...
-- ダウンロードが終了すると、ボードの7セグメントLEDに"000...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-19-s.jpg,50%...
* 実行 [#m6897115]
- 手順詳細
-- bitファイルのダウンロード終了時点で、自動的に回路に電...
-- sw[0](sda) を1にします。center button (scl)は、押して...
-- sclを1 にして、sda を 1->0にします。(center button を...
-- sclを0にします。(center buttonを離す)
-- sdaを1にして、sclを 0->1->0にします。(sw[0]を1にして、...
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを0のまま、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを1のまま、sclを 0->1->0にします。ここまでが、ADT74...
-- sdaを0にして、sclを 0->1->0にします。write (=0)の出力...
-- sdaを1(Z)にして、sclを0->1->0にします。ADT7420から ack...
-- sdaを0にして、sclを8回、0->1->0にします。 ... register...
-- sdaを1(Z)にして、sclを0->1->0にし、ADT7420から ackを入...
-- sdaを1のまま、sclを1にします。
-- sclを1のまま、sdaを0にして、restart します。そのあと、...
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを0のまま、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを1のまま、sclを 0->1->0にします。ADT7420のアドレス...
-- sdaを1にして、sclを 0->1->0にします。read (=1)の出力で...
-- sdaを1のまま、sclを 0->1->0にし、ADT7420からackを入力...
-- sdaを1のまま、sclを8回 0->1->0します。このとき、ADT742...
-- sdaを0にして、sclを 0->1->0にして、Master から ADT7420...
-- sdaを1にして、そのまま、sclを8回 0->1->0します。このと...
-- 最後に、sdaを0, sclを1, そのまま sdaを1, にすることに...
----
- 実際に操作しているところの動画です。
-- http://youtu.be/mjl-93KeypM
- 説明
-- 最初のスイッチの操作 ... I2C通信開始信号送信
--- center button を押して sclを 1にして、押したままにし...
---スライドスイッチをOffからONにして, sdaを1にする。&br; ...
--- スライドスイッチをONからOFFにする。&br; &ref(I2Cデバ...
-- アドレスの送信の最初の部分
--- sclを0にしたあと, sdaを1にして、sclを 0->1->0 &br;
&ref(I2Cデバイスを手で動かしてみる/i2c-1-26.jpg,50%);
--- led[8]が点灯(1がsdaに流れたことを示す)。&br;
&ref(I2Cデバイスを手で動かしてみる/i2c-1-27.jpg,50%);
-- 再スタート, アドレス指定, 読み込みbit (1)送信, ack受信...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-r-data-2.jpg...
-- 次の8bit が, 11010000
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-r-data-3.jp...
-- この2つの01の列を接続した16bitの値が計測された温度で...
-- 従って、0010 0001 が摂氏の小数点より大きい値となり、摂...
--- 実際に赤外線温度計で計測すると、摂氏33.6度となってお...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-28.jpg,50%);
* 考察 [#x8893931]
- 手でI2Cデバイスを制御するのは大変。ちょっと間違えたら1...
- tinyCPUを作ったのだから、それを使って、プログラムで制御...
----
#counter
終了行:
[[FpgaI2c]]
* 概要 [#se990e91]
- Nexys 4 付属のI2C温度計の SDA, SCL 信号線を直接スイッチ...
-- 参考: Nesys4 のマニュアル
--- https://reference.digilentinc.com/_media/nexys:nexys4...
-- このマニュアルを確認しながら設定を行うと良いと思います。
- Nexys 4 付属の温度計, Analog Devices の ADT7420
-- 詳しい情報は以下の pdf に載っています。
--- http://www.analog.com/media/jp/technical-documentatio...
-- ADT7420 をNexys 4 で使うとき、
--- Vivadoのxdcファイルの場合は、sclの PACKAGE_PIN は "F1...
##Temperature Sensor
##Bank = 15, Pin name = IO_L14N_T2_SRCC_15, Sch name...
set_property PACKAGE_PIN F16 [get_ports scl]
set_property IOSTANDARD LVCMOS33 [get_ports scl]
##Bank = 15, Pin name = IO_L13N_T2_MRCC_15, Sch name...
set_property PACKAGE_PIN G16 [get_ports sda]
set_property IOSTANDARD LVCMOS33 [get_ports sda]
--- ISEのUCFの場合は、sclの LOCは "F16", sdaの LOCは "G1...
NET "scl" LOC = "F16" | IOSTANDARD = "LVCMOS33"; #Ban...
NET "sda" LOC = "G16" | IOSTANDARD = "LVCMOS33"; #Ban...
-- ADT7420 の(slave)device addressは、0x4b (=1001011) で...
-- 温度データを取り出すには、以下の手順を実行します。
--- Master がStart 信号を送信。... scl=1, sda=1の状態から...
--- これ以降、通信を終了するまで、Master またはdeviceが s...
--- Master がdevice(ADT7420)のアドレス(0x4b)と、Masterか...
--- device が ack 信号(成功していれば、0)を出力。 Master...
--- Master がレジスタを表す 8bitのデータ(0000 0000)を出力。
--- device が ack 信号 0 を出力
--- Master がrestart 信号を送信(start と同じ)
--- Master が device address (0x4b)と、入力を表す 1を出力。
--- device が ack 信号 0 を出力
--- device が 最初の 8 bit を出力... この時のbit 列を Mas...
--- Master が ack 0 を出力。
--- device が次の8 bit を出力 ... この時の bit 列を Maste...
--- Master が nack 1 を出力。
--- 通信終了手順を行う。 ... sclを 1 にして、その間に sda...
* 回路の概要 [#j9728216]
- sw[7:0]と up button, left button, center button, right ...
- sw[0]をチャタリング防止回路を通して(swx[o]), sda に接続...
- center button をチャタリング防止回路を通して(BCx), scl...
- down button をリセット信号とします。
- sda を led[8] に接続します。scl が 0->1 に変化するたび...
- 1つのポートで入出力を行う為、scl, sda は verilog の in...
- data[7:0]の値を16進法4桁でLEDマトリックスの左側4個に出...
- sw[7:0]をled[7:0]に接続します。
- sw[7:0]を16進法4桁でLEDマトリックスの右側4個に出力する...
- 回路図
-- &ref(I2Cデバイスを手で動かしてみる/i2c-1-circuit.jpg,7...
* Verilog と xdc または ucf [#c4fc3ca8]
- ソース: [[i2c-thermo-verilog-xdc]]
- Vivadoの画面の例 (ISEの場合は[[isc-thermo-ise]])
-- 入力終了後の状態(上のverilog のコピペで良いです)
--- &ref(I2Cデバイスを手で動かしてみる/i2c_thermo-1.png,5...
* verilog のコンパイルと bit ファイルの作成 [#kdebad86]
- Run systhesis をクリック
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-run-syn...
- Run Implementation ... ポップアップウィンドウで指定, ...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-therm-synthesi...
- bitファイルの生成,Generate bit stream
--- &ref(I2Cデバイスを手で動かしてみる/i2c_thermo-generat...
* Nexys4とパソコンの接続, bit ファイルのダウンロード [#m2...
- bitファイル生成後, ポップアップウィンドウが開きます. Op...
--&ref(I2Cデバイスを手で動かしてみる/i2c-thermo-open-hw-m...
- パソコンとNexys4を接続します.
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-7-s.jpg,30%);
- ポップアップウィンドウのOKをクリックします.
-- Hardware Managerの Open Tagert が click 可能になります。
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-open-ma...
- Open Taget を click し, auto connect をクリックします。
--- &ref(I2Cデバイスを手で動かしてみる/i2c-therm-hw-manag...
- Program Device をクリックします。
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-hw-mana...
- プログラム可能なデバイス名(xc7a100t)が表示されます。こ...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-hw-mana...
- プログラム(download)するbitファイルの候補が表示されるの...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-thermo-hw-mana...
-- ダウンロードが終了すると、ボードの7セグメントLEDに"000...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-19-s.jpg,50%...
* 実行 [#m6897115]
- 手順詳細
-- bitファイルのダウンロード終了時点で、自動的に回路に電...
-- sw[0](sda) を1にします。center button (scl)は、押して...
-- sclを1 にして、sda を 1->0にします。(center button を...
-- sclを0にします。(center buttonを離す)
-- sdaを1にして、sclを 0->1->0にします。(sw[0]を1にして、...
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを0のまま、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを1のまま、sclを 0->1->0にします。ここまでが、ADT74...
-- sdaを0にして、sclを 0->1->0にします。write (=0)の出力...
-- sdaを1(Z)にして、sclを0->1->0にします。ADT7420から ack...
-- sdaを0にして、sclを8回、0->1->0にします。 ... register...
-- sdaを1(Z)にして、sclを0->1->0にし、ADT7420から ackを入...
-- sdaを1のまま、sclを1にします。
-- sclを1のまま、sdaを0にして、restart します。そのあと、...
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを0のまま、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを0にして、sclを 0->1->0にします。
-- sdaを1にして、sclを 0->1->0にします。
-- sdaを1のまま、sclを 0->1->0にします。ADT7420のアドレス...
-- sdaを1にして、sclを 0->1->0にします。read (=1)の出力で...
-- sdaを1のまま、sclを 0->1->0にし、ADT7420からackを入力...
-- sdaを1のまま、sclを8回 0->1->0します。このとき、ADT742...
-- sdaを0にして、sclを 0->1->0にして、Master から ADT7420...
-- sdaを1にして、そのまま、sclを8回 0->1->0します。このと...
-- 最後に、sdaを0, sclを1, そのまま sdaを1, にすることに...
----
- 実際に操作しているところの動画です。
-- http://youtu.be/mjl-93KeypM
- 説明
-- 最初のスイッチの操作 ... I2C通信開始信号送信
--- center button を押して sclを 1にして、押したままにし...
---スライドスイッチをOffからONにして, sdaを1にする。&br; ...
--- スライドスイッチをONからOFFにする。&br; &ref(I2Cデバ...
-- アドレスの送信の最初の部分
--- sclを0にしたあと, sdaを1にして、sclを 0->1->0 &br;
&ref(I2Cデバイスを手で動かしてみる/i2c-1-26.jpg,50%);
--- led[8]が点灯(1がsdaに流れたことを示す)。&br;
&ref(I2Cデバイスを手で動かしてみる/i2c-1-27.jpg,50%);
-- 再スタート, アドレス指定, 読み込みbit (1)送信, ack受信...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-r-data-2.jpg...
-- 次の8bit が, 11010000
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-r-data-3.jp...
-- この2つの01の列を接続した16bitの値が計測された温度で...
-- 従って、0010 0001 が摂氏の小数点より大きい値となり、摂...
--- 実際に赤外線温度計で計測すると、摂氏33.6度となってお...
--- &ref(I2Cデバイスを手で動かしてみる/i2c-1-28.jpg,50%);
* 考察 [#x8893931]
- 手でI2Cデバイスを制御するのは大変。ちょっと間違えたら1...
- tinyCPUを作ったのだから、それを使って、プログラムで制御...
----
#counter
ページ名: