こんばわぁ。

久々のブログです。

 

今回はSwitch Scienceさんとかで販売している

Tiny FPGA AX2

https://www.switch-science.com/catalog/3980/

と、そのプログラマ(Tiny FPGAプログラマ)

https://www.switch-science.com/catalog/3979/

を使って、Lチカしたのでそのご報告を。

 

ボードに搭載されているFPGAがXO2-1200(Lattice Semiconductor)

ということで、Lattice社のDiamondを使って作っていきます。

 

ユーザーガイドではVerilogでのコードが書いてありましたが、

ここでは、VHDLコードを記載しておきますね。

内蔵CLKを使ったり、内蔵クロックを上位モジュールに

組み込んだりと、はじめの一歩としてはかなり敷居が

高いようにも思えますが、まぁいいでしょう(^-^;

 

---ここから----

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

library machxo2;
use machxo2.all;


entity LED_ONOFF is
port (
    --clk : in std_logic;
    out1: out std_logic); 
end LED_ONOFF;

architecture RTL of LED_ONOFF is

COMPONENT OSCH
-- synthesis translate_off
GENERIC (NOM_FREQ: string := "2.56");
-- synthesis translate_on
PORT ( STDBY :IN std_logic;
OSC :OUT std_logic;
SEDSTDBY :OUT std_logic);
END COMPONENT;

attribute NOM_FREQ : string;
attribute NOM_FREQ of OSCinst0 : label is "2.56";

signal reg1:std_logic_vector(23 downto 0);
signal stdby:std_logic;
signal osc_int:std_logic;
signal stdby_sed:std_logic;

begin

OSCInst0: OSCH
-- synthesis translate_off
GENERIC MAP ( NOM_FREQ => "2.56" )
-- synthesis translate_on
PORT MAP ( STDBY=> stdby,
OSC=> osc_int,
SEDSTDBY=> stdby_sed
);

out1 <= reg1(23);
stdby <= '0';

process(osc_int) begin
    if(osc_int'event and osc_int='1') then
        reg1 <= reg1 + 1;
    end if;
end process;

end RTL; 

 

---ここまで---

 

動作的には、内蔵クロックを2.08MHzに設定して、

変数regをクロックに同期させて1ずつ足していく。

そのregの最上位ビットを出力(pin13は、ボード上のLEDにつながっています)

しています。

 

最初、コードはできたもののJEDICファイル(書き込むファイル)を

Tiny FPGAプログラマを使って、書けねー!と何時間か戸惑い

ましたが、PCとの接続に使ったUSBケーブルのせいでした(-_-;

きちんと通信できるケーブルにしたら、Virtual COM Portとして

認識してくれました。

 

Latticeの純正ダウンロードケーブルや他のFPGAライターを

使わなくても、Tiny FPGAプログラマで書けるのはいいですね。

 

今後は、周辺回路も作ってみたいと思います(時間があったら)。

 


 

 

またまた備忘録ということで。

 

Form上に、ButtonとStringGridがある状態にしてください。

 

念のために

#include <stdio.h>
#include <string.h>
#include <windows.h>

の3つをインクルードした上で、

 

void __fastcall TForm2::Button4Click(TObject *Sender)
{
    TCHAR   szBuff[ 128 ];      // 最低でも(4 * 26 + 1)バイト以上
    LPTSTR  lpSeek;
    DWORD   dwDrive;
    int     nDrive;
    LPCTSTR     lpMedia;
    int num;



    // ドライブのビットで取得
    dwDrive = GetLogicalDrives();
    for ( nDrive = 0 ; nDrive < 26 ; nDrive++ ){
        if ( dwDrive & (1 << nDrive) ){
            char nnDrive = nDrive + TEXT('A');
            AnsiString nDrive1 = AnsiString(nnDrive) + ":\\";
            StringGrid1->Cells[1][num+1] = nDrive1;
            UnicodeString nDrive2 = UnicodeString(nDrive1);
            switch (GetDriveType(nDrive2.c_str())){
                case 0:     lpMedia = TEXT("不明なドライブ");
                            break;
                case 1:     lpMedia = TEXT("ドライブが存在しない");
                            break;
                case 2:     lpMedia = TEXT(" Removable ドライブ");
                            break;
                case 3:     lpMedia = TEXT(" HDD ドライブ");
                            break;
                case 4:     lpMedia = TEXT("ネットワーク・ドライブ");
                            break;
                case 5:     lpMedia = TEXT(" CD-ROM ドライブ");
                            break;
                case 6:     lpMedia = TEXT(" RAM ディスク");
                            break;
                default:    lpMedia = TEXT("?????");
                            break;
            }
            StringGrid1->Cells[2][num+1]= AnsiString(lpMedia);
            num++;

        }
    }
}
//---------------------------------------------------------------------------
 

のようにしてA:\からZ:\までで有効なドライブを検出して、そのドライブが

どのようなドライブかを表示しています。

 

C++ Builderのメモ帳のつづき。

 

ここでは、Lドライブ(12番目)の空き容量を表示させます。

 

  __int64 iSize;
    __int64 iFreeSize;

    iSize = DiskSize(12);     //Lドライブ
    iFreeSize = DiskFree(12); //Lドライブ

    if(iSize == -1){
        AnsiString strErrMsg;
        strErrMsg = SysErrorMessage(GetLastError());
        ShowMessage(strErrMsg);
        return;
    }

    ShowMessage("Lドライブの空き容量は"+ FloatToStrF(float(iFreeSize)/1024.0/1024.0/1024.0,ffGeneral,3,2)+ "GBです");