Следующее решение работает для любого количества ведомых (K) и равно O (n) в вашей FPGA. Для каждого бита в поле вам потребуются три логических элемента и два инвертора. Я проверил концепцию с помощью базового логического симулятора, и он работает.
Цепочка логических элементов между current и mask , по существу, создает систему приоритетов, которая поддерживает биты "ниже" в цепочке. Эта цепь зациклена на концах, но биты current используются для разрыва цепи.
Чтобы визуализировать операцию, представьте, что бит 3 установлен в поле current , и следуйте сигналу вниз на диаграмме. Логическая единица в бите 3 помещает логический ноль на входе первого логического элемента И, что гарантирует, что выход этого логического элемента И также будет нулевым (в этом случае цепь логического элемента ИЛИ разорвана) , Ноль на выходе первого логического элемента И ставит единицу на входе второго логического элемента И. Это делает бит 2 из next прямо зависимым от бита 2 из mask .
Теперь вступает в игру цепь ИЛИ.
Если был установлен бит 2 из mask , логический выход логического элемента ИЛИ, находящийся непосредственно слева от него, также будет один, который поместит логический блок в вход в логический элемент AND ниже бита 2 из current (который будет равен нулю, поскольку одновременно может быть установлен только один бит в current ). Логическая единица на выходе верхнего логического элемента И помещает логический ноль на вход нижнего логического элемента И, таким образом устанавливая бит 1 из next равным нулю.
Если бит 2 из mask не был установлен, оба входа в логический элемент ИЛИ будут равны нулю, поэтому выход логического элемента AND ниже бита 2 current будет равен нулю, помещая единицу на входе в нижний логический элемент И, и, следовательно, делая бит 1 из следующим зависимым от бита 1 из маска .
Эта логика следует цепочке логических элементов ИЛИ "вверх" битов, повторяя цикл с левой стороны обратно вправо, гарантируя, что только один бит в next может быть установлен в единицу. Цикл останавливается, как только он возвращается к биту 3 из current , в результате установки этого бита. Это препятствует тому, чтобы схема оставалась в вечном цикле.
У меня нет опыта работы с Verilog или VHDL, поэтому я оставлю фактический код на ваше усмотрение и остальной части stackoverflow .
альтернативный текст http://img145.imageshack.us/img145/5125/bitshifterlogicdiagramkn7.jpg
Примечания:
- Это решение только частичное. Это все еще потребует некоторого механизма фиксации, чтобы держать битовые поля.
- Имейте в виду, что по мере увеличения количества битов время, необходимое для установления напряжения затвора, также будет увеличиваться.
- Должна быть определенная логика для обработки случая, когда поле current равно нулю. См. этот вопрос о переполнении стека .