2012-05-19 2 views
2

Я пытаюсь написать сценарий tcl для моего модуля декодера (verilog in modelsim) Мне нужно закодировать входное значение 'din' от 000 до 111
То, к чему я пришел сейчас.Tcl двоичный цикл. Бинарный приращение

vsim work.decode_shift 
add wave -noupdate -format Logic -radix binary /decode_shift/din 
add wave -noupdate -format Logic -radix binary /decode_shift/dout 
for { set i 0 } { $i==0111 } { incr i } { 
    force din $i 
    run 100 
} 
run @500ns 

Это не работает из-за какой-то проблемы с типом, и я не знаю, как обойти. Что я делаю неправильно и каков правильный способ увеличения двоичных цифр в tcl?

+0

не так просто цикл от 0 до 7? Если вам нужно превратить его в двоичную строку, вы можете использовать формат. – Julian

+0

Да, в десятичной системе. Но как назначить десятичную дробь для двоичного din? – user1405165

+0

i get "Ошибка: (vsim-4011) Недопустимое значение силы: 2", как только я дойду до "2". – user1405165

ответ

0

Не знаю, поможет ли это вам http://codepad.org/YX4nfMIS (воспроизведено ниже) Он создает восходящий список строк, представляющих числа в двоичном формате. Но это может быть не так, как Verilog хочет ваши данные.

set l { "000" "001" "010" "011" "100" "101" "110" "111"} 
for { set i 0} { $i<8 } { incr i } { 
puts [lindex $l $i] 
} 

Или, как Донал указует

set l { "000" "001" "010" "011" "100" "101" "110" "111"} 
foreach i $l { 
    puts $i 
} 
+0

В этом случае вам лучше использовать 'foreach'; Мне нравится 'foreach' много ... –

+0

Мне также нравится простота этого, b/c, если вы хотите перейти на серый код, это очень просто. –

2

С Tcl, вы не увеличиваете двоичные цифры. Вы форматируете номер как двоичный. До 8.6, можно использовать комбинацию binary format и binary scan сделать преобразование, так как здесь:

vsim work.decode_shift 
add wave -noupdate -format Logic -radix binary /decode_shift/din 
add wave -noupdate -format Logic -radix binary /decode_shift/dout 
for { set i 0 } { $i<=7 } { incr i } {  # Need non-binary literal 
    # Convert to 8 binary digits, store result in “i_bin” variable 
    binary scan [binary format c $i] B8 i_bin 

    force din $i_bin; # Assume takes 8 bits; [string range] to trim otherwise 
    run 100 
} 
run @500ns 

Если у вас есть 8.6, вы можете сделать это вместо того, чтобы:

vsim work.decode_shift 
add wave -noupdate -format Logic -radix binary /decode_shift/din 
add wave -noupdate -format Logic -radix binary /decode_shift/dout 
for { set i 0 } { $i<=0b111 } { incr i } { # Binary literal... 
    force din [format %04b $i]; # width 4 field, zero padded on left 
    run 100 
} 
run @500ns 
Смежные вопросы