реклама на сайте
подробности

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> Счетчик на примитивах CARRY_SUM и DFFE
ViKo
сообщение Apr 11 2010, 13:36
Сообщение #61


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(des00 @ Apr 11 2010, 16:34) *
Вывод : Надо пользовать в таких тяжелых случаях мегафункцию и не париться %)

Но мегафункция-то работает! В Квартусе, на Verilog (ну, или AHDL, какая разница).
Смотришь в эту функцию lpm_counter.tdf - ничего не понимаешь smile.gif
Тоже, наверное, индусы писали smile.gif
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 11 2010, 13:39
Сообщение #62


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(ViKo @ Apr 11 2010, 08:51) *
Но мегафункция-то работает! В Квартусе, на Verilog (ну, или AHDL, какая разница).

Если бы еще мегафункция не работала, то это бы вообще ни в какие ворота не лезло. Ведь по сути мегафункция это вставка RPM, а так разработчики синтезатора с языка Verilog сильно упростили себе задачу, положив два с половиной режима LE вместо 4-х %)


--------------------
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 11 2010, 13:44
Сообщение #63


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(des00 @ Apr 11 2010, 16:54) *
Если бы еще мегафункция не работала, то это бы вообще ни в какие ворота не лезло.

Вопрос принципиальный. Можно конвертировать из *.tdf в *.v (если б это что-то упростилоsmile.gif, синтезировать счетчик в упакованном виде. Что же не дает? Может быть, настройки какие-то хитрые есть, атрибуты?
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 11 2010, 13:49
Сообщение #64


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(ViKo @ Apr 11 2010, 07:59) *
Вопрос принципиальный. Можно конвертировать из *.tdf в *.v (если б это что-то упростилоsmile.gif, синтезировать счетчик в упакованном виде. Что же не дает? Может быть, настройки какие-то хитрые есть, атрибуты?

не дает, то, что при синтезе tdf используется синтезатор с языка AHDL, а при синтезе с v синтезатор с языка Verilog. И далеко не факт что команда разработчиков обоих синтезаторов была одна и та же. Просто кто-то, в свое время, сильно схалявил, а команда тестеров вовремя эту халяву не заметила. Потом пошли сыклоны, вторые, третьи и как то всем стало не до асексов. Своего рода плевок в вечность (как в свое время с шиной ISA) %)


--------------------
Go to the top of the page
 
+Quote Post
sazh
сообщение Apr 11 2010, 14:48
Сообщение #65


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(ViKo @ Apr 11 2010, 16:59) *
Вопрос принципиальный. Можно конвертировать из *.tdf в *.v


Сранивать с tdf некорректно. Это описание по сути - графическое представление lpm функций в текстовом виде (нет понятия в этом языке фронта клока)
При переходе на поведенческое описание - меняется даже стиль описания.
используйте lpm в крайних случаях. Например когда по ресурсам не проходите.
В чем принцип, да еще на ацексе. (5 лет назад рисовал его в максе, если надо в нем и дорисую)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 11 2010, 16:03
Сообщение #66


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я его сделал (Quartus, Coutner, Carry)! smile.gif
Код
module  CountCarry
#(parameter    WIDTH = 24)
  (
  input        rst,
  input        clk,
  input        clk_en,
  input        cnt_en,
  input        load,
  input        [WIDTH-1:0] data,
  output    [WIDTH-1:0] cnt,
  output    cout, cout2
  );
  
  wire [WIDTH:0] cnt_reg;
  wire [WIDTH:0] cnt_next;
  wire [WIDTH:0] cnt_carry;
  wire [WIDTH:0] cnt_init = {1'b0, data};

  genvar i;
  generate
    for (i=0; i<=WIDTH; i++) begin : dff_gen

      carry  carry
      (
        .in    ((i ? cnt_carry[i-1] : cnt_en) & cnt_reg[i]),
        .out    (cnt_carry[i])
      );

      dffeas  dffeas
      (
        .clk    (clk),
        .d    ((i ? cnt_carry[i-1] : cnt_en) ^ cnt_reg[i]),
        .ena    (clk_en),
        .asdata    (cnt_init[i]),
        .clrn    (rst),
        .sload    (load),
        .q    (cnt_reg[i])
      );
    end
  endgenerate

  assign cnt = cnt_reg[WIDTH-1:0];
  assign cout = cnt_reg[WIDTH];
  assign cout2 = cnt_next[WIDTH];

endmodule

28 ЛЭ для ACEX, один из которых - чисто инвертор для load.
Не зря в хэлпе говорится, что CARRY оставлен для совместимости с проектами на MAXPlus.
Благодарю "коллективный разум" форума, и des00 персонально! cheers.gif
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 11 2010, 16:26
Сообщение #67


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(ViKo @ Apr 11 2010, 10:18) *
Я его сделал (Quartus, Coutner, Carry)! smile.gif

хмм, странно в процессе ковыряния я делал что то подобное, давало 50 плиток. Сейчас еще раз проверил дало 28 плиток biggrin.gif


--------------------
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 12 2010, 21:20
Сообщение #68


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Выход переполнения счетчика (который выдается наружу) нужно брать не с выхода суммы последнего сумматора, а с выхода переноса.
Вот - "правильный" счетчик, со всеми достоинствами - регулярной структурой, предсказуемым быстродействием, и компакный. Только выбирайте синхронный выход переполнения (там их два).
Код
module  CountPrim
#(
  parameter    WIDTH = 8,        // number of bits
  parameter    DIRECT = "UP"        // count direction: "UP" or "DOWN"
  )
  (
  input        rst_n,        // async reset
  input        clk_en,        // clock enable all flip-flops
  input        clk,
  input        cnt_en,        // count enable
  input        load,        // hi-level sync load
  input        [WIDTH-1:0] data,    // data for sync load
  output bit    [WIDTH-1:0] cnt,    // bits of counter
  output bit    rcry,            // ripple carry
  output bit    tcry            // triggered (sync) carry
  );
  
  wire [WIDTH:-1] cnt_cry;

  carry  cryin (
    .in        (cnt_en),
    .out    (cnt_cry[-1]) );

  genvar i;
  generate
    for (i=0; i<WIDTH; i++) begin : bitgen
      if (DIRECT == "DOWN")
        carry  crycnt (
          .in    (cnt_cry[i-1] & !cnt[i]),
          .out    (cnt_cry[i]) );
      else                // "UP"
        carry  crycnt (
          .in    (cnt_cry[i-1] & cnt[i]),
          .out    (cnt_cry[i]) );
      
      dffeas  dffcnt (
        .clk    (clk),
        .d    (cnt_cry[i-1] ^ cnt[i]),
        .ena    (clk_en),
        .asdata    (data[i]),
        .clrn    (rst_n),
        .sload    (load),
        .q    (cnt[i]) );
    end
  endgenerate

  assign rcry = cnt_cry[WIDTH-1];
  dffeas  dffcry (
    .clk    (clk),
    .d    (rcry),
    .ena    (clk_en),
    .clrn    (rst_n),
    .q    (tcry) );
endmodule
Go to the top of the page
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 13:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016