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

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

Ну, вот, к примеру.

module CountDownReload
#(parameter PERIOD = 50000)
  (
  input Reset_n, Clock, Enable,
  output reg [WIDTH:0] Count
  );
  localparam WIDTH = NumBits(PERIOD-2);
  
  always @(negedge Reset_n, posedge Clock)
  if (!Reset_n)
    Count = 0;
  else
    if (Enable)
      if (Count[WIDTH])
        Count = Count - 1;
      else 
        Count = (1 << WIDTH) | (PERIOD-2);
endmodule

Для ACEX получился в виде, как на картинке. Да, сумматор использует переносы, но триггеры черт знает где, выходы берутся с других мест.

 

 

А вот тот же код, разложенный в Cyclone III, 18 ЛЭ

 

Что сказать: Quartus + Cyclone = Сила!

Предыдущие семейства - в топку!

post-10362-1270714338_thumb.jpg

post-10362-1270715335_thumb.jpg

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


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

Что сказать: Quartus + Cyclone = Сила!

Предыдущие семейства - в топку!

 

Добавлю, все на квартус 9.0. Ибо только он творит чудеса.

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


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

Добавлю, все на квартус 9.0. Ибо только он творит чудеса.

Неужто 9.1 хуже?

Или, снова... шутка? Смайлик поставьте.

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


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

теперь еще добавить alcr, clk_ena, sload, cnt_en как в сабжевом примере и посмотреть. очень занятные вещи видятся для разных семейств (причины уже обсуждали на этом форуме) %)

//------------------------------------------------------------------------------
module slon 
(
    input            clk, 
    input            rst,

    input            cnt_en,

    input      [63:0] data,
    input             load,
                     
    output bit [63:0] cnt
);

always_ff @(posedge clk, posedge rst) begin
    if(rst) begin
        cnt <= 0;
    end
    else begin
        if(cnt_en) begin
            if(load) begin
                cnt <= data;
            end
            else begin
                cnt <= cnt + 1;
            end
        end
    end
end

endmodule
//------------------------------------------------------------------------------

post-1343-1270716629_thumb.png post-1343-1270716636_thumb.png

 

P.S. EP2C8F256I8 @ Quartus II 9.0 Build 235 06/17/2009 SJ Full Version, Service Pack Installed: 2

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


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

to dxp

Для ACEX попробуйте то же.

 

Сам попробовал :)

Все ровненько, только я длину счетчика уменьшил до 32.

Значит, ваш пример недостаточно сложный.

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


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

P.S. EP2C8F256I8 @ Quartus II 9.0 Build 235 06/17/2009 SJ Full Version, Service Pack Installed: 2

я не зря перечислил нужные сигналы, посмотрите для начала на таблицу истинности lpm_counter потом сравните со своим кодом %)

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


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

Неужто 9.1 хуже?

Или, снова... шутка? Смайлик поставьте.

 

Error (10207): Verilog HDL error at CountDownReload.v(7): can't resolve reference to object "NumBits"

Где он описан?

Да и приоритетность нарушаете:

The signal order is the same for all Altera device families, although as noted

previously, not all device families provide every signal. The following priority order is

observed:

1. Asynchronous Clear, aclr—highest priority

2. Preset, pre

3. Asynchronous Load, aload

4. Enable, ena

5. Synchronous Clear, sclr

6. Synchronous Load, sload

7. Data In, data—lowest priority

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


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

Error (10207): Verilog HDL error at CountDownReload.v(7): can't resolve reference to object "NumBits"

Где он описан?

Да и приоритетность нарушаете:

...

Это - функция, в другом месте была

/*!
***********************************************************************
* @brief    Calculate Number-of-Bits for Number
* @details    Вычисляет количество разрядов для представления числа
* @param    Number - число
* @return    NumBits - количество двоичных разрядов
***********************************************************************/
function integer NumBits (input integer Number);
begin
  NumBits = 0;
  while (Number)
  begin
    NumBits++;
    Number >>= 1;
  end
end
endfunction

Приоритетность нарушаю? :unsure:

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


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

я не зря перечислил нужные сигналы,

теперь еще добавить alcr, clk_ena, sload, cnt_en

module slon 
(
    input            clk, 
    input            rst,

    input            clk_en,
    input            cnt_en,

    input      [63:0] data,
    input             load,
                     
    output bit [63:0] cnt
);

always_ff @(posedge clk, posedge rst) begin
    if(rst) begin
        cnt <= 0;
    end
    else begin
        if(clk_en) begin
            if(load) begin
                cnt <= data;
            end
            else begin
                if(cnt_en) begin
                    cnt <= cnt + 1;
                end
            end
        end
    end
end

endmodule

Так?

 

Результат в смысле выстраивания счетчика в сгруппированном виде не изменился (скриншоты делать и слать лень).

 

посмотрите для начала на таблицу истинности lpm_counter потом сравните со своим кодом %)

lpm_counter может быть сконфигурирован очень разнообразно, начиная от первого моего примера и включая этот. Какую именно конфигурацию вы имеете в виду? И что в ней мешает синтезатору слепить счетчик в сгруппированных ячейках и с использованием быстрых переносов?

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


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

Какую именно конфигурацию вы имеете в виду? И что в ней мешает синтезатору слепить счетчик в сгруппированных ячейках и с использованием быстрых переносов?

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

FUNCTION lpm_counter
                           (
                           -- INPUTS
                           data[LPM_WIDTH-1..0],
                           clock,
                           clk_en,
                           cnt_en,
                           updown,
                           cin,
                           aclr,
                           aset,
                           aconst,
                           aload,
                           sclr,
                           sset,
                           sconst,
                           sload
                           )

                           WITH
                           (
                           -- PARAMETERS
                           LPM_WIDTH,
                           LPM_DIRECTION,
                           LPM_MODULUS,
                           LPM_AVALUE,
                           LPM_SVALUE,
                           LPM_PORT_UPDOWN,
                           CARRY_CNT_EN,
                           LABWIDE_SCLR,
                           USE_NEW_VERSION
                           )

                           RETURNS
                           (
                           -- OUPUTS
                           q[LPM_WIDTH-1..0],
                           cout,
                           eq[15..0]%,
                           debug_out[6..0]%
                           );

Правда, я уже не совсем понимаю, зачем...

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


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

Результат в смысле выстраивания счетчика в сгруппированном виде не изменился (скриншоты делать и слать лень).

 

пример Viko MWLPM_Counter в посте №25 дает 26 плиток для третьего сыклона, ваш пример slon подрихтованный по разрядности + выход cout дает 50 плиток для того же сыклона.

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


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

Правда, я уже не совсем понимаю, зачем...

Тоже не представляю реальной задачи, где нужен такой счетчик.

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


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

пример Viko MWLPM_Counter в посте №25 дает 26 плиток для третьего сыклона, ваш пример slon подрихтованный по разрядности + выход cout дает 50 плиток для того же сыклона.

Видимо, дело, в cout (которого нет у dxp). Потому что последний slon на 24 разряда дает те же 26 "плиток".

Приведите свой модуль.

Ой, нет - 24 "плитки", 26 было для ACEX.

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


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

Приведите свой модуль.

как разберусь откуда берутся лишние плитки приведу %)

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


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

Загнал следующий код в квартус 9.1 под stratix iv с установками по умолчанию.

 

module test_counter 
(
input clk,
input rst,
output reg [15:0] cnt_out
);

always @(posedge clk or posedge rst)
    if (rst) cnt_out<=16'd0;
        else cnt_out<=cnt_out+16'd1;

endmodule

Проект размазался на флурплане по трем лабам и занял 20 лог ячеек, при этом раскидался в произвольном порядке.

К сожалению, вставить картинку так и не смог :smile3046:

При использовании мегафункции все получилось ровно и красиво.

 

Поменял далее на циклон второй - красивая картиночка - все как положено. Непонятно... :cranky:

Изменено пользователем bogaev_roman

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


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

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

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

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

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

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

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

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

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

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