Jump to content
    

Счетчик на примитивах 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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

теперь еще добавить 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

Share this post


Link to post
Share on other sites

to dxp

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Неужто 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

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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

теперь еще добавить 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 может быть сконфигурирован очень разнообразно, начиная от первого моего примера и включая этот. Какую именно конфигурацию вы имеете в виду? И что в ней мешает синтезатору слепить счетчик в сгруппированных ячейках и с использованием быстрых переносов?

Share this post


Link to post
Share on other sites

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

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

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]%
                           );

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Загнал следующий код в квартус 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:

Edited by bogaev_roman

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...