Develop and Download Open Source Software

最近の更新 (Recent Changes)

2012-04-23
2012-04-22
2012-04-21
2012-03-25
2012-03-11
2012-02-24

Wikiガイド(Guide)

サイドバー (Side Bar)

TkTest

tk_led.png

ModelSIMのTranscriptウィンドウから、とりあえずLEDに見えるものを表示できました。

load tk84
#pack [button .b -text Botan -command exit]
#pack [button .b1 -text BotanA -command exit]

pack [canvas .c_led]
set x 10
set y 20
set w 10

for {set i 7} {$i >= 0} {incr i -1} {
    incr x 20
    set name led
    append name $i
    .c create text [expr $x + 5] [expr $y - 5] -text $i
    .c create oval $x $y [expr $x + $w] [expr $y + $w] \
        -fill "red" -outline "dark red" -width 1 -tag $name
}

.c_led bind led0 <Enter> {
    %W itemconfigure led0 -fill "salmon"
}

.c_led bind led0 <Leave> {
    %W itemconfigure led0 -fill "gray"
}
  • あとは、HDL記述の中のwireのH/Lによって色が変わるようにすればいけるはず。
  • ナイトライダーとかも試せます。実用性より、無味乾燥になりがちなシミュレーションを楽しくやることが目的。

ledpanel.png

貧弱だった見た目を大幅に改善、なんだか動きそう。7セグの表示がおかしいのはデコーダ回路を未作成だから。

ただしこの段階で、whenで起こされた後examineで信号状態を見るという、NOODLYBOXでやったことの応用に成功しています。

# ModelSIM上でLED Panelを出すスクリプト
load tk84

proc seven_seg_yoko {x y name} {
    .c_led create polygon $x $y  [incr x  5] [incr y -5]  [incr x  20] $y \
        [incr x 5] [incr y 5]    [incr x -5] [incr y  5]  [incr x -20] $y \
        -fill "black" -outline "dark red" -tag $name
}

proc seven_seg_tate {x y name} {
    .c_led create polygon $x $y [incr x 5] [incr y 5]  [incr x -3] [incr y 20] \
        [incr x -5] [incr y 5] [incr x -5] [incr y -5] [incr x 3] [incr y -20] \
        -fill "black" -outline "dark red" -tag $name
}

proc seven_seg {x y name} {
    seven_seg_yoko       $x             $y       ${name}a
    seven_seg_tate [expr $x + 31] [expr $y +  2] ${name}b
    seven_seg_tate [expr $x + 28] [expr $y + 35] ${name}c
    seven_seg_yoko [expr $x -  7] [expr $y + 66] ${name}d
    seven_seg_tate [expr $x -  6] [expr $y + 35] ${name}e
    seven_seg_tate [expr $x -  2] [expr $y +  2] ${name}f
    seven_seg_yoko [expr $x -  4] [expr $y + 34] ${name}g
    #dot
    .c_led create oval [expr $x + 28] [expr $y + 66] \
        [expr $x + 38] [expr $y + 76] \
        -fill "black" -outline "dark red" -width 1 -tag ${name}dot
}

proc change_led {} {
    array set color {0 black 1 red x black}
    set value [examine -radix 2 /test_counter/count]
    #puts stdout $value

    for {set i 0} {$i <= 7} {incr i} {
	set bit [string index $value [expr 7 - $i]]
        .c_led itemconfigure led${i} -fill $color($bit)
    }
    change_seven_seg
}

proc change_seven_seg {} {
    array set color {0 black 1 red x black}
    array set pos {0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 dot}
    set value [examine -radix 2 /test_counter/count]
    #puts stdout $value

    for {set i 0} {$i <= 7} {incr i} {
	set bit [string index $value [expr 7 - $i]]
        .c_led itemconfigure seg0$pos($i) -fill $color($bit)
    }
}

#-----------------------------------------------------

# ウィンドウタイトルが"tk"のままだとカッコ悪いので、名前を変える
wm title . "LED Panel"

# スクリプトを再読み込みしても問題を起こさないように、
# キャンバスが作成済みなら、削除してから再作成する
if {[info command .c_led] ne ""} {
    destroy .c_led
}

pack [canvas .c_led -width 200 -height 150 -bg black]
#pack [button .b -text Botan -command exit]
#pack [button .b1 -text BotanA -command exit]

# LEDの表示
set x 10
set y 20
set w 10
for {set i 7} {$i >= 0} {incr i -1} {
    .c_led create text [expr $x + 5] [expr $y - 5] -text $i -fill white
    .c_led create oval $x $y [expr $x + $w] [expr $y + $w] \
        -fill "black" -outline "dark red" -width 1 -tag led${i}
    incr x 20
}

# 7セグメントLEDの表示
seven_seg  50 50 seg0
seven_seg 110 50 seg1

#.c_led bind led0 <Enter> {
#    %W itemconfigure led0 -fill "salmon"
#}

when -label Kicked { /test_counter/count } { change_led }

ledpanel2.png

最終形態。incr Tclを使ってカプセル化したのでずっと使いやすくなりました。

実行可能なサンプルの解説、HDLソースを含めたファイルの取得は TkTestHowTo を参照してください。

ソース

要は、
  1. source ~/led.tclでクラス定義を読んでから、
  2. vsim -t 時間 シミュレーション対象でシミュレーションモデルを読み込み、
  3. pack [canvas .c_ledpanel ~]してキャンバスを作り、
  4. Led ~またはSevenSeg ~で描画
すれば、あとはrun 100 nsなどとして時間を進めるとLEDに信号状態が反映されます。

注意点

  1. 監視対象の信号が存在しえないため、vsimの呼び出し前ではLedクラスおよびSevenSegクラスのオブジェクトの作成に失敗します。
  2. obj名とタグ名は同一で構いませんが、オブジェクトごとにユニークにする必要があります。

SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.