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

Счетчик на примитивах CARRY_SUM и DFFE

Quartus 9.0, Altera ACEX 1K. Пытаюсь создать счетчик, чтобы укладывался компактно в логические элементы. Для начала - фиксированного размера (с generate - свои проблемы). Как-то так:

module CountPrim
#(parameter WIDTH = 4)
  (
  input Reset_n, Clock, Enable,
  output [WIDTH-1:0] Count,
  output POut
  );

  wire [WIDTH-1:0] Fb;    // feedback
  wire [WIDTH-1:0] Lt;    // look table
  wire [WIDTH-1:0] Cr;    // carry out

  CARRY_SUM Cy0 (.sin(Fb[0]), .cin(1),
        .sout(Lt[0]), .cout(Cr[0]));
  DFFE Ff0 (.d(Lt[0]), .clk(Clock), 
        .clrn(Reset_n), .prn(1),
        .ena(Enable), .q(Fb[0]));

  CARRY_SUM Cy1 (.sin(Fb[1]), .cin(Cr[0]),
        .sout(Lt[1]), .cout(Cr[1]));
  DFFE Ff1 (.d(Lt[1]), .clk(Clock), 
        .clrn(Reset_n), .prn(1),
        .ena(Enable), .q(Fb[1]));

  CARRY_SUM Cy2 (.sin(Fb[2]), .cin(Cr[1]),
        .sout(Lt[2]), .cout(Cr[2]));
  DFFE Ff2 (.d(Lt[2]), .clk(Clock), 
        .clrn(Reset_n), .prn(1),
        .ena(Enable), .q(Fb[2]));

  CARRY_SUM Cy3 (.sin(Fb[3]), .cin(Cr[2]),
        .sout(Lt[3]), .cout(Cr[3]));
  DFFE Ff3 (.d(Lt[3]), .clk(Clock), 
        .clrn(Reset_n), .prn(1),
        .ena(Enable), .q(Fb[3]));

  assign  Count = Fb;
  assign  POut = Cr[3];

endmodule

Но не получаю желаемого (см. картинку). Где-то промахнулся. Поможите, люди добрые!

post-10362-1270555737_thumb.jpg

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


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

Quartus 9.0, Altera ACEX 1K. Пытаюсь создать счетчик, чтобы укладывался компактно в логические элементы. Для начала - фиксированного размера (с generate - свои проблемы).

Но не получаю желаемого (см. картинку). Где-то промахнулся. Поможите, люди добрые!

 

чем Вас не устраивает такое описание

 

   reg [<upper>:0] <reg_name>;
   
   always @(posedge <clock> or posedge <reset>)
      if (<reset>)
         <reg_name> <= 0;
      else if (<clock_enable>)
         <reg_name> <= <reg_name> + 1;

 

готового счетчика?

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


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

чем Вас не устраивает такое описание

...

готового счетчика?

Не устраивает тем, что Quartus не объединяет в одном логическом элементе сумматор и триггер, а раскидывает, как захочет. На MAX+II на AHDL у меня счетчики выстраивались в линейку, с цепями переноса длиной в 24 элемента.

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


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

Не устраивает тем, что Quartus не объединяет в одном логическом элементе сумматор и триггер, а раскидывает, как захочет. На MAX+II на AHDL у меня счетчики выстраивались в линейку, с цепями переноса длиной в 24 элемента.
Какую версию квартуса используете? Квартус достаточно умный для того, что-б использовать мегафункции, если только там код не сильно хитрый и не завязано на что-то ещё. Если что-то не получается, по моему проще использовать LPM функцию сложения, врятли получится написать оптимальнее чем в ней, особенно для общего случая.

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


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

..раскидывает, как захочет...

Если во времянку вложились - вам не всё равно где и почему он их так расставил ??

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


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

Если во времянку вложились - вам не всё равно где и почему он их так расставил ??

Предпочитаю идеальное решение. Жалко напрасно потраченных логических элементов.

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


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

Не устраивает тем, что Quartus не объединяет в одном логическом элементе сумматор и триггер, а раскидывает, как захочет. На MAX+II на AHDL у меня счетчики выстраивались в линейку, с цепями переноса длиной в 24 элемента.

У вас счетчик по скорости не укладывается или вам просто хочется, чтобы фиттер размещал ячейки рядом и обязательно переносы делал через carry chain'ы?

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


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

У вас счетчик по скорости не укладывается или вам просто хочется, чтобы фиттер размещал ячейки рядом и обязательно переносы делал через carry chain'ы?

...Просто хочется :)...

Просто счетчиков будет некоторое количество... остальное уже сказал.

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


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

Предпочитаю идеальное решение. Жалко напрасно потраченных логических элементов.

Перфекционизмом занимаетесь. :) Просинтезируйте счетчик, который вам описали, и загляните в директорию db - с ненулевой вероятностью увидите там файл lpm_counter.tdf. :) Который как раз весь из себя низкоуровневый и использует переносы "вручную".

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


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

Просто счетчиков будет некоторое количество... остальное уже сказал.

Самый главный вопрос: все счетчики считают одновременно и на максимальной для чипа частоте?

Т.е решение "в лоб"???

Или можно сделать один счетчик и успевать им считать в нескольких каналах?

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


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

2 ViKo

пройдитесь по форуму - помнится des00 и SM поднимали такой вопрос (только там есчё модуль был числа, а потом "плюс"). Не совсем то, что вам нужно, но сумматор там как раз таким вот хитроумным методом и был организован, и даже вроде бы через generate-ы.

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


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

...Просто хочется :)...

Просто счетчиков будет некоторое количество... остальное уже сказал.

Констрейнами зададите требования, синтезатор будет стараться выжимать скорость и/или размер.

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


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

Счетчики разные, счетчиков - несколько (5-6), длинные.

Я могу написать Count = Count + 1, и все будет нормально.

Но хотелось бы получить конкретный ответ на свой вопрос. Что-то я напутал в CARRY_SUM.

 

2 ViKo

пройдитесь по форуму - помнится des00 и SM поднимали такой вопрос (только там есчё модуль был числа, а потом "плюс"). Не совсем то, что вам нужно, но сумматор там как раз таким вот хитроумным методом и был организован, и даже вроде бы через generate-ы.

Смотрел, что-то видел. Но там не было CARRY_SUM.

Я понимаю так, что таблица истинности у него следующая:

CI SI SO CO
0  0  0  0
0  1  1  0
1  0  1  0
1  1  0  1

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


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

Предпочитаю идеальное решение. Жалко напрасно потраченных логических элементов.

а почему не берете в расчет зря потраченное время на это решение?

 

Я понимаю так, что таблица истинности у него следующая:

CI SI SO CO
0  0  0  0
0  1  1  0
1  0  1  0
1  1  0  1

похоже на правду, если хотите удостовериться - сделайте тестбенч и подайте на вход CI SI (всего лишь четыре варианта)

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


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

а почему не берете в расчет зря потраченное время на это решение?

 

похоже на правду, если хотите удостовериться - сделайте тестбенч и подайте на вход CI SI (всего лишь четыре варианта)

По первому - один раз набив шишек, можно потом клепать счетчики сколь угодно раз. У меня есть нечто подобное на AHDL, мне нравится. Сразу видно на Floorplan - вот они, мои счетчики :)

По второму - попробую.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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