Цитата(CaPpuCcino @ Nov 15 2010, 18:14)

да я тоже пользуюсь 2-пробельной табуляцией. именно поэтому так широко размазано и получилось. но думаю это переживабельно.
очередь с рукопожатием на обоих портах. может быть сконфигурирована на использование block RAM так и на обычной логике (в зависимости от установленного атрибута).
для указателей на концы очереди использована тривиальная схема кодирования (бинарный код) так что не советую использовать в самолётах, спутниках и в районе экватора. можно только для поиграться.
есть две ноги для заглядывания в будущее (может быть полезны для поддержания непрерывного потока данных интерфейсных КА).
замеры не делал, потому как там мало управляющей логики.
описание:
parameterizable queue with a trivial pointer encodings
can be implementer eather with on-chip Block RAM or distributed memory, subject to synthesis attribute setting of the stack memory
when implemeted with a RAM block adopt the first-word-falls-through policy for zero latency immediate pop
provides forward read and write grant signals for smooth operation of FSMs controlling the data-flows on both ports of the channel(queue)
блин, други, я чичас чуть не поседел!
ВНИМАНИЕ! выложенное фифо содержит ошибку!!!ошибка в неправильном расчёте ширины счётчиков при помощи стандартной функции $clog2()
раньше два параметра рассчитывались с помощью самописной функции
localparam ptr_width=number_of_bits_for_value_representation(stack_depth-1);
localparam cnt_width=number_of_bits_for_value_representation(stack_depth);
вот эта функция
Код
function int number_of_bits_for_value_representation(input int value);
int temp;
temp = 2;
number_of_bits_for_value_representation = 1;
while (temp<=value)
begin
number_of_bits_for_value_representation = number_of_bits_for_value_representation+1;
temp = temp*2;
end
endfunction
перед отправкой на форум я решил выпендриться и заменил расчёт этих параметров на
localparam ptr_width=$clog2(stack_depth-1);
localparam cnt_width=$clog2(stack_depth);
и не проверив работу в симуляторе и не подумав о том, что результат будет уже другой - ширина для cnt_width на один бит меньше, чем положено
представляете мои ощущения, когда я в четверг запустил систему, которая была полностью отлажена и которую я не трогал пол года.
2 дня сидел разбирался почему система перестала корректно работать.
в общем звиняйте
итого. чтобы правильно работало с $clog2 нужно написать вот так
localparam ptr_width=$clog2(stack_depth);
localparam cnt_width=$clog2(stack_depth+1);
попрошу модератора, чтобы исправил исходный пост.
файл с изменениями: