最近の更新 (Recent Changes)

2022-08-24
2015-11-04
2014-10-14
2014-07-01
2014-06-29

最新檔案發佈

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

Wikiガイド(Guide)

サイドバー (Side Bar)

TkTest

tk_led.png

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

  1. load tk84
  2. #pack [button .b -text Botan -command exit]
  3. #pack [button .b1 -text BotanA -command exit]
  4. pack [canvas .c_led]
  5. set x 10
  6. set y 20
  7. set w 10
  8. for {set i 7} {$i >= 0} {incr i -1} {
  9. incr x 20
  10. set name led
  11. append name $i
  12. .c create text [expr $x + 5] [expr $y - 5] -text $i
  13. .c create oval $x $y [expr $x + $w] [expr $y + $w] \
  14. -fill "red" -outline "dark red" -width 1 -tag $name
  15. }
  16. .c_led bind led0 <Enter> {
  17. %W itemconfigure led0 -fill "salmon"
  18. }
  19. .c_led bind led0 <Leave> {
  20. %W itemconfigure led0 -fill "gray"
  21. }
  • あとは、HDL記述の中のwireのH/Lによって色が変わるようにすればいけるはず。
  • ナイトライダーとかも試せます。実用性より、無味乾燥になりがちなシミュレーションを楽しくやることが目的。

ledpanel.png

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

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

  1. # ModelSIM上でLED Panelを出すスクリプト
  2. load tk84
  3. proc seven_seg_yoko {x y name} {
  4. .c_led create polygon $x $y [incr x 5] [incr y -5] [incr x 20] $y \
  5. [incr x 5] [incr y 5] [incr x -5] [incr y 5] [incr x -20] $y \
  6. -fill "black" -outline "dark red" -tag $name
  7. }
  8. proc seven_seg_tate {x y name} {
  9. .c_led create polygon $x $y [incr x 5] [incr y 5] [incr x -3] [incr y 20] \
  10. [incr x -5] [incr y 5] [incr x -5] [incr y -5] [incr x 3] [incr y -20] \
  11. -fill "black" -outline "dark red" -tag $name
  12. }
  13. proc seven_seg {x y name} {
  14. seven_seg_yoko $x $y ${name}a
  15. seven_seg_tate [expr $x + 31] [expr $y + 2] ${name}b
  16. seven_seg_tate [expr $x + 28] [expr $y + 35] ${name}c
  17. seven_seg_yoko [expr $x - 7] [expr $y + 66] ${name}d
  18. seven_seg_tate [expr $x - 6] [expr $y + 35] ${name}e
  19. seven_seg_tate [expr $x - 2] [expr $y + 2] ${name}f
  20. seven_seg_yoko [expr $x - 4] [expr $y + 34] ${name}g
  21. #dot
  22. .c_led create oval [expr $x + 28] [expr $y + 66] \
  23. [expr $x + 38] [expr $y + 76] \
  24. -fill "black" -outline "dark red" -width 1 -tag ${name}dot
  25. }
  26. proc change_led {} {
  27. array set color {0 black 1 red x black}
  28. set value [examine -radix 2 /test_counter/count]
  29. #puts stdout $value
  30. for {set i 0} {$i <= 7} {incr i} {
  31. set bit [string index $value [expr 7 - $i]]
  32. .c_led itemconfigure led${i} -fill $color($bit)
  33. }
  34. change_seven_seg
  35. }
  36. proc change_seven_seg {} {
  37. array set color {0 black 1 red x black}
  38. array set pos {0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 dot}
  39. set value [examine -radix 2 /test_counter/count]
  40. #puts stdout $value
  41. for {set i 0} {$i <= 7} {incr i} {
  42. set bit [string index $value [expr 7 - $i]]
  43. .c_led itemconfigure seg0$pos($i) -fill $color($bit)
  44. }
  45. }
  46. #-----------------------------------------------------
  47. # ウィンドウタイトルが"tk"のままだとカッコ悪いので、名前を変える
  48. wm title . "LED Panel"
  49. # スクリプトを再読み込みしても問題を起こさないように、
  50. # キャンバスが作成済みなら、削除してから再作成する
  51. if {[info command .c_led] ne ""} {
  52. destroy .c_led
  53. }
  54. pack [canvas .c_led -width 200 -height 150 -bg black]
  55. #pack [button .b -text Botan -command exit]
  56. #pack [button .b1 -text BotanA -command exit]
  57. # LEDの表示
  58. set x 10
  59. set y 20
  60. set w 10
  61. for {set i 7} {$i >= 0} {incr i -1} {
  62. .c_led create text [expr $x + 5] [expr $y - 5] -text $i -fill white
  63. .c_led create oval $x $y [expr $x + $w] [expr $y + $w] \
  64. -fill "black" -outline "dark red" -width 1 -tag led${i}
  65. incr x 20
  66. }
  67. # 7セグメントLEDの表示
  68. seven_seg 50 50 seg0
  69. seven_seg 110 50 seg1
  70. #.c_led bind led0 <Enter> {
  71. # %W itemconfigure led0 -fill "salmon"
  72. #}
  73. 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名とタグ名は同一で構いませんが、オブジェクトごとにユニークにする必要があります。