|
|
  |
Счетчик на примитивах CARRY_SUM и DFFE |
|
|
|
Apr 8 2010, 08:32
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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 = Сила! Предыдущие семейства - в топку!
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 8 2010, 08:50
|

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
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 8 2010, 12:28
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 8 2010, 12:50
|

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

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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]% ); Правда, я уже не совсем понимаю, зачем...
|
|
|
|
|
Apr 8 2010, 13:59
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Apr 8 2010, 14:46
|
Профессионал
    
Группа: Свой
Сообщений: 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 лог ячеек, при этом раскидался в произвольном порядке. К сожалению, вставить картинку так и не смог При использовании мегафункции все получилось ровно и красиво. Поменял далее на циклон второй - красивая картиночка - все как положено. Непонятно...
Сообщение отредактировал bogaev_roman - Apr 8 2010, 14:52
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|