TCL: объединение выходных битов в переменную

Предположим, у нас есть переменная «a», которая в конце должна представлять значение из 4 бит, например. а = "0011". Отдельные биты в эту переменную считываются из экземпляра VHDL.

Предположим, что первый бит вывода VHDL равен 1, например. result_from_VHDL_instance = 1. Затем я сохраняю этот старший бит в своей переменной a:

  set a [BUS2INT result_from_VHDL_instance]; # a = 1

Теперь, как мне соединить с этой переменной оставшиеся биты. Предположим, что второй бит вывода VHDL снова равен 1, например. result_from_VHDL_instance = 1. Теперь я хочу объединить этот бит с битом, который уже хранится, например, в а = 11.

И так продолжается, для следующего бита, например. result_from_VHDL_instance = 0, значение a должно быть 110 и т. д.

РЕДАКТИРОВАТЬ:

Спасибо за ваши ответы до сих пор, но я думаю, что у меня есть более основная проблема. Первый вопрос заключается в том, есть ли в TCL такой тип данных для бинарного представления, например. что a = 1011. Если нет, то я должен либо представить переменную в виде строки, либо целого числа, какие-либо предложения для этого?


tcl
person Patrick    schedule 26.01.2012    source источник
comment
Чтобы ошибка исчезла, просто введите второй $ в вашей команде. Но не ясно, что вы действительно хотите сделать.   -  person schlenk    schedule 26.01.2012
comment
Да ошибка уходит, но желаемого результата я не получаю. Я отредактировал свой пост, надеюсь, теперь он имеет немного больше смысла   -  person Patrick    schedule 26.01.2012
comment
@ Патрик, Костикс дал ответ на твой обновленный вопрос в своем ответе.   -  person TrojanName    schedule 27.01.2012


Ответы (3)


Я бы просто использовал строку, добавив к ней символы 0 и 1, а затем, когда переменная собрала все входные данные, преобразовал бы ее в настоящее целое число, используя бинарный формат со спецификатором b*, например:

set val ""
append val 0
append val 1
...
append val 1
...
set int [binary format b* $val]
# or, in case the digit characters were pushed from the opposite end
set int [binary format b* [string reverse $val]]

Вы также можете играть в игры с expr:

set val 0
set val [expr {($val << 1) | 0x00}]
...
set val [expr {($val << 1) | 0x01}]
...
person kostix    schedule 26.01.2012

Я думаю, вы просто хотите:

append a [BUS2INT result_from_VHDL_instance]
person Colin Macleod    schedule 26.01.2012
comment
Учитывая более поздние изменения вопроса, я думаю, что ответ Костикса подходит лучше. - person Colin Macleod; 27.01.2012

В качестве альтернативы вы можете просто сделать:

set a "${a}[BUS2INT result_from_VHDL_instance]"
person TrojanName    schedule 26.01.2012