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ボードを弄ってるうちに、うやむやに。。
- 前半は過去に調べたことで、ちょっと古い話なんだけど、勿体無いのでそのまま載せた。
- 後半が、改めて1MachXO2の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。。。
5SMDはこういう時、追加が簡単でいいよね。
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させている
- 抵抗と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]
[電子工作関連に戻る]