LEDチカチカ

BeMicro Max10用のVHDLコード。

-- LED display demo on BeMicro MAX10
-- Shifting LED pattern every second. 


library ieee;
use ieee.std_logic_1164.all;

entity blink_top is 
    port (      reset : in std_logic;
                clock : in std_logic;   -- assign 50Mhz clock.
                led : out std_logic_vector( 7 downto 0 ) );
end blink_top;


architecture rtl of blink_top is 
    signal count : integer;                             -- 50Mhz divider
    signal pattern : std_logic_vector( 15 downto 0 );   -- LED internal pattern.
    
    type stateType is ( counting, saturated );          -- for State machine
    signal state : stateType ;
begin
    process ( clock, reset )
    begin
        if reset = '0' then
                -- async reset the internal state and signals; 
            led <= ( others => '0' );
            pattern <= "0000000011111111";
            count <= 1;
            state <= saturated;
        elsif clock'event and clock = '1' then
                -- State transition
            case state is
                        -- count up till 50M 
                when counting =>
                    count <= count + 1;
                    
                    if count > 50000000 then
                        state <= saturated;
                    end if;
                    
                        -- output the display pattern to LED, then, rotate the pattern
                        -- initialize the counter 
                when saturated =>
                    led <= pattern( 15 downto 8 );                      -- output to LED
                    pattern <= pattern( 14 downto 0 ) & pattern(15);    -- rotate pattern
                    count <= 1;                                         -- reset counter
                    
                    state <= counting;
            end case;
        
        end if;
    end process;
end rtl; 

BeMicro MAXのハードウェア

BeMicro Max10は、クロックとして50MHzをN14ピンに入力している。サンプルverilogプロジェクトのピンアサイメントは以下の通り

LED[7] Output PIN_AA5
LED[6] Output PIN_AB4
LED[5] Output PIN_T6
LED[4] Output PIN_V4
LED[3] Output PIN_T1
LED[2] Output PIN_R2
LED[1] Output PIN_N1
LED[0] Output PIN_M2
clk Input PIN_N14
reset_n Input PIN_M1

回路図へのリンク

ubuntuとquartus

  • Ubuntu 14.04 LTS 64bit 日本語版
  • Quartus Prime 15.1

起動まで確認済み。32bit版では動かない。
追記:

  • /opt配下にインストールすると、どうしてもoption等を保存してくれない。結局~/配下にインストールした。
  • 15.1にupdate1を適用した。
  • USB Blasterを安定動作させるために、/etc/udev/rules.d/に51-usbblaster.rules を作った

# Altera USB-Blaster for Quartus FPGA Software
SUBSYSTEMS=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666"
SUBSYSTEMS=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666"
SUBSYSTEMS=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666"
# USB-Blaster II
SUBSYSTEMS=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666"
SUBSYSTEMS=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666"

現状、sofファイルはターゲットにダウンロードできる。pofファイルはツールにロードした段階でツールがクラッシュ。
ubuntuはサポート対象外。

qemuでu-boot

ubuntu 14.04 LTS。
apt-get install でqemuをインストールする。

sudo apt-get install gcc-arm-none-eqbi
sudo apt-get install qemu

u-bootは2010.09をダウンロードする。これよりあとのバージョンだとqemuでは起動しない。ダウンロードしたらmakeをかける。

make all versatilepb_config arch=ARM CROSS_COMPILE=arm-none-eabi-

qemuで起動する。

qemu-system-arm -M versatilepb -m 128M -nographic -kernel u-boot.bin 
U-Boot 2010.09 (Aug 21 2015 - 17:33:49)

DRAM:  0 Bytes
Flash: 64 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   SMC91111-0

range()とfor文

range(a,b)で、aからb-1の範囲オブジェクトを作る。

range(1,5)

だと、値の範囲は1から4である(5は範囲に含まない)。0から始まる範囲の場合、最初の0は省いて良い。

range(0)

for文を回すときにはrange()を使う。

for i in range(5):
    print(i)

実行すると0から5までの数字が印字される。
for文は範囲だけでなく、リストの要素に対して回すことも出来る。

b = ['a', 'b', 'c', 'd']
for i in b:
    print(i)

これでリストbの要素がすべて印字される。
辞書に対してfor文を回すことも出来る。

a = { '春':'あけぼの', '夏':'よる', '秋':'ゆうぐれ','冬':'つとめて' }

for v,u in a.items():
    print(v,u)

a.items()は、キーと値のペアを列挙する。そのため、印字結果はすべてのキーと値1行ずつ印字したものになる。なお、印字される順序は辞書を作った順序では無い。実装はハッシュなので順序は制御できないのである。

リストと辞書

リスト

オブジェクトをコンマで区切って[]で囲むとリストになる

a = [ 1,2,3,4,5 ]
print[1]

オブジェクトは数値でも文字列でもなんでもいい。リストでもいい。
リストは添え字を持つ。順番に0,1,2...となる。上の例だと、0番目のオブジェクトにアクセスするにはa[0]とする。上のプログラムは実行すると「2」を出力する
スライシング機能を使ってサブリストを抽出できる。

a[1:3]

は、添え字1の手前から添え字3の手前までをサブリストとして抽出することを意味する。上の例では値は[2,3,4]となる。

辞書

リストは添え字で順序されたオブジェクトの列だった。辞書はキーを持つオブジェクトの集合である。キーとオブジェクトはコロン(:)で区切る。これらをコンマで区切って並べ、{}でくるむ。キーは定数を使う。

a = { '春'|'あけぼの', '夏'|'よる', '秋'|'ゆうぐれ', '冬'|'つとめて' }
print(a['夏'])

辞書はキーによるアクセスを行う。上の例は、実行すると「よる」を出力する。
リストと辞書は、作成時の記号が異なる。リストは、辞書は{}である。しかし、アクセス時にはいずれもを使う。

文字列リテラル

いずれも文字列リテラル

'literarl'
'リテラル'
u'リテラル'
"literal"

文字列は'で囲っても"で囲っても良い。いずれも文字列。'で囲った文字列の中には"を書くことが出来る。"で囲った文字列の中には'を書くことができる。
文字列の頭にuを付けるとunicode文字列である事を宣言したことになる。
隣接する二つの文字列リテラルは連接される。

a = 'alpha' 'beta'
print(a)

印字結果はalphabetaとなる。
\はエスケーシーケンス。