MachXo2ふたたび
by K.I
2012/07/xx - 2018/09/13〜2018/10/31
Index
CPLDのXCR3064XLは使いやすいんだけど、64マクロセルとちょっと小さい。
何とか入るものもあるけど、削って削ってやっと入ったと思っても、機能不足で結局使えなかったり。。
少ピンのCPLDかFPGAで、なんか無いかと思って調べていたら、 こちらの記事 を見つけた。
QFN32のFPGAとなっているけど。。このスペックはCPLDっぽい感じだ。
というか、これはCPLDだと思う。
でも、規模的には丁度良いかも。それに小さいのが良いなぁ。
Mouserでは、リードタイムが2ヶ月といったところ
使えるかどうかわからんけど、とりあえず注文だけしてしまった。
。。。でも、来るのが遅かったので、Breakoutボードを弄ってるうちに、うやむやに。。
前半は過去に調べたことで、ちょっと古い話なんだけど、勿体無いのでそのまま載せた。
後半が、改めて1 MachXO2の256HCを弄ってみましたというお話。。。
1 にしても、6年も経ってるのか。ずいぶんと放っておかれたもんだなあ。。
[top]
自分は、CPLDとかFPGAはXilinxしか使ったことがない。
MachXo2は、Latticeというメーカーで、開発環境はDiamondというソフトがあるらしい。
Lattice のページの上の方のNEW ACCOUNTのリンクから、アカウントを取得
SIGN INしたら、Dwonload→Softwareで、Lattice Diamondを選び、
さらに、左側のDownloadのリンクから、自分の環境に合わせたプログラムをダウンロードする。
Diamondのフリーライセンスを取得する。
やはり、Download→Softwareで、Lattice Diamondを選んで、
Diamond Software Free Licenseの、free license can be requested のリンクをクリック
Software License Request Formの、Host NICにインストールするPCのMACアドレスを入力する
これは、Windowのコマンドプロンプトを出して、ipconfig /allとタイプすれば良い
少し待つと、ライセンスファイルがメールで送られてくるので、
とりあえず、例えば、C:\lscc等に入れておく。
Diamondを起動したら、ライセンスファイルの在処を聞いてくるので、
Diamondの起動は、もの凄く時間が掛かるので気長に待つ。5分以上掛かる。
XilinxのWebPackよりも、かなり重いんじゃないかと思う。
新規プロジェクトを作成する。
ワークディレクトリは、ネットワーク上でも構わないが、パスに日本語が含まれるとダメなので注意。
Select Device
Family: MachXO2
Device: LCMX02-256HC
Part Name LCMX02-256HC-6SG32C
File→New→Fileで、Verilog Filesを選択ファイル名を入れる
新規プロジェクトのディレクトリに作られると思ったが、locationを指定しないと一つ上になってしまった
作成したファイルは、Input Filesのフォルダに入った。
ピンの割り当てはどうやるんだろう?
Tools→Spreadsheet Viewがそれらしいと思ったが、設定できない。。
Package Viewでも、PortがDisableになっている。
結局、適当なVerilogファイルをAddしてから、Place & Route Designしたら、
Spreadsheet Viewで、Port名が設定できるようになった
制約ファイルは、UCFファイルではなく、LPFファイルというらしい。
適当に接続したので、rstnとclkに対するWarningが出ている
WARNING - map: Using local reset signal 'rstn_c' to infer global GSR net.
WARNING - par: Signal "clk_c" is selected to use Primary clock resources; however its driver comp "clk" is located at "9", which is not a dedicated pin for connecting to Primary clock resources. General routing has to be used to route this signal, and it may suffer from excessive delay or skew.
WARNING - par: The driver of primary clock net clk_c is not placed on one of the sites dedicated for primary clocks. This primary clock will be routed to a H-spine through general routing resource or will be routed as a secondary clock and may suffer from excessive delay or skew.
それじゃ、ピン制約を掛けずにやらせてみよう。
LPFファイルを、これに合わせて書き直してみる
BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ;
IOBUF ALLPORTS IO_TYPE=LVCMOS33 ;
LOCATE COMP "clk" SITE "13";
LOCATE COMP "led" SITE "14";
LOCATE COMP "rstn" SITE "4";
LOCATE COMP "rx" SITE "11";
LOCATE COMP "tx" SITE "21";
LOCATE COMP "x_a" SITE "9";
LOCATE COMP "x_b" SITE "12";
LOCATE COMP "y_a" SITE "8";
LOCATE COMP "y_b" SITE "28";
IOBUF PORT "rstn" IO_TYPE=LVCMOS33 PULLMODE=UP ;
なんでBottomViewなんだろう? 分りづらい。。
この図で、上の23〜32と1ピンがBANK0、左19〜21ピンがBANK1、下7〜17ピンがBANK2、右4〜6ピンがBANK3
ピンのアイコンは、
ギザギザの抵抗みたいなのは電源か。GNDはそのまま。
矩形波っぽいのは、クロックが入れられる?
オペアンプっぽいのはバッファかな?
差動入力は、+−が描いてある
Pin PadName Bank Function
1 PT6C 0 TDO
2 VCC ‐
3 GND ‐
4 PL5C 3 PCLKT3_0
5 PL5D 3 PCLKC3_0
6 VCCIO3 3
7 VCCIO2 2
8 PB2A 2 CSSPIN/MD4/TDOB
9 PB2C 2 MCLK/CCLK
10 PB2D 2 SO/SPISO/IO1/MD1/TDIL
11 PB4A 2 PCLKT2_0/INTEST_OVER
12 PB4B 2 PCLKC2_0
13 PB4C 2 PCLKT2_1/INTEST_OVER
14 PB4D 2 PCLKC2_1
15 VCCIO2 2
16 PB9A 2 SN/MD5/SCAN_SHFT_ENB/TDIB
17 PB9B 2 SI/SISPI/IO0/MD0/TDOR
18 VCC ‐
19 VCCIO1 1
20 PR5B 1 PCLKC1_0
21 PR5A 1 PCLKT1_0
22 GND ‐
23 PT9D 0 DONE
24 VCCIO0 0
25 PT9B 0 PROGRAMN
26 PT9A 0 JTAGENB/MD6/TDIR
27 PT8D 0 SDA/IO3/MD3/ATBFORCE/PCLKC0_0/TDOT
28 PT8C 0 SCL/IO2/MD2/ATB_SENSE/PCLKT0_0
29 PT7B 0 TMS
30 PT7A 0 TCK/TEST_CLK
31 VCCIO0 0
32 PT6D 0 TDI/MD7
電源ピンが全部で10ピンと多い。
VCC,GNDが各2ピンづつは良いとして、
VCCIO0x2,VCCIO1,VCCIO2x2,VCCIO3で6ピン、
残り22ピンがI/Oに使えるピンということか。
JTAGで4ピン。JTAGENB=LでI/Oに使えるっぽい。JTAGENGはI/Oに使えないのかな?
PROGRAMN,DONEというのは、コンフィグレーション時の状態出力?
PCLKT3_0とか、CLKと付くのは、クロック入力可能なのかな?
各BANK毎にあるのは何故だろう。CとTって何?2
MCLK/CCLKはコンフィグレーションに使うのかもしれない
SDA,SCLはI2Cっぽい。SI,SOはSPIかな?
これだけピン数が少ないとI2CやSPIは必須だろうけど、使いこなせるかな。。
Machxo2は、内蔵発振器があるらしい。
Verilogのサンプルコードがあるけど、これだけで良いのかな?
// Internal Oscillator
// defparam OSCH_inst.NOM_FREQ = "2.08";// This is the default frequency
defparam OSCH_inst.NOM_FREQ = "24.18";
OSCH OSCH_inst( .STDBY(1'b0), // 0=Enabled, 1=Disabled
// also Disabled with Bandgap=OFF
.OSC(osc_clk),
.SEDSTDBY()); // this signal is not required if not
// using SED
発振周波数は、以下の4x16個から選べるらしい
デフォルトは2.08MHz。最大133MHz...って凄いな。。
OSCH Supported Frequency Settings
2.08 4.16 8.31 15.65
2.15 4.29 8.58 16.63
2.22 4.43 8.87 17.73
2.29 4.59 9.17 19.00
2.38 4.75 9.50 20.46
2.46 4.93 9.85 22.17
2.56 5.12 10.23 24.18
2.66 5.32 10.64 26.60
2.77 5.54 11.08 29.56
2.89 5.78 11.57 33.25
3.02 6.05 12.09 38.00
3.17 6.33 12.67 44.33
3.33 6.65 13.30 53.20
3.50 7.00 14.00 66.50
3.69 7.39 14.78 88.67
3.91 7.82 15.65 133.00
2 差動ペアのComp(反転)、True(正転)を示すらしい。
[top]
まぁ、ここまでいろいろ調べたんだけど。。
肝心のデバイスの入荷がさらに遅れているらしい。。。
MachXO2には、Breakoutボードという開発キットがあるらしい。
LCMXO2-1200ZE-P1-EVNでも手に入れるか。。。
Breakoutボードが使いやすくて、満足しちゃったこともあるかも。
[top]
ちょっと部品の整理をしていたら、LCMX02-256HCデバイスの入った箱を偶然見つけた。
あとから試してみようと思った時に探し回ったんだけど、全然見つからなくて諦めていたものだった。
こういう箱に入っているんじゃなくて、帯電防止袋に入っていると思い込んでいたので、分からなかったんだなぁ。。
最近、電子工作してないので、ちょっと弄ってみようかな。。
タイムカプセルを見つけたようなもので、いまさら感が半端ないが、勿体無いしね〜
またまた久しぶりにDiamondを起動したので、ライセンスエラー
Diamond Baseダウンロード
Diamond 3.10 64-bit for Windows
あれ?3.10になってる。インストール済みのDiamondは3.9なんだけど。。
Diamond Baseっていうのは、Diamondとは別なのかなぁ??
でも、最新のものを入れたいので、Diamond3.9はアンインストールしておく。
どうやら、3.10というのは3.1のことじゃなくて、9の次で10ということみたいだ
3.10.0.111.2_Diamond_x64.exeをインストール
起動時にライセンスエラー。システム環境変数LM_LICENSE_FILEを削除して再インストールしてみてもダメ。
結局、Dialogからは、ライセンスファイルのパスをうまく設定できなかったので、
LM_LICENSE_FILEのパス(C:\lscc\diamond\3.10_x64\license)に、license.datを置く様にしたら起動した。
以前 やったように、LM_LICENSE_FILEのパスを、直接書き換えても良かったかもしれない。
Diamondで、256HCのピン配置を表示してみる
Tools→PackageViewで、
最初はBottomViewになってるけど、右クリックでTopViewに切り替えれば良かったのか。
[top]
自分が使う場合に必要そうな仕様を改めてざっとまとめてみる
LCMX02-256HC
コア用電源 Vccに、2.5/3.3Vを供給
I/O用電源 VCCIOに各バング毎に、1.2/1.5/1.8/2.5/3.3Vとロジックレベルに応じた電圧を与える
基本的に3.3V電源で使うことになりそう。
ロジックレベル1.2から3.3Vで使えるのは、いろいろと用途がありそうだが、
5Vトレラントではないので注意が必要か
JTAG_PORT = Enable
これがデフォルト状態で、TDI,TDO,TMS,TCKピンがJTAG専用ピンとして機能している
この場合、JTAGENBピンは汎用I/Oになっている
JTAG_PORT = Disable
JTAGENBピンがLの時は、TDI,TDO,TMS,TCKピンは汎用I/Oだが、
JTAGENBピンをHにすることで、TDI,TDO,TMS,TCKピンがJTAGピンとして機能する
JTAG_PORTは、DiamondのTools→Spreadsheet Viewの、Global Preferencesタブで設定する
SYSCONFIG JTAG_PORT=DISABLE ;
[top]
BreakOutボードをライタとして使えるんじゃないかなぁ
JTAGチェインしたいが、回路図を見てみると残念ながらTDOを切り離せるようになってないみたいだ。
ボード上のMachXo2のJTAGを無効にしておいた方が良さそうだ
JTAG_PORTをDisable、TDI,TDO,TMS,TCKピンを入力に設定、
あとは、JTAGENBをHにすればいいのかな
Breakoutボードを書き換えたい場合は、JTAGENをLにすれば良いはず。
Breakoutボードには、とりあえず 以前やったLED点滅プログラム の手順で、
Tool→Spreadsheet Viewの、Global PreferencesタブでJTAG_PORTをDISABLEにして、インプリメントしてみる。
ERROR - All configuration ports of the design have been disabled.
If this is correct, change the Bitstream Setting MUX_CONFIGURATION_PORTS to ENABLE.
Done: error code 1
指示通りに、 MUX_CONFIGURATION_PORTSをENABLEにして、改めてインプリメント
以下のワーニングは出るけど、インプリメント出来た
WARNING - The JTAG Port has been disabled in this project,
and JTAG pins will be configured as General Purpose IO.
You must use JTAGENB pin in hardware to change the personality of the port from JTAG pins to general purpose IO.
This mux control pin is dedicated to the selection of JTAG pins for GPIO use by the user design.
Refer to the MachXO2 Handbook for details on dual-function JTAG ports.
WARNING - All configuration ports of the design could be disabled.
これを書き込んでやれば、JTAGポートは無効になるので、JTAGライタとして使えるようになる。
JTAGENをHにすれば、JTAGポートが有効になるので、また書き換えることが出来るようになる
LCMX02-256HCの仕様をよく分からないままで作ったので、いろいろ問題がありそう
JTAGEをプルアップできるようにしておくべきだったか
っていうか、単純に端子に出しとけば、汎用I/Oとして使えたんじゃね?3
まぁ、この回路図にはもっと大きなとんでもないミスがあったんだけど、それが何だか分かるでしょうか。。
最初に、両面テープを小さく切って(1mm角ぐらい)対角2箇所ぐらいに貼り付けて、位置決めする4 。
半田の切れを良くするために、パターンに無洗浄フラックスを塗っておく
QFN32といっても、側面に端子が見えているタイプなので、側面をざっとつける
少し半田を多めに盛って、融けて十分行き渡ったら、半田ごてで余計な半田をさっと除去する感じ
半田ブリッヂしないように注意する。QFN32は端子毎に半田付けするのは自分には無理なので。。
あとは、ブレッドボードに挿せるように、JTAG接続出来るように、ヘッダピンをつけておく
→とりあえずJP2を繋いでVCCIOは3.3Vにする
まぁ、自分は肉眼では半田付け無理なので、実体顕微鏡を使いました。
Breakoutボードと256HC基板を接続してみよう
Breakout-J1 256HC-JT
1 3.3V 6 VCC
2 TDO 5 TDO
3 TDI 4 TDI
4 NC -
5 NC -
6 TMS 3 TMS
7 GND 2 GND
8 TCK 1 TCK
基板のJTAG端子は、BreakoutボードのJTAGピン配置を参考にしている
NC端子を除いた6ピンを単純に接続するだけの、JTAG書き込み用ケーブルを作ってみた
JTAG端子の3.3Vを、256HCの電源として利用することが出来る
3 何か、ピンをひとつ削る必要があるけど。
4 これが、一番面倒で時間が掛かったかもしれない。
[top]
使わないとLCMX02-256HCが勿体無い!ってことで再開したので、特に作りたいものが無い。。
でも、最初は書き込みが出来るかどうかの確認だから、
とりあえずbreakoutボードでも使った 定番の LED点滅 でいいかな。
`timescale 1ns / 1ps
module m256blink (
input rst,
output led
);
reg [23:0] count;
OSCH #(.NOM_FREQ("4.16")) IOSC(.STDBY(1'b0),.OSC(clk),.SEDSTDBY());
always @(posedge clk or negedge rst)
begin
if (!rst)
count <= 0;
else
count <= count+1;
end
assign led = count[20];
endmodule
LEDを1個にしただけだけど、何故かalwaysでブロッキング代入を使ってたので、ノンブロッキングに直した。
基板のLEDとスイッチに合わせて、LPFファイルを作成する。
BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ;
IOBUF ALLPORTS IO_TYPE=LVCMOS33 ;
LOCATE COMP "led" SITE "17";
LOCATE COMP "rst" SITE "16";
とりあえず、タクトスイッチはrst端子に接続しておく
error - jedec file cannot be found.
これって自分が以前、 引っ掛かったこと に似てる気がする。
Programmerで7000ZEとして認識されている。256HCに直しfilenameを設定して、インプリメントからやり直す。
これで、ちゃんと256HCとして認識されて、書き込みできるようになったが、
よく分からないんだけど、これは書き込みが失敗しているのかな?
ググってみると、 こんな記事 があったけど、どうなんだろう。
TCK-GND間に、10〜30pFを付けたら良いというものなんだけど。
或いは、 こちらの記述 を見ると、
「TCKは2.2Kで必ず外部プルダウン、TMSは4.7K-10.0Kでプルアップすることを推奨します。」って書いてあるなぁ。
仕方が無いので、上の記述のような細工ができるかどうか、基板をチェックしてみることにした。
この基板、パスコンが全く入っていないじゃないか!
パスコンが少ないなら未だしも、全く無いんじゃまともに動かない。。
VCCは2箇所あるので、それぞれのピンの近くに0.1uF、念のため別に10uFを追加5 した。
これで、すんなり書き込めるようになって、ちゃんとLED2が点滅するようになりました。
この基板、かなり前にレイアウトだけしたのでよく憶えてないんだけど、設計途中だったのかも。
FusionPCBで、多面付けで基板を作るときに丁度良かったのでそのまま載せたけど、チェックが甘かった。。
でもLEDの抵抗10kΩはちょっと大きすぎたかな?かなり暗いんだけど。。
あぁそうか。VDD=3.3Vだったんだっけ。VDD=5Vのつもりだった7 。。。
5 SMDはこういう時、追加が簡単でいいよね。
6 昔、パスコンには散々悩まされたんだけど。。
7 まぁ、明るすぎるよりは良いか。。
[top]
書き込みは出来たので、JTAG端子と、LEDとタクトスイッチが接続された端子は、OKのようだけど、
他の端子の半田付けがちゃんと出来ているかどうかチェックしておこう。
改めて、回路図と確認しながら、256HC基板のピン配置を表にしてみた。
本来は、こんなことは基板を作る前にやるべきなんだけど。
256HC-JT pin
6 VCC 2,18
5 TDO 1
4 TDI 32
3 TMS 29
2 GND 3,22
1 TCK 30
256HC-J1 FPGA pin
1 CKC30 5
2 CKT30 4
3 CSSPIN 8
4 CCLK 9
5 SO 10
6 CKT20 11
7 CKC20 12
8 CKT21 13
9 CKC21 14
10 GND 3,22
256HC-J2 FPGA pin
1 VCC 2,18
2 VCCIO 6,7,15,19,24,31
3 SCL 28
4 SDA 27
5 PROGN 25
6 DONE 23
7 CKT10 21
8 CKC10 20
9 SI(LEDE) 17
10 SN(SW1) 16
回路図を見ると、MACHXO2のSymbol作成を失敗していて、4,5ピンが逆になっていた8 。。
256HC基板に合わせて、LPFファイルを作成する。
BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ;
IOBUF ALLPORTS IO_TYPE=LVCMOS33 ;
LOCATE COMP "led" SITE "17";
LOCATE COMP "rst" SITE "16";
LOCATE COMP "ledx[0]" SITE "5";
LOCATE COMP "ledx[1]" SITE "4";
LOCATE COMP "ledx[2]" SITE "8";
LOCATE COMP "ledx[3]" SITE "9";
LOCATE COMP "ledx[4]" SITE "10";
LOCATE COMP "ledx[5]" SITE "11";
LOCATE COMP "ledx[6]" SITE "12";
LOCATE COMP "ledx[7]" SITE "13";
LOCATE COMP "ledx[8]" SITE "14";
LOCATE COMP "ledx[9]" SITE "20";
LOCATE COMP "ledx[10]" SITE "21";
LOCATE COMP "ledx[11]" SITE "23";
LOCATE COMP "ledx[12]" SITE "25";
LOCATE COMP "ledx[13]" SITE "27";
LOCATE COMP "ledx[14]" SITE "28";
LOCATE COMP "ledx[15]" SITE "26";
LEDEとSW1と別に、16個のI/Oを用意する
JTAGEは端子が出ていないけど、ledx[15]として、一応接続しておこう
16個のLEDを順に点灯させるナイトライダーもどきを作ってみた
`timescale 1ns / 1ps
module m256night (
input rst,
output led,
output [15:0] ledx
);
reg [18:0] count;
reg [4:0] a;
reg [40:0] light;
OSCH #(.NOM_FREQ("4.16")) IOSC(.STDBY(1'b0),.OSC(clk),.SEDSTDBY());
reg[15:0] night[0:31];
initial begin
night[0] = 16'b00000000_00000001;
night[1] = 16'b00000000_00000010;
night[2] = 16'b00000000_00000100;
night[3] = 16'b00000000_00001000;
night[4] = 16'b00000000_00010000;
night[5] = 16'b00000000_00100000;
night[6] = 16'b00000000_01000000;
night[7] = 16'b00000000_10000000;
night[8] = 16'b00000001_00000000;
night[9] = 16'b00000010_00000000;
night[10] = 16'b00000100_00000000;
night[11] = 16'b00001000_00000000;
night[12] = 16'b00010000_00000000;
night[13] = 16'b00100000_00000000;
night[14] = 16'b01000000_00000000;
night[15] = 16'b10000000_00000000;
night[16] = 16'b10000000_00000000;
night[17] = 16'b01000000_00000000;
night[18] = 16'b00100000_00000000;
night[19] = 16'b00010000_00000000;
night[20] = 16'b00001000_00000000;
night[21] = 16'b00000100_00000000;
night[22] = 16'b00000010_00000000;
night[23] = 16'b00000001_00000000;
night[24] = 16'b00000000_10000000;
night[25] = 16'b00000000_01000000;
night[26] = 16'b00000000_00100000;
night[27] = 16'b00000000_00010000;
night[28] = 16'b00000000_00001000;
night[29] = 16'b00000000_00000100;
night[30] = 16'b00000000_00000010;
night[31] = 16'b00000000_00000001;
end
always @(posedge clk or negedge rst)
begin
if (!rst) begin
a <= 0;
count <= 0;
end
else begin
if (!count) a <= a+1;
light <= night[a];
count <= count+1;
end
end
assign ledx = light;
assign led = count[18];
endmodule
点灯箇所がテーブルになってるので、ちょっと冗長な記述だけど。。
256HCの12,27,26ピンの3箇所が点灯しない。。半田ゴテを当ててリカバリしようとしたけど変化なし。。。
もしかして半田付けはうまく行ってるけど、何か設定とかが悪いのではと、もう1つ作ってみた9 。
やはりQFN32の側面だけではうまく接続出来ないみたいなので、予め基板パターンにうすく半田を盛っておいて、
チップの裏側も、うすく半田メッキしておく
無洗浄フラックスを塗って、チップを置いたら、慎重に位置合わせ
それで、無洗浄フラックスを隙間に浸み込ませて、しばらく置く10
チップを軽く押さえて、コーナー一箇所だけ半田を融かして、位置合わせが狂っていないことを確認
あとは、逆コーナーから、普通に全ピン半田付けする。
今度はちゃんと全部点灯した。残念ながら設定の問題ではなく、単純に半田付けの失敗だった。
1個目はJTAG端子が接続されていてラッキーだったなぁ。。
やっぱり、QFN32の手付けは自分にはちょっと難しいね。。。
ホットプレートとかを使った、半田リフローの方がうまく行くのかもしれない。
JTAGEピンも基板上にチェック端子を付けて接続を確認した
単純に点灯するだけだと、ナイトライダーっぼくないので、残光処理をしてみた
変更したのは、 青字の3行 のみ
:
reg [19:0] a;
:
always @(posedge clk or negedge rst)
begin
if (!rst) begin
a <= 0;
count <= 0;
end
else begin
if (!count) a <= ({a[19:15],a}>>5)+20'b00001_00000_00000_00000; light <= night[a[19:15]] | (!count[1:0]?night[a[14:10]]:0) | (!count[3:0]?night[a[9:5]]:0) | (!count[7:0]?night[a[4:0]]:0); count <= count+1;
end
end
:
ぐちゃぐちゃでちょっと分かり辛いので、簡単に説明すると、
1つ前、2つ前、3つ前の点灯箇所を覚えて置いて、
それぞれ、1/4、1/16、1/256の時間だけ点灯11 させている
VIDEO
抵抗とLEDを16個づつ配線するのは、ブレッドボードでも面倒くさかったので、
1kΩ抵抗とLEDを、カソードコモンでそれぞれ8個分纏めた基板を2つ作ってみた。→なかなか便利!
やっぱり残光があった方が、それっぽい。
JTAGENピンも含めて16ピン接続OKだったので、書き込み成功したJTAGピン合わせて全ピンの接続確認できました12 。
8 後でEagleのSymbolを直しておかないと。。いや、直した奴を追加登録しないと、この基板のデータに矛盾がでちゃうかな。。
9 チップを外して付け直そうかとも思ったが、今以上にダメになりそうなので止めた。
10 基板を傾けても外れない程度の仮止め。
11 初め、1/2,1/4,1/8でやってみたが、明るさがあまり変わらなかったので、時間を短くした。
12 まぁ完全に成功したのは2個目に作った方だけなんだけど。。
[top]
log 133000000 / log 2 = 26.98685...
133MHzを分周して1Hzにするには、約2^27分周なので、
`timescale 1ns / 1ps
module m256osc (
input rst,
output led,
output [15:0] ledx
);
reg [26:0] count;
OSCH #(.NOM_FREQ("133.00")) IOSC(.STDBY(1'b0),.OSC(clk),.SEDSTDBY());
always @(posedge clk or negedge rst)
begin
if (!rst) begin
count <= 0;
end
else begin
count <= count+1;
end
end
assign ledx[0] = clk;
assign ledx[15:1] = count[15:1];
assign led = count[26];
endmodule
LEDの点滅は、約1秒おきぐらいなので、133MHzってのは本当らしい。
使用したHantekのDSO225013 は250Ms/sなので、波形は全く当てにならないが、ちゃんと出力はされているようだ。
さらに2波形表示では125Ms/sになるので、まぁ出力があるかどうかの確認程度14 なんだけど。
内蔵発振なので精度は全然期待出来ないが、100MHz級の発振器を簡単に用意できるのは良いね
13 自分はWindows7なんだけど、最新バージョンのアプリだとDSO2250がまともに動かなかったので、V7.1.0.5を使っている。
14 エイリアシングが見えているが、繰り返し波形なので、ある程度は判断できる。
[top]
VCCIOで、入出力のI/Oロジックレベルを設定できるらしい。
それならレベルシフタとか使わずに低電圧のロジックに接続出来るのか。
といっても、内蔵クロックを一旦出力して、それを改めて入力して分周するだけなんだけど。
4ピンがPCLKT3_0でPCLKのTrue側なので、ここからクロック入力してみる。
`timescale 1ns / 1ps
module m256oscx (
input rst,
output led,
output clko,
input clki,
output [13:0] ledx
);
reg [26:0] count;
OSCH #(.NOM_FREQ("133.00")) IOSC(.STDBY(1'b0),.OSC(clk),.SEDSTDBY());
always @(posedge clki or negedge rst)
begin
if (!rst) begin
count <= 0;
end
else begin
count <= count+1;
end
end
assign clko = clk;
assign ledx[13:0] = count[13:0];
assign led = count[26];
endmodule
BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ;
IOBUF ALLPORTS IO_TYPE=LVCMOS33 ;
LOCATE COMP "led" SITE "17";
LOCATE COMP "rst" SITE "16";
LOCATE COMP "clko" SITE "5";
LOCATE COMP "clki" SITE "4";
LOCATE COMP "ledx[0]" SITE "8";
LOCATE COMP "ledx[1]" SITE "9";
LOCATE COMP "ledx[2]" SITE "10";
LOCATE COMP "ledx[3]" SITE "11";
LOCATE COMP "ledx[4]" SITE "12";
LOCATE COMP "ledx[5]" SITE "13";
LOCATE COMP "ledx[6]" SITE "14";
LOCATE COMP "ledx[7]" SITE "20";
LOCATE COMP "ledx[8]" SITE "21";
LOCATE COMP "ledx[9]" SITE "23";
LOCATE COMP "ledx[10]" SITE "25";
LOCATE COMP "ledx[11]" SITE "27";
LOCATE COMP "ledx[12]" SITE "28";
LOCATE COMP "ledx[13]" SITE "26";
4,5ピン間を外部接続して、ちゃんと動くか確認する。
JP2を切り離して、VCCIOに外部から3.3Vを入力してやると、ちゃんとLEDが約1秒間隔で点滅した。
VCCIOの電圧を下げると、入出力可能な上限の周波数も下がるはずだ。
逆に入力周波数に対して、どれぐらいの電圧まで動作するか、ざっくり確認してみよう。
VCCIOの電圧を下げながら、LEDの点滅を確認しようと思ったが、
青色LEDのVFは3Vぐらいなので、3V以下だとLEDの点滅は見えなかった。。
ということで、1/128分周した波形をDSOで見ながら、確認することにした。
⇒
で、内蔵発振の周波数を書換えながら確認すると、結果は以下のようになった15
入力周波数 VCCIO動作電圧
133.00MHz 1.5V
88.67MHz 1.3V
44.33MHz 1.05V
22.17MHz 0.9V
11.08MHz 0.8V
かなり大雑把だけど、VCCIOが1V程度でも、10MHzぐらいの信号は十分やりとり出来そうだ。
実用的には1V以下はちょっと不安定な感じだけど、実験的にはOKかな。
15 ちなみに書き込み時はVCCIOを3.3Vにしないとうまく書き込めなかった。まぁ当然か。
[top]
ずっと放っておいた256HCをやっと動かせて良かった。
でも、QFN32の手付けはやっぱりちょっと難しい。
結局、あまりまともなものは作れてないんだけど、
Breakoutボードを、JTAGライタとして使えることが分かったし、
VCCIOを使えば、レベルシフタなしで低電圧ロジックと接続出来そうなのも分かったので良しとしよう
まぁでも今となってはロジックの規模的に、256HC16 だと実際に使う機会はなさそうかなぁ。。
16 ピン数はこれで十分なので、規模が1200とか、出来れば7000ぐらいあると良いなぁ。
[top]
[top]
[電子工作関連に戻る]