arcer 0 8 февраля, 2011 Опубликовано 8 февраля, 2011 · Жалоба Здравствуйте, уважаемые форумчане! Столкнулся с необходимостью, имея две функции, выполнять их одновременно на возрастание какого-то сигнала. Оказалось, что блоки fork - несинтезируемы. Спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Блоки always @(posedge <ваш 'какой то сигнал'>) ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Блоки always @(posedge <ваш 'какой то сигнал'>) ... точнее, блоки называются begin - end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arcer 0 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Блоки 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 последовательно, а нужно, чтоб параллельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Тогда в блоке always выполнятся функции F и G последовательно, а нужно, чтоб параллельно. Функции выполняются мгновенно, порядок не важен. И результат должен, наверное, чему-то присваиваться. Приведите более реальный пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arcer 0 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Функции выполняются мгновенно, порядок не важен. И результат должен, наверное, чему-то присваиваться. Приведите более реальный пример. Т.е. Вы хотите сказать, что если я напишу: 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". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Наша задача: сделать так, чтоб "a XOR b" и "c XOR d" должны выполнятся параллельно, а после этого выполнится "a+c". Называется "неблокирующее присваивание", и задается с помощью <= Отличается от блокирующего = тем, что все операторы в блоке выполняются одновременно, в момент выхода из блока. upd. Вернее, рассчитываются, когда дойдет очередь, а результат присваивается при выходе из блока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба то присваивание всем элементам массива Х суммы соответствующих элементов 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arcer 0 9 февраля, 2011 Опубликовано 9 февраля, 2011 · Жалоба Как загружать исходные значения в регистры? Результат действительно надо кидать обратно в a, или достаточно вывести на выход? Что вы потом с этим a собираетесь делать? Ну скажем эти регистры связанны с портами. Ваша задача ляжет в немаленький такой автомат. :cranky: Гораздо проще вообще все посчитать параллельно и выдать наружу. Если можно ВСЕ параллельно, то это хорошо. Вот только как? Если все операции проводить с помощью <=, то будет неопределенность для "а" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 февраля, 2011 Опубликовано 10 февраля, 2011 · Жалоба Даны 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 так, как описали словами, что будет плохо? Это же не программа, где один процессор мучается со всеми функциями поочередно. Здесь то, что можно сделать параллельно, будет реализовано отдельными аппаратными средствами, и будет работать синхронно с другими устройствами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 10 февраля, 2011 Опубликовано 10 февраля, 2011 · Жалоба то присваивание всем элементам массива Х суммы соответствующих элементов 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 10 февраля, 2011 Опубликовано 10 февраля, 2011 · Жалоба Ну скажем эти регистры связанны с портами.Что такое 'порты'? Как эти регистры с этими 'портами' связанны? Если можно ВСЕ параллельно, то это хорошо. Вот только как?Вариантов есть вагон и маленькая тележка. Все зависит от внешних интерфейсов. Пример - входные данные (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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arcer 0 10 февраля, 2011 Опубликовано 10 февраля, 2011 · Жалоба Если вы опишете блокирующими операторами в блоке begin - end так, как описали словами, что будет плохо? Это же не программа, где один процессор мучается со всеми функциями поочередно. Здесь то, что можно сделать параллельно, будет реализовано отдельными аппаратными средствами, и будет работать синхронно с другими устройствами. Т.е. Вы имеете в виду, что если я напишу так (не обращайте внимание на неоптимальность - это для понимания сути): a=a^b; c=c^d; a=a+c; то первые 2 строки система синтеза сама разметит как параллельные блоки (если не учитывать, что она может упростить само выражение), при завершении работы которых выполнится блок, отвечающий 3-й строке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 февраля, 2011 Опубликовано 10 февраля, 2011 · Жалоба Т.е. Вы имеете в виду, что если я напишу так ... то ...? Да. Это просто язык описания аппаратных средств. А как иначе можно создать устройство, выполняющее ваши операции? :) Нарисуйте на бумаге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 10 февраля, 2011 Опубликовано 10 февраля, 2011 · Жалоба то первые 2 строки система синтеза сама разметит как параллельные блоки (если не учитывать, что она может упростить само выражение), при завершении работы которых выполнится блок, отвечающий 3-й строке?Угу. В Verilog за тактирование отвечают блоки always (это если очень грубо). Все, что написано внутри блока выполняется за один такт. Просто если вы понапихаете туда много всего, то такт станет очень длинным :rolleyes: В HDL (для синтезатора) нет понятия 'выполнится раньше, выполнится позже' - там все выполняется параллельно и в тот момент, когда сработает условие в always. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться