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

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Счетчик на примитивах CARRY_SUM и DFFE
ViKo
сообщение Apr 8 2010, 08:32
Сообщение #31


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

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



Ну, вот, к примеру.
Код
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 = Сила!
Предыдущие семейства - в топку!
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
sazh
сообщение Apr 8 2010, 08:43
Сообщение #32


Гуру
******

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



Цитата(ViKo @ Apr 8 2010, 11:47) *
Что сказать: Quartus + Cyclone = Сила!
Предыдущие семейства - в топку!


Добавлю, все на квартус 9.0. Ибо только он творит чудеса.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2010, 08:46
Сообщение #33


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

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



Цитата(sazh @ Apr 8 2010, 11:58) *
Добавлю, все на квартус 9.0. Ибо только он творит чудеса.

Неужто 9.1 хуже?
Или, снова... шутка? Смайлик поставьте.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 8 2010, 08:50
Сообщение #34


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(des00 @ Apr 8 2010, 15:11) *
теперь еще добавить 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
//------------------------------------------------------------------------------

Прикрепленное изображение
Прикрепленное изображение


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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2010, 08:56
Сообщение #35


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

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



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

Сам попробовал smile.gif
Все ровненько, только я длину счетчика уменьшил до 32.
Значит, ваш пример недостаточно сложный.
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 8 2010, 11:41
Сообщение #36


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

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



Цитата(dxp @ Apr 8 2010, 03:05) *
P.S. EP2C8F256I8 @ Quartus II 9.0 Build 235 06/17/2009 SJ Full Version, Service Pack Installed: 2

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


--------------------
Go to the top of the page
 
+Quote Post
sazh
сообщение Apr 8 2010, 12:28
Сообщение #37


Гуру
******

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



Цитата(ViKo @ Apr 8 2010, 12:01) *
Неужто 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2010, 12:46
Сообщение #38


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

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



Цитата(sazh @ Apr 8 2010, 15:43) *
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.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 8 2010, 12:50
Сообщение #39


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(des00 @ Apr 8 2010, 18:56) *
я не зря перечислил нужные сигналы,

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

Так?

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

Цитата(des00 @ Apr 8 2010, 18:56) *
посмотрите для начала на таблицу истинности lpm_counter потом сравните со своим кодом %)

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2010, 13:24
Сообщение #40


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

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



Цитата(dxp @ Apr 8 2010, 16:05) *
Какую именно конфигурацию вы имеете в виду? И что в ней мешает синтезатору слепить счетчик в сгруппированных ячейках и с использованием быстрых переносов?

Если задействовать всё, что можно, в счетчике, то, может быть, "красивенько" уже не уложится.
Код
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]%
                           );

Правда, я уже не совсем понимаю, зачем...
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 8 2010, 13:38
Сообщение #41


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

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



Цитата(dxp @ Apr 8 2010, 08:05) *
Результат в смысле выстраивания счетчика в сгруппированном виде не изменился (скриншоты делать и слать лень).


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


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 8 2010, 13:45
Сообщение #42


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ViKo @ Apr 8 2010, 20:39) *
Правда, я уже не совсем понимаю, зачем...

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 8 2010, 13:59
Сообщение #43


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

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



Цитата(des00 @ Apr 8 2010, 16:53) *
пример Viko MWLPM_Counter в посте №25 дает 26 плиток для третьего сыклона, ваш пример slon подрихтованный по разрядности + выход cout дает 50 плиток для того же сыклона.

Видимо, дело, в cout (которого нет у dxp). Потому что последний slon на 24 разряда дает те же 26 "плиток".
Приведите свой модуль.
Ой, нет - 24 "плитки", 26 было для ACEX.
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 8 2010, 14:05
Сообщение #44


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

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



Цитата(ViKo @ Apr 8 2010, 09:14) *
Приведите свой модуль.

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


--------------------
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 8 2010, 14:46
Сообщение #45


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Загнал следующий код в квартус 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.gif
При использовании мегафункции все получилось ровно и красиво.

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

Сообщение отредактировал bogaev_roman - Apr 8 2010, 14:52
Go to the top of the page
 
+Quote Post

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

 


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


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