Нахождение следующего в циклическом планировании битовым жонглированием

У вас есть простая синтаксическая ошибка в слушателе:

<form ... onsubmit="return gdpr(e)"> 

Не существует глобальной переменной e , поэтому обработчик выдает ошибку, код не возвращает [114 ] и подача не прекращается. Если вы хотите передать связанный объект события, вы должны использовать событие .

<form ... onsubmit="return gdpr(event)"> 

Но вы все равно не заботитесь о событии, возвращая false , выполняет свою работу.

У вас также есть элемент управления формой с именем gdpr . Это устаревшая функция, когда имена и идентификаторы элементов становятся глобальными свойствами (очень плохая идея, но она застряла), поэтому элемент управления с именем gdpr маскирует функцию с тем же именем в браузерах, которые поддерживают устаревшую функцию так что смени его название. Сопоставление идентификатора является типичной стратегией (но идентификаторы в элементах управления формой на самом деле не нужны).

function gdpr(e) {
  console.log(`I'm a ${e.type} event`);
  return false;
}
<form onsubmit="return gdpr(event)">
  <input type="checkbox" value="" name="gdpr_privacy" id="gdpr_privacy">
  <input class="btn btn-primary btn-block" type="submit">
</form>

9
задан Eli Bendersky 26 January 2009 в 16:31
поделиться

7 ответов

Я нашел, что следующий код Verilog для реализации задачи в Altera усовершенствовал поваренную книгу синтеза.

// 'base' is a one hot signal indicating the first request
// that should be considered for a grant.  Followed by higher
// indexed requests, then wrapping around.
//

module arbiter (
    req, grant, base
);

parameter WIDTH = 16;

input [WIDTH-1:0] req;
output [WIDTH-1:0] grant;
input [WIDTH-1:0] base;

wire [2*WIDTH-1:0] double_req = {req,req};
wire [2*WIDTH-1:0] double_grant = double_req & ~(double_req-base);
assign grant = double_grant[WIDTH-1:0] | double_grant[2*WIDTH-1:WIDTH];

endmodule

Это использует вычитание (только однажды, хотя), так концептуально это весьма схоже с решением Doug.

4
ответ дан 4 December 2019 в 10:05
поделиться

Интересная проблема! Я не могу не задаться вопросом, не можете ли Вы упростить свою эксплуатацию планировщика, таким образом, этот вид операции был бы необходим.

Учитывая, что Вы знаете VHDL, я не буду вдаваться в подробности, но мое предложение было бы следующим:

Используйте кодер на 3 бита для превращения в настоящее время запланированной задачи в число:

01000000-> 6

Затем используйте многорегистровое циклическое сдвиговое устройство для вращения маски на то число + 1 (для пропуска текущей задачи):

00001010-> 00010100

Затем используйте кодер приоритета для нахождения первой доступной "следующей" задачи:

00010100-> 00000100-> 2

Затем инвертируйте циклический сдвиг дополнением:

(2+7) % 8 = 1

Который, когда повторно закодированный даст следующую запланированную задачу:

00000010

Должно быть очень быстрым и простым, хотя многорегистровое циклическое сдвиговое устройство является 'дорогим' с точки зрения агента по операциям с недвижимостью, но я не вижу простой способ обойти это в данный момент.

Править: Решение Doug значительно более изящно...

- Adam

2
ответ дан 4 December 2019 в 10:05
поделиться

Subracting 1 является основной идеей здесь. Это используется для расположения каскадом, одалживает через биты для нахождения следующей задачи.

bits_before_current = ~(current-1) & ~current
bits_after_current = current-1
todo = (mask & bits_before_current) 
if todo==0: todo = (mask & bits_after_current) // second part is if we have to wrap around
next = last_bit_of_todo = todo & -todo

Это будет использовать цикл внутренне хотя...

2
ответ дан 4 December 2019 в 10:05
поделиться

Цикл не должен быть плохим.

Я просто сделал бы

current[i] = current[i-1] & mask[i] |                         // normal shift logic
                mask[i] & current[i-2] & !mask[i-1] |         // here build logic 
                ...                                          // expression for 
                                                             // remaining 

И затем помещенный это в генерировать цикл (т.е. это будет развернуто в аппаратные средства), который произведет параллельные аппаратные средства для выражений.

Другие здесь упомянутые решения используют несколько "-". Я могу только препятствовать им, поскольку это получит Вас действительно дорогая операция. Особенно в одном горячем можно получить легко больше, чем> 32 бита, которые легко не будут реализуемы в HW, поскольку одалживание должно перейти все биты (deadicated несут логику на определенном fpgas, делают это доступным для небольшого количества битов).

6
ответ дан 4 December 2019 в 10:05
поделиться

Это должно сделать то, что Вы хотите:

number_of_tasks= <number of tasks, in the example this is 8>
next_mask= current | (current - 1);
next_barrel= next | (next << number_of_tasks);
next_barrel&= ~number_of_tasks;
next_barrel&= -next_barrel;
next_barrel|= next_barrel >> number_of_tasks;
next_task_mask= next_barrel & -next_barrel;

В основном копируйте биты следующей маски задачи, маска от битов, которые мы не хотим рассматривать, найдите, что самый низкий набор укусил, отложил высокие биты в, затем взял самый низкий набор битов. Это работает в постоянное время.

Править: Обновление для принятия во внимание текущий == 00010000 и next_mask == 00111000

1
ответ дан 4 December 2019 в 10:05
поделиться

При принятии представления дополнения пар назовите два слова mask и current, в C:

mask_lo = (current << 1) - 1; // the bits to the right and including current
mask_hi = ~mask_lo;           // the bits to the left of current
                              // the left bits, otherwise right:
next = (mask & mask_hi) ? (mask & mask_hi) : (mask & mask_lo);
return (next & -next);        // the least significant bit set
2
ответ дан 4 December 2019 в 10:05
поделиться

Следующее решение работает на любое количество ведомых устройств (K) и является O (n) в Вашем FPGA. Для каждого бита в поле Вы потребуете трех логических элементов и двух инверторов. Я проверил понятие со средством моделирования основной логики, и оно работает.

Цепочка логических элементов между текущим и маской по существу создает систему с приоритетом, которую биты пользы "опускают" в цепочке. Эта цепочка циклично выполняется в концах, но текущие биты используются для повреждения цепочки.

Для визуализации операции предположите, что бит 3 установлен в текущем поле, и следуйте за сигналом вниз в схеме. Логическая единица на уровне бита 3 места логический нуль во входе к первому логическому элементу И, который гарантирует, что вывод того логического элемента И также будет нулем (это - то, где цепочка логического элемента ИЛИ повреждается). Нуль в выводе первого логического элемента И помещает тот во входе к второму логическому элементу И. Это делает бит 2 из следующих непосредственно зависящий от бита 2 из маски.

Теперь, цепочка логических элементов ИЛИ играет роль.

Если бит, 2 из маски были установлены, логический вывод логического элемента ИЛИ непосредственно слева от него, также будет тем, который поместит, логическая единица во входе к логическому элементу И ниже укусила 2 из текущих (который будет нулем, так как только один бит в токе может быть установлен за один раз). Логическая единица в выводе лучшего логического элемента И помещает логический нуль во входе нижнего логического элемента И, таким образом устанавливая бит 1 из следующих, равных нулю.

Если бы бит, 2 из маски не были установлены, оба исходных данных к логическому элементу ИЛИ, был бы нулем, таким образом, вывод логического элемента И ниже укусил 2 из тока, будет нуль, помещая тот во входе к нижнему логическому элементу И, и поэтому делая бит 1 из следующих зависящий от бита 1 из маски.

Эта логика следует за цепочкой логических элементов ИЛИ "выше на" биты, цикличное выполнение вокруг от левой стороны назад направо, гарантируя, что только один бит в следующем может быть установлен на тот. Цикл останавливается, после того как он делает свой путь назад к биту 3 из тока, в результате того бита устанавливаемый. Это препятствует тому, чтобы схема осталась в бесконечном цикле.

У меня нет опыта с Verilog или VHDL, таким образом, я оставлю фактический код до Вас и остальной части stackoverflow.

сопроводительный текст http://img145.imageshack.us/img145/5125/bitshifterlogicdiagramkn7.jpg

примечания:

  1. Это решение только неравнодушно. Это все еще потребует, чтобы некоторый механизм фиксации содержал битовые поля.
  2. Следует иметь в виду, что, поскольку Вы увеличиваете число битов, время, необходимое, чтобы напряжения затвора обосновались, также увеличится.
  3. Там должен будет существовать некоторая логика для обработки случая, где текущее поле равно нулю. Посмотрите этот stackoverflow вопрос.
3
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: