Перейти к содержанию
    

параллельные блоки в верилоге

Здравствуйте, уважаемые форумчане!

 

Столкнулся с необходимостью, имея две функции, выполнять их одновременно на возрастание какого-то сигнала. Оказалось, что блоки fork - несинтезируемы.

 

Спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блоки always @(posedge <ваш 'какой то сигнал'>) ...

точнее, блоки называются begin - end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блоки always @(posedge <ваш 'какой то сигнал'>) ...

Нет, на разные сигналы - проблем нет. А вот именно на один сигнал. К примеру:

module veri_fork(input reset)
begin

function [0:7] F;

/*тело*/
endfunction


function [0:7] G;
/*тело*/
endfunction

always @(posedge reset)
begin
F(...);
G(...);
end

end

 

Тогда в блоке always выполнятся функции F и G последовательно, а нужно, чтоб параллельно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда в блоке always выполнятся функции F и G последовательно, а нужно, чтоб параллельно.

Функции выполняются мгновенно, порядок не важен. И результат должен, наверное, чему-то присваиваться.

Приведите более реальный пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функции выполняются мгновенно, порядок не важен. И результат должен, наверное, чему-то присваиваться.

Приведите более реальный пример.

 

Т.е. Вы хотите сказать, что если я напишу:

reg [0:31] X[0:9], Y[0:9], Z[0:9], i
...................
/*что-то там*/
...................
for(i=0;i<10;i=i+1)
X[i]=Y[i]+Z[i];

то присваивание всем элементам массива Х суммы соответствующих элементов Y и Z будет происходить одновременно для всех 10-ти элементов массива X ?

 

Приведите более реальный пример.

Ну скажем не пример, а какая стоит задача:

Даны 4 регистра a, b, c, d, все n-разрядные. Мне нужно сксорить a и b, результат кинуть в a, c и d, результат кинуть в c, суммировать по модулю 2^n a и c, результат кинуть в a.

Наша задача: сделать так, чтоб "a XOR b" и "c XOR d" должны выполнятся параллельно, а после этого выполнится "a+c".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наша задача: сделать так, чтоб "a XOR b" и "c XOR d" должны выполнятся параллельно, а после этого выполнится "a+c".

Называется "неблокирующее присваивание", и задается с помощью <=

Отличается от блокирующего = тем, что все операторы в блоке выполняются одновременно, в момент выхода из блока.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то присваивание всем элементам массива Х суммы соответствующих элементов Y и Z будет происходить одновременно для всех 10-ти элементов массива X ?
Да. Привыкайте - HDL это не язык программирования, а язык описания аппаратуры. Тут все происходит параллельно. И что бы что то сделать последовательно нужно написать много кода

 

Ну скажем не пример, а какая стоит задача:

Даны 4 регистра a, b, c, d, все n-разрядные. Мне нужно сксорить a и b, результат кинуть в a,

Как загружать исходные значения в регистры? Результат действительно надо кидать обратно в a, или достаточно вывести на выход?

суммировать по модулю 2^n a и c, результат кинуть в a.
Что вы потом с этим a собираетесь делать?

Наша задача: сделать так, чтоб "a XOR b" и "c XOR d" должны выполнятся параллельно, а после этого выполнится "a+c".
Ваша задача ляжет в немаленький такой автомат. :cranky: Гораздо проще вообще все посчитать параллельно и выдать наружу.

 

Огласите, что ваша схема должна делать, но не в терминах регистров (они снаружи не видны и нафиг никого не интересуют), а в терминах входов и выходов FPGA.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как загружать исходные значения в регистры? Результат действительно надо кидать обратно в a, или достаточно вывести на выход?

Что вы потом с этим a собираетесь делать?

Ну скажем эти регистры связанны с портами.

 

 

Ваша задача ляжет в немаленький такой автомат. :cranky: Гораздо проще вообще все посчитать параллельно и выдать наружу.

Если можно ВСЕ параллельно, то это хорошо. Вот только как? Если все операции проводить с помощью <=, то будет неопределенность для "а"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даны 4 регистра a, b, c, d, все n-разрядные. Мне нужно сксорить a и b, результат кинуть в a, c и d, результат кинуть в c, суммировать по модулю 2^n a и c, результат кинуть в a.

Наша задача: сделать так, чтоб "a XOR b" и "c XOR d" должны выполнятся параллельно, а после этого выполнится "a+c".

Если вы опишете блокирующими операторами в блоке begin - end так, как описали словами, что будет плохо? Это же не программа, где один процессор мучается со всеми функциями поочередно. Здесь то, что можно сделать параллельно, будет реализовано отдельными аппаратными средствами, и будет работать синхронно с другими устройствами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то присваивание всем элементам массива Х суммы соответствующих элементов Y и Z будет происходить одновременно для всех 10-ти элементов массива X ?

Именно.

 

Ну скажем не пример, а какая стоит задача:

Даны 4 регистра a, b, c, d, все n-разрядные. Мне нужно сксорить a и b, результат кинуть в a, c и d, результат кинуть в c, суммировать по модулю 2^n a и c, результат кинуть в a.

Наша задача: сделать так, чтоб "a XOR b" и "c XOR d" должны выполнятся параллельно, а после этого выполнится "a+c".

решение в лоб:

begin
  a = a ^ b;
  c = c ^ d;
  a = a + c;
end

здесь важно блокирующее присваивание, при этом содержимое 'c' меняется напрасно.

нормальное решение:

begin
  a <= (a ^ b) + (c ^ d);
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну скажем эти регистры связанны с портами.
Что такое 'порты'? Как эти регистры с этими 'портами' связанны?

 

Если можно ВСЕ параллельно, то это хорошо. Вот только как?
Вариантов есть вагон и маленькая тележка. Все зависит от внешних интерфейсов.

 

Пример - входные данные (a/b/c/d), пусть для определенности все по 8 бит. Выход - e. Вся схема асинхронная, т.е выход немедленно изменяется при изменении любого входа. Задержки - неизвестно какие :(

module top(input [7:0] a,b,c,d, output [7:0] e);
assign e= (a^b) + (c^d);
endmodule

 

Тоже самое, но схема синхронная. Выход защелкивается по сигналу clk

module top(input clk, input [7:0] a,b,c,d, output [7:0] e);
reg [7:0] o;

always @(posedge clk)
o <= (a^b) + (c^d);

assign e=o;
endmodule

 

Тоже самое, pipline (глубиной 3). Выходные данные появляются на выходе e через 3 такта частоты clk. Входные данные можно менять каждый такт clk. Быстродействие максимальное

module top(input clk, input [7:0] a,b,c,d, output [7:0] e);
reg [7:0] o, ar, br, abr, cr, dr, cdr;

always @(posedge clk)
begin

ar <= a;
br <= b;
cr <= c;
dr <= d;

abr <= ar ^ br;
cdr <= cr ^ dr;

o <= abr + cdr;
end

assign e=o;
endmodule

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы опишете блокирующими операторами в блоке begin - end так, как описали словами, что будет плохо? Это же не программа, где один процессор мучается со всеми функциями поочередно. Здесь то, что можно сделать параллельно, будет реализовано отдельными аппаратными средствами, и будет работать синхронно с другими устройствами.

Т.е. Вы имеете в виду, что если я напишу так (не обращайте внимание на неоптимальность - это для понимания сути):

a=a^b;
c=c^d;
a=a+c;

то первые 2 строки система синтеза сама разметит как параллельные блоки (если не учитывать, что она может упростить само выражение), при завершении работы которых выполнится блок, отвечающий 3-й строке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. Вы имеете в виду, что если я напишу так ... то ...?

Да. Это просто язык описания аппаратных средств.

А как иначе можно создать устройство, выполняющее ваши операции? :) Нарисуйте на бумаге.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то первые 2 строки система синтеза сама разметит как параллельные блоки (если не учитывать, что она может упростить само выражение), при завершении работы которых выполнится блок, отвечающий 3-й строке?
Угу. В Verilog за тактирование отвечают блоки always (это если очень грубо). Все, что написано внутри блока выполняется за один такт. Просто если вы понапихаете туда много всего, то такт станет очень длинным :rolleyes:

В HDL (для синтезатора) нет понятия 'выполнится раньше, выполнится позже' - там все выполняется параллельно и в тот момент, когда сработает условие в always.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...