2016-02-02 6 views
0

Я изучаю реализацию 4-разрядной функции BitSet на уровне логических ворот, чтобы ее можно было записать в структурном Verilog - я искал в другом месте для ответа на этот вопрос, но могут находить только ресурсы C/C++, которые работают на более высоком уровне и в большинстве случаев мне не нужны.Bitset на уровне логических ворот

Входы на мой интерфейс представляют собой 4-битное число х, два-битное число индекс, содержащий индекс, чтобы быть установлен или сброшен в х, один-битное число значение а, содержащий значение x [index] должен быть установлен на (1 или 0 для установки или очистки соответственно) и 4-разрядный выход y, что является окончательным результатом x.

В моем понимании, установив значение х следует логический у | = 1 < < х и клиринговых значение х следует Y & = 1 < < х, так что если значение равно 1, отправка его через логический элемент ИЛИ со значением, уже указанным в этом индексе x, приведет к значению 1, и если значение равно, оно равно 0, отправив его через логический элемент И со значением, уже указанным в этом индексе x приведет к 0. Это имеет смысл для меня.

Это также имеет смысл, что если я начинаю с 4-разрядным числом х, что я мог бы поставить его через демультиплексор блок 1-к-4 (в стороне от основных логических вентилей, у меня есть MUX демультиплексируй , компараторы величин и двоичные сумматоры в моем распоряжении) для получения отдельных бит.

Что я не уверен в том, как получить из четырех отдельных битов, чтобы выбрать один из них, чтобы изменить на основе значения, хранящегося в , индекс, используя только базовые логические ворота. Любые идеи или указатели для меня, чтобы начать? Думаю ли я об этом правильно?

ответ

0

Я думаю, что вы ищете что-то вроде этого

reg [3:0] x; 
reg [3:0] y; 
reg [1:0] index; 

// wont work in synthesis 
x[index] = 0; 

В Verilog вы можете получить доступ каждый бит индивидуально с помощью [Bit_Number] Но в вашем случае индекс не является постоянной величиной, которая в конечном итоге неудачу в процессе синтеза. Что вы можете сделать, это написать, если еще проверить индекс и изменить правильный индекс так

if (index == 1) // change bit one 
    x[1] = 1'b0; // value to assign is zero here 
else if(index == 2) 
    x[2] 1'b0; 

Примечание стороны:

Вы также можете присвоить значения

// Here x gets the bit 1 and bit 0 of y concatenated with the value of index 
x = {y[1:0],index}; 

Так предположим

y = 4'b1011; 
index = 2'b00; 
x = {y[1:0],index} = 1100 
+0

Но будет ли это рассматриваться как структурный уровень verilog? Мне всегда говорили, что аргументы/else относятся к поведенческим и что структурный дизайн может быть представлен иерархическим дизайном, используя только блоки ворот (и, или, не, и т. Д. И т. Д.). –

+0

Хорошо, если вы используете инструменты синтеза, они преобразуют его в ворота для вас, поэтому вам не нужно беспокоиться.В случае, если вы действительно хотите использовать ворота, просто используйте Mux с выделенной строкой в ​​качестве индекса, потому что это то, к чему приводятся операторы case, если другие и тройные операторы синтезируются. – DBB