[an error occurred while processing this directive]
|
Logic Elements семейств ACEX/APEX/FLEX в арифметическом режиме допускают одновременное использование Cascade и Carry цепей, если логика для их получения формируется из двух одних и тех же сигналов. Вот эту возможность я попытался использовать в приведенном ниже примере (AHDL) для функции компаратора двух 16 битных чисел. Компаратор имеет два выхода: «РАВНО» и «БОЛЬШЕ».
«РАВНО» использует Cascade Chain, а «БОЛЬШЕ» - Carry Chain. (На правильность работы даже не проверял – дело не в этом)
При компиляции в МАХ с установкой Global Project Logic Synthesis – Fast, чтобы разрешить использовать цепи переноса и каскадирования, результат: 17 LC и я достигаю желаемого: оба выхода функции используют одни и те же LC!
При компиляции в Квартус (2.2) никакими мне известными способами не удалось получить аналогичный результат. «РАВНО» использует одни LC, а «БОЛЬШЕ» - другие LC, но при этом цепи переноса и каскадирования имеют место!
ВОПРОС 1: как объяснить Квартусу сделать все на одних LC?
«Чем дальше, тем все страньше и страньше...» (Алиса в ...Квартусе)
При изучении рапорта в Квартусе: «примитивы CARRY заменены на CARRY_SUM»!
Зачем, если это ACEX???
Да, CARRY_SUM с двумя входами и выходами призваны поддержать спекулятивные цепи переноса в Cyclone & Stratix – это понятно, но здесь...???
ВОПРОС 2: объясните, пожалуйста, (лучше на примере) как обращаться с CARRY_SUM? Help меня не удовлетворил.
ПРИМЕР КОМПАРАТОРА
TITLE "Comparator of two 16 bits digits with A>B and A==B outputs";
-- ************************************************************************************************************
--
-- Comparator of two 16 bits digits with A>B and A==B outputs.
-- To minimize area, Carry and Cascade buffers in same Logics Cells are used extensively.
--
-- Specification:
--
-- Input data A and B width: 16 bits
-- Outputs: A > B and A == B
--
-- ************************************************************************************************************
SUBDESIGN cmp_cc
(
dataa[15..0] : INPUT; -- Data A to compare
datab[15..0] : INPUT; -- Data B to compare
AeB : OUTPUT; -- A == B
AgB : OUTPUT; -- A > B
)
VARIABLE
a_eq_b[15..0] : NODE; -- Output of Cascade buffers to derive A == B
a_gr_b[15..0] : NODE; -- Output of Carry buffers to derive A > B
BEGIN
FOR i IN 1 TO 14 GENERATE
-- A == B generation
a_eq_b[15 - i] = CASCADE( (dataa[15 - i] !$ datab[15 - i]) & a_eq_b[15 - 1 - i] );
-- A > B generation
a_gr_b[15 - i] = CARRY( dataa[15 - i] & !datab[15 - i]
# (dataa[15 - i] !$ datab[15 - i]) & a_gr_b[15 - 1 - i] );
END GENERATE;
-- A == B the first and the final stages
a_eq_b[0] = CASCADE(dataa[0] !$ datab[0]);
a_eq_b[15] = (dataa[15] !$ datab[15]) & a_eq_b[14];
AeB = a_eq_b[15];
-- A > B the first and the final stages
a_gr_b[0] = CARRY(dataa[0] & !datab[0]);
a_gr_b[15] = CARRY( dataa[15] & !datab[15]
# (dataa[15] !$ datab[15]) & a_gr_b[14] );
AgB = a_gr_b[15];
END;
E-mail: info@telesys.ru