isesimutil (r230) | 2012-01-01 23:07 |
nbox_util (r247) | 2012-03-11 22:19 |
noodlybox (0012) | 2010-01-01 19:46 |
TimingChartViewer (r245) | 2012-02-15 00:10 |
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"
- }
貧弱だった見た目を大幅に改善、なんだか動きそう。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 }
最終形態。incr Tclを使ってカプセル化したのでずっと使いやすくなりました。
実行可能なサンプルの解説、HDLソースを含めたファイルの取得は TkTestHowTo を参照してください。
ソース
注意点
[PageInfo]
LastUpdate: 2009-05-27 01:16:54, ModifiedBy: molelord
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:members, delete/config:members